Merge "Map dummy language codes in sites"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Tue, 7 Jun 2016 14:13:47 +0000 (14:13 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Tue, 7 Jun 2016 14:13:47 +0000 (14:13 +0000)
450 files changed:
.stylelintrc [new file with mode: 0644]
CREDITS
Gruntfile.js
HISTORY
RELEASE-NOTES-1.27
RELEASE-NOTES-1.28
autoload.php
composer.json
docs/hooks.txt
includes/Category.php
includes/DefaultSettings.php
includes/Defines.php
includes/DummyLinker.php
includes/EditPage.php
includes/GlobalFunctions.php
includes/Linker.php
includes/MediaWiki.php
includes/MediaWikiServices.php
includes/Message.php
includes/OutputHandler.php
includes/OutputPage.php
includes/PHPVersionCheck.php
includes/ServiceWiring.php
includes/Services/SalvageableService.php [new file with mode: 0644]
includes/Services/ServiceContainer.php
includes/Setup.php
includes/Status.php
includes/Title.php
includes/WatchedItemStore.php
includes/WebRequest.php
includes/WebStart.php
includes/actions/Action.php
includes/actions/InfoAction.php
includes/actions/RawAction.php
includes/actions/RollbackAction.php
includes/api/ApiAMCreateAccount.php
includes/api/ApiAuthManagerHelper.php
includes/api/ApiBase.php
includes/api/ApiChangeAuthenticationData.php
includes/api/ApiClientLogin.php
includes/api/ApiFormatJson.php
includes/api/ApiFormatPhp.php
includes/api/ApiMain.php
includes/api/ApiMove.php
includes/api/ApiOpenSearch.php
includes/api/ApiQuery.php
includes/api/ApiQueryAllMessages.php
includes/api/ApiQueryAuthManagerInfo.php
includes/api/ApiQueryPrefixSearch.php
includes/api/ApiQueryRevisions.php
includes/api/ApiQuerySearch.php
includes/api/ApiQuerySiteinfo.php
includes/api/ApiQueryUsers.php
includes/api/ApiRemoveAuthenticationData.php
includes/api/ApiRollback.php
includes/api/ApiSetNotificationTimestamp.php
includes/api/ApiStashEdit.php
includes/api/SearchApi.php [new file with mode: 0644]
includes/api/i18n/ba.json
includes/api/i18n/de.json
includes/api/i18n/diq.json
includes/api/i18n/en.json
includes/api/i18n/es.json
includes/api/i18n/fr.json
includes/api/i18n/gl.json
includes/api/i18n/he.json
includes/api/i18n/ia.json
includes/api/i18n/it.json
includes/api/i18n/ko.json
includes/api/i18n/oc.json
includes/api/i18n/pl.json
includes/api/i18n/ps.json
includes/api/i18n/qqq.json
includes/api/i18n/ta.json
includes/api/i18n/tcy.json
includes/api/i18n/uk.json
includes/api/i18n/zh-hans.json
includes/auth/AbstractPasswordPrimaryAuthenticationProvider.php
includes/auth/AuthManager.php
includes/auth/AuthPluginPrimaryAuthenticationProvider.php
includes/auth/AuthenticationRequest.php
includes/auth/AuthenticationResponse.php
includes/auth/ConfirmLinkSecondaryAuthenticationProvider.php
includes/auth/CreateFromLoginAuthenticationRequest.php
includes/auth/CreationReasonAuthenticationRequest.php
includes/auth/ResetPasswordSecondaryAuthenticationProvider.php
includes/cache/CacheDependency.php
includes/cache/HTMLFileCache.php
includes/cache/LinkBatch.php
includes/cache/LinkCache.php
includes/cache/localisation/LocalisationCache.php
includes/changes/ChangesList.php
includes/changes/EnhancedChangesList.php
includes/changes/RCCacheEntryFactory.php
includes/collation/IcuCollation.php
includes/config/ConfigFactory.php
includes/content/ContentHandler.php
includes/db/DatabaseMysqlBase.php
includes/db/loadbalancer/LBFactory.php
includes/db/loadbalancer/LoadBalancer.php
includes/debug/MWDebug.php
includes/deferred/LinksDeletionUpdate.php
includes/deferred/LinksUpdate.php
includes/diff/ComplexityException.php [new file with mode: 0644]
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/gallery/TraditionalImageGallery.php
includes/htmlform/HTMLForm.php
includes/htmlform/HTMLMultiSelectField.php
includes/htmlform/HTMLRadioField.php
includes/htmlform/OOUIHTMLForm.php
includes/htmlform/VFormHTMLForm.php
includes/installer/Installer.php
includes/installer/MysqlInstaller.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/lv.json
includes/installer/i18n/oc.json
includes/installer/i18n/qqq.json
includes/installer/i18n/ru.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/jobqueue/jobs/RefreshLinksJob.php
includes/libs/HtmlArmor.php [new file with mode: 0644]
includes/libs/objectcache/WANObjectCache.php
includes/linker/LinkRenderer.php [new file with mode: 0644]
includes/linker/LinkRendererFactory.php [new file with mode: 0644]
includes/linker/LinkTarget.php
includes/logging/DeleteLogFormatter.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/LinkHolderArray.php
includes/parser/Parser.php
includes/parser/ParserOptions.php
includes/password/MWOldPassword.php
includes/password/MWSaltedPassword.php
includes/password/Pbkdf2Password.php
includes/resourceloader/ResourceLoaderFileModule.php
includes/resourceloader/ResourceLoaderUserGroupsModule.php [deleted file]
includes/resourceloader/ResourceLoaderUserModule.php
includes/resourceloader/ResourceLoaderWikiModule.php
includes/revisiondelete/RevDelArchiveList.php
includes/revisiondelete/RevDelList.php
includes/revisiondelete/RevDelRevisionList.php
includes/search/SearchEngine.php
includes/session/Session.php
includes/session/SessionManager.php
includes/skins/SkinTemplate.php
includes/specialpage/LoginSignupSpecialPage.php
includes/specials/SpecialBlockList.php
includes/specials/SpecialChangeCredentials.php
includes/specials/SpecialPrefixindex.php
includes/specials/SpecialSearch.php
includes/specials/SpecialTrackingCategories.php
includes/specials/SpecialUndelete.php
includes/specials/SpecialUpload.php
includes/specials/SpecialWhatlinkshere.php
includes/specials/SpecialWithoutinterwiki.php
includes/specials/pagers/AllMessagesTablePager.php
includes/specials/pre-authmanager/SpecialUserlogin.php
includes/title/MediaWikiTitleCodec.php
includes/upload/UploadBase.php
includes/user/User.php
includes/utils/BatchRowIterator.php
jsduck.json
languages/Language.php
languages/data/ZhConversion.php
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/bg.json
languages/i18n/bgn.json
languages/i18n/bho.json
languages/i18n/bn.json
languages/i18n/bs.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/et.json
languages/i18n/eu.json
languages/i18n/fa.json
languages/i18n/fi.json
languages/i18n/fr.json
languages/i18n/gd.json
languages/i18n/gl.json
languages/i18n/gom-deva.json
languages/i18n/gom-latn.json
languages/i18n/gor.json [new file with mode: 0644]
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/jam.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/lv.json
languages/i18n/mai.json
languages/i18n/map-bms.json
languages/i18n/mk.json
languages/i18n/nap.json
languages/i18n/nds-nl.json
languages/i18n/nds.json
languages/i18n/nl.json
languages/i18n/oc.json
languages/i18n/olo.json
languages/i18n/pa.json
languages/i18n/pl.json
languages/i18n/pms.json
languages/i18n/pnb.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/sah.json
languages/i18n/ses.json
languages/i18n/sgs.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/ta.json
languages/i18n/tcy.json
languages/i18n/tg-cyrl.json
languages/i18n/th.json
languages/i18n/tly.json
languages/i18n/tr.json
languages/i18n/tt-cyrl.json
languages/i18n/uk.json
languages/i18n/ur.json
languages/i18n/vep.json
languages/i18n/vi.json
languages/i18n/war.json
languages/i18n/wuu.json
languages/i18n/xmf.json
languages/i18n/yi.json
languages/i18n/zh-hans.json
languages/i18n/zh-hant.json
maintenance/convertExtensionToRegistration.php
maintenance/jsduck/eg-iframe.html
maintenance/language/zhtable/toCN.manual
maintenance/language/zhtable/toHK.manual
maintenance/language/zhtable/toTW.manual
maintenance/language/zhtable/trad2simp.manual
maintenance/language/zhtable/tradphrases.manual
maintenance/language/zhtable/tradphrases_exclude.manual
maintenance/populateRevisionLength.php
maintenance/storage/recompressTracked.php
mw-config/config-cc.css
mw-config/config.css
package.json
resources/Resources.php
resources/ResourcesOOUI.php
resources/lib/es5-shim/es5-shim.js
resources/lib/oojs-ui/i18n/eu.json
resources/lib/oojs-ui/i18n/gom-latn.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/gor.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/hr.json
resources/lib/oojs-ui/i18n/lv.json
resources/lib/oojs-ui/oojs-ui-apex.js
resources/lib/oojs-ui/oojs-ui-core-apex.css
resources/lib/oojs-ui/oojs-ui-core-mediawiki.css
resources/lib/oojs-ui/oojs-ui-core.js
resources/lib/oojs-ui/oojs-ui-mediawiki.js
resources/lib/oojs-ui/oojs-ui-toolbars-apex.css
resources/lib/oojs-ui/oojs-ui-toolbars-mediawiki.css
resources/lib/oojs-ui/oojs-ui-toolbars.js
resources/lib/oojs-ui/oojs-ui-widgets-apex.css
resources/lib/oojs-ui/oojs-ui-widgets-mediawiki.css
resources/lib/oojs-ui/oojs-ui-widgets.js
resources/lib/oojs-ui/oojs-ui-windows-apex.css
resources/lib/oojs-ui/oojs-ui-windows-mediawiki.css
resources/lib/oojs-ui/oojs-ui-windows.js
resources/lib/oojs-ui/themes/apex/icons-editing-styling.json
resources/lib/oojs-ui/themes/mediawiki/icons-editing-styling.json
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/commonPrint.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/images/magnify-clip-ltr.png
resources/src/mediawiki.skinning/images/magnify-clip-rtl.png
resources/src/mediawiki.skinning/interface.css
resources/src/mediawiki.special/mediawiki.special.apisandbox.js
resources/src/mediawiki.special/mediawiki.special.blocklist.css [deleted file]
resources/src/mediawiki.special/mediawiki.special.css
resources/src/mediawiki.special/mediawiki.special.js [deleted file]
resources/src/mediawiki.special/mediawiki.special.preferences.styles.css
resources/src/mediawiki.special/mediawiki.special.recentchanges.js
resources/src/mediawiki.special/mediawiki.special.search.css [changed mode: 0755->0644]
resources/src/mediawiki.special/mediawiki.special.search.styles.css [new file with mode: 0644]
resources/src/mediawiki.special/mediawiki.special.upload.css [deleted file]
resources/src/mediawiki.special/mediawiki.special.upload.styles.css [new file with mode: 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.CategoryCapsuleItemWidget.js
resources/src/mediawiki.widgets/mw.widgets.CategorySelector.js
resources/src/mediawiki.widgets/mw.widgets.DateInputWidget.less
resources/src/mediawiki.widgets/mw.widgets.StashedFileWidget.less
resources/src/mediawiki/api/rollback.js [new file with mode: 0644]
resources/src/mediawiki/mediawiki.ForeignStructuredUpload.BookletLayout.js
resources/src/mediawiki/mediawiki.Title.js
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.htmlform.ooui.css
resources/src/mediawiki/mediawiki.jqueryMsg.js
resources/src/mediawiki/mediawiki.js
resources/src/mediawiki/mediawiki.notification.css
resources/src/mediawiki/mediawiki.raggett.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/mediawiki/page/ready.js
resources/src/mediawiki/page/rollback.js [new file with mode: 0644]
resources/src/mediawiki/page/watch.js
resources/src/moment-locale-overrides.js
tests/TestsAutoLoader.php
tests/browser/features/edit_page.feature
tests/browser/features/view_history.feature
tests/parser/parserTest.inc
tests/parser/parserTests.txt
tests/phpunit/MediaWikiTestCase.php
tests/phpunit/ResourceLoaderTestCase.php
tests/phpunit/data/css/bom.css [new file with mode: 0644]
tests/phpunit/includes/HtmlTest.php
tests/phpunit/includes/LinkerTest.php
tests/phpunit/includes/MediaWikiServicesTest.php
tests/phpunit/includes/MergeHistoryTest.php
tests/phpunit/includes/Services/ServiceContainerTest.php
tests/phpunit/includes/TestUser.php
tests/phpunit/includes/TestUserRegistry.php [new file with mode: 0644]
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/ApiQueryWatchlistIntegrationTest.php
tests/phpunit/includes/api/ApiSetNotificationTimestampIntegrationTest.php [new file with mode: 0644]
tests/phpunit/includes/api/ApiTestCase.php
tests/phpunit/includes/api/format/ApiFormatJsonTest.php
tests/phpunit/includes/auth/AuthManagerTest.php
tests/phpunit/includes/auth/AuthPluginPrimaryAuthenticationProviderTest.php
tests/phpunit/includes/auth/AuthenticationRequestTest.php
tests/phpunit/includes/auth/ConfirmLinkSecondaryAuthenticationProviderTest.php
tests/phpunit/includes/auth/CreateFromLoginAuthenticationRequestTest.php
tests/phpunit/includes/auth/LocalPasswordPrimaryAuthenticationProviderTest.php
tests/phpunit/includes/auth/ResetPasswordSecondaryAuthenticationProviderTest.php
tests/phpunit/includes/cache/GenderCacheTest.php
tests/phpunit/includes/changes/CategoryMembershipChangeTest.php
tests/phpunit/includes/changes/EnhancedChangesListTest.php
tests/phpunit/includes/changes/OldChangesListTest.php
tests/phpunit/includes/changes/RCCacheEntryFactoryTest.php
tests/phpunit/includes/changes/TestRecentChangesHelper.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/libs/HtmlArmorTest.php [new file with mode: 0644]
tests/phpunit/includes/libs/objectcache/WANObjectCacheTest.php
tests/phpunit/includes/linker/LinkRendererFactoryTest.php [new file with mode: 0644]
tests/phpunit/includes/linker/LinkRendererTest.php [new file with mode: 0644]
tests/phpunit/includes/parser/NewParserTest.php
tests/phpunit/includes/resourceloader/ResourceLoaderFileModuleTest.php
tests/phpunit/includes/resourceloader/ResourceLoaderWikiModuleTest.php
tests/phpunit/includes/session/BotPasswordSessionProviderTest.php
tests/phpunit/includes/session/CookieSessionProviderTest.php
tests/phpunit/includes/session/PHPSessionHandlerTest.php
tests/phpunit/includes/session/SessionBackendTest.php
tests/phpunit/includes/title/MediaWikiTitleCodecTest.php
tests/phpunit/includes/upload/UploadBaseTest.php
tests/phpunit/includes/user/BotPasswordTest.php
tests/phpunit/includes/user/CentralIdLookupTest.php
tests/phpunit/includes/user/LocalIdLookupTest.php
tests/phpunit/includes/user/UserTest.php
tests/phpunit/languages/LanguageTest.php
tests/phpunit/maintenance/DumpTestCase.php
tests/phpunit/phpunit.php
tests/phpunit/suite.xml
tests/qunit/suites/resources/mediawiki.special/mediawiki.special.recentchanges.test.js

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" ],
+       }
+}
diff --git a/CREDITS b/CREDITS
index a54bd90..dca597e 100644 (file)
--- a/CREDITS
+++ b/CREDITS
@@ -1,6 +1,6 @@
 {{int:version-credits-summary}}
 <!--
-MediaWiki 1.27 is a collaborative project released under the
+MediaWiki 1.28 is a collaborative project released under the
 GNU General Public License v2. We would like to recognize the
 following names for their contribution to the product.
 -->
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' ] );
diff --git a/HISTORY b/HISTORY
index e57d346..e833154 100644 (file)
--- a/HISTORY
+++ b/HISTORY
@@ -1,4 +1,4 @@
-Change notes from older releases. For current info see RELEASE-NOTES-1.27.
+Change notes from older releases. For current info see RELEASE-NOTES-1.28.
 
 = MediaWiki 1.26 =
 
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 e365486..a650a50 100644 (file)
@@ -9,16 +9,17 @@ production.
 * The load.php entry point now enforces the existing policy of not allowing
   access to session data, which includes the session user and the session
   user's language. If such access is attempted, an exception will be thrown.
+* The number of internal PBKDF2 iterations used to derive the session secret
+  is configurable via $wgSessionPbkdf2Iterations.
 
 === New features in 1.28 ===
 * User::isBot() method for checking if an account is a bot role account.
 * Added a new hook, 'UserIsBot', to aid in determining if a user is a bot.
 
-
 === External library changes in 1.28 ===
 
 ==== Upgraded external libraries ====
-
+* Updated es5-shim from v4.1.5 to v4.5.8
 
 ==== New external libraries ====
 
@@ -41,8 +42,8 @@ MediaWiki supports over 350 languages. Many localisations are updated
 regularly. Below only new and removed languages are listed, as well as
 changes to languages because of Phabricator reports.
 
-=== Other changes in 1.27 ===
-
+=== Other changes in 1.28 ===
+* (T128697) Improved handling of large diffs.
 
 == Compatibility ==
 
index f79bace..27da2ca 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',
@@ -556,6 +557,7 @@ $wgAutoloadLocalClasses = [
        'HistoryPager' => __DIR__ . '/includes/actions/HistoryAction.php',
        'Hooks' => __DIR__ . '/includes/Hooks.php',
        'Html' => __DIR__ . '/includes/Html.php',
+       'HtmlArmor' => __DIR__ . '/includes/libs/HtmlArmor.php',
        'HtmlFormatter' => __DIR__ . '/includes/HtmlFormatter.php',
        'Http' => __DIR__ . '/includes/HttpFunctions.php',
        'HttpError' => __DIR__ . '/includes/exception/HttpError.php',
@@ -772,13 +774,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,8 +830,14 @@ $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\\ComplexityException' => __DIR__ . '/includes/diff/ComplexityException.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\\LinkRenderer' => __DIR__ . '/includes/linker/LinkRenderer.php',
+       'MediaWiki\\Linker\\LinkRendererFactory' => __DIR__ . '/includes/linker/LinkRendererFactory.php',
        'MediaWiki\\Linker\\LinkTarget' => __DIR__ . '/includes/linker/LinkTarget.php',
        'MediaWiki\\Logger\\LegacyLogger' => __DIR__ . '/includes/debug/logger/LegacyLogger.php',
        'MediaWiki\\Logger\\LegacySpi' => __DIR__ . '/includes/debug/logger/LegacySpi.php',
@@ -850,6 +858,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 +1095,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',
@@ -1146,7 +1155,6 @@ $wgAutoloadLocalClasses = [
        'ResourceLoaderUploadDialogModule' => __DIR__ . '/includes/resourceloader/ResourceLoaderUploadDialogModule.php',
        'ResourceLoaderUserCSSPrefsModule' => __DIR__ . '/includes/resourceloader/ResourceLoaderUserCSSPrefsModule.php',
        'ResourceLoaderUserDefaultsModule' => __DIR__ . '/includes/resourceloader/ResourceLoaderUserDefaultsModule.php',
-       'ResourceLoaderUserGroupsModule' => __DIR__ . '/includes/resourceloader/ResourceLoaderUserGroupsModule.php',
        'ResourceLoaderUserModule' => __DIR__ . '/includes/resourceloader/ResourceLoaderUserModule.php',
        'ResourceLoaderUserOptionsModule' => __DIR__ . '/includes/resourceloader/ResourceLoaderUserOptionsModule.php',
        'ResourceLoaderUserTokensModule' => __DIR__ . '/includes/resourceloader/ResourceLoaderUserTokensModule.php',
@@ -1191,6 +1199,7 @@ $wgAutoloadLocalClasses = [
        'SavepointPostgres' => __DIR__ . '/includes/db/DatabasePostgres.php',
        'ScopedCallback' => __DIR__ . '/includes/libs/ScopedCallback.php',
        'ScopedLock' => __DIR__ . '/includes/filebackend/lockmanager/ScopedLock.php',
+       'SearchApi' => __DIR__ . '/includes/api/SearchApi.php',
        'SearchDatabase' => __DIR__ . '/includes/search/SearchDatabase.php',
        'SearchDump' => __DIR__ . '/maintenance/dumpIterator.php',
        'SearchEngine' => __DIR__ . '/includes/search/SearchEngine.php',
@@ -1504,7 +1513,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 +1525,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 ef85ec4..a261449 100644 (file)
                "ext-xml": "*",
                "liuggio/statsd-php-client": "1.0.18",
                "mediawiki/at-ease": "1.1.0",
-               "oojs/oojs-ui": "0.17.2",
+               "oojs/oojs-ui": "0.17.4",
                "oyejorge/less.php": "1.7.0.10",
                "php": ">=5.5.9",
                "psr/log": "1.0.0",
                "wikimedia/assert": "0.2.2",
                "wikimedia/base-convert": "1.0.1",
-               "wikimedia/cdb": "1.4.0",
+               "wikimedia/cdb": "1.4.1",
                "wikimedia/cldr-plural-rule-parser": "1.0.0",
                "wikimedia/composer-merge-plugin": "1.3.1",
                "wikimedia/html-formatter": "1.0.1",
@@ -46,7 +46,7 @@
        "require-dev": {
                "jakub-onderka/php-parallel-lint": "0.9.2",
                "justinrainbow/json-schema": "~1.3",
-               "mediawiki/mediawiki-codesniffer": "0.7.1",
+               "mediawiki/mediawiki-codesniffer": "0.7.2",
                "monolog/monolog": "~1.18.2",
                "nikic/php-parser": "1.4.1",
                "nmred/kafka-php": "0.1.5",
index f652786..c91354d 100644 (file)
@@ -1783,7 +1783,8 @@ $title: The page's Title.
 $out: The output page.
 $cssClassName: CSS class name of the language selector.
 
-'LinkBegin': Used when generating internal and interwiki links in
+'LinkBegin': DEPRECATED! Use HtmlPageLinkRendererBegin instead.
+Used when generating internal and interwiki links in
 Linker::link(), before processing starts.  Return false to skip default
 processing and return $ret. See documentation for Linker::link() for details on
 the expected meanings of parameters.
@@ -1800,7 +1801,8 @@ $target: the Title that the link is pointing to
 &$options: array of options.  Can include 'known', 'broken', 'noclasses'.
 &$ret: the value to return if your hook returns false.
 
-'LinkEnd': Used when generating internal and interwiki links in Linker::link(),
+'LinkEnd': DEPRECATED! Use HtmlPageLinkRendererEnd hook instead
+Used when generating internal and interwiki links in Linker::link(),
 just before the function returns a value.  If you return true, an <a> element
 with HTML attributes $attribs and contents $html will be returned.  If you
 return false, $ret will be returned.
@@ -1835,6 +1837,35 @@ $file: the File object or false if broken link
 &$attribs: the attributes to be applied
 &$ret: the value to return if your hook returns false
 
+'LinkRendererBegin':
+Used when generating internal and interwiki links in
+LinkRenderer, before processing starts.  Return false to skip default
+processing and return $ret.
+$linkRenderer: the LinkRenderer object
+$target: the LinkTarget that the link is pointing to
+&$html: the contents that the <a> tag should have (raw HTML); null means
+  "default".
+&$customAttribs: the HTML attributes that the <a> tag should have, in
+  associative array form, with keys and values unescaped.  Should be merged
+  with default values, with a value of false meaning to suppress the
+  attribute.
+&$query: the query string to add to the generated URL (the bit after the "?"),
+  in associative array form, with keys and values unescaped.
+&$ret: the value to return if your hook returns false.
+
+'LinkRendererEnd':
+Used when generating internal and interwiki links in LinkRenderer,
+just before the function returns a value.  If you return true, an <a> element
+with HTML attributes $attribs and contents $html will be returned.  If you
+return false, $ret will be returned.
+$linkRenderer: the LinkRenderer object
+$target: the LinkTarget object that the link is pointing to
+$isKnown: boolean indicating whether the page is known or not
+&$html: the final (raw HTML) contents of the <a> tag, after processing.
+&$attribs: the final HTML attributes of the <a> tag, after processing, in
+  associative array form.
+&$ret: the value to return if your hook returns false.
+
 'LinksUpdate': At the beginning of LinksUpdate::doUpdate() just before the
 actual update.
 &$linksUpdate: the LinksUpdate object
@@ -2494,6 +2525,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 6209a1a..28b566a 100644 (file)
@@ -95,7 +95,11 @@ class Category {
                # and should not be kept, and 2) we *probably* don't have to scan many
                # rows to obtain the correct figure, so let's risk a one-time recount.
                if ( $this->mPages < 0 || $this->mSubcats < 0 || $this->mFiles < 0 ) {
-                       $this->refreshCounts();
+                       $this->mPages = max( $this->mPages, 0 );
+                       $this->mSubcats = max( $this->mSubcats, 0 );
+                       $this->mFiles = max( $this->mFiles, 0 );
+
+                       DeferredUpdates::addCallableUpdate( [ $this, 'refreshCounts' ] );
                }
 
                return true;
index 0b70d16..0fe3388 100644 (file)
@@ -1902,6 +1902,7 @@ $wgSharedSchema = false;
  *                                    if available
  *
  *   - max lag:     (optional) Maximum replication lag before a slave will taken out of rotation
+ *   - is static:   (optional) Set to true if the dataset is static and no replication is used.
  *
  *   These and any other user-defined properties will be assigned to the mLBInfo member
  *   variable of the Database object.
@@ -2385,6 +2386,13 @@ $wgSessionHandler = null;
  */
 $wgPHPSessionHandling = 'enable';
 
+/**
+ * Number of internal PBKDF2 iterations to use when deriving session secrets.
+ *
+ * @since 1.28
+ */
+$wgSessionPbkdf2Iterations = 10001;
+
 /**
  * If enabled, will send MemCached debugging information to $wgDebugLogFile
  */
@@ -4261,7 +4269,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;
 
@@ -4451,7 +4465,7 @@ $wgPasswordPolicy = [
  * @since 1.27
  * @deprecated since 1.27, for use during development only
  */
-$wgDisableAuthManager = true;
+$wgDisableAuthManager = false;
 
 /**
  * Configure AuthManager
@@ -4539,9 +4553,40 @@ $wgAuthManagerAutoConfig = [
 ];
 
 /**
- * If it has been this long since the last authentication, recommend
- * re-authentication before security-sensitive operations (e.g. password or
- * email changes). Set negative to disable.
+ * Time frame for re-authentication.
+ *
+ * With only password-based authentication, you'd just ask the user to re-enter
+ * their password to verify certain operations like changing the password or
+ * changing the account's email address. But under AuthManager, the user might
+ * not have a password (you might even have to redirect the browser to a
+ * third-party service or something complex like that), you might want to have
+ * both factors of a two-factor authentication, and so on. So, the options are:
+ * - Incorporate the whole multi-step authentication flow within everything
+ *   that needs to do this.
+ * - Consider it good if they used Special:UserLogin during this session within
+ *   the last X seconds.
+ * - Come up with a third option.
+ *
+ * MediaWiki currently takes the second option. This setting configures the
+ * "X seconds".
+ *
+ * This allows for configuring different time frames for different
+ * "operations". The operations used in MediaWiki core include:
+ * - LinkAccounts
+ * - UnlinkAccount
+ * - ChangeCredentials
+ * - RemoveCredentials
+ * - ChangeEmail
+ *
+ * Additional operations may be used by extensions, either explicitly by
+ * calling AuthManager::securitySensitiveOperationStatus(),
+ * ApiAuthManagerHelper::securitySensitiveOperation() or
+ * SpecialPage::checkLoginSecurityLevel(), or implicitly by overriding
+ * SpecialPage::getLoginSecurityLevel() or by subclassing
+ * AuthManagerSpecialPage.
+ *
+ * The key 'default' is used if a requested operation isn't defined in the array.
+ *
  * @since 1.27
  * @var int[] operation => time in seconds. A 'default' key must always be provided.
  */
@@ -4550,8 +4595,18 @@ $wgReauthenticateTime = [
 ];
 
 /**
- * Whether to allow security-sensitive operations when authentication is not possible.
+ * Whether to allow security-sensitive operations when re-authentication is not possible.
+ *
+ * If AuthManager::canAuthenticateNow() is false (e.g. the current
+ * SessionProvider is not able to change users, such as when OAuth is in use),
+ * AuthManager::securitySensitiveOperationStatus() cannot sensibly return
+ * SEC_REAUTH. Setting an operation true here will have it return SEC_OK in
+ * that case, while setting it false will have it return SEC_FAIL.
+ *
+ * The key 'default' is used if a requested operation isn't defined in the array.
+ *
  * @since 1.27
+ * @see $wgReauthenticateTime
  * @var bool[] operation => boolean. A 'default' key must always be provided.
  */
 $wgAllowSecuritySensitiveOperationIfCannotReauthenticate = [
@@ -4844,7 +4899,7 @@ $wgSessionProviders = [
        MediaWiki\Session\BotPasswordSessionProvider::class => [
                'class' => MediaWiki\Session\BotPasswordSessionProvider::class,
                'args' => [ [
-                       'priority' => 40,
+                       'priority' => 75,
                ] ],
        ],
 ];
@@ -7051,6 +7106,7 @@ $wgExtensionCredits = [];
 /**
  * Authentication plugin.
  * @var $wgAuth AuthPlugin
+ * @deprecated since 1.27 use $wgAuthManagerConfig instead
  */
 $wgAuth = null;
 
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 6545c4a..d9330ee 100644 (file)
@@ -72,7 +72,7 @@ class DummyLinker {
                $html = null,
                $customAttribs = [],
                $query = [],
-               $options = [ 'known', 'noclasses' ]
+               $options = [ 'known' ]
        ) {
                return Linker::linkKnown(
                        $target,
index 0f52983..f2403fe 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>",
@@ -3496,6 +3501,8 @@ HTML
                $cancelParams = [];
                if ( !$this->isConflict && $this->oldid > 0 ) {
                        $cancelParams['oldid'] = $this->oldid;
+               } elseif ( $this->getContextTitle()->isRedirect() ) {
+                       $cancelParams['redirect'] = 'no';
                }
                $attrs = [ 'id' => 'mw-editform-cancel' ];
 
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..0b2d3a7 100644 (file)
@@ -20,6 +20,7 @@
  * @file
  */
 use MediaWiki\Linker\LinkTarget;
+use MediaWiki\MediaWikiServices;
 
 /**
  * Some internal bits split of from Skin.php. These functions are used
@@ -137,22 +138,30 @@ class Linker {
         * Return the CSS colour of a known link
         *
         * @since 1.16.3
-        * @param Title $t
+        * @param LinkTarget $t
         * @param int $threshold User defined threshold
         * @return string CSS class
         */
-       public static function getLinkColour( $t, $threshold ) {
-               $colour = '';
-               if ( $t->isRedirect() ) {
+       public static function getLinkColour( LinkTarget $t, $threshold ) {
+               $linkCache = MediaWikiServices::getInstance()->getLinkCache();
+               // Make sure the target is in the cache
+               $id = $linkCache->addLinkObj( $t );
+               if ( $id == 0 ) {
+                       // Doesn't exist
+                       return '';
+               }
+
+               if ( $linkCache->getGoodLinkFieldObj( $t, 'redirect' ) ) {
                        # Page is a redirect
-                       $colour = 'mw-redirect';
-               } elseif ( $threshold > 0 && $t->isContentPage() &&
-                       $t->exists() && $t->getLength() < $threshold
+                       return 'mw-redirect';
+               } elseif ( $threshold > 0 && MWNamespace::isContent( $t->getNamespace() )
+                       && $linkCache->getGoodLinkFieldObj( $t, 'length' ) < $threshold
                ) {
                        # Page is a stub
-                       $colour = 'stub';
+                       return 'stub';
                }
-               return $colour;
+
+               return '';
        }
 
        /**
@@ -210,55 +219,35 @@ class Linker {
                        wfDeprecated( __METHOD__ . ' with parameter $query as string (should be array)', '1.20' );
                        $query = wfCgiToArray( $query );
                }
-               $options = (array)$options;
-
-               $dummy = new DummyLinker; // dummy linker instance for bc on the hooks
-
-               $ret = null;
-               if ( !Hooks::run( 'LinkBegin',
-                       [ $dummy, $target, &$html, &$customAttribs, &$query, &$options, &$ret ] )
-               ) {
-                       return $ret;
-               }
 
-               # Normalize the Title if it's a special page
-               $target = self::normaliseSpecialPage( $target );
-
-               # If we don't know whether the page exists, let's find out.
-               if ( !in_array( 'known', $options, true ) && !in_array( 'broken', $options, true ) ) {
-                       if ( $target->isKnown() ) {
-                               $options[] = 'known';
-                       } else {
-                               $options[] = 'broken';
+               $services = MediaWikiServices::getInstance();
+               $options = (array)$options;
+               if ( $options ) {
+                       // Custom options, create new LinkRenderer
+                       if ( !isset( $options['stubThreshold'] ) ) {
+                               $defaultLinkRenderer = $services->getLinkRenderer();
+                               $options['stubThreshold'] = $defaultLinkRenderer->getStubThreshold();
                        }
+                       $linkRenderer = $services->getLinkRendererFactory()
+                               ->createFromLegacyOptions( $options );
+               } else {
+                       $linkRenderer = $services->getLinkRenderer();
                }
 
-               $oldquery = [];
-               if ( in_array( "forcearticlepath", $options, true ) && $query ) {
-                       $oldquery = $query;
-                       $query = [];
-               }
-
-               # Note: we want the href attribute first, for prettiness.
-               $attribs = [ 'href' => self::linkUrl( $target, $query, $options ) ];
-               if ( in_array( 'forcearticlepath', $options, true ) && $oldquery ) {
-                       $attribs['href'] = wfAppendQuery( $attribs['href'], $oldquery );
-               }
-
-               $attribs = array_merge(
-                       $attribs,
-                       self::linkAttribs( $target, $customAttribs, $options )
-               );
-               if ( is_null( $html ) ) {
-                       $html = self::linkText( $target );
-               }
-
-               $ret = null;
-               if ( Hooks::run( 'LinkEnd', [ $dummy, $target, $options, &$html, &$attribs, &$ret ] ) ) {
-                       $ret = Html::rawElement( 'a', $attribs, $html );
+               if ( $html !== null ) {
+                       $text = new HtmlArmor( $html );
+               } else {
+                       $text = $html; // null
+               }
+               if ( in_array( 'known', $options, true ) ) {
+                       return $linkRenderer->makeKnownLink( $target, $text, $customAttribs, $query );
+               } elseif ( in_array( 'broken', $options, true ) ) {
+                       return $linkRenderer->makeBrokenLink( $target, $text, $customAttribs, $query );
+               } elseif ( in_array( 'noclasses', $options, true ) ) {
+                       return $linkRenderer->makePreloadedLink( $target, $text, '', $customAttribs, $query );
+               } else {
+                       return $linkRenderer->makeLink( $target, $text, $customAttribs, $query );
                }
-
-               return $ret;
        }
 
        /**
@@ -269,135 +258,11 @@ class Linker {
         */
        public static function linkKnown(
                $target, $html = null, $customAttribs = [],
-               $query = [], $options = [ 'known', 'noclasses' ]
+               $query = [], $options = [ 'known' ]
        ) {
                return self::link( $target, $html, $customAttribs, $query, $options );
        }
 
-       /**
-        * Returns the Url used to link to a Title
-        *
-        * @param LinkTarget $target
-        * @param array $query Query parameters
-        * @param array $options
-        * @return string
-        */
-       private static function linkUrl( LinkTarget $target, $query, $options ) {
-               # We don't want to include fragments for broken links, because they
-               # generally make no sense.
-               if ( in_array( 'broken', $options, true ) && $target->hasFragment() ) {
-                       $target = $target->createFragmentTarget( '' );
-               }
-
-               # If it's a broken link, add the appropriate query pieces, unless
-               # there's already an action specified, or unless 'edit' makes no sense
-               # (i.e., for a nonexistent special page).
-               if ( in_array( 'broken', $options, true ) && empty( $query['action'] )
-                       && $target->getNamespace() !== NS_SPECIAL ) {
-                       $query['action'] = 'edit';
-                       $query['redlink'] = '1';
-               }
-
-               if ( in_array( 'http', $options, true ) ) {
-                       $proto = PROTO_HTTP;
-               } elseif ( in_array( 'https', $options, true ) ) {
-                       $proto = PROTO_HTTPS;
-               } else {
-                       $proto = PROTO_RELATIVE;
-               }
-
-               $title = Title::newFromLinkTarget( $target );
-               $ret = $title->getLinkURL( $query, false, $proto );
-               return $ret;
-       }
-
-       /**
-        * Returns the array of attributes used when linking to the Title $target
-        *
-        * @param Title $target
-        * @param array $attribs
-        * @param array $options
-        *
-        * @return array
-        */
-       private static function linkAttribs( $target, $attribs, $options ) {
-               global $wgUser;
-               $defaults = [];
-
-               if ( !in_array( 'noclasses', $options, true ) ) {
-                       # Now build the classes.
-                       $classes = [];
-
-                       if ( in_array( 'broken', $options, true ) ) {
-                               $classes[] = 'new';
-                       }
-
-                       if ( $target->isExternal() ) {
-                               $classes[] = 'extiw';
-                       }
-
-                       if ( !in_array( 'broken', $options, true ) ) { # Avoid useless calls to LinkCache (see r50387)
-                               $colour = self::getLinkColour(
-                                       $target,
-                                       isset( $options['stubThreshold'] ) ? $options['stubThreshold'] : $wgUser->getStubThreshold()
-                               );
-                               if ( $colour !== '' ) {
-                                       $classes[] = $colour; # mw-redirect or stub
-                               }
-                       }
-                       if ( $classes != [] ) {
-                               $defaults['class'] = implode( ' ', $classes );
-                       }
-               }
-
-               # Get a default title attribute.
-               if ( $target->getPrefixedText() == '' ) {
-                       # A link like [[#Foo]].  This used to mean an empty title
-                       # attribute, but that's silly.  Just don't output a title.
-               } elseif ( in_array( 'known', $options, true ) ) {
-                       $defaults['title'] = $target->getPrefixedText();
-               } else {
-                       // This ends up in parser cache!
-                       $defaults['title'] = wfMessage( 'red-link-title', $target->getPrefixedText() )
-                               ->inContentLanguage()
-                               ->text();
-               }
-
-               # Finally, merge the custom attribs with the default ones, and iterate
-               # over that, deleting all "false" attributes.
-               $ret = [];
-               $merged = Sanitizer::mergeAttributes( $defaults, $attribs );
-               foreach ( $merged as $key => $val ) {
-                       # A false value suppresses the attribute, and we don't want the
-                       # href attribute to be overridden.
-                       if ( $key != 'href' && $val !== false ) {
-                               $ret[$key] = $val;
-                       }
-               }
-               return $ret;
-       }
-
-       /**
-        * Default text of the links to the Title $target
-        *
-        * @param Title $target
-        *
-        * @return string
-        */
-       private static function linkText( $target ) {
-               if ( !$target instanceof Title ) {
-                       wfWarn( __METHOD__ . ': Requires $target to be a Title object.' );
-                       return '';
-               }
-               // If the target is just a fragment, with no title, we return the fragment
-               // text.  Otherwise, we return the title text itself.
-               if ( $target->getPrefixedText() === '' && $target->hasFragment() ) {
-                       return htmlspecialchars( $target->getFragment() );
-               }
-
-               return htmlspecialchars( $target->getPrefixedText() );
-       }
-
        /**
         * Make appropriate markup for a link to the current article. This is
         * currently rendered as the bold link text. The calling sequence is the
@@ -940,7 +805,15 @@ class Linker {
                        $redir = RepoGroup::singleton()->getLocalRepo()->checkRedirect( $title );
 
                        if ( $redir ) {
-                               return self::linkKnown( $title, $encLabel, [], wfCgiToArray( $query ) );
+                               // We already know it's a redirect, so mark it
+                               // accordingly
+                               return self::link(
+                                       $title,
+                                       $encLabel,
+                                       [ 'class' => 'mw-redirect' ],
+                                       wfCgiToArray( $query ),
+                                       [ 'known', 'noclasses' ]
+                               );
                        }
 
                        $href = self::getUploadUrl( $title, $query );
@@ -950,7 +823,7 @@ class Linker {
                                $encLabel . '</a>';
                }
 
-               return self::linkKnown( $title, $encLabel, [], wfCgiToArray( $query ) );
+               return self::link( $title, $encLabel, [], wfCgiToArray( $query ), [ 'known', 'noclasses' ] );
        }
 
        /**
@@ -1084,7 +957,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 ] );
@@ -1872,7 +1754,7 @@ class Linker {
         * work if $wgShowRollbackEditCount is disabled, so this can only function
         * as an additional check.
         *
-        * If the option noBrackets is set the rollback link wont be enclosed in []
+        * If the option noBrackets is set the rollback link wont be enclosed in "[]".
         *
         * @since 1.16.3. $context added in 1.20. $options added in 1.21
         *
@@ -1996,11 +1878,14 @@ class Linker {
                $query = [
                        'action' => 'rollback',
                        'from' => $rev->getUserText(),
-                       'token' => $context->getUser()->getEditToken( [
-                               $title->getPrefixedText(),
-                               $rev->getUserText()
-                       ] ),
+                       'token' => $context->getUser()->getEditToken( 'rollback' ),
                ];
+               $attrs = [
+                       'data-mw' => 'interface',
+                       'title' => $context->msg( 'tooltip-rollback' )->text(),
+               ];
+               $options = [ 'known', 'noclasses' ];
+
                if ( $context->getRequest()->getBool( 'bot' ) ) {
                        $query['bot'] = '1';
                        $query['hidediff'] = '1'; // bug 15999
@@ -2025,27 +1910,16 @@ class Linker {
                        }
 
                        if ( $editCount > $wgShowRollbackEditCount ) {
-                               $editCount_output = $context->msg( 'rollbacklinkcount-morethan' )
+                               $html = $context->msg( 'rollbacklinkcount-morethan' )
                                        ->numParams( $wgShowRollbackEditCount )->parse();
                        } else {
-                               $editCount_output = $context->msg( 'rollbacklinkcount' )->numParams( $editCount )->parse();
+                               $html = $context->msg( 'rollbacklinkcount' )->numParams( $editCount )->parse();
                        }
 
-                       return self::link(
-                               $title,
-                               $editCount_output,
-                               [ 'title' => $context->msg( 'tooltip-rollback' )->text() ],
-                               $query,
-                               [ 'known', 'noclasses' ]
-                       );
+                       return self::link( $title, $html, $attrs, $query, $options );
                } else {
-                       return self::link(
-                               $title,
-                               $context->msg( 'rollbacklink' )->escaped(),
-                               [ 'title' => $context->msg( 'tooltip-rollback' )->text() ],
-                               $query,
-                               [ 'known', 'noclasses' ]
-                       );
+                       $html = $context->msg( 'rollbacklink' )->escaped();
+                       return self::link( $title, $html, $attrs, $query, $options );
                }
        }
 
index ff469e4..ee03f02 100644 (file)
@@ -667,10 +667,10 @@ class MediaWiki {
                $trxLimits = $this->config->get( 'TrxProfilerLimits' );
                $trxProfiler = Profiler::instance()->getTransactionProfiler();
                $trxProfiler->setLogger( LoggerFactory::getInstance( 'DBPerformance' ) );
-               if ( $request->wasPosted() ) {
-                       $trxProfiler->setExpectations( $trxLimits['POST'], __METHOD__ );
-               } else {
+               if ( $request->hasSafeMethod() ) {
                        $trxProfiler->setExpectations( $trxLimits['GET'], __METHOD__ );
+               } else {
+                       $trxProfiler->setExpectations( $trxLimits['POST'], __METHOD__ );
                }
 
                // If the user has forceHTTPS set to true, or if the user
@@ -680,6 +680,8 @@ class MediaWiki {
                // isLoggedIn() will do all sorts of weird stuff.
                if (
                        $request->getProtocol() == 'http' &&
+                       // switch to HTTPS only when supported by the server
+                       preg_match( '#^https://#', wfExpandUrl( $request->getRequestURL(), PROTO_HTTPS ) ) &&
                        (
                                $request->getSession()->shouldForceHTTPS() ||
                                // Check the cookie manually, for paranoia
index 891f426..6613db1 100644 (file)
@@ -11,9 +11,12 @@ use LBFactory;
 use LinkCache;
 use Liuggio\StatsdClient\Factory\StatsdDataFactory;
 use LoadBalancer;
+use MediaWiki\Linker\LinkRenderer;
+use MediaWiki\Linker\LinkRendererFactory;
+use MediaWiki\Services\SalvageableService;
 use MediaWiki\Services\ServiceContainer;
 use MWException;
-use ResourceLoader;
+use ObjectCache;
 use SearchEngine;
 use SearchEngineConfig;
 use SearchEngineFactory;
@@ -23,6 +26,7 @@ use WatchedItemStore;
 use SkinFactory;
 use TitleFormatter;
 use TitleParser;
+use MediaWiki\Interwiki\InterwikiLookup;
 
 /**
  * Service locator for MediaWiki core services.
@@ -88,7 +92,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 +125,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 +133,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 +154,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 +173,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 +213,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 +260,8 @@ class MediaWikiServices extends ServiceContainer {
                foreach ( $destroy as $name ) {
                        $services->disableService( $name );
                }
+
+               ObjectCache::clear();
        }
 
        /**
@@ -261,7 +301,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 +421,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
@@ -470,6 +518,25 @@ class MediaWikiServices extends ServiceContainer {
                return $this->getService( 'LinkCache' );
        }
 
+       /**
+        * @since 1.28
+        * @return LinkRendererFactory
+        */
+       public function getLinkRendererFactory() {
+               return $this->getService( 'LinkRendererFactory' );
+       }
+
+       /**
+        * LinkRenderer instance that can be used
+        * if no custom options are needed
+        *
+        * @since 1.28
+        * @return LinkRenderer
+        */
+       public function getLinkRenderer() {
+               return $this->getService( 'LinkRenderer' );
+       }
+
        /**
         * @since 1.28
         * @return TitleFormatter
index c7752aa..c204aee 100644 (file)
@@ -447,12 +447,12 @@ class Message implements MessageSpecifier, Serializable {
        public function getTitle() {
                global $wgContLang, $wgForceUIMsgAsContentMsg;
 
-               $code = $this->getLanguage()->getCode();
                $title = $this->key;
                if (
-                       $wgContLang->getCode() !== $code
+                       !$this->language->equals( $wgContLang )
                        && in_array( $this->key, (array)$wgForceUIMsgAsContentMsg )
                ) {
+                       $code = $this->language->getCode();
                        $title .= '/' . $code;
                }
 
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..6f62ae6 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 );
                }
@@ -3096,12 +3101,6 @@ class OutputPage extends ContextSource {
                        $links[] = $this->makeResourceLoaderLink( 'user', ResourceLoaderModule::TYPE_COMBINED );
                }
 
-               // Group JS is only enabled if site JS is enabled.
-               $links[] = $this->makeResourceLoaderLink(
-                       'user.groups',
-                       ResourceLoaderModule::TYPE_COMBINED
-               );
-
                return self::getHtmlFromLoaderLinks( $links );
        }
 
@@ -3667,7 +3666,6 @@ class OutputPage extends ContextSource {
                // Per-site custom styles
                $moduleStyles[] = 'site';
                $moduleStyles[] = 'noscript';
-               $moduleStyles[] = 'user.groups';
 
                // Per-user custom styles
                if ( $this->getConfig()->get( 'AllowUserCss' ) && $this->getTitle()->isCssSubpage()
index 1eafcfa..ab8aada 100644 (file)
@@ -30,7 +30,7 @@
  * version are hardcoded here
  */
 function wfEntryPointCheck( $entryPoint ) {
-       $mwVersion = '1.27';
+       $mwVersion = '1.28';
        $minimumVersionPHP = '5.5.9';
        $phpVersion = PHP_VERSION;
 
index e53b9ed..338f306 100644 (file)
@@ -37,6 +37,8 @@
  *      MediaWiki code base.
  */
 
+use MediaWiki\Interwiki\ClassicInterwikiLookup;
+use MediaWiki\Linker\LinkRendererFactory;
 use MediaWiki\MediaWikiServices;
 
 return [
@@ -91,6 +93,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' ), '.' )
@@ -148,6 +163,22 @@ return [
                );
        },
 
+       'LinkRendererFactory' => function( MediaWikiServices $services ) {
+               return new LinkRendererFactory(
+                       $services->getTitleFormatter()
+               );
+       },
+
+       'LinkRenderer' => function( MediaWikiServices $services ) {
+               global $wgUser;
+
+               if ( defined( 'MW_NO_SESSION' ) ) {
+                       return $services->getLinkRendererFactory()->create();
+               } else {
+                       return $services->getLinkRendererFactory()->createForUser( $wgUser );
+               }
+       },
+
        'GenderCache' => function( MediaWikiServices $services ) {
                return new GenderCache();
        },
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..2c78061 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.
@@ -850,15 +850,20 @@ if ( !defined( 'MW_NO_SESSION' ) && !$wgCommandLineMode ) {
        if ( $sessionUser->getId() === 0 && User::isValidUserName( $sessionUser->getName() ) ) {
                $ps_autocreate = Profiler::instance()->scopedProfileIn( $fname . '-autocreate' );
                if ( $wgDisableAuthManager ) {
-                       MediaWiki\Session\SessionManager::autoCreateUser( $sessionUser );
+                       $res = MediaWiki\Session\SessionManager::autoCreateUser( $sessionUser );
                } else {
-                       MediaWiki\Auth\AuthManager::singleton()->autoCreateUser(
+                       $res = MediaWiki\Auth\AuthManager::singleton()->autoCreateUser(
                                $sessionUser,
-                               MediaWiki\Auth\AuthManager::AUTOCREATE_SOURCE_SESSSION,
+                               MediaWiki\Auth\AuthManager::AUTOCREATE_SOURCE_SESSION,
                                true
                        );
                }
                Profiler::instance()->scopedProfileOut( $ps_autocreate );
+               \MediaWiki\Logger\LoggerFactory::getInstance( 'authmanager' )->info( 'Autocreation attempt', [
+                       'event' => 'autocreate',
+                       'status' => $res,
+               ] );
+               unset( $res );
        }
        unset( $sessionUser );
 }
index f8370e4..d01f269 100644 (file)
@@ -118,6 +118,7 @@ class Status {
        /**
         * Returns the wrapped StatusValue object
         * @return StatusValue
+        * @since 1.27
         */
        public function getStatusValue() {
                return $this->sv;
index 25fbce3..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 != '' ) {
@@ -1714,7 +1729,7 @@ class Title implements LinkTarget {
                                if ( $url === false
                                        && $wgVariantArticlePath
                                        && preg_match( '/^variant=([^&]*)$/', $query, $matches )
-                                       && $wgContLang->getCode() === $this->getPageLanguage()->getCode()
+                                       && $this->getPageLanguage()->equals( $wgContLang )
                                        && $this->getPageLanguage()->hasVariants()
                                ) {
                                        $variant = urldecode( $matches[1] );
@@ -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..515fbfc 100644 (file)
@@ -1,7 +1,6 @@
 <?php
 
 use Liuggio\StatsdClient\Factory\StatsdDataFactoryInterface;
-use MediaWiki\MediaWikiServices;
 use MediaWiki\Linker\LinkTarget;
 use Wikimedia\Assert\Assert;
 
@@ -81,14 +80,12 @@ class WatchedItemStore implements StatsdAwareInterface {
         * @return ScopedCallback to reset the overridden value
         * @throws MWException
         */
-       public function overrideDeferredUpdatesAddCallableUpdateCallback( $callback ) {
+       public function overrideDeferredUpdatesAddCallableUpdateCallback( callable $callback ) {
                if ( !defined( 'MW_PHPUNIT_TEST' ) ) {
                        throw new MWException(
                                'Cannot override DeferredUpdates::addCallableUpdate callback in operation.'
                        );
                }
-               Assert::parameterType( 'callable', $callback, '$callback' );
-
                $previousValue = $this->deferredUpdatesAddCallableUpdateCallback;
                $this->deferredUpdatesAddCallableUpdateCallback = $callback;
                return new ScopedCallback( function() use ( $previousValue ) {
@@ -106,14 +103,12 @@ class WatchedItemStore implements StatsdAwareInterface {
         * @return ScopedCallback to reset the overridden value
         * @throws MWException
         */
-       public function overrideRevisionGetTimestampFromIdCallback( $callback ) {
+       public function overrideRevisionGetTimestampFromIdCallback( callable $callback ) {
                if ( !defined( 'MW_PHPUNIT_TEST' ) ) {
                        throw new MWException(
                                'Cannot override Revision::getTimestampFromId callback in operation.'
                        );
                }
-               Assert::parameterType( 'callable', $callback, '$callback' );
-
                $previousValue = $this->revisionGetTimestampFromIdCallback;
                $this->revisionGetTimestampFromIdCallback = $callback;
                return new ScopedCallback( function() use ( $previousValue ) {
@@ -145,16 +140,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 +674,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)
@@ -697,15 +739,24 @@ class WatchedItemStore implements StatsdAwareInterface {
                        $fname = __METHOD__;
                        $dbw->onTransactionIdle(
                                function () use ( $dbw, $timestamp, $watchers, $target, $fname ) {
-                                       $dbw->update( 'watchlist',
-                                               [ /* SET */
-                                                       'wl_notificationtimestamp' => $dbw->timestamp( $timestamp )
-                                               ], [ /* WHERE */
-                                                       'wl_user' => $watchers,
-                                                       'wl_namespace' => $target->getNamespace(),
-                                                       'wl_title' => $target->getDBkey(),
-                                               ], $fname
-                                       );
+                                       global $wgUpdateRowsPerQuery;
+
+                                       $watchersChunks = array_chunk( $watchers, $wgUpdateRowsPerQuery );
+                                       foreach ( $watchersChunks as $watchersChunk ) {
+                                               $dbw->update( 'watchlist',
+                                                       [ /* SET */
+                                                               'wl_notificationtimestamp' => $dbw->timestamp( $timestamp )
+                                                       ], [ /* WHERE - TODO Use wl_id T130067 */
+                                                               'wl_user' => $watchersChunk,
+                                                               'wl_namespace' => $target->getNamespace(),
+                                                               'wl_title' => $target->getDBkey(),
+                                                       ], $fname
+                                               );
+                                               if ( count( $watchersChunks ) > 1 ) {
+                                                       $dbw->commit( __METHOD__, 'flush' );
+                                                       wfGetLBFactory()->waitForReplication( [ 'wiki' => $dbw->getWikiID() ] );
+                                               }
+                                       }
                                        $this->uncacheLinkTarget( $target );
                                }
                        );
index 2333c78..152a3d2 100644 (file)
@@ -1249,6 +1249,26 @@ HTML;
                $this->ip = $ip;
        }
 
+       /**
+        * Check if this request uses a "safe" HTTP method
+        *
+        * Safe methods are verbs (e.g. GET/HEAD/OPTIONS) used for obtaining content. Such requests
+        * are not expected to mutate content, especially in ways attributable to the client. Verbs
+        * like POST and PUT are typical of non-safe requests which often change content.
+        *
+        * @return bool
+        * @see https://tools.ietf.org/html/rfc7231#section-4.2.1
+        * @see https://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html
+        * @since 1.28
+        */
+       public function hasSafeMethod() {
+               if ( !isset( $_SERVER['REQUEST_METHOD'] ) ) {
+                       return false; // CLI mode
+               }
+
+               return in_array( $_SERVER['REQUEST_METHOD'], [ 'GET', 'HEAD', 'OPTIONS', 'TRACE' ] );
+       }
+
        /**
         * Whether this request should be identified as being "safe"
         *
@@ -1268,21 +1288,15 @@ HTML;
         * @since 1.28
         */
        public function isSafeRequest() {
-               if ( !isset( $_SERVER['REQUEST_METHOD'] ) ) {
-                       return false; // CLI mode
-               }
-
-               if ( $_SERVER['REQUEST_METHOD'] === 'POST' ) {
-                       return $this->markedAsSafe;
-               } elseif ( in_array( $_SERVER['REQUEST_METHOD'], [ 'GET', 'HEAD', 'OPTIONS' ] ) ) {
-                       return true; // HTTP "safe methods"
+               if ( $this->markedAsSafe && $this->wasPosted() ) {
+                       return true; // marked as a "safe" POST
                }
 
-               return false; // PUT/DELETE
+               return $this->hasSafeMethod();
        }
 
        /**
-        * Mark this request is identified as being nullipotent even if it is a POST request
+        * Mark this request as identified as being nullipotent even if it is a POST request
         *
         * POST requests are often used due to the need for a client payload, even if the request
         * is otherwise equivalent to a "safe method" request.
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 b5f7ff2..7be2aa7 100644 (file)
@@ -478,16 +478,18 @@ class InfoAction extends FormlessAction {
                if ( $firstRev ) {
                        $firstRevUser = $firstRev->getUserText( Revision::FOR_THIS_USER );
                        if ( $firstRevUser !== '' ) {
-                               $batch->add( NS_USER, $firstRevUser );
-                               $batch->add( NS_USER_TALK, $firstRevUser );
+                               $firstRevUserTitle = Title::makeTitle( NS_USER, $firstRevUser );
+                               $batch->addObj( $firstRevUserTitle );
+                               $batch->addObj( $firstRevUserTitle->getTalkPage() );
                        }
                }
 
                if ( $lastRev ) {
                        $lastRevUser = $lastRev->getUserText( Revision::FOR_THIS_USER );
                        if ( $lastRevUser !== '' ) {
-                               $batch->add( NS_USER, $lastRevUser );
-                               $batch->add( NS_USER_TALK, $lastRevUser );
+                               $lastRevUserTitle = Title::makeTitle( NS_USER, $lastRevUser );
+                               $batch->addObj( $lastRevUserTitle );
+                               $batch->addObj( $lastRevUserTitle->getTalkPage() );
                        }
                }
 
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 d002da8..3e760fd 100644 (file)
@@ -35,39 +35,61 @@ class RollbackAction extends FormlessAction {
                return 'rollback';
        }
 
+       /**
+        * Temporarily unused message keys due to T88044/T136375:
+        * - confirm-rollback-top
+        * - confirm-rollback-button
+        * - rollbackfailed
+        * - rollback-missingparam
+        */
+
+       /**
+        * @throws ErrorPageError
+        */
        public function onView() {
                // TODO: use $this->useTransactionalTimeLimit(); when POST only
                wfTransactionalTimeLimit();
 
-               $details = null;
-
                $request = $this->getRequest();
                $user = $this->getUser();
+               $from = $request->getVal( 'from' );
+               $rev = $this->page->getRevision();
+               if ( $from === null || $from === '' ) {
+                       throw new ErrorPageError( 'rollbackfailed', 'rollback-missingparam' );
+               }
+               if ( $from !== $rev->getUserText() ) {
+                       throw new ErrorPageError( 'rollbackfailed', 'alreadyrolled', [
+                               $this->getTitle()->getPrefixedText(),
+                               $from,
+                               $rev->getUserText()
+                       ] );
+               }
 
-               $result = $this->page->doRollback(
-                       $request->getVal( 'from' ),
+               $data = null;
+               $errors = $this->page->doRollback(
+                       $from,
                        $request->getText( 'summary' ),
                        $request->getVal( 'token' ),
                        $request->getBool( 'bot' ),
-                       $details,
+                       $data,
                        $this->getUser()
                );
 
-               if ( in_array( [ 'actionthrottledtext' ], $result ) ) {
+               if ( in_array( [ 'actionthrottledtext' ], $errors ) ) {
                        throw new ThrottledError;
                }
 
-               if ( isset( $result[0][0] ) &&
-                       ( $result[0][0] == 'alreadyrolled' || $result[0][0] == 'cantrollback' )
+               if ( isset( $errors[0][0] ) &&
+                       ( $errors[0][0] == 'alreadyrolled' || $errors[0][0] == 'cantrollback' )
                ) {
                        $this->getOutput()->setPageTitle( $this->msg( 'rollbackfailed' ) );
-                       $errArray = $result[0];
+                       $errArray = $errors[0];
                        $errMsg = array_shift( $errArray );
                        $this->getOutput()->addWikiMsgArray( $errMsg, $errArray );
 
-                       if ( isset( $details['current'] ) ) {
+                       if ( isset( $data['current'] ) ) {
                                /** @var Revision $current */
-                               $current = $details['current'];
+                               $current = $data['current'];
 
                                if ( $current->getComment() != '' ) {
                                        $this->getOutput()->addHTML( $this->msg( 'editcomment' )->rawParams(
@@ -79,21 +101,20 @@ class RollbackAction extends FormlessAction {
                }
 
                # NOTE: Permission errors already handled by Action::checkExecute.
-
-               if ( $result == [ [ 'readonlytext' ] ] ) {
+               if ( $errors == [ [ 'readonlytext' ] ] ) {
                        throw new ReadOnlyError;
                }
 
                # XXX: Would be nice if ErrorPageError could take multiple errors, and/or a status object.
-               #     Right now, we only show the first error
-               foreach ( $result as $error ) {
+               #      Right now, we only show the first error
+               foreach ( $errors as $error ) {
                        throw new ErrorPageError( 'rollbackfailed', $error[0], array_slice( $error, 1 ) );
                }
 
                /** @var Revision $current */
-               $current = $details['current'];
-               $target = $details['target'];
-               $newId = $details['newid'];
+               $current = $data['current'];
+               $target = $data['target'];
+               $newId = $data['newid'];
                $this->getOutput()->setPageTitle( $this->msg( 'actioncomplete' ) );
                $this->getOutput()->setRobotPolicy( 'noindex,nofollow' );
 
@@ -121,6 +142,7 @@ class RollbackAction extends FormlessAction {
                        );
                        $de->showDiff( '', '' );
                }
+               return;
        }
 
        protected function getDescription() {
index 806b8d2..0a4b6dc 100644 (file)
@@ -109,9 +109,12 @@ class ApiAMCreateAccount extends ApiBase {
        }
 
        public function getAllowedParams() {
-               return ApiAuthManagerHelper::getStandardParams( AuthManager::ACTION_CREATE,
+               $ret = ApiAuthManagerHelper::getStandardParams( AuthManager::ACTION_CREATE,
                        'requests', 'messageformat', 'mergerequestfields', 'preservestate', 'returnurl', 'continue'
                );
+               $ret['preservestate'][ApiBase::PARAM_HELP_MSG_APPEND][] =
+                       'apihelp-createaccount-param-preservestate';
+               return $ret;
        }
 
        public function dynamicParameterDocumentation() {
index 2997405..e30f22b 100644 (file)
@@ -244,7 +244,7 @@ class ApiAuthManagerHelper {
                        $describe = $req->describeCredentials();
                        $reqInfo = [
                                'id' => $req->getUniqueId(),
-                               'metadata' => $req->getMetadata(),
+                               'metadata' => $req->getMetadata() + [ ApiResult::META_TYPE => 'assoc' ],
                        ];
                        switch ( $req->required ) {
                                case AuthenticationRequest::OPTIONAL:
@@ -283,7 +283,6 @@ class ApiAuthManagerHelper {
        private function formatFields( array $fields ) {
                static $copy = [
                        'type' => true,
-                       'image' => true,
                        'value' => true,
                ];
 
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 54547ef..aea2819 100644 (file)
@@ -56,6 +56,7 @@ class ApiChangeAuthenticationData extends ApiBase {
 
                // Make the change
                $status = $manager->allowsAuthenticationDataChange( $req, true );
+               Hooks::run( 'ChangeAuthenticationDataAudit', [ $req, $status ] );
                if ( !$status->isGood() ) {
                        $this->dieStatus( $status );
                }
index 711234a..cffccb1 100644 (file)
@@ -23,6 +23,7 @@
 use MediaWiki\Auth\AuthManager;
 use MediaWiki\Auth\AuthenticationRequest;
 use MediaWiki\Auth\AuthenticationResponse;
+use MediaWiki\Auth\CreateFromLoginAuthenticationRequest;
 
 /**
  * Log in to the wiki with AuthManager
@@ -90,6 +91,13 @@ class ApiClientLogin extends ApiBase {
                        $res = $manager->beginAuthentication( $reqs, $params['returnurl'] );
                }
 
+               // Remove CreateFromLoginAuthenticationRequest from $res->neededRequests.
+               // It's there so a RESTART treated as UI will work right, but showing
+               // it to the API client is just confusing.
+               $res->neededRequests = ApiAuthManagerHelper::blacklistAuthenticationRequests(
+                       $res->neededRequests, [ CreateFromLoginAuthenticationRequest::class ]
+               );
+
                $this->getResult()->addValue( null, 'clientlogin',
                        $helper->formatAuthenticationResponse( $res ) );
        }
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..ce9587f 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
@@ -439,7 +471,8 @@ class ApiMain extends ApiBase {
                        $this->logRequest( $runTime );
                        if ( $this->mModule->isWriteMode() && $this->getRequest()->wasPosted() ) {
                                $this->getStats()->timing(
-                                       'api.' . $this->getModuleName() . '.executeTiming', 1000 * $runTime );
+                                       'api.' . $this->mModule->getModuleName() . '.executeTiming', 1000 * $runTime
+                               );
                        }
                } catch ( Exception $e ) {
                        $this->handleException( $e );
@@ -730,6 +763,8 @@ class ApiMain extends ApiBase {
                $response = $this->getRequest()->response();
                $out = $this->getOutput();
 
+               $out->addVaryHeader( 'Treat-as-Untrusted' );
+
                $config = $this->getConfig();
 
                if ( $config->get( 'VaryOnXFP' ) ) {
@@ -1356,15 +1391,13 @@ class ApiMain extends ApiBase {
        protected function setRequestExpectations( ApiBase $module ) {
                $limits = $this->getConfig()->get( 'TrxProfilerLimits' );
                $trxProfiler = Profiler::instance()->getTransactionProfiler();
-               if ( $this->getRequest()->wasPosted() ) {
-                       if ( $module->isWriteMode() ) {
-                               $trxProfiler->setExpectations( $limits['POST'], __METHOD__ );
-                       } else {
-                               $trxProfiler->setExpectations( $limits['POST-nonwrite'], __METHOD__ );
-                               $this->getRequest()->markAsSafeRequest();
-                       }
-               } else {
+               if ( $this->getRequest()->hasSafeMethod() ) {
                        $trxProfiler->setExpectations( $limits['GET'], __METHOD__ );
+               } elseif ( $this->getRequest()->wasPosted() && !$module->isWriteMode() ) {
+                       $trxProfiler->setExpectations( $limits['POST-nonwrite'], __METHOD__ );
+                       $this->getRequest()->markAsSafeRequest();
+               } else {
+                       $trxProfiler->setExpectations( $limits['POST'], __METHOD__ );
                }
        }
 
@@ -1645,9 +1678,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 +1701,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 058e0a3..066aaa3 100644 (file)
@@ -30,10 +30,14 @@ use MediaWiki\MediaWikiServices;
  * @ingroup API
  */
 class ApiOpenSearch extends ApiBase {
+       use SearchApi;
 
        private $format = null;
        private $fm = null;
 
+       /** @var array list of api allowed params */
+       private $allowedParams = null;
+
        /**
         * Get the output format
         *
@@ -80,24 +84,13 @@ class ApiOpenSearch extends ApiBase {
        public function execute() {
                $params = $this->extractRequestParams();
                $search = $params['search'];
-               $limit = $params['limit'];
-               $namespaces = $params['namespace'];
                $suggest = $params['suggest'];
-
-               if ( $params['redirects'] === null ) {
-                       // Backwards compatibility, don't resolve for JSON.
-                       $resolveRedir = $this->getFormat() !== 'json';
-               } else {
-                       $resolveRedir = $params['redirects'] === 'resolve';
-               }
-
                $results = [];
-
                if ( !$suggest || $this->getConfig()->get( 'EnableOpenSearchSuggest' ) ) {
                        // Open search results may be stored for a very long time
                        $this->getMain()->setCacheMaxAge( $this->getConfig()->get( 'SearchSuggestCacheExpiry' ) );
                        $this->getMain()->setCacheMode( 'public' );
-                       $this->search( $search, $limit, $namespaces, $resolveRedir, $results );
+                       $results = $this->search( $search, $params );
 
                        // Allow hooks to populate extracts and images
                        Hooks::run( 'ApiOpenSearchSuggest', [ &$results ] );
@@ -117,21 +110,17 @@ class ApiOpenSearch extends ApiBase {
 
        /**
         * Perform the search
-        *
-        * @param string $search Text to search
-        * @param int $limit Maximum items to return
-        * @param array $namespaces Namespaces to search
-        * @param bool $resolveRedir Whether to resolve redirects
-        * @param array &$results Put results here. Keys have to be integers.
+        * @param string $search the search query
+        * @param array $params api request params
+        * @return array search results. Keys are integers.
         */
-       protected function search( $search, $limit, $namespaces, $resolveRedir, &$results ) {
-               $searchEngine = MediaWikiServices::getInstance()->newSearchEngine();
-               $searchEngine->setLimitOffset( $limit );
-               $searchEngine->setNamespaces( $namespaces );
+       private function search( $search, array $params ) {
+               $searchEngine = $this->buildSearchEngine( $params );
                $titles = $searchEngine->extractTitles( $searchEngine->completionSearchWithVariants( $search ) );
+               $results = [];
 
                if ( !$titles ) {
-                       return;
+                       return $results;
                }
 
                // Special pages need unique integer ids in the return list, so we just
@@ -139,6 +128,13 @@ class ApiOpenSearch extends ApiBase {
                // always positive articleIds that non-special pages get.
                $nextSpecialPageId = -1;
 
+               if ( $params['redirects'] === null ) {
+                       // Backwards compatibility, don't resolve for JSON.
+                       $resolveRedir = $this->getFormat() !== 'json';
+               } else {
+                       $resolveRedir = $params['redirects'] === 'resolve';
+               }
+
                if ( $resolveRedir ) {
                        // Query for redirects
                        $redirects = [];
@@ -206,6 +202,8 @@ class ApiOpenSearch extends ApiBase {
                                ];
                        }
                }
+
+               return $results;
        }
 
        /**
@@ -271,7 +269,10 @@ class ApiOpenSearch extends ApiBase {
        }
 
        public function getAllowedParams() {
-               return [
+               if ( $this->allowedParams !== null ) {
+                       return $this->allowedParams;
+               }
+               $this->allowedParams = [
                        'search' => null,
                        'limit' => [
                                ApiBase::PARAM_DFLT => $this->getConfig()->get( 'OpenSearchDefaultLimit' ),
@@ -295,6 +296,20 @@ class ApiOpenSearch extends ApiBase {
                        ],
                        'warningsaserror' => false,
                ];
+
+               $profileParam = $this->buildProfileApiParam( SearchEngine::COMPLETION_PROFILE_TYPE,
+                       'apihelp-query+prefixsearch-param-profile' );
+               if ( $profileParam ) {
+                       $this->allowedParams['profile'] = $profileParam;
+               }
+               return $this->allowedParams;
+       }
+
+       public function getSearchProfileParams() {
+               if ( isset( $this->getAllowedParams()['profile'] ) ) {
+                       return [ SearchEngine::COMPLETION_PROFILE_TYPE => 'profile' ];
+               }
+               return [];
        }
 
        protected function getExamplesMessages() {
index 3ca4c08..ed4d373 100644 (file)
@@ -554,23 +554,34 @@ class ApiQuery extends ApiBase {
        }
 
        public function isReadMode() {
-               // We need to make an exception for ApiQueryTokens so login tokens can
-               // be fetched on private wikis. Restrict that exception as much as
-               // possible: no other modules allowed, and no pageset parameters
-               // either. We do allow the 'rawcontinue' and 'indexpageids' parameters
-               // since frameworks might add these unconditionally and they can't
-               // expose anything here.
+               // We need to make an exception for certain meta modules that should be
+               // accessible even without the 'read' right. Restrict the exception as
+               // much as possible: no other modules allowed, and no pageset
+               // parameters either. We do allow the 'rawcontinue' and 'indexpageids'
+               // parameters since frameworks might add these unconditionally and they
+               // can't expose anything here.
+               $this->mParams = $this->extractRequestParams();
                $params = array_filter(
                        array_diff_key(
-                               $this->extractRequestParams() + $this->getPageSet()->extractRequestParams(),
+                               $this->mParams + $this->getPageSet()->extractRequestParams(),
                                [ 'rawcontinue' => 1, 'indexpageids' => 1 ]
                        )
                );
-               if ( $params === [ 'meta' => [ 'tokens' ] ] ) {
-                       return false;
+               if ( array_keys( $params ) !== [ 'meta' ] ) {
+                       return true;
+               }
+
+               // Ask each module if it requires read mode. Any true => this returns
+               // true.
+               $modules = [];
+               $this->instantiateModules( $modules, 'meta' );
+               foreach ( $modules as $module ) {
+                       if ( $module->isReadMode() ) {
+                               return true;
+                       }
                }
 
-               return true;
+               return false;
        }
 
        protected function getExamplesMessages() {
index f1d787b..e0ba4ea 100644 (file)
@@ -113,15 +113,14 @@ class ApiQueryAllMessages extends ApiQueryBase {
                $customiseFilterEnabled = $params['customised'] !== 'all';
                if ( $customiseFilterEnabled ) {
                        global $wgContLang;
-                       $lang = $langObj->getCode();
 
                        $customisedMessages = AllMessagesTablePager::getCustomisedStatuses(
                                array_map(
                                        [ $langObj, 'ucfirst' ],
                                        $messages_target
                                ),
-                               $lang,
-                               $lang != $wgContLang->getCode()
+                               $langObj->getCode(),
+                               !$langObj->equals( $wgContLang )
                        );
 
                        $customised = $params['customised'] === 'modified';
index b591f9c..1d250e9 100644 (file)
@@ -43,7 +43,6 @@ class ApiQueryAuthManagerInfo extends ApiQueryBase {
                        'canauthenticatenow' => $manager->canAuthenticateNow(),
                        'cancreateaccounts' => $manager->canCreateAccounts(),
                        'canlinkaccounts' => $manager->canLinkAccounts(),
-                       'haspreservedstate' => $helper->getPreservedRequest() !== null,
                ];
 
                if ( $params['securitysensitiveoperation'] !== null ) {
@@ -53,10 +52,27 @@ class ApiQueryAuthManagerInfo extends ApiQueryBase {
                }
 
                if ( $params['requestsfor'] ) {
-                       $reqs = $manager->getAuthenticationRequests( $params['requestsfor'], $this->getUser() );
+                       $action = $params['requestsfor'];
+
+                       $preservedReq = $helper->getPreservedRequest();
+                       if ( $preservedReq ) {
+                               $ret += [
+                                       'haspreservedstate' => $preservedReq->hasStateForAction( $action ),
+                                       'hasprimarypreservedstate' => $preservedReq->hasPrimaryStateForAction( $action ),
+                                       'preservedusername' => (string)$preservedReq->username,
+                               ];
+                       } else {
+                               $ret += [
+                                       'haspreservedstate' => false,
+                                       'hasprimarypreservedstate' => false,
+                                       'preservedusername' => '',
+                               ];
+                       }
+
+                       $reqs = $manager->getAuthenticationRequests( $action, $this->getUser() );
 
                        // Filter out blacklisted requests, depending on the action
-                       switch ( $params['requestsfor'] ) {
+                       switch ( $action ) {
                                case AuthManager::ACTION_CHANGE:
                                        $reqs = ApiAuthManagerHelper::blacklistAuthenticationRequests(
                                                $reqs, $this->getConfig()->get( 'ChangeCredentialsBlacklist' )
@@ -75,8 +91,8 @@ class ApiQueryAuthManagerInfo extends ApiQueryBase {
                $this->getResult()->addValue( [ 'query' ], $this->getModuleName(), $ret );
        }
 
-       public function getCacheMode( $params ) {
-               return 'public';
+       public function isReadMode() {
+               return false;
        }
 
        public function getAllowedParams() {
@@ -95,7 +111,7 @@ class ApiQueryAuthManagerInfo extends ApiQueryBase {
                                        AuthManager::ACTION_UNLINK,
                                ],
                        ],
-               ] + ApiAuthManagerHelper::getStandardParams( '', 'mergerequestfields' );
+               ] + ApiAuthManagerHelper::getStandardParams( '', 'mergerequestfields', 'messageformat' );
        }
 
        protected function getExamplesMessages() {
index 5c50273..46538e0 100644 (file)
@@ -25,6 +25,11 @@ use MediaWiki\MediaWikiServices;
  * @ingroup API
  */
 class ApiQueryPrefixSearch extends ApiQueryGeneratorBase {
+       use SearchApi;
+
+       /** @var array list of api allowed params */
+       private $allowedParams;
+
        public function __construct( $query, $moduleName ) {
                parent::__construct( $query, $moduleName, 'ps' );
        }
@@ -44,12 +49,9 @@ class ApiQueryPrefixSearch extends ApiQueryGeneratorBase {
                $params = $this->extractRequestParams();
                $search = $params['search'];
                $limit = $params['limit'];
-               $namespaces = $params['namespace'];
                $offset = $params['offset'];
 
-               $searchEngine = MediaWikiServices::getInstance()->newSearchEngine();
-               $searchEngine->setLimitOffset( $limit + 1, $offset );
-               $searchEngine->setNamespaces( $namespaces );
+               $searchEngine = $this->buildSearchEngine( $params );
                $titles = $searchEngine->extractTitles( $searchEngine->completionSearchWithVariants( $search ) );
 
                if ( $resultPageSet ) {
@@ -60,7 +62,7 @@ class ApiQueryPrefixSearch extends ApiQueryGeneratorBase {
                                return $current;
                        } );
                        if ( count( $titles ) > $limit ) {
-                               $this->setContinueEnumParameter( 'offset', $offset + $params['limit'] );
+                               $this->setContinueEnumParameter( 'offset', $offset + $limit );
                                array_pop( $titles );
                        }
                        $resultPageSet->populateFromTitles( $titles );
@@ -72,7 +74,7 @@ class ApiQueryPrefixSearch extends ApiQueryGeneratorBase {
                        $count = 0;
                        foreach ( $titles as $title ) {
                                if ( ++$count > $limit ) {
-                                       $this->setContinueEnumParameter( 'offset', $offset + $params['limit'] );
+                                       $this->setContinueEnumParameter( 'offset', $offset + $limit );
                                        break;
                                }
                                $vals = [
@@ -101,29 +103,45 @@ class ApiQueryPrefixSearch extends ApiQueryGeneratorBase {
        }
 
        public function getAllowedParams() {
-                       return [
-                               'search' => [
-                                       ApiBase::PARAM_TYPE => 'string',
-                                       ApiBase::PARAM_REQUIRED => true,
-                               ],
-                               'namespace' => [
-                                       ApiBase::PARAM_DFLT => NS_MAIN,
-                                       ApiBase::PARAM_TYPE => 'namespace',
-                                       ApiBase::PARAM_ISMULTI => true,
-                               ],
-                               'limit' => [
-                                       ApiBase::PARAM_DFLT => 10,
-                                       ApiBase::PARAM_TYPE => 'limit',
-                                       ApiBase::PARAM_MIN => 1,
-                                       // Non-standard value for compatibility with action=opensearch
-                                       ApiBase::PARAM_MAX => 100,
-                                       ApiBase::PARAM_MAX2 => 200,
-                               ],
-                               'offset' => [
-                                       ApiBase::PARAM_DFLT => 0,
-                                       ApiBase::PARAM_TYPE => 'integer',
-                               ],
-                       ];
+               if ( $this->allowedParams !== null ) {
+                       return $this->allowedParams;
+               }
+               $this->allowedParams = [
+                       'search' => [
+                               ApiBase::PARAM_TYPE => 'string',
+                               ApiBase::PARAM_REQUIRED => true,
+                       ],
+                       'namespace' => [
+                               ApiBase::PARAM_DFLT => NS_MAIN,
+                               ApiBase::PARAM_TYPE => 'namespace',
+                               ApiBase::PARAM_ISMULTI => true,
+                       ],
+                       'limit' => [
+                               ApiBase::PARAM_DFLT => 10,
+                               ApiBase::PARAM_TYPE => 'limit',
+                               ApiBase::PARAM_MIN => 1,
+                               // Non-standard value for compatibility with action=opensearch
+                               ApiBase::PARAM_MAX => 100,
+                               ApiBase::PARAM_MAX2 => 200,
+                       ],
+                       'offset' => [
+                               ApiBase::PARAM_DFLT => 0,
+                               ApiBase::PARAM_TYPE => 'integer',
+                       ],
+               ];
+               $profileParam = $this->buildProfileApiParam( SearchEngine::COMPLETION_PROFILE_TYPE,
+                       'apihelp-query+prefixsearch-param-profile' );
+               if ( $profileParam ) {
+                       $this->allowedParams['profile'] = $profileParam;
+               }
+               return $this->allowedParams;
+       }
+
+       public function getSearchProfileParams() {
+               if ( isset( $this->getAllowedParams()['profile'] ) ) {
+                       return [ SearchEngine::COMPLETION_PROFILE_TYPE => 'profile' ];
+               }
+               return [];
        }
 
        protected function getExamplesMessages() {
index 64022ff..b816f43 100644 (file)
@@ -80,8 +80,7 @@ class ApiQueryRevisions extends ApiQueryRevisionsBase {
                        return false;
                }
 
-               return $wgUser->getEditToken(
-                       [ $title->getPrefixedText(), $rev->getUserText() ] );
+               return $wgUser->getEditToken( 'rollback' );
        }
 
        protected function run( ApiPageSet $resultPageSet = null ) {
index f57d3a3..80798a1 100644 (file)
@@ -32,6 +32,10 @@ use MediaWiki\MediaWikiServices;
  * @ingroup API
  */
 class ApiQuerySearch extends ApiQueryGeneratorBase {
+       use SearchApi;
+
+       /** @var array list of api allowed params */
+       private $allowedParams;
 
        /**
         * When $wgSearchType is null, $wgSearchAlternatives[0] is null. Null isn't
@@ -61,8 +65,11 @@ class ApiQuerySearch extends ApiQueryGeneratorBase {
                global $wgContLang;
                $params = $this->extractRequestParams();
 
+               if ( isset( $params['backend'] ) && $params['backend'] == self::BACKEND_NULL_PARAM ) {
+                       unset( $params['backend'] );
+               }
+
                // Extract parameters
-               $limit = $params['limit'];
                $query = $params['search'];
                $what = $params['what'];
                $interwiki = $params['interwiki'];
@@ -80,11 +87,7 @@ class ApiQuerySearch extends ApiQueryGeneratorBase {
                }
 
                // Create search engine instance and set options
-               $type = isset( $params['backend'] ) && $params['backend'] != self::BACKEND_NULL_PARAM ?
-                       $params['backend'] : null;
-               $search = MediaWikiServices::getInstance()->getSearchEngineFactory()->create( $type );
-               $search->setLimitOffset( $limit + 1, $params['offset'] );
-               $search->setNamespaces( $params['namespace'] );
+               $search = $this->buildSearchEngine( $params );
                $search->setFeatureData( 'rewrite', (bool)$params['enablerewrites'] );
 
                $query = $search->transformSearchTerm( $query );
@@ -152,6 +155,7 @@ class ApiQuerySearch extends ApiQueryGeneratorBase {
                $titles = [];
                $count = 0;
                $result = $matches->next();
+               $limit = $params['limit'];
 
                while ( $result ) {
                        if ( ++$count > $limit ) {
@@ -301,7 +305,11 @@ class ApiQuerySearch extends ApiQueryGeneratorBase {
        }
 
        public function getAllowedParams() {
-               $params = [
+               if ( $this->allowedParams !== null ) {
+                       return $this->allowedParams;
+               }
+
+               $this->allowedParams = [
                        'search' => [
                                ApiBase::PARAM_TYPE => 'string',
                                ApiBase::PARAM_REQUIRED => true
@@ -368,13 +376,31 @@ class ApiQuerySearch extends ApiQueryGeneratorBase {
                        if ( $alternatives[0] === null ) {
                                $alternatives[0] = self::BACKEND_NULL_PARAM;
                        }
-                       $params['backend'] = [
+                       $this->allowedParams['backend'] = [
                                ApiBase::PARAM_DFLT => $searchConfig->getSearchType(),
                                ApiBase::PARAM_TYPE => $alternatives,
                        ];
+                       // @todo: support profile selection when multiple
+                       // backends are available. The solution could be to
+                       // merge all possible profiles and let ApiBase
+                       // subclasses do the check. Making ApiHelp and ApiSandbox
+                       // comprehensive might be more difficult.
+               } else {
+                       $profileParam = $this->buildProfileApiParam( SearchEngine::FT_QUERY_INDEP_PROFILE_TYPE,
+                               'apihelp-query+search-param-qiprofile' );
+                       if ( $profileParam ) {
+                               $this->allowedParams['qiprofile'] = $profileParam;
+                       }
                }
 
-               return $params;
+               return $this->allowedParams;
+       }
+
+       public function getSearchProfileParams() {
+               if ( isset( $this->getAllowedParams()['qiprofile'] ) ) {
+                       return [ SearchEngine::FT_QUERY_INDEP_PROFILE_TYPE => 'qiprofile' ];
+               }
+               return [];
        }
 
        protected function getExamplesMessages() {
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 68ec38d..5afb66f 100644 (file)
@@ -262,8 +262,11 @@ class ApiQueryUsers extends ApiQueryBase {
                                } else {
                                        $data[$u]['missing'] = true;
                                        if ( isset( $this->prop['cancreate'] ) && !$this->getConfig()->get( 'DisableAuthManager' ) ) {
-                                               $data[$u]['cancreate'] = MediaWiki\Auth\AuthManager::singleton()->canCreateAccount( $u )
-                                                       ->isGood();
+                                               $status = MediaWiki\Auth\AuthManager::singleton()->canCreateAccount( $u );
+                                               $data[$u]['cancreate'] = $status->isGood();
+                                               if ( !$status->isGood() ) {
+                                                       $data[$u]['cancreateerror'] = $this->getErrorFormatter()->arrayFromStatus( $status );
+                                               }
                                        }
                                }
                        } else {
index 30e40fb..d72c8a4 100644 (file)
@@ -73,6 +73,7 @@ class ApiRemoveAuthenticationData extends ApiBase {
 
                // Perform the removal
                $status = $manager->allowsAuthenticationDataChange( $req, true );
+               Hooks::run( 'ChangeAuthenticationDataAudit', [ $req, $status ] );
                if ( !$status->isGood() ) {
                        $this->dieStatus( $status );
                }
index 55f7143..b9911da 100644 (file)
@@ -45,16 +45,6 @@ class ApiRollback extends ApiBase {
                $user = $this->getUser();
                $params = $this->extractRequestParams();
 
-               // WikiPage::doRollback needs a Web UI token, so get one of those if we
-               // validated based on an API rollback token.
-               $token = $params['token'];
-               if ( $user->matchEditToken( $token, 'rollback', $this->getRequest() ) ) {
-                       $token = $this->getUser()->getEditToken(
-                               $this->getWebUITokenSalt( $params ),
-                               $this->getRequest()
-                       );
-               }
-
                $titleObj = $this->getRbTitle( $params );
                $pageObj = WikiPage::factory( $titleObj );
                $summary = $params['summary'];
@@ -72,15 +62,30 @@ class ApiRollback extends ApiBase {
                $retval = $pageObj->doRollback(
                        $this->getRbUser( $params ),
                        $summary,
-                       $token,
+                       $params['token'],
                        $params['markbot'],
                        $details,
                        $user,
                        $params['tags']
                );
 
+               // We don't care about multiple errors, just report one of them
                if ( $retval ) {
-                       // We don't care about multiple errors, just report one of them
+                       if ( isset( $retval[0][0] ) &&
+                               ( $retval[0][0] == 'alreadyrolled' || $retval[0][0] == 'cantrollback' )
+                       ) {
+                               $error = $retval[0];
+                               $userMessage = $this->msg( $error[0], array_slice( $error, 1 ) );
+                               // dieUsageMsg() doesn't support $extraData
+                               $errorCode = $error[0];
+                               $errorInfo = isset( ApiBase::$messageMap[$errorCode] ) ?
+                                       ApiBase::$messageMap[$errorCode]['info'] :
+                                       $errorCode;
+                               $this->dieUsage( $errorInfo, $errorCode, 0, [
+                                       'messageHtml' => $userMessage->parseAsBlock()
+                               ] );
+                       }
+
                        $this->dieUsageMsg( reset( $retval ) );
                }
 
@@ -97,10 +102,23 @@ class ApiRollback extends ApiBase {
                        'pageid' => intval( $details['current']->getPage() ),
                        'summary' => $details['summary'],
                        'revid' => intval( $details['newid'] ),
+                       // The revision being reverted (previously the current revision of the page)
                        'old_revid' => intval( $details['current']->getID() ),
+                       // The revision being restored (the last revision before revision(s) by the reverted user)
                        'last_revid' => intval( $details['target']->getID() )
                ];
 
+               $oldUser = $details['current']->getUserText( Revision::FOR_THIS_USER );
+               $lastUser = $details['target']->getUserText( Revision::FOR_THIS_USER );
+               $diffUrl = $titleObj->getFullURL( [
+                       'diff' => $info['revid'],
+                       'oldid' => $info['old_revid'],
+                       'diffonly' => '1'
+               ] );
+               $info['messageHtml'] = $this->msg( 'rollback-success-notify' )
+                       ->params( $oldUser, $lastUser, $diffUrl )
+                       ->parseAsBlock();
+
                $this->getResult()->addValue( null, $this->getModuleName(), $info );
        }
 
@@ -148,13 +166,6 @@ class ApiRollback extends ApiBase {
                return 'rollback';
        }
 
-       protected function getWebUITokenSalt( array $params ) {
-               return [
-                       $this->getRbTitle( $params )->getPrefixedText(),
-                       $this->getRbUser( $params )
-               ];
-       }
-
        /**
         * @param array $params
         *
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..6b3c26e 100644 (file)
@@ -46,6 +46,10 @@ class ApiStashEdit extends ApiBase {
                $user = $this->getUser();
                $params = $this->extractRequestParams();
 
+               if ( $user->isBot() ) { // sanity
+                       $this->dieUsage( 'This interface is not supported for bots', 'botsnotsupported' );
+               }
+
                $page = $this->getTitleOrPageId( $params );
                $title = $page->getTitle();
 
@@ -123,6 +127,8 @@ class ApiStashEdit extends ApiBase {
                        $status = 'busy';
                }
 
+               $this->getStats()->increment( "editstash.cache_stores.$status" );
+
                $this->getResult()->addValue( null, $this->getModuleName(), [ 'status' => $status ] );
        }
 
@@ -259,6 +265,10 @@ class ApiStashEdit extends ApiBase {
         * @return stdClass|bool Returns false on cache miss
         */
        public static function checkCache( Title $title, Content $content, User $user ) {
+               if ( $user->isBot() ) {
+                       return false; // bots never stash - don't pollute stats
+               }
+
                $cache = ObjectCache::getLocalClusterInstance();
                $logger = LoggerFactory::getInstance( 'StashEdit' );
                $stats = RequestContext::getMain()->getStats();
@@ -294,9 +304,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 +377,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,13 +404,15 @@ 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( ':', [
+                       // Account for the edit model/text
                        $content->getModel(),
                        $content->getDefaultFormat(),
                        sha1( $content->serialize( $content->getDefaultFormat() ) ),
-                       $user->getId() ?: md5( $user->getName() ), // account for user parser options
-                       $user->getId() ? $user->getDBTouched() : '-' // handle preference change races
+                       // Account for user name related variables like signatures
+                       $user->getId(),
+                       md5( $user->getName() )
                ] ) );
 
                return wfMemcKey( 'prepared-edit', md5( $title->getPrefixedDBkey() ), $hash );
@@ -394,7 +429,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.
diff --git a/includes/api/SearchApi.php b/includes/api/SearchApi.php
new file mode 100644 (file)
index 0000000..139793d
--- /dev/null
@@ -0,0 +1,116 @@
+<?php
+use MediaWiki\MediaWikiServices;
+
+/**
+ * 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
+ */
+
+/**
+ * Traits for API components that use a SearchEngine.
+ * @ingroup API
+ */
+trait SearchApi {
+       /**
+        * Build the profile api param definitions.
+        *
+        * @param string $profileType type of profile to customize
+        * @param string $helpMsg i18n message
+        * @param string|null $backendType SearchEngine backend type or null for default engine
+        * @return array|null the api param definition or null if profiles are
+        * not supported by the searchEngine implementation.
+        */
+       public function buildProfileApiParam( $profileType, $helpMsg, $backendType = null ) {
+               $searchEngine = null;
+               if ( $backendType !== null ) {
+                       $searchEngine = MediaWikiServices::getInstance()
+                               ->getSearchEngineFactory()->create( $backendType );
+               } else {
+                       $searchEngine = MediaWikiServices::getInstance()->newSearchEngine();
+               }
+
+               $profiles = $searchEngine->getProfiles( $profileType );
+               if ( $profiles ) {
+                       $types = [];
+                       $helpMessages = [];
+                       $defaultProfile = null;
+                       foreach ( $profiles as $profile ) {
+                               $types[] = $profile['name'];
+                               if ( isset ( $profile['desc-message'] ) ) {
+                                       $helpMessages[$profile['name']] = $profile['desc-message'];
+                               }
+                               if ( !empty( $profile['default'] ) ) {
+                                       $defaultProfile = $profile['name'];
+                               }
+                       }
+                       return [
+                               ApiBase::PARAM_TYPE => $types,
+                               ApiBase::PARAM_HELP_MSG => $helpMsg,
+                               ApiBase::PARAM_HELP_MSG_PER_VALUE => $helpMessages,
+                               ApiBase::PARAM_DFLT => $defaultProfile,
+                       ];
+               }
+               return null;
+       }
+
+       /**
+        * Build the search engine to use.
+        * If $params is provided then the following searchEngine options
+        * will be set:
+        *  - limit: mandatory
+        *  - offset: optional, if set limit will be incremented by
+        *    one ( to support the continue parameter )
+        *  - namespace: mandatory
+        *  - search engine profiles defined by SearchApi::getSearchProfileParams()
+        * @param string[]|null API request params (must be sanitized by
+        * ApiBase::extractRequestParams() before)
+        * @return SearchEngine the search engine
+        */
+       public function buildSearchEngine( array $params = null ) {
+               if ( $params != null ) {
+                       $type = isset( $params['backend'] ) ? $params['backend'] : null;
+                       $searchEngine = MediaWikiServices::getInstance()->getSearchEngineFactory()->create( $type );
+                       $limit = $params['limit'];
+                       $searchEngine->setNamespaces( $params['namespace'] );
+                       $offset = null;
+                       if ( isset( $params['offset'] ) ) {
+                               // If the API supports offset then it probably
+                               // wants to fetch limit+1 so it can check if
+                               // more results are available to properly set
+                               // the continue param
+                               $offset = $params['offset'];
+                               $limit += 1;
+                       }
+                       $searchEngine->setLimitOffset( $limit, $offset );
+                       foreach ( $this->getSearchProfileParams() as $type => $param ) {
+                               if ( isset( $params[$param] ) ) {
+                                       $searchEngine->setFeatureData( $type, $params[$param] );
+                               }
+                       }
+               } else {
+                       $searchEngine = MediaWikiServices::getInstance()->newSearchEngine();
+               }
+               return $searchEngine;
+       }
+
+       /**
+        * @return string[] the list of supported search profile types. Key is
+        * the profile type and its associated value is the request param.
+        */
+       abstract public function getSearchProfileParams();
+}
index 512ab83..7dcc4fd 100644 (file)
        "apihelp-query+allfileusages-param-dir": "Һанау йүнәлеше.",
        "apihelp-query+allfileusages-example-unique": "Атамаларҙың уҙенсәлекле файлдары исемлеге.",
        "apihelp-query+allfileusages-example-unique-generator": "Төшөп ҡалғандарҙы айырып, барлыҡ исем-һылтанмаларҙы алырға.",
+       "apihelp-query+allfileusages-example-generator": "Һылтанмалы биттәр бар.",
        "apihelp-query+allimages-description": "Бер-бер артлы бөтә образдарҙы һанап сығырға.",
        "apihelp-query+allimages-param-sort": "Сортировкалау үҙенсәлектәре.",
        "apihelp-query+allimages-param-dir": "Һанау йүнәлеше.",
        "apihelp-query+allredirects-param-prefix": "Был мәғәнәнән башланған бар атамаларҙы категориялар буйынса эҙләргә.",
        "apihelp-query+allredirects-param-prop": "Ҡайһы мәғлүмәтте күрһәтергә:",
        "apihelp-query+allredirects-param-namespace": "Һанау өсөн исемдәр арауығы.",
+       "apihelp-query+allredirects-param-limit": "Нисә битте тергеҙергә?",
        "apihelp-query+allredirects-param-dir": "Һанау йүнәлеше.",
        "apihelp-query+allredirects-example-generator": "Һылтанмалы биттәр бар.",
        "apihelp-query+allrevisions-param-start": "Иҫәп күсереү башланған ваҡыт билдәһе",
        "apihelp-query+allrevisions-param-end": "Иҫәп күсереү башланған ваҡыт билдәһе",
        "apihelp-query+allrevisions-param-user": "Бары тик был ҡулланыусының үҙгәртеүҙәр исемлеге.",
        "apihelp-query+allrevisions-param-excludeuser": "Бары тик был ҡулланыусының үҙгәртеүҙәр исемлеге.",
+       "apihelp-query+alltransclusions-param-to": "Һанауҙы туҡтатыу һылтанмаһы атамаһы.",
+       "apihelp-query+alltransclusions-param-prop": "Ҡайһы мәғлүмәтте күрһәтергә:",
+       "apihelp-query+alltransclusions-param-namespace": "Һанау өсөн исемдәр арауығы.",
+       "apihelp-query+alltransclusions-param-limit": "Нисә битте тергеҙергә?",
+       "apihelp-query+alltransclusions-param-dir": "Һанау йүнәлеше.",
        "apihelp-query+alltransclusions-example-generator": "Һылтанмалы биттәр бар.",
        "apihelp-query+allusers-param-from": "Иҫәп күсереү башланған ваҡыт билдәһе",
        "apihelp-query+allusers-param-to": "Иҫәп күсереү башланған ваҡыт билдәһе",
        "apihelp-query+allusers-param-prefix": "Был мәғәнәнән башланған бар атамаларҙы категориялар буйынса эҙләргә.",
+       "apihelp-query+allusers-param-dir": "Сортлау йүнәлештәре.",
        "apihelp-query+allusers-param-prop": "Ҡайһы мәғлүмәтте күрһәтергә:",
        "apihelp-query+backlinks-param-title": "Мөхәриррләү өсөн биттең исеме.<var>$1биттәрҙән</var> бергә файҙаланыу  мөмкин түгел.",
        "apihelp-query+backlinks-param-pageid": "Бит идентифакторын мөхәррирләү өсөн биттәр.  <var>$1title</var> менән бергә ҡулланыла алмайҙар",
index 5402ab4..8c6a71f 100644 (file)
@@ -61,6 +61,7 @@
        "apihelp-compare-param-torev": "Zweite zu vergleichende Version.",
        "apihelp-compare-example-1": "Unterschied zwischen Version 1 und 2 abrufen",
        "apihelp-createaccount-description": "Erstellen eines neuen Benutzerkontos.",
+       "apihelp-createaccount-param-preservestate": "Falls <kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd> für <samp>hasprimarypreservedstate</samp> wahr ausgegeben hat, sollten Anfragen, die als <samp>primary-required</samp> markiert wurden, ausgelassen werden. Falls ein nicht-leerer Wert für <samp>preservedusername</samp> zurückgegeben wurde, muss dieser Benutzername für den Parameter <var>username</var> verwendet werden.",
        "apihelp-createaccount-param-name": "Benutzername.",
        "apihelp-createaccount-param-password": "Passwort (wird ignoriert, wenn <var>$1mailpassword</var> angegeben ist).",
        "apihelp-createaccount-param-domain": "Domain für die externe Authentifizierung (optional).",
        "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+pageswithprop-param-limit": "Die maximale Anzahl zurückzugebender Seiten.",
        "apihelp-query+prefixsearch-param-search": "Such-Zeichenfolge.",
        "apihelp-query+prefixsearch-param-offset": "Anzahl der zu überspringenden Ergebnisse.",
+       "apihelp-query+prefixsearch-param-profile": "Zu verwendendes Suchprofil.",
        "apihelp-query+protectedtitles-param-prop": "Zurückzugebende Eigenschaften:",
        "apihelp-query+querypage-param-limit": "Anzahl der zurückzugebenden Ergebnisse.",
        "apihelp-query+recentchanges-description": "Listet die letzten Änderungen auf.",
        "apihelp-query+search-param-what": "Welcher Suchtyp ausgeführt werden soll.",
        "apihelp-query+search-param-info": "Welche Metadaten zurückgegeben werden sollen.",
        "apihelp-query+search-param-prop": "Eigenschaften zur Rückgabe:",
+       "apihelp-query+search-param-qiprofile": "Zu verwendendes anfrageunabhängiges Profil (wirkt sich auf den Ranking-Algorithmus aus).",
        "apihelp-query+search-paramvalue-prop-wordcount": "Ergänzt den Wortzähler der Seite.",
        "apihelp-query+search-param-limit": "Wie viele Seiten insgesamt zurückgegeben werden sollen.",
        "apihelp-query+search-example-simple": "Nach <kbd>meaning</kbd> suchen.",
        "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 c737355..1ab1bc5 100644 (file)
@@ -2,9 +2,11 @@
        "@metadata": {
                "authors": [
                        "Gorizon",
-                       "Mirzali"
+                       "Mirzali",
+                       "Kumkumuk"
                ]
        },
+       "apihelp-block-description": "Enê karberi bloqe ke",
        "apihelp-createaccount-param-name": "Nameyê karberi.",
        "apihelp-delete-description": "Pele bestere.",
        "apihelp-disabled-description": "Eno modul aktiv niyo.",
@@ -25,6 +27,9 @@
        "apihelp-feedrecentchanges-param-hidebots": "Vurnayışanê botan bınımne.",
        "apihelp-feedrecentchanges-param-hideanons": "Vurnayışanê karberanê anoniman bınımne.",
        "apihelp-feedrecentchanges-param-hideliu": "Vurnayışanê karberanê qeydınan bınımne.",
+       "apihelp-feedrecentchanges-param-tagfilter": "Filtrey etiketi",
+       "apihelp-feedrecentchanges-example-simple": "Vurnayışê peyênan bıvin",
+       "apihelp-feedrecentchanges-example-30days": "Peyni vurnayışanê 30 raco bımosne",
        "apihelp-login-param-name": "Nameyê karberi.",
        "apihelp-login-param-password": "Parola.",
        "apihelp-login-param-domain": "Domain (optional).",
index a802cc7..e4a2c2e 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.",
@@ -60,6 +60,7 @@
        "apihelp-compare-example-1": "Create a diff between revision 1 and 2.",
 
        "apihelp-createaccount-description": "Create a new user account.",
+       "apihelp-createaccount-param-preservestate": "If <kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd> returned true for <samp>hasprimarypreservedstate</samp>, requests marked as <samp>primary-required</samp> should be omitted. If it returned a non-empty value for <samp>preservedusername</samp>, that username must be used for the <var>username</var> parameter.",
        "apihelp-createaccount-example-create": "Start the process of creating user <kbd>Example</kbd> with password <kbd>ExamplePassword</kbd>.",
        "apihelp-createaccount-param-name": "Username.",
        "apihelp-createaccount-param-password": "Password (ignored if <var>$1mailpassword</var> is set).",
        "apihelp-query+prefixsearch-param-limit": "Maximum number of results to return.",
        "apihelp-query+prefixsearch-param-offset": "Number of results to skip.",
        "apihelp-query+prefixsearch-example-simple": "Search for page titles beginning with <kbd>meaning</kbd>.",
+       "apihelp-query+prefixsearch-param-profile": "Search profile to use.",
 
        "apihelp-query+protectedtitles-description": "List all titles protected from creation.",
        "apihelp-query+protectedtitles-param-namespace": "Only list titles in these namespaces.",
        "apihelp-query+search-param-what": "Which type of search to perform.",
        "apihelp-query+search-param-info": "Which metadata to return.",
        "apihelp-query+search-param-prop": "Which properties to return:",
+       "apihelp-query+search-param-qiprofile": "Query independent profile to use (affects ranking algorithm).",
        "apihelp-query+search-paramvalue-prop-size": "Adds the size of the page in bytes.",
        "apihelp-query+search-paramvalue-prop-wordcount": "Adds the word count of the page.",
        "apihelp-query+search-paramvalue-prop-timestamp": "Adds the timestamp of when the page was last edited.",
        "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..657fe3e 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-filterredir": "Cómo filtrar redirecciones. Si se establece a <kbd>nonredirects</kbd> cuando está activo <var>$1redirect</var>, esto sólo se aplica al segundo nivel.",
        "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+backlinks-example-generator": "Obtener información acerca de las páginas enlazadas 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..fa8aa03 100644 (file)
@@ -23,7 +23,9 @@
                        "Umherirrender",
                        "Elfix",
                        "Lbayle",
-                       "Verdy p"
+                       "Verdy p",
+                       "Yasten",
+                       "Trial"
                ]
        },
        "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 +54,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 +63,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’<samp>IHM</samp> 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 +75,8 @@
        "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-param-preservestate": "Si <kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd> renvoyé true pour <samp>hasprimarypreservedstate</samp>, les demandes marquées comme <samp>primary-required</samp> doivent être omises. Si elle a retourné une valeur non vide pour <samp>preservedusername</samp>, ce nom d'utilisateur doit être utilisé pour le paramètre <var>username</var>.",
+       "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+prefixsearch-param-limit": "Nombre maximal de résultats à renvoyer.",
        "apihelp-query+prefixsearch-param-offset": "Nombre de résultats à sauter.",
        "apihelp-query+prefixsearch-example-simple": "Rechercher les titres de page commençant par <kbd>meaning</kbd>.",
+       "apihelp-query+prefixsearch-param-profile": "Rechercher le profil à utiliser.",
        "apihelp-query+protectedtitles-description": "Lister tous les titres protégés en création.",
        "apihelp-query+protectedtitles-param-namespace": "Lister uniquement les titres dans ces espaces de nom.",
        "apihelp-query+protectedtitles-param-level": "Lister uniquement les titres avec ces niveaux de protection.",
        "apihelp-query+search-param-what": "Quel type de recherche effectuer.",
        "apihelp-query+search-param-info": "Quelles métadonnées renvoyer.",
        "apihelp-query+search-param-prop": "Quelles propriétés renvoyer :",
+       "apihelp-query+search-param-qiprofile": "Profil indépendant des requêtes à utiliser (affecte algorithme de classement).",
        "apihelp-query+search-paramvalue-prop-size": "Ajoute la taille de la page en octets.",
        "apihelp-query+search-paramvalue-prop-wordcount": "Ajoute le nombre de mots de la page.",
        "apihelp-query+search-paramvalue-prop-timestamp": "Ajoute l’horodatage de la dernière modification de la page.",
        "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]]</kbd>.\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 be92dc2..65b5c95 100644 (file)
@@ -39,6 +39,8 @@
        "apihelp-block-param-watchuser": "Vixiar a páxina de usuario ou direccións IP e a de conversa deste usuario",
        "apihelp-block-example-ip-simple": "Bloquear dirección IP <kbd>192.0.2.5</kbd> durante tres días coa razón <kbd>Primeiro aviso</kbd>.",
        "apihelp-block-example-user-complex": "Bloquear indefinidamente ó usuario <kbd>Vandal</kbd> coa razón <kbd>Vandalism</kbd>, e impedir a creación de novas contas e envío de correos electrónicos.",
+       "apihelp-changeauthenticationdata-description": "Cambiar os datos de autenticación do usuario actual.",
+       "apihelp-changeauthenticationdata-example-password": "Intento de cambiar o contrasinal do usuario actua a <kbd>ExemploContrasinal</kbd>.",
        "apihelp-checktoken-description": "Verificar a validez dun identificador de <kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd>.",
        "apihelp-checktoken-param-type": "Tipo de identificador a probar.",
        "apihelp-checktoken-param-token": "Símbolo a testar",
@@ -46,6 +48,8 @@
        "apihelp-checktoken-example-simple": "Verificar a validez de un identificador   <kbd>csrf</kbd>.",
        "apihelp-clearhasmsg-description": "Limpar a bandeira <code>hasmsg</code> para o usuario actual",
        "apihelp-clearhasmsg-example-1": "Limpar a bandeira <code>hasmsg</code> para o usuario actual",
+       "apihelp-clientlogin-description": "Conectarse á wiki usando o fluxo interactivo.",
+       "apihelp-clientlogin-example-login": "Comezar o proceso de conexión á wiki como o usuario <kbd>Exemplo</kbd> con contrasinal <kbd>ExemploContrasinal</kbd>.",
        "apihelp-compare-description": "Obter as diferencias entre dúas páxinas.\n\nDebe indicar un número de revisión, un título de páxina, ou un ID de páxina tanto para \"from\" como para \"to\".",
        "apihelp-compare-param-fromtitle": "Primeiro título para comparar.",
        "apihelp-compare-param-fromid": "Identificador da primeira páxina a comparar.",
@@ -55,6 +59,7 @@
        "apihelp-compare-param-torev": "Segunda revisión a comparar.",
        "apihelp-compare-example-1": "Mostrar diferencias entre a revisión 1 e a 2",
        "apihelp-createaccount-description": "Crear unha nova conta de usuario.",
+       "apihelp-createaccount-example-create": "Comezar o proceso de crear un usuario <kbd>Exemplo</kbd> con contrasinal <kbd>ExemploContrasinal</kbd>.",
        "apihelp-createaccount-param-name": "Nome de usuario.",
        "apihelp-createaccount-param-password": "Contrasinal (ignorado se <var>$1mailpassword</var> está activo)",
        "apihelp-createaccount-param-domain": "Dominio para autenticación externa (opcional)",
        "apihelp-import-param-namespace": "Importar a este espazo de nomes. Non se pode usar de forma conxunta con  <var>$1rootpage</var>.",
        "apihelp-import-param-rootpage": "Importar como subpáxina desta páxina. Non se pode usar de forma conxunta con <var>$1namespace</var>.",
        "apihelp-import-example-import": "Importar [[meta:Help:ParserFunctions]] ó espazo de nomes 100 con todo o historial.",
+       "apihelp-linkaccount-description": "Vincular unha conta dun provedor externo ó usuario actual.",
+       "apihelp-linkaccount-example-link": "Comezar o proceso de vincular a unha conta de <kbd>Exemplo</kbd>.",
        "apihelp-login-description": "No caso dunha conexión correcta, as cookies necesarias incluiranse nas cabeceiras HTTP de resposta. No caso dunha conexión fallida, os intentos posteriores poden ser reducidos para limitar ataques automaticos de roubo de contrasinais.",
        "apihelp-login-param-name": "Nome de usuario.",
        "apihelp-login-param-password": "Contrasinal",
        "apihelp-query+allusers-param-activeusers": "Só listar usuarios activos {{PLURAL:$1|no último día|nos $1 últimos días}}.",
        "apihelp-query+allusers-param-attachedwiki": "Con <kbd>$1prop=centralids</kbd>, \ntamén indica se o usuario está acoplado á wiki identificada por este identificador.",
        "apihelp-query+allusers-example-Y": "Listar usuarios que comecen por <kbd>Y</kbd>.",
+       "apihelp-query+authmanagerinfo-description": "Recuperar información sobre o estado de autenticación actual.",
+       "apihelp-query+authmanagerinfo-param-securitysensitiveoperation": "Comprobar se o estado de autenticación actual do usuario é abondo para a operación especificada como sensible dende o punto de vista da seguridade.",
+       "apihelp-query+authmanagerinfo-param-requestsfor": "Recuperar a información sobre as peticións de autenticación necesarias para a acción de autenticación especificada.",
+       "apihelp-query+filerepoinfo-example-login": "Recuperar as peticións que poden ser usadas ó comezo dunha conexión.",
+       "apihelp-query+filerepoinfo-example-login-merged": "Recuperar as peticións que poden ser usadas ó comezo dunha conexión, xunto cos campos de formulario integrados.",
+       "apihelp-query+filerepoinfo-example-securitysensitiveoperation": "Probar se a autenticación é abondo para a acción <kbd>foo</kbd>.",
        "apihelp-query+backlinks-description": "Atopar todas as páxinas que ligan coa páxina dada.",
        "apihelp-query+backlinks-param-title": "Título a buscar. Non pode usarse xunto con <var>$1pageid</var>.",
        "apihelp-query+backlinks-param-pageid": "Identificador de páxina a buscar. Non pode usarse xunto con <var>$1title</var>.",
        "apihelp-query+prefixsearch-param-limit": "Número máximo de resultados a visualizar.",
        "apihelp-query+prefixsearch-param-offset": "Número de resultados a saltar.",
        "apihelp-query+prefixsearch-example-simple": "Buscar títulos de páxina que comecen con <kbd>meaning</kbd>.",
+       "apihelp-query+prefixsearch-param-profile": "Buscar o perfil a usar.",
        "apihelp-query+protectedtitles-description": "Listar todos os títulos protexidos en creación.",
        "apihelp-query+protectedtitles-param-namespace": "Só listar títulos nestes espazos de nomes.",
        "apihelp-query+protectedtitles-param-level": "Só listar títulos con estos niveis de protección.",
        "apihelp-query+search-param-what": "Que tipo de busca lanzar.",
        "apihelp-query+search-param-info": "Que metadatos devolver.",
        "apihelp-query+search-param-prop": "Que propiedades devolver:",
+       "apihelp-query+search-param-qiprofile": "Perfil independente das consultas a usar (afecta ó algoritmo de clasificación).",
        "apihelp-query+search-paramvalue-prop-size": "Engade o tamaño da páxina en bytes.",
        "apihelp-query+search-paramvalue-prop-wordcount": "Engade o número de palabras da páxina.",
        "apihelp-query+search-paramvalue-prop-timestamp": "Engade o selo de tempo da última vez que foi editada a páxina.",
        "apihelp-query+siteinfo-paramvalue-prop-variables": "Devolve unha lista de identificadores de variable.",
        "apihelp-query+siteinfo-paramvalue-prop-protocols": "Devolve unha lista de protocolos que están permitidos nas ligazóns externas.",
        "apihelp-query+siteinfo-paramvalue-prop-defaultoptions": "Devolve os valores por defecto das preferencias de usuario.",
+       "apihelp-query+siteinfo-paramvalue-prop-uploaddialog": "Devolve a configuración do diálogo de subas.",
        "apihelp-query+siteinfo-param-filteriw": "Só devolver entradas locais ou só non locais da correspondencia interwiki.",
        "apihelp-query+siteinfo-param-showalldb": "Listar todos os servidores de base de datos, non só o que teña máis retardo.",
        "apihelp-query+siteinfo-param-numberingroup": "Listar o número de usuarios nos grupos de usuarios.",
        "apihelp-query+users-paramvalue-prop-emailable": "Marca se o usuario pode e quere recibir correos usando [[Special:Emailuser]].",
        "apihelp-query+users-paramvalue-prop-gender": "Marca o xénero do usuario. Devolve \"home\", \"muller\" ou \"descoñecido\".",
        "apihelp-query+users-paramvalue-prop-centralids": "Engade os identificadores centrais e o estado de acoplamento do usuario.",
+       "apihelp-query+users-paramvalue-prop-cancreate": "Indica se unha conta pode ser creada para nomes de usuario válidos pero non rexistrados.",
        "apihelp-query+users-param-attachedwiki": "Con <kbd>$1prop=centralids</kbd>, \nindica que o usuario está acoplado á wiki identificada por este identificador.",
        "apihelp-query+users-param-users": "Lista de usuarios para os que obter información.",
        "apihelp-query+users-param-token": "Usar <kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd> no canto diso.",
        "apihelp-query+watchlistraw-param-totitle": "Título (co prefixo de espazo de nomes) no que rematar de enumerar.",
        "apihelp-query+watchlistraw-example-simple": "Listar páxinas na lista de vixiancia do usuario actual.",
        "apihelp-query+watchlistraw-example-generator": "Buscar a información de páxina das páxinas da lista de vixiancia do usuario actual.",
+       "apihelp-removeauthenticationdata-description": "Elimina os datos de autenticación do usuario actual.",
+       "apihelp-removeauthenticationdata-example-simple": "Intenta eliminar os datos de usuario actual para <kbd>FooAuthenticationRequest</kbd>.",
+       "apihelp-resetpassword-description": "Envía un correo de inicialización de contrasinal a un usuario.",
+       "apihelp-resetpassword-param-user": "Usuario sendo reinicializado.",
+       "apihelp-resetpassword-param-email": "Está reinicializándose o enderezo de correo electrónico do usuario.",
+       "apihelp-resetpassword-param-capture": "Devolve os contrasinais temporais que se enviaron. Require o dereito de usuario <code>passwordreset</code> .",
+       "apihelp-resetpassword-example-user": "Enviar un correo de reinicialización de contrasinal ó usuario <kbd>Exemplo</kbd>.",
+       "apihelp-resetpassword-example-email": "Enviar un correo de reinicialización de contrasinal a todos os usuarios con enderezo de correo electrónico <kbd>usario@exemplo.com</kbd>.",
        "apihelp-revisiondelete-description": "Borrar e restaurar revisións.",
        "apihelp-revisiondelete-param-type": "Tipo de borrado de revisión a ser tratada.",
        "apihelp-revisiondelete-param-target": "Título de páxina para o borrado da revisión, se requerido para o tipo.",
        "apihelp-undelete-param-watchlist": "Engadir ou eliminar a páxina da lista de vixiancia do usuario actual sen condicións, use as preferencias ou non cambie a vixiancia.",
        "apihelp-undelete-example-page": "Restaurar a <kbd>Páxina Principal</kbd>.",
        "apihelp-undelete-example-revisions": "Restaurar dúas revisións de <kbd>Main Page</kbd>.",
+       "apihelp-unlinkaccount-description": "Elimina unha conta vinculada do usuario actual.",
+       "apihelp-unlinkaccount-example-simple": "Tentar eliminar a ligazón do usuario actual co provedor asociado con <kbd>FooAuthenticationRequest</kbd>.",
        "apihelp-upload-description": "Subir un ficheiro, ou obter o estado de subas pedentes.\n\nHai varios métodos dispoñibles:\n*Subir o contido do ficheiro directamente, usando o parámetro <var>$1file</var>.\n*Subir o ficheiro por partes, usando os parámetros <var>$1filesize</var>, <var>$1chunk</var>, e <var>$1offset</var>.\n*Mandar ó servidor MediaWiki que colla un ficheiro dunha URL, usando o parámetro <var>$1url</var>.\n*Completar unha suba anterior que fallou a causa dos avisos, usando o parámetro <var>$1filekey</var>. \nTeña en conta que o HTTP POST debe facerse como suba de ficheiro (p.ex. usando <code>multipart/form-data</code>)cando se envie o <var>$1file</var>.",
        "apihelp-upload-param-filename": "Nome de ficheiro obxectivo.",
        "apihelp-upload-param-comment": "Subir comentario. Tamén usado como texto da páxina inicial para ficheiros novos se non se especifica <var>$1text</var>.",
        "api-help-permissions-granted-to": "{{PLURAL:$1|Concedida a|Concedidas a}}: $2",
        "api-help-right-apihighlimits": "Usar os valores superiores das consultas da API (consultas lentas: $1; consultas rápidas: $2). Os límites para as consultas lentas tamén se aplican ós parámetros multivaluados.",
        "api-help-open-in-apisandbox": "<small>[abrir en zona de probas]</small>",
+       "api-help-authmanagerhelper-messageformat": "Formato a usar para devolver as mensaxes.",
+       "api-help-authmanagerhelper-mergerequestfields": "Fusionar os campos de información para todas as peticións de autenticación nunha táboa.",
+       "api-help-authmanagerhelper-preservestate": "Conservar o estado dun intento previo de conexión fallida, se é posible.",
        "api-credits-header": "Créditos",
        "api-credits": "Desenvolvedores da API:\n* Roan Kattouw (desenvolvedor principal, set. 2007-2009)\n* Victor Vasiliev\n* Bryan Tong Minh\n* Sam Reed\n* Yuri Astrakhan (creador e desenvolvedor principal, set. 2006-sep. 2007)\n* Brad Jorsch (desenvolvedor principal, 2013-actualidade)\n\nEnvía comentarios, suxerencias e preguntas a mediawiki-api@lists.wikimedia.org\nou informa dun erro en https://phabricator.wikimedia.org/."
 }
index 7a842f4..c85a62b 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,8 @@
        "apihelp-compare-param-torev": "גרסה שנייה להשוואה.",
        "apihelp-compare-example-1": "יצירת תיעוד שינוי בין גרסה 1 ל־2.",
        "apihelp-createaccount-description": "יצירת חשבון משתמש חדש.",
+       "apihelp-createaccount-param-preservestate": "אם <kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd> החזיר true עבור <samp>hasprimarypreservedstate</samp>, בקשות שמסומנות בתור <samp>primary-required</samp> אמורות להיות מושמטות. אם מוחזר ערך לא ריק ל־<samp>preservedusername</samp>, שם המשתמש הזה ישמש לפרמטר <var>username</var>.",
+       "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+prefixsearch-param-limit": "מספר התוצאות המרבי להחזרה.",
        "apihelp-query+prefixsearch-param-offset": "מספר תוצאות לדילוג.",
        "apihelp-query+prefixsearch-example-simple": "חיפוש שםות דפים שמתחילים ב־<kbd>meaning</kbd>.",
+       "apihelp-query+prefixsearch-param-profile": "באיזה פרופיל חיפוש להשתמש.",
        "apihelp-query+protectedtitles-description": "לרשום את כל הכותרות שמוגנות מפני יצירה.",
        "apihelp-query+protectedtitles-param-namespace": "לרשום רק כותרות במרחבי השם האלה.",
        "apihelp-query+protectedtitles-param-level": "לרשום רק שמות עם רמת ההגנה הזאת.",
        "apihelp-query+search-param-what": "איזה סוג חיפוש לבצע.",
        "apihelp-query+search-param-info": "אילו מטא־נתונים להחזיר.",
        "apihelp-query+search-param-prop": "אילו מאפיינים להחזיר:",
+       "apihelp-query+search-param-qiprofile": "באיזה פרופיל בלתי־תלוי בשאילתה להשתמש (משפיע על אלגוריתם הדירוג).",
        "apihelp-query+search-paramvalue-prop-size": "הוספת גודל הדף בבתים.",
        "apihelp-query+search-paramvalue-prop-wordcount": "הוספת מניין המילים של הדף.",
        "apihelp-query+search-paramvalue-prop-timestamp": "הוספת חותם־הזמן של העריכה האחרונה של הדף.",
        "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 7a7675d..147a832 100644 (file)
@@ -26,6 +26,7 @@
        "apihelp-checktoken-param-type": "Typo de indicio a testar.",
        "apihelp-checktoken-param-token": "Indicio a testar.",
        "apihelp-createaccount-param-name": "Nomine de usator.",
+       "apihelp-query+prefixsearch-param-profile": "Le profilo de recerca a usar.",
        "apihelp-query+revisions-example-first5-not-localhost": "Obtener le prime 5 versiones del \"Pagina principal\" que non ha essite facite per le usator anonyme \"127.0.0.1\"",
        "api-credits": "Programmatores del API:\n* Roan Kattouw (programmator dirigente Sept. 2007–2009)\n* Victor Vasiliev\n* Bryan Tong Minh\n* Sam Reed\n* Yuri Astrakhan (creator, programmator dirigente Sept. 2006–Sept. 2007)\n* Brad Jorsch (programmator dirigente 2013–presente)\n\nInvia tu commentos, suggestiones e questiones a mediawiki-api@lists.wikimedia.org\no insere un reportage de bug a https://phabricator.wikimedia.org/."
 }
index 6b0cab6..f876b1f 100644 (file)
@@ -12,7 +12,8 @@
                        "Macofe",
                        "Nemo bis",
                        "JackLantern",
-                       "Urielejh"
+                       "Urielejh",
+                       "Matteocng"
                ]
        },
        "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|Documentazione]] (in inglese)\n* [[mw:API:FAQ|FAQ]] (in inglese)\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Mailing list]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Annunci sull'API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Bug & richieste]\n</div>\n<strong>Stato:</strong> tutte le funzioni e caratteristiche mostrate su questa pagina dovrebbero funzionare, ma le API sono ancora in fase attiva di sviluppo, e potrebbero cambiare in qualsiasi momento. Iscriviti alla [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ la mailing list sugli annunci delle API MediaWiki] per essere informato sugli aggiornamenti.\n\n<strong>Istruzioni sbagliate:</strong> quando vengono impartite alle API delle istruzioni sbagliate, un'intestazione HTTP verrà inviata col messaggio \"MediaWiki-API-Error\" e, sia il valore dell'intestazione, sia il codice d'errore, verranno impostati con lo stesso valore. Per maggiori informazioni leggi [[mw:API:Errors_and_warnings|API:Errori ed avvertimenti]] (in inglese).\n\n<strong>Test:</strong> per testare facilmente le richieste API, vedi [[Special:ApiSandbox]].",
@@ -34,6 +35,8 @@
        "apihelp-block-param-watchuser": "Segui la pagina utente e le pagine di discussione utente dell'utente o dell'indirizzo IP.",
        "apihelp-block-example-ip-simple": "Blocca l'indirizzo IP <kbd>192.0.2.5</kbd> per tre giorni con motivazione <kbd>First strike</kbd>.",
        "apihelp-block-example-user-complex": "Blocca l'utente <kbd>Vandal</kbd> a tempo indeterminato con motivazione <kbd>Vandalism</kbd>, e impediscigli la creazione di nuovi account e l'invio di e-mail.",
+       "apihelp-changeauthenticationdata-description": "Modificare i dati di autenticazione per l'utente corrente.",
+       "apihelp-changeauthenticationdata-example-password": "Tentativo di modificare la password dell'utente corrente a <kbd>ExamplePassword</kbd>.",
        "apihelp-checktoken-description": "Verifica la validità di un token da <kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd>.",
        "apihelp-checktoken-param-type": "Tipo di token in corso di test.",
        "apihelp-checktoken-param-token": "Token da testare.",
@@ -41,6 +44,9 @@
        "apihelp-checktoken-example-simple": "Verifica la validità di un token <kbd>csrf</kbd>.",
        "apihelp-clearhasmsg-description": "Cancella il flag <code>hasmsg</code> per l'utente corrente.",
        "apihelp-clearhasmsg-example-1": "Cancella il flag <code>hasmsg</code> per l'utente corrente.",
+       "apihelp-clientlogin-description": "Accedi al wiki utilizzando il flusso interattivo.",
+       "apihelp-clientlogin-example-login": "Avvia il processo di accesso alla wiki come utente <kbd>Example</kbd> con password <kbd>ExamplePassword</kbd>.",
+       "apihelp-clientlogin-example-login2": "Continua l'accesso dopo una risposta dell'<samp>UI</samp> per l'autenticazione a due fattori, fornendo un <var>OATHToken</var> di <kbd>987654</kbd>.",
        "apihelp-compare-description": "Ottieni le differenze tra 2 pagine.\n\nUn numero di revisione, il titolo di una pagina, o un ID di pagina deve essere indicato sia per il \"da\" che per lo \"a\".",
        "apihelp-compare-param-fromtitle": "Primo titolo da confrontare.",
        "apihelp-compare-param-fromid": "Primo ID di pagina da confrontare.",
@@ -50,6 +56,8 @@
        "apihelp-compare-param-torev": "Seconda revisione da confrontare.",
        "apihelp-compare-example-1": "Crea un diff tra revisione 1 e revisione 2.",
        "apihelp-createaccount-description": "Crea un nuovo account utente.",
+       "apihelp-createaccount-param-preservestate": "Se <kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd> ha restituito true per <samp>hasprimarypreservedstate</samp>, le richieste contrassegnate come <samp>primary-required</samp> dovrebbero essere omesse. Se invece ha restituito un valore non vuoto per <samp>preservedusername</samp>, quel nome utente deve essere utilizzato per il parametro <var>username</var>.",
+       "apihelp-createaccount-example-create": "Avvia il processo di creazione utente <kbd>Example</kbd> con password <kbd>ExamplePassword</kbd>.",
        "apihelp-createaccount-param-name": "Nome utente.",
        "apihelp-createaccount-param-password": "Password (verrà ignorata se è impostato <var>$1mailpassword</var>).",
        "apihelp-createaccount-param-domain": "Dominio per l'autenticazione esterna (opzionale).",
        "apihelp-import-param-namespace": "Importa in questo namespace. Non può essere usato insieme a <var>$1rootpage</var>.",
        "apihelp-import-param-rootpage": "Importa come sottopagina di questa pagina. Non può essere usato insieme a <var>$1namespace</var>.",
        "apihelp-import-example-import": "Importa [[meta:Help:ParserFunctions]] nel namespace 100 con cronologia completa.",
+       "apihelp-linkaccount-description": "Collegamento di un'utenza di un provider di terze parti all'utente corrente.",
+       "apihelp-linkaccount-example-link": "Avvia il processo di collegamento ad un'utenza da <kbd>Example</kbd>.",
+       "apihelp-login-description": "Accedi e ottieni i cookie di autenticazione.\n\nQuesta azione deve essere usata esclusivamente in combinazione con [[Special:BotPasswords]]; utilizzarla per l'accesso all'account principale è deprecato e può fallire senza preavviso. Per accedere in modo sicuro all'utenza principale, usa <kbd>[[Special:ApiHelp/clientlogin|action=clientlogin]]</kbd>.",
+       "apihelp-login-description-nobotpasswords": "Accedi e ottieni i cookies di autenticazione.\n\nQuesta azione è deprecata e può fallire senza preavviso. Per accedere in modo sicuro, usa [[Special:ApiHelp/clientlogin|action=clientlogin]].",
+       "apihelp-login-description-nonauthmanager": "Accedi e ottieni i cookie di autenticazione.\n\nIn caso di accesso riuscito, i cookies necessari saranno inclusi nella intestazioni di risposta HTTP. In caso di accesso fallito, ulteriori tentativi potrebbero essere limitati, in modo da contenere gli attacchi automatizzati per indovinare le password.",
        "apihelp-login-param-name": "Nome utente.",
        "apihelp-login-param-password": "Password.",
        "apihelp-login-param-domain": "Dominio (opzionale).",
        "apihelp-query+allusers-param-excludegroup": "Escludi gli utenti nei gruppi indicati.",
        "apihelp-query+allusers-param-prop": "Quali pezzi di informazioni includere:",
        "apihelp-query+allusers-param-limit": "Quanti nomi utente totali restituire.",
+       "apihelp-query+authmanagerinfo-description": "Recupera informazioni circa l'attuale stato di autenticazione.",
+       "apihelp-query+authmanagerinfo-param-securitysensitiveoperation": "Verifica se lo stato di autenticazione dell'utente attuale è sufficiente per la specifica operazione sensibile alla sicurezza.",
+       "apihelp-query+authmanagerinfo-param-requestsfor": "Recupera informazioni circa le richieste di autenticazione necessarie per la specifica azione di autenticazione.",
+       "apihelp-query+filerepoinfo-example-login": "Recupera le richieste che possono essere utilizzate quando si inizia l'accesso.",
+       "apihelp-query+filerepoinfo-example-login-merged": "Recupera le richieste che possono essere utilizzate quando si inizia l'accesso, con i campi del modulo uniti.",
+       "apihelp-query+filerepoinfo-example-securitysensitiveoperation": "Verificare se l'autenticazione è sufficiente per l'azione <kbd>foo</kbd>.",
        "apihelp-query+backlinks-description": "Trova tutte le pagine che puntano a quella specificata.",
        "apihelp-query+backlinks-param-namespace": "Il namespace da elencare.",
        "apihelp-query+backlinks-param-dir": "La direzione in cui elencare.",
        "apihelp-query+userinfo-example-simple": "Ottieni informazioni sull'utente attuale.",
        "apihelp-query+users-description": "Ottieni informazioni su un elenco di utenti.",
        "apihelp-query+users-param-prop": "Quali pezzi di informazioni includere:",
+       "apihelp-query+users-paramvalue-prop-cancreate": "Indica se può essere creata un'utenza per nomi utente validi ma non registrati.",
        "apihelp-query+users-param-users": "Un elenco di utenti di cui ottenere informazioni.",
        "apihelp-query+watchlist-description": "Ottieni le ultime modifiche alle pagine tra gli osservati speciali dell'utente attuale.",
        "apihelp-query+watchlist-param-start": "Il timestamp da cui iniziare l'elenco.",
        "apihelp-query+watchlistraw-param-totitle": "Il titolo (con prefisso namespace) al quale interrompere l'elenco.",
        "apihelp-query+watchlistraw-example-simple": "Elenca le pagine fra gli osservati speciali dell'utente attuale.",
        "apihelp-query+watchlistraw-example-generator": "Recupera le informazioni sulle pagine fra gli osservati speciali dell'utente attuale.",
+       "apihelp-removeauthenticationdata-description": "Rimuove i dati di autenticazione per l'utente corrente.",
+       "apihelp-removeauthenticationdata-example-simple": "Tentativo di rimuovere gli attuali dati utente per <kbd>FooAuthenticationRequest</kbd>.",
+       "apihelp-resetpassword-description": "Invia una mail per reimpostare la password di un utente.",
+       "apihelp-resetpassword-description-noroutes": "Non sono disponibili rotte per la reimpostazione della password.\n\nAbilita le rotte in <var>[[mw:Manual:$wgPasswordResetRoutes|$wgPasswordResetRoutes]]</var> per usare questo modulo.",
+       "apihelp-resetpassword-param-user": "Utente in corso di ripristino.",
+       "apihelp-resetpassword-param-email": "Indirizzo di posta elettronica dell'utente in corso di ripristino.",
+       "apihelp-resetpassword-param-capture": "Restituisce le password temporanee che erano state inviate. Richiede il diritto utente <code>passwordreset</code>.",
+       "apihelp-resetpassword-example-user": "Invia una mail per reimpostare la password all'utente <kbd>Example</kbd>.",
+       "apihelp-resetpassword-example-email": "Invia una mail per reimpostare la password a tutti gli utenti con indirizzo di posta elettronica <kbd>user@example.com</kbd>.",
        "apihelp-revisiondelete-description": "Cancella e ripristina le versioni.",
        "apihelp-revisiondelete-param-type": "Tipo di cancellazione della versione effettuata.",
        "apihelp-revisiondelete-param-hide": "Cosa nascondere per ogni versione.",
        "apihelp-undelete-param-title": "Titolo della pagina da ripristinare.",
        "apihelp-undelete-param-reason": "Motivo per il ripristino.",
        "apihelp-undelete-param-tags": "Modifica etichette da applicare all'elemento del registro delle cancellazioni.",
+       "apihelp-unlinkaccount-description": "Rimuove un'utenza di terze parti collegata all'utente corrente.",
+       "apihelp-unlinkaccount-example-simple": "Tentativo di rimuovere il collegamento dell'utente corrente per il provider associato con <kbd>FooAuthenticationRequest</kbd>.",
        "apihelp-upload-param-watch": "Osserva la pagina.",
        "apihelp-upload-param-file": "Contenuto del file.",
        "apihelp-upload-example-url": "Carica da un URL.",
        "api-help-examples": "{{PLURAL:$1|Esempio|Esempi}}:",
        "api-help-permissions": "{{PLURAL:$1|Permesso|Permessi}}:",
        "api-help-open-in-apisandbox": "<small>[apri in una sandbox]</small>",
+       "api-help-authmanager-general-usage": "La procedura generale per usare questo modulo é:\n# Ottenere i campi disponibili da <kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd> con <kbd>amirequestsfor=$4</kbd>, e un token <kbd>$5</kbd> da <kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd>.\n# Mostra i campi all'utente e ottieni i dati che invia.\n# Esegui un post a questo modulo, fornendo <var>$1returnurl</var> e ogni campo rilevante.\n# Controlla <samp>status</samp> nella response.\n#* Se hai ricevuto <samp>PASS</samp> o <samp>FAIL</samp>, hai finito. L'operazione nel primo caso è andata a buon fine, nel secondo no.\n#* Se hai ricevuto <samp>UI</samp>, mostra i nuovi campi all'utente e ottieni i dati che invia. Esegui un post a questo modulo con <var>$1continue</var> e i campi rilevanti settati, quindi ripeti il punto 4.\n#* Se hai ricevuto <samp>REDIRECT</samp>, dirigi l'utente a <samp>redirecttarget</samp> e aspetta che ritorni a <var>$1returnurl</var>. A quel punto esegui un post a questo modulo con <var>$1continue</var> e ogni campo passato all'URL di ritorno, e ripeti il punto 4.\n#* Se hai ricevuto <samp>RESTART</samp>, vuol dire che l'autenticazione ha funzionato ma non abbiamo un account collegato. Potresti considerare questo caso come <samp>UI</samp> o come <samp>FAIL</samp>.",
+       "api-help-authmanagerhelper-messageformat": "Formato da utilizzare per per la restituzione dei messaggi.",
+       "api-help-authmanagerhelper-preservestate": "Conserva lo stato da un precedente tentativo di accesso non riuscito, se possibile.",
+       "api-help-authmanagerhelper-returnurl": "URL di ritorno per i flussi di autenticazione di terze parti, deve essere assoluto. E' necessario fornirlo, oppure va fornito <var>$1continue</var>.\n\nAlla ricezione di una risposta <samp>REDIRECT</samp>, in genere si apre un browser o una vista web all'URL specificato <samp>redirecttarget</samp> per un flusso di autenticazione di terze parti. Quando questo è completato, la terza parte invierà il browser o la vista web a questo URL. Dovresti estrarre qualsiasi parametro POST o della richiesta dall'URL e passarli come un request <var>$1continue</var> a questo modulo API.",
+       "api-help-authmanagerhelper-additional-params": "Questo modulo accetta parametri aggiuntivi a seconda delle richieste di autenticazione disponibili. Utilizza <kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd> con <kbd>amirequestsfor=$1</kbd> (o una precedente risposta da questo modulo, se applicabile) per determinare le richieste disponibili e i campi usati da queste.",
        "api-credits-header": "Crediti"
 }
index a33dedf..a3a2db4 100644 (file)
@@ -19,8 +19,8 @@
        "apihelp-main-param-action": "수행할 동작",
        "apihelp-main-param-format": "출력값의 형식.",
        "apihelp-main-param-maxlag": "최대 랙은 미디어위키가 데이터베이스 복제된 클러스터에 설치되었을 때 사용될 수 있습니다. 특정한 행동이 사이트 복제 랙을 유발할 때, 이 변수는 클라이언트가 복제 랙이 설정된 숫자 아래로 내려갈 때까지 기다리도록 지시합니다. 과도한 랙의 경우, <samp>maxlag</samp> 오류 코드와 <samp>Waiting for $host: $lag seconds lagged</samp> 메시지가 제공됩니다.<br />[[mw:Manual:Maxlag_parameter|매뉴얼: Maxlag 변수]] 에서 더 많은 정보를 얻을 수 있습니다.",
-       "apihelp-main-param-smaxage": "<code>s-maxage</code> HTTP ìº\90ì\8b\9c ì»¨í\8a¸ë¡¤ í\97¤ë\8d\94를 ì\84¤ì \95í\95©ë\8b\88ë\8b¤. ì\97\90ë\9f¬는 캐시되지 않습니다.",
-       "apihelp-main-param-maxage": "<code>max-age</code> HTTP ìº\90ì\8b\9c ì»¨í\8a¸ë¡¤ í\97¤ë\8d\94를 ì\84¤ì \95í\95©ë\8b\88ë\8b¤. ì\97\90ë\9f¬는 캐시되지 않습니다.",
+       "apihelp-main-param-smaxage": "<code>s-maxage</code> HTTP ìº\90ì\8b\9c ì»¨í\8a¸ë¡¤ í\97¤ë\8d\94를 ì\84¤ì \95í\95©ë\8b\88ë\8b¤. ì\98¤ë¥\98는 캐시되지 않습니다.",
+       "apihelp-main-param-maxage": "<code>max-age</code> HTTP ìº\90ì\8b\9c ì»¨í\8a¸ë¡¤ í\97¤ë\8d\94를 ì\84¤ì \95í\95©ë\8b\88ë\8b¤. ì\98¤ë¥\98는 캐시되지 않습니다.",
        "apihelp-main-param-assert": "<kbd>user</kbd> 플래그가 설정되어 있다면 로그인 여부를 체크하며, <kbd>bot</kbd>  플래그가 설정되어 있다면 봇 사용자 권한이 설정되어 있는지 확인합니다.",
        "apihelp-main-param-requestid": "주어진 요청 값은 응답에 포함됩니다. 요청을 구분하기 위해 사용될 수 있습니다.",
        "apihelp-main-param-servedby": "결과에 요청을 처리한 호스트네임을 포함합니다.",
@@ -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 ad54d42..32e227d 100644 (file)
@@ -51,7 +51,7 @@
        "apihelp-login-param-password": "Senhal.",
        "apihelp-login-param-domain": "Domeni (facultatiu).",
        "apihelp-login-example-login": "Se connectar.",
-       "apihelp-managetags-description": "Efectuar de prètzfaches de gestion relatius a la modificacion de las balisas.",
+       "apihelp-managetags-description": "Efectuar de prètzfaits de gestion relatius a la modificacion de las balisas.",
        "apihelp-move-description": "Desplaçar una pagina.",
        "apihelp-opensearch-param-search": "Cadena de recèrca.",
        "apihelp-parse-example-page": "Analisar una pagina.",
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 9f77e10..89fa617 100644 (file)
@@ -12,7 +12,7 @@
        "apihelp-block-param-nocreate": "د گڼون جوړولو مخ نيول.",
        "apihelp-createaccount-param-name": "کارن-نوم.",
        "apihelp-delete-description": "يو مخ ړنگول.",
-       "apihelp-delete-example-simple": "<kbd>Main Page</kbd> ړنگول.",
+       "apihelp-delete-example-simple": "<kbd>لومړی مخ</kbd> ړنگول.",
        "apihelp-edit-description": "مخونه جوړول او سمول.",
        "apihelp-edit-param-sectiontitle": "د يوې نوې برخې سرليک.",
        "apihelp-edit-param-text": "مخ مېنځپانگه.",
index 6137457..362a473 100644 (file)
@@ -62,6 +62,7 @@
        "apihelp-compare-param-torev": "{{doc-apihelp-param|compare|torev}}",
        "apihelp-compare-example-1": "{{doc-apihelp-example|compare}}",
        "apihelp-createaccount-description": "{{doc-apihelp-description|createaccount}}",
+       "apihelp-createaccount-param-preservestate": "{{doc-apihelp-param|createaccount|preservestate|info=This message is displayed in addition to {{msg-mw|api-help-authmanagerhelper-preservestate}}.}}",
        "apihelp-createaccount-example-create": "{{doc-apihelp-example|createaccount}}",
        "apihelp-createaccount-param-name": "{{doc-apihelp-param|createaccount|name}}\n{{Identical|Username}}",
        "apihelp-createaccount-param-password": "{{doc-apihelp-param|createaccount|password}}",
        "apihelp-query+prefixsearch-param-limit": "{{doc-apihelp-param|query+prefixsearch|limit}}",
        "apihelp-query+prefixsearch-param-offset": "{{doc-apihelp-param|query+prefixsearch|offset}}",
        "apihelp-query+prefixsearch-example-simple": "{{doc-apihelp-example|query+prefixsearch}}",
+       "apihelp-query+prefixsearch-param-profile": "{{doc-apihelp-param|query+prefixsearch|profile|paramvalues=1}}",
        "apihelp-query+protectedtitles-description": "{{doc-apihelp-description|query+protectedtitles}}",
        "apihelp-query+protectedtitles-param-namespace": "{{doc-apihelp-param|query+protectedtitles|namespace}}",
        "apihelp-query+protectedtitles-param-level": "{{doc-apihelp-param|query+protectedtitles|level}}",
        "apihelp-query+search-param-what": "{{doc-apihelp-param|query+search|what}}",
        "apihelp-query+search-param-info": "{{doc-apihelp-param|query+search|info}}",
        "apihelp-query+search-param-prop": "{{doc-apihelp-param|query+search|prop|paramvalues=1}}",
+       "apihelp-query+search-param-qiprofile": "{{doc-apihelp-param|query+search|qiprofile|paramvalues=1}}",
        "apihelp-query+search-paramvalue-prop-size": "{{doc-apihelp-paramvalue|query+search|prop|size}}",
        "apihelp-query+search-paramvalue-prop-wordcount": "{{doc-apihelp-paramvalue|query+search|prop|wordcount}}",
        "apihelp-query+search-paramvalue-prop-timestamp": "{{doc-apihelp-paramvalue|query+search|prop|timestamp}}",
index 04e9a43..5626b70 100644 (file)
@@ -2,9 +2,13 @@
        "@metadata": {
                "authors": [
                        "AntanO",
-                       "கலைவாணன்"
+                       "கலைவாணன்",
+                       "Info-farmer"
                ]
        },
+       "apihelp-main-param-action": "எச்செயலை செயற்படுத்த",
+       "apihelp-main-param-format": "பெற விரும்பும்  கோப்பு வடிவம்",
+       "apihelp-main-param-requestid": "இங்கு கொடுக்கப்படும் மதிப்பானது, விளைவில் இணையும். கோரிக்கைகளை வேறுபடுத்தப் பயன்படலாம்.",
        "apihelp-import-param-namespace": "இதனைப் பெயர்வெளிக்கு இறக்குமதி செய்யவும். <kbd>$1rootpage</kbd> அளவுருவை மீறச்செய்யும்.",
        "apihelp-import-param-rootpage": "இப்பக்கத்தின் துணைப்பக்கமாக இறக்குமதி செய்யவும். <kbd>$1namespace</kbd> அளவுரு வழங்கப்பட்டிருந்தால் இது புறக்கணிக்கப்படும்.",
        "api-help-source": "மூலம்: $1",
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 a525f2e..0802c53 100644 (file)
@@ -10,7 +10,8 @@
                        "Macofe",
                        "Mix Gerder",
                        "Piramidion",
-                       "Andriykopanytsia"
+                       "Andriykopanytsia",
+                       "Максим Підліснюк"
                ]
        },
        "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|Документація]]\n* [[mw:API:FAQ|ЧаПи]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Список розсилки]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Оголошення API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Баґи і запити]\n</div>\n<strong>Статус:</strong> Усі функції, вказані на цій сторінці, мають працювати, але API далі перебуває в активній розробці і може змінитися у будь-який момент. Підпишіться на [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ список розсилки mediawiki-api-announce], щоб помічати оновлення.\n\n<strong>Хибні запити:</strong> Коли до API надсилаються хибні запити, буде відіслано HTTP-шапку з ключем «MediaWiki-API-Error», а тоді і значення шапки, і код помилки, надіслані назад, будуть встановлені з тим же значенням. Більше інформації див. на [[mw:API:Errors_and_warnings|API: Errors and warnings]].\n\n<strong>Тестування:</strong> Для зручності тестування запитів API, див. [[Special:ApiSandbox]].",
@@ -39,6 +40,7 @@
        "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-checktoken-description": "Перевірити коректність токена з <kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd>.",
        "apihelp-checktoken-param-type": "Тип токена, який тестується.",
        "apihelp-checktoken-param-token": "Токен для тесту.",
        "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": "Видати лише локальні або лише нелокальні елементи карти інтервікі.",
        "apihelp-query+siteinfo-param-showalldb": "Перелічити усі сервери баз даних, а не лише той, який робить найбільшу затримку.",
        "apihelp-query+siteinfo-param-numberingroup": "Перераховує кількість користувачів у групах користувачів.",
index 71daba7..8e42964 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+authmanagerinfo-description": "检索有关当前身份验证状态的信息。",
+       "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+prefixsearch-param-limit": "要返回的结果最大数。",
        "apihelp-query+prefixsearch-param-offset": "跳过的结果数。",
        "apihelp-query+prefixsearch-example-simple": "搜索以<kbd>meaning</kbd>开头的页面标题。",
+       "apihelp-query+prefixsearch-param-profile": "搜索要使用的配置文件。",
        "apihelp-query+protectedtitles-description": "列出所有被限制创建的标题。",
        "apihelp-query+protectedtitles-param-namespace": "只列出这些名字空间的标题。",
        "apihelp-query+protectedtitles-param-level": "只列出带这些保护级别的标题。",
        "apihelp-query+search-param-what": "要执行的搜索类型。",
        "apihelp-query+search-param-info": "要返回的元数据。",
        "apihelp-query+search-param-prop": "要返回的属性:",
+       "apihelp-query+search-param-qiprofile": "查询要使用的独立描述(影响排序算法)。",
        "apihelp-query+search-paramvalue-prop-size": "添加页面大小,单位为字节。",
        "apihelp-query+search-paramvalue-prop-wordcount": "添加页面的字数。",
        "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 900d2e5..f5bfc2a 100644 (file)
@@ -34,7 +34,7 @@ abstract class AbstractPasswordPrimaryAuthenticationProvider
        extends AbstractPrimaryAuthenticationProvider
 {
        /** @var bool Whether this provider should ABSTAIN (false) or FAIL (true) on password failure */
-       protected $authoritative = true;
+       protected $authoritative;
 
        private $passwordFactory = null;
 
index efee53c..2ed0d61 100644 (file)
@@ -231,6 +231,17 @@ class AuthManager implements LoggerAwareInterface {
 
        /**
         * Start an authentication flow
+        *
+        * In addition to the AuthenticationRequests returned by
+        * $this->getAuthenticationRequests(), a client might include a
+        * CreateFromLoginAuthenticationRequest from a previous login attempt to
+        * preserve state.
+        *
+        * Instead of the AuthenticationRequests returned by
+        * $this->getAuthenticationRequests(), a client might pass a
+        * CreatedAccountAuthenticationRequest from an account creation that just
+        * succeeded to log in to the just-created account.
+        *
         * @param AuthenticationRequest[] $reqs
         * @param string $returnToUrl Url that REDIRECT responses should eventually
         *  return to.
@@ -344,8 +355,7 @@ class AuthManager implements LoggerAwareInterface {
         * Return values are interpreted as follows:
         * - status FAIL: Authentication failed. If $response->createRequest is
         *   set, that may be passed to self::beginAuthentication() or to
-        *   self::beginAccountCreation() (after adding a username, if necessary)
-        *   to preserve state.
+        *   self::beginAccountCreation() to preserve state.
         * - status REDIRECT: The client should be redirected to the contained URL,
         *   new AuthenticationRequests should be made (if any), then
         *   AuthManager::continueAuthentication() should be called.
@@ -432,6 +442,7 @@ class AuthManager implements LoggerAwareInterface {
                                                case AuthenticationResponse::REDIRECT;
                                                case AuthenticationResponse::UI;
                                                        $this->logger->debug( "Primary login with $id returned $res->status" );
+                                                       $this->fillRequests( $res->neededRequests, self::ACTION_LOGIN, $guessUserName );
                                                        $state['primary'] = $id;
                                                        $state['continueRequests'] = $res->neededRequests;
                                                        $session->setSecret( 'AuthManager::authnState', $state );
@@ -494,6 +505,7 @@ class AuthManager implements LoggerAwareInterface {
                                        case AuthenticationResponse::REDIRECT;
                                        case AuthenticationResponse::UI;
                                                $this->logger->debug( "Primary login with $id returned $res->status" );
+                                               $this->fillRequests( $res->neededRequests, self::ACTION_LOGIN, $guessUserName );
                                                $state['continueRequests'] = $res->neededRequests;
                                                $session->setSecret( 'AuthManager::authnState', $state );
                                                return $res;
@@ -546,6 +558,7 @@ class AuthManager implements LoggerAwareInterface {
                                        );
                                        $ret->neededRequests[] = $ret->createRequest;
                                }
+                               $this->fillRequests( $ret->neededRequests, self::ACTION_LOGIN, null, true );
                                $session->setSecret( 'AuthManager::authnState', [
                                        'reqs' => [], // Will be filled in later
                                        'primary' => null,
@@ -615,6 +628,7 @@ class AuthManager implements LoggerAwareInterface {
                                        case AuthenticationResponse::REDIRECT;
                                        case AuthenticationResponse::UI;
                                                $this->logger->debug( "Secondary login with $id returned " . $res->status );
+                                               $this->fillRequests( $res->neededRequests, self::ACTION_LOGIN, $user->getName() );
                                                $state['secondary'][$id] = false;
                                                $state['continueRequests'] = $res->neededRequests;
                                                $session->setSecret( 'AuthManager::authnState', $state );
@@ -950,6 +964,17 @@ class AuthManager implements LoggerAwareInterface {
 
        /**
         * Start an account creation flow
+        *
+        * In addition to the AuthenticationRequests returned by
+        * $this->getAuthenticationRequests(), a client might include a
+        * CreateFromLoginAuthenticationRequest from a previous login attempt. If
+        * <code>
+        * $createFromLoginAuthenticationRequest->hasPrimaryStateForAction( AuthManager::ACTION_CREATE )
+        * </code>
+        * returns true, any AuthenticationRequest::PRIMARY_REQUIRED requests
+        * should be omitted. If the CreateFromLoginAuthenticationRequest has a
+        * username set, that username must be used for all other requests.
+        *
         * @param User $creator User doing the account creation
         * @param AuthenticationRequest[] $reqs
         * @param string $returnToUrl Url that REDIRECT responses should eventually
@@ -1038,44 +1063,10 @@ class AuthManager implements LoggerAwareInterface {
                if ( $req ) {
                        $state['maybeLink'] = $req->maybeLink;
 
-                       // If we get here, the user didn't submit a form with any of the
-                       // usual AuthenticationRequests that are needed for an account
-                       // creation. So we need to determine if there are any and return a
-                       // UI response if so.
                        if ( $req->createRequest ) {
-                               // We have a createRequest from a
-                               // PrimaryAuthenticationProvider, so don't ask.
-                               $providers = $this->getPreAuthenticationProviders() +
-                                       $this->getSecondaryAuthenticationProviders();
-                       } else {
-                               // We're only preserving maybeLink, so ask for primary fields
-                               // too.
-                               $providers = $this->getPreAuthenticationProviders() +
-                                       $this->getPrimaryAuthenticationProviders() +
-                                       $this->getSecondaryAuthenticationProviders();
-                       }
-                       $reqs = $this->getAuthenticationRequestsInternal(
-                               self::ACTION_CREATE,
-                               [],
-                               $providers
-                       );
-                       // See if we need any requests to begin
-                       foreach ( (array)$reqs as $r ) {
-                               if ( !$r instanceof UsernameAuthenticationRequest &&
-                                       !$r instanceof UserDataAuthenticationRequest &&
-                                       !$r instanceof CreationReasonAuthenticationRequest
-                               ) {
-                                       // Needs some reqs, so request them
-                                       $reqs[] = new CreateFromLoginAuthenticationRequest( $req->createRequest, [] );
-                                       $state['continueRequests'] = $reqs;
-                                       $session->setSecret( 'AuthManager::accountCreationState', $state );
-                                       $session->persist();
-                                       return AuthenticationResponse::newUI( $reqs, wfMessage( 'authmanager-create-from-login' ) );
-                               }
+                               $reqs[] = $req->createRequest;
+                               $state['reqs'][] = $req->createRequest;
                        }
-                       // No reqs needed, so we can just continue.
-                       $req->createRequest->returnToUrl = $returnToUrl;
-                       $reqs = [ $req->createRequest ];
                }
 
                $session->setSecret( 'AuthManager::accountCreationState', $state );
@@ -1213,15 +1204,6 @@ class AuthManager implements LoggerAwareInterface {
                                $req->username = $state['username'];
                        }
 
-                       // If we're coming in from a create-from-login UI response, we need
-                       // to extract the createRequest (if any).
-                       $req = AuthenticationRequest::getRequestByClass(
-                               $reqs, CreateFromLoginAuthenticationRequest::class
-                       );
-                       if ( $req && $req->createRequest ) {
-                               $reqs[] = $req->createRequest;
-                       }
-
                        // Run pre-creation tests, if we haven't already
                        if ( !$state['ranPreTests'] ) {
                                $providers = $this->getPreAuthenticationProviders() +
@@ -1281,6 +1263,7 @@ class AuthManager implements LoggerAwareInterface {
                                                                'user' => $user->getName(),
                                                                'creator' => $creator->getName(),
                                                        ] );
+                                                       $this->fillRequests( $res->neededRequests, self::ACTION_CREATE, null );
                                                        $state['primary'] = $id;
                                                        $state['continueRequests'] = $res->neededRequests;
                                                        $session->setSecret( 'AuthManager::accountCreationState', $state );
@@ -1343,6 +1326,7 @@ class AuthManager implements LoggerAwareInterface {
                                                        'user' => $user->getName(),
                                                        'creator' => $creator->getName(),
                                                ] );
+                                               $this->fillRequests( $res->neededRequests, self::ACTION_CREATE, null );
                                                $state['continueRequests'] = $res->neededRequests;
                                                $session->setSecret( 'AuthManager::accountCreationState', $state );
                                                return $res;
@@ -1438,6 +1422,7 @@ class AuthManager implements LoggerAwareInterface {
                                                        'user' => $user->getName(),
                                                        'creator' => $creator->getName(),
                                                ] );
+                                               $this->fillRequests( $res->neededRequests, self::ACTION_CREATE, null );
                                                $state['secondary'][$id] = false;
                                                $state['continueRequests'] = $res->neededRequests;
                                                $session->setSecret( 'AuthManager::accountCreationState', $state );
@@ -1806,6 +1791,7 @@ class AuthManager implements LoggerAwareInterface {
                                        $this->logger->debug( __METHOD__ . ": Account linking $res->status by $id", [
                                                'user' => $user->getName(),
                                        ] );
+                                       $this->fillRequests( $res->neededRequests, self::ACTION_LINK, $user->getName() );
                                        $state['primary'] = $id;
                                        $state['continueRequests'] = $res->neededRequests;
                                        $session->setSecret( 'AuthManager::accountLinkState', $state );
@@ -1908,6 +1894,7 @@ class AuthManager implements LoggerAwareInterface {
                                        $this->logger->debug( __METHOD__ . ": Account linking $res->status by $id", [
                                                'user' => $user->getName(),
                                        ] );
+                                       $this->fillRequests( $res->neededRequests, self::ACTION_LINK, $user->getName() );
                                        $state['continueRequests'] = $res->neededRequests;
                                        $session->setSecret( 'AuthManager::accountLinkState', $state );
                                        return $res;
@@ -2069,12 +2056,7 @@ class AuthManager implements LoggerAwareInterface {
                }
 
                // Fill in reqs data
-               foreach ( $reqs as $req ) {
-                       $req->action = $providerAction;
-                       if ( $req->username === null ) {
-                               $req->username = $options['username'];
-                       }
-               }
+               $this->fillRequests( $reqs, $providerAction, $options['username'], true );
 
                // For self::ACTION_CHANGE, filter out any that something else *doesn't* allow changing
                if ( $providerAction === self::ACTION_CHANGE || $providerAction === self::ACTION_REMOVE ) {
@@ -2086,6 +2068,24 @@ class AuthManager implements LoggerAwareInterface {
                return array_values( $reqs );
        }
 
+       /**
+        * Set values in an array of requests
+        * @param AuthenticationRequest[] &$reqs
+        * @param string $action
+        * @param string|null $username
+        * @param boolean $forceAction
+        */
+       private function fillRequests( array &$reqs, $action, $username, $forceAction = false ) {
+               foreach ( $reqs as $req ) {
+                       if ( !$req->action || $forceAction ) {
+                               $req->action = $action;
+                       }
+                       if ( $req->username === null ) {
+                               $req->username = $username;
+                       }
+               }
+       }
+
        /**
         * Determine whether a username exists
         * @param string $username
@@ -2124,6 +2124,37 @@ class AuthManager implements LoggerAwareInterface {
                return true;
        }
 
+       /**
+        * Get a provider by ID
+        * @note This is public so extensions can check whether their own provider
+        *  is installed and so they can read its configuration if necessary.
+        *  Other uses are not recommended.
+        * @param string $id
+        * @return AuthenticationProvider|null
+        */
+       public function getAuthenticationProvider( $id ) {
+               // Fast version
+               if ( isset( $this->allAuthenticationProviders[$id] ) ) {
+                       return $this->allAuthenticationProviders[$id];
+               }
+
+               // Slow version: instantiate each kind and check
+               $providers = $this->getPrimaryAuthenticationProviders();
+               if ( isset( $providers[$id] ) ) {
+                       return $providers[$id];
+               }
+               $providers = $this->getSecondaryAuthenticationProviders();
+               if ( isset( $providers[$id] ) ) {
+                       return $providers[$id];
+               }
+               $providers = $this->getPreAuthenticationProviders();
+               if ( isset( $providers[$id] ) ) {
+                       return $providers[$id];
+               }
+
+               return null;
+       }
+
        /**@}*/
 
        /**
@@ -2273,34 +2304,6 @@ class AuthManager implements LoggerAwareInterface {
                return $this->secondaryAuthenticationProviders;
        }
 
-       /**
-        * Get a provider by ID
-        * @param string $id
-        * @return AuthenticationProvider|null
-        */
-       protected function getAuthenticationProvider( $id ) {
-               // Fast version
-               if ( isset( $this->allAuthenticationProviders[$id] ) ) {
-                       return $this->allAuthenticationProviders[$id];
-               }
-
-               // Slow version: instantiate each kind and check
-               $providers = $this->getPrimaryAuthenticationProviders();
-               if ( isset( $providers[$id] ) ) {
-                       return $providers[$id];
-               }
-               $providers = $this->getSecondaryAuthenticationProviders();
-               if ( isset( $providers[$id] ) ) {
-                       return $providers[$id];
-               }
-               $providers = $this->getPreAuthenticationProviders();
-               if ( isset( $providers[$id] ) ) {
-                       return $providers[$id];
-               }
-
-               return null;
-       }
-
        /**
         * @param User $user
         * @param bool|null $remember
@@ -2310,6 +2313,7 @@ class AuthManager implements LoggerAwareInterface {
                $delay = $session->delaySave();
 
                $session->resetId();
+               $session->resetAllTokens();
                if ( $session->canSetUser() ) {
                        $session->setUser( $user );
                }
@@ -2332,7 +2336,7 @@ class AuthManager implements LoggerAwareInterface {
        private function setDefaultUserOptions( User $user, $useContextLang ) {
                global $wgContLang;
 
-               \MediaWiki\Session\SessionManager::singleton()->invalidateSessionsForUser( $user );
+               $user->setToken();
 
                $lang = $useContextLang ? \RequestContext::getMain()->getLanguage() : $wgContLang;
                $user->setOption( 'language', $lang->getPreferredVariant() );
index 9746637..b8e36bc 100644 (file)
@@ -329,7 +329,7 @@ class AuthPluginPrimaryAuthenticationProvider
                                if ( $req->domain === null ) {
                                        return \StatusValue::newGood( 'ignored' );
                                }
-                               if ( !$this->auth->validDomain( $domain ) ) {
+                               if ( !$this->auth->validDomain( $req->domain ) ) {
                                        return \StatusValue::newFatal( 'authmanager-authplugin-setpass-bad-domain' );
                                }
                        }
index 3c19b87..ff4d52e 100644 (file)
@@ -92,14 +92,12 @@ abstract class AuthenticationRequest {
         *     - select: <select>
         *     - checkbox: <input type="checkbox">
         *     - multiselect: More a grid of checkboxes than <select multi>
-        *     - button: <input type="image"> if 'image' is set, otherwise <input type="submit">
-        *       (uses 'label' as button text)
+        *     - button: <input type="submit"> (uses 'label' as button text)
         *     - hidden: Not visible to the user, but needs to be preserved for the next request
         *     - null: No widget, just display the 'label' message.
         *  - options: (array) Maps option values to Messages for the
         *      'select' and 'multiselect' types.
         *  - value: (string) Value (for 'null' and 'hidden') or default value (for other types).
-        *  - image: (string) URL of an image to use in connection with the input
         *  - label: (Message) Text suitable for a label in an HTML form
         *  - help: (Message) Text suitable as a description of what the field is
         *  - optional: (bool) If set and truthy, the field may be left empty
@@ -281,6 +279,21 @@ abstract class AuthenticationRequest {
        public static function mergeFieldInfo( array $reqs ) {
                $merged = [];
 
+               // fields that are required by some primary providers but not others are not actually required
+               $primaryRequests = array_filter( $reqs, function ( $req ) {
+                       return $req->required === AuthenticationRequest::PRIMARY_REQUIRED;
+               } );
+               $sharedRequiredPrimaryFields = array_reduce( $primaryRequests, function ( $shared, $req ) {
+                       $required = array_keys( array_filter( $req->getFieldInfo(), function ( $options ) {
+                               return empty( $options['optional'] );
+                       } ) );
+                       if ( $shared === null ) {
+                               return $required;
+                       } else {
+                               return array_intersect( $shared, $required );
+                       }
+               }, null );
+
                foreach ( $reqs as $req ) {
                        $info = $req->getFieldInfo();
                        if ( !$info ) {
@@ -288,8 +301,14 @@ abstract class AuthenticationRequest {
                        }
 
                        foreach ( $info as $name => $options ) {
-                               if ( $req->required !== self::REQUIRED ) {
+                               if (
                                        // If the request isn't required, its fields aren't required either.
+                                       $req->required === self::OPTIONAL
+                                       // If there is a primary not requiring this field, no matter how many others do,
+                                       // authentication can proceed without it.
+                                       || $req->required === self::PRIMARY_REQUIRED
+                                               && !in_array( $name, $sharedRequiredPrimaryFields, true )
+                               ) {
                                        $options['optional'] = true;
                                } else {
                                        $options['optional'] = !empty( $options['optional'] );
index db01825..5048cf8 100644 (file)
@@ -83,13 +83,14 @@ class AuthenticationResponse {
        /**
         * @var AuthenticationRequest|null
         *
-        * Returned with a PrimaryAuthenticationProvider login FAIL, this holds a
-        * request that should result in a PASS when passed to that provider's
-        * PrimaryAuthenticationProvider::beginPrimaryAccountCreation().
+        * Returned with a PrimaryAuthenticationProvider login FAIL or a PASS with
+        * no username, this holds a request that should result in a PASS when
+        * passed to that provider's PrimaryAuthenticationProvider::beginPrimaryAccountCreation().
         *
-        * Returned with an AuthManager login FAIL or RESTART, this holds a request
-        * that may be passed to AuthManager::beginCreateAccount() after setting
-        * its ->returnToUrl property. It may also be passed to
+        * Returned with an AuthManager login FAIL or RESTART, this holds a
+        * CreateFromLoginAuthenticationRequest that may be passed to
+        * AuthManager::beginCreateAccount(), possibly in place of any
+        * "primary-required" requests. It may also be passed to
         * AuthManager::beginAuthentication() to preserve state.
         */
        public $createRequest = null;
index 180aaae..57f1e6b 100644 (file)
@@ -50,7 +50,10 @@ class ConfirmLinkSecondaryAuthenticationProvider extends AbstractSecondaryAuthen
                if ( !is_array( $state ) ) {
                        return AuthenticationResponse::newAbstain();
                }
-               $maybeLink = $state['maybeLink'];
+
+               $maybeLink = array_filter( $state['maybeLink'], function ( $req ) {
+                       return $this->manager->allowsAuthenticationDataChange( $req )->isGood();
+               } );
                if ( !$maybeLink ) {
                        return AuthenticationResponse::newAbstain();
                }
@@ -134,7 +137,7 @@ class ConfirmLinkSecondaryAuthenticationProvider extends AbstractSecondaryAuthen
                                $combinedStatus->error( wfMessage( 'authprovider-confirmlink-success-line', $description ) );
                        } else {
                                $combinedStatus->error( wfMessage(
-                                       'authprovider-confirmlink-failure-line', $description, $status->getMessage()->text()
+                                       'authprovider-confirmlink-failed-line', $description, $status->getMessage()->text()
                                ) );
                        }
                }
index 949302d..ddeb13d 100644 (file)
@@ -25,7 +25,8 @@ namespace MediaWiki\Auth;
  * This transfers state between the login and account creation flows.
  *
  * AuthManager::getAuthenticationRequests() won't return this type, but it
- * may be passed to AuthManager::beginAccountCreation() anyway.
+ * may be passed to AuthManager::beginAuthentication() or
+ * AuthManager::beginAccountCreation() anyway.
  *
  * @ingroup Auth
  * @since 1.27
@@ -50,6 +51,7 @@ class CreateFromLoginAuthenticationRequest extends AuthenticationRequest {
        ) {
                $this->createRequest = $createRequest;
                $this->maybeLink = $maybeLink;
+               $this->username = $createRequest ? $createRequest->username : null;
        }
 
        public function getFieldInfo() {
@@ -59,4 +61,36 @@ class CreateFromLoginAuthenticationRequest extends AuthenticationRequest {
        public function loadFromSubmission( array $data ) {
                return true;
        }
+
+       /**
+        * Indicate whether this request contains any state for the specified
+        * action.
+        * @param string $action One of the AuthManager::ACTION_* constants
+        * @return boolean
+        */
+       public function hasStateForAction( $action ) {
+               switch ( $action ) {
+                       case AuthManager::ACTION_LOGIN:
+                               return (bool)$this->maybeLink;
+                       case AuthManager::ACTION_CREATE:
+                               return $this->maybeLink || $this->createRequest;
+                       default:
+                               return false;
+               }
+       }
+
+       /**
+        * Indicate whether this request contains state for the specified
+        * action sufficient to replace other primary-required requests.
+        * @param string $action One of the AuthManager::ACTION_* constants
+        * @return boolean
+        */
+       public function hasPrimaryStateForAction( $action ) {
+               switch ( $action ) {
+                       case AuthManager::ACTION_CREATE:
+                               return (bool)$this->createRequest;
+                       default:
+                               return false;
+               }
+       }
 }
index 1711aec..146470e 100644 (file)
@@ -10,6 +10,8 @@ class CreationReasonAuthenticationRequest extends AuthenticationRequest {
        /** @var string Account creation reason (only used when creating for someone else) */
        public $reason;
 
+       public $required = self::OPTIONAL;
+
        public function getFieldInfo() {
                return [
                        'reason' => [
index 2e51cf2..dd97830 100644 (file)
@@ -95,12 +95,12 @@ class ResetPasswordSecondaryAuthenticationProvider extends AbstractSecondaryAuth
                        }
                }
 
-               if ( isset( $data->req ) ) {
-                       $needReq = $data->req;
-               } else {
-                       $needReq = new PasswordAuthenticationRequest();
+               $needReq = isset( $data->req ) ? $data->req : new PasswordAuthenticationRequest();
+               if ( !$needReq->action ) {
                        $needReq->action = AuthManager::ACTION_CHANGE;
                }
+               $needReq->required = $data->hard ? AuthenticationRequest::REQUIRED
+                       : AuthenticationRequest::OPTIONAL;
                $needReqs = [ $needReq ];
                if ( !$data->hard ) {
                        $needReqs[] = new ButtonAuthenticationRequest(
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 cdf00c7..bb78aa0 100644 (file)
@@ -124,11 +124,10 @@ class HTMLFileCache extends FileCacheBase {
                $user = $context->getUser();
                // Check for non-standard user language; this covers uselang,
                // and extensions for auto-detecting user language.
-               $ulang = $context->getLanguage()->getCode();
-               $clang = $wgContLang->getCode();
+               $ulang = $context->getLanguage();
 
                // Check that there are no other sources of variation
-               if ( $user->getId() || $user->getNewtalk() || $ulang != $clang ) {
+               if ( $user->getId() || $user->getNewtalk() || $ulang->equals( $wgContLang ) ) {
                        return false;
                }
                // Allow extensions to disable caching
index a7dd570..ec37dd6 100644 (file)
@@ -21,6 +21,7 @@
  * @ingroup Cache
  */
 use MediaWiki\Linker\LinkTarget;
+use MediaWiki\MediaWikiServices;
 
 /**
  * Class representing a list of titles
@@ -72,8 +73,8 @@ class LinkBatch {
         * @param string $dbkey
         */
        public function add( $ns, $dbkey ) {
-               if ( $ns < 0 ) {
-                       return;
+               if ( $ns < 0 || $dbkey === '' ) {
+                       return; // T137083
                }
                if ( !array_key_exists( $ns, $this->data ) ) {
                        $this->data[$ns] = [];
@@ -116,7 +117,7 @@ class LinkBatch {
         * @return array Mapping PDBK to ID
         */
        public function execute() {
-               $linkCache = LinkCache::singleton();
+               $linkCache = MediaWikiServices::getInstance()->getLinkCache();
 
                return $this->executeInto( $linkCache );
        }
@@ -151,23 +152,26 @@ class LinkBatch {
                        return [];
                }
 
+               $titleFormatter = MediaWikiServices::getInstance()->getTitleFormatter();
                // For each returned entry, add it to the list of good links, and remove it from $remaining
 
                $ids = [];
                $remaining = $this->data;
                foreach ( $res as $row ) {
-                       $title = Title::makeTitle( $row->page_namespace, $row->page_title );
+                       $title = new TitleValue( (int)$row->page_namespace, $row->page_title );
                        $cache->addGoodLinkObjFromRow( $title, $row );
-                       $ids[$title->getPrefixedDBkey()] = $row->page_id;
+                       $pdbk = $titleFormatter->getPrefixedDBkey( $title );
+                       $ids[$pdbk] = $row->page_id;
                        unset( $remaining[$row->page_namespace][$row->page_title] );
                }
 
                // The remaining links in $data are bad links, register them as such
                foreach ( $remaining as $ns => $dbkeys ) {
                        foreach ( $dbkeys as $dbkey => $unused ) {
-                               $title = Title::makeTitle( $ns, $dbkey );
+                               $title = new TitleValue( (int)$ns, (string)$dbkey );
                                $cache->addBadLinkObj( $title );
-                               $ids[$title->getPrefixedDBkey()] = 0;
+                               $pdbk = $titleFormatter->getPrefixedDBkey( $title );
+                               $ids[$pdbk] = 0;
                        }
                }
 
@@ -218,7 +222,7 @@ class LinkBatch {
                        return false;
                }
 
-               $genderCache = GenderCache::singleton();
+               $genderCache = MediaWikiServices::getInstance()->getGenderCache();
                $genderCache->doLinkBatch( $this->data, $this->caller );
 
                return true;
index de44f9b..3fd29f3 100644 (file)
@@ -230,7 +230,9 @@ class LinkCache {
         */
        public function addLinkObj( LinkTarget $nt ) {
                $key = $this->titleFormatter->getPrefixedDBkey( $nt );
-               if ( $this->isBadLink( $key ) || $nt->isExternal() ) {
+               if ( $this->isBadLink( $key ) || $nt->isExternal()
+                       || $nt->inNamespace( NS_SPECIAL )
+               ) {
                        return 0;
                }
                $id = $this->getGoodLinkID( $key );
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 cf97afb..9948040 100644 (file)
@@ -21,6 +21,8 @@
  *
  * @file
  */
+use MediaWiki\Linker\LinkRenderer;
+use MediaWiki\MediaWikiServices;
 
 class ChangesList extends ContextSource {
        /**
@@ -39,6 +41,11 @@ class ChangesList extends ContextSource {
        /** @var BagOStuff */
        protected $watchMsgCache;
 
+       /**
+        * @var LinkRenderer
+        */
+       protected $linkRenderer;
+
        /**
         * Changeslist constructor
         *
@@ -54,6 +61,7 @@ class ChangesList extends ContextSource {
                }
                $this->preCacheMessages();
                $this->watchMsgCache = new HashBagOStuff( [ 'maxKeys' => 50 ] );
+               $this->linkRenderer = MediaWikiServices::getInstance()->getLinkRenderer();
        }
 
        /**
@@ -337,8 +345,10 @@ class ChangesList extends ContextSource {
         */
        public function insertLog( &$s, $title, $logtype ) {
                $page = new LogPage( $logtype );
-               $logname = $page->getName()->setContext( $this->getContext() )->escaped();
-               $s .= $this->msg( 'parentheses' )->rawParams( Linker::linkKnown( $title, $logname ) )->escaped();
+               $logname = $page->getName()->setContext( $this->getContext() )->text();
+               $s .= $this->msg( 'parentheses' )->rawParams(
+                       $this->linkRenderer->makeKnownLink( $title, $logname )
+               )->escaped();
        }
 
        /**
@@ -363,10 +373,10 @@ class ChangesList extends ContextSource {
                                'oldid' => $rc->mAttribs['rc_last_oldid']
                        ];
 
-                       $diffLink = Linker::linkKnown(
+                       $diffLink = $this->linkRenderer->makeKnownLink(
                                $rc->getTitle(),
-                               $this->message['diff'],
-                               [ 'tabindex' => $rc->counter ],
+                               new HtmlArmor( $this->message['diff'] ),
+                               [],
                                $query
                        );
                }
@@ -375,9 +385,9 @@ class ChangesList extends ContextSource {
                } else {
                        $diffhist = $diffLink . $this->message['pipe-separator'];
                        # History link
-                       $diffhist .= Linker::linkKnown(
+                       $diffhist .= $this->linkRenderer->makeKnownLink(
                                $rc->getTitle(),
-                               $this->message['hist'],
+                               new HtmlArmor( $this->message['hist'] ),
                                [],
                                [
                                        'curid' => $rc->mAttribs['rc_cur_id'],
@@ -415,7 +425,7 @@ class ChangesList extends ContextSource {
                        $params = [ 'redirect' => 'no' ];
                }
 
-               $articlelink = Linker::link(
+               $articlelink = $this->linkRenderer->makeLink(
                        $rc->getTitle(),
                        null,
                        [ 'class' => 'mw-changeslist-title' ],
index 1070877..099a295 100644 (file)
@@ -54,7 +54,8 @@ class EnhancedChangesList extends ChangesList {
                // message is set by the parent ChangesList class
                $this->cacheEntryFactory = new RCCacheEntryFactory(
                        $context,
-                       $this->message
+                       $this->message,
+                       $this->linkRenderer
                );
        }
 
@@ -390,9 +391,9 @@ class EnhancedChangesList extends ChangesList {
                } elseif ( !ChangesList::userCan( $rcObj, Revision::DELETED_TEXT, $this->getUser() ) ) {
                        $link = '<span class="history-deleted">' . $rcObj->timestamp . '</span> ';
                } else {
-                       $link = Linker::linkKnown(
+                       $link = $this->linkRenderer->makeKnownLink(
                                $rcObj->getTitle(),
-                               $rcObj->timestamp,
+                               new HtmlArmor( $rcObj->timestamp ),
                                [],
                                $params
                        );
@@ -524,26 +525,24 @@ class EnhancedChangesList extends ChangesList {
                        ) {
                                $links['total-changes'] = $nchanges[$n];
                        } else {
-                               $links['total-changes'] = Linker::link(
+                               $links['total-changes'] = $this->linkRenderer->makeKnownLink(
                                        $block0->getTitle(),
-                                       $nchanges[$n],
+                                       new HtmlArmor( $nchanges[$n] ),
                                        [],
                                        $queryParams + [
                                                'diff' => $currentRevision,
                                                'oldid' => $last->mAttribs['rc_last_oldid'],
-                                       ],
-                                       [ 'known', 'noclasses' ]
+                                       ]
                                );
                                if ( $sinceLast > 0 && $sinceLast < $n ) {
-                                       $links['total-changes-since-last'] = Linker::link(
+                                       $links['total-changes-since-last'] = $this->linkRenderer->makeKnownLink(
                                                        $block0->getTitle(),
-                                                       $sinceLastVisitMsg[$sinceLast],
+                                                       new HtmlArmor( $sinceLastVisitMsg[$sinceLast] ),
                                                        [],
                                                        $queryParams + [
                                                                'diff' => $currentRevision,
                                                                'oldid' => $unvisitedOldid,
-                                                       ],
-                                                       [ 'known', 'noclasses' ]
+                                                       ]
                                                );
                                }
                        }
@@ -558,9 +557,9 @@ class EnhancedChangesList extends ChangesList {
                        $params = $queryParams;
                        $params['action'] = 'history';
 
-                       $links['history'] = Linker::linkKnown(
+                       $links['history'] = $this->linkRenderer->makeKnownLink(
                                        $block0->getTitle(),
-                                       $this->message['enhancedrc-history'],
+                                       new HtmlArmor( $this->message['enhancedrc-history'] ),
                                        [],
                                        $params
                                );
@@ -618,9 +617,11 @@ class EnhancedChangesList extends ChangesList {
                if ( $logType ) {
                        $logPage = new LogPage( $logType );
                        $logTitle = SpecialPage::getTitleFor( 'Log', $logType );
-                       $logName = $logPage->getName()->escaped();
+                       $logName = $logPage->getName()->text();
                        $data['logLink'] = $this->msg( 'parentheses' )
-                               ->rawParams( Linker::linkKnown( $logTitle, $logName ) )->escaped();
+                               ->rawParams(
+                                       $this->linkRenderer->makeKnownLink( $logTitle, $logName )
+                               )->escaped();
                } else {
                        $data['articleLink'] = $this->getArticleLink( $rcObj, $rcObj->unpatrolled, $rcObj->watched );
                }
@@ -710,9 +711,10 @@ class EnhancedChangesList extends ChangesList {
                }
 
                $retVal = ' ' . $this->msg( 'parentheses' )
-                               ->rawParams( $rc->difflink . $this->message['pipe-separator'] . Linker::linkKnown(
+                               ->rawParams( $rc->difflink . $this->message['pipe-separator']
+                                       . $this->linkRenderer->makeKnownLink(
                                                $pageTitle,
-                                               $this->message['hist'],
+                                               new HtmlArmor( $this->message['hist'] ),
                                                [],
                                                $query
                                        ) )->escaped();
index 4c003d3..2c5c8b1 100644 (file)
@@ -19,6 +19,7 @@
  *
  * @file
  */
+use MediaWiki\Linker\LinkRenderer;
 
 class RCCacheEntryFactory {
 
@@ -28,13 +29,22 @@ class RCCacheEntryFactory {
        /* @var string[] */
        private $messages;
 
+       /**
+        * @var LinkRenderer
+        */
+       private $linkRenderer;
+
        /**
         * @param IContextSource $context
         * @param string[] $messages
+        * @param LinkRenderer $linkRenderer
         */
-       public function __construct( IContextSource $context, $messages ) {
+       public function __construct(
+               IContextSource $context, $messages, LinkRenderer $linkRenderer
+       ) {
                $this->context = $context;
                $this->messages = $messages;
+               $this->linkRenderer = $linkRenderer;
        }
 
        /**
@@ -99,7 +109,7 @@ class RCCacheEntryFactory {
 
                // New unpatrolled pages
                if ( $cacheEntry->unpatrolled && $type == RC_NEW ) {
-                       $clink = Linker::linkKnown( $cacheEntry->getTitle() );
+                       $clink = $this->linkRenderer->makeKnownLink( $cacheEntry->getTitle() );
                // Log entries
                } elseif ( $type == RC_LOG ) {
                        $logType = $cacheEntry->mAttribs['rc_log_type'];
@@ -108,7 +118,7 @@ class RCCacheEntryFactory {
                                $clink = $this->getLogLink( $logType );
                        } else {
                                wfDebugLog( 'recentchanges', 'Unexpected log entry with no log type in recent changes' );
-                               $clink = Linker::link( $cacheEntry->getTitle() );
+                               $clink = $this->linkRenderer->makeLink( $cacheEntry->getTitle() );
                        }
                // Log entries (old format) and special pages
                } elseif ( $cacheEntry->mAttribs['rc_namespace'] == NS_SPECIAL ) {
@@ -116,7 +126,7 @@ class RCCacheEntryFactory {
                        $clink = '';
                // Edits
                } else {
-                       $clink = Linker::linkKnown( $cacheEntry->getTitle() );
+                       $clink = $this->linkRenderer->makeKnownLink( $cacheEntry->getTitle() );
                }
 
                return $clink;
@@ -125,10 +135,12 @@ class RCCacheEntryFactory {
        private function getLogLink( $logType ) {
                $logtitle = SpecialPage::getTitleFor( 'Log', $logType );
                $logpage = new LogPage( $logType );
-               $logname = $logpage->getName()->escaped();
+               $logname = $logpage->getName()->text();
 
                $logLink = $this->context->msg( 'parentheses' )
-                       ->rawParams( Linker::linkKnown( $logtitle, $logname ) )->escaped();
+                       ->rawParams(
+                               $this->linkRenderer->makeKnownLink( $logtitle, $logname )
+                       )->escaped();
 
                return $logLink;
        }
@@ -174,7 +186,7 @@ class RCCacheEntryFactory {
                        $curLink = $curMessage;
                } else {
                        $curUrl = htmlspecialchars( $cacheEntry->getTitle()->getLinkURL( $queryParams ) );
-                       $curLink = "<a href=\"$curUrl\" tabindex=\"$counter\">$curMessage</a>";
+                       $curLink = "<a href=\"$curUrl\">$curMessage</a>";
                }
 
                return $curLink;
@@ -217,10 +229,10 @@ class RCCacheEntryFactory {
                                return $diffMessage;
                        }
                        $diffUrl = htmlspecialchars( $pageTitle->getLinkURL( $queryParams ) );
-                       $diffLink = "<a href=\"$diffUrl\" tabindex=\"$counter\">$diffMessage</a>";
+                       $diffLink = "<a href=\"$diffUrl\">$diffMessage</a>";
                } else {
                        $diffUrl = htmlspecialchars( $cacheEntry->getTitle()->getLinkURL( $queryParams ) );
-                       $diffLink = "<a href=\"$diffUrl\" tabindex=\"$counter\">$diffMessage</a>";
+                       $diffLink = "<a href=\"$diffUrl\">$diffMessage</a>";
                }
 
                return $diffLink;
@@ -242,9 +254,9 @@ class RCCacheEntryFactory {
                if ( !$showDiffLinks || !$lastOldid || in_array( $type, $logTypes ) ) {
                        $lastLink = $lastMessage;
                } else {
-                       $lastLink = Linker::linkKnown(
+                       $lastLink = $this->linkRenderer->makeKnownLink(
                                $cacheEntry->getTitle(),
-                               $lastMessage,
+                               new HtmlArmor( $lastMessage ),
                                [],
                                $this->buildDiffQueryParams( $cacheEntry )
                        );
index a374b13..27f917b 100644 (file)
@@ -155,6 +155,11 @@ class IcuCollation extends Collation {
                'smn' => [ "Á", "Č", "Đ", "Ŋ", "Š", "Ŧ", "Ž", "Æ", "Ø", "Å", "Ä", "Ö" ],
                'sq' => [ "Ç", "Dh", "Ë", "Gj", "Ll", "Nj", "Rr", "Sh", "Th", "Xh", "Zh" ],
                'sr' => [],
+               'ta' => [
+                       "\xE0\xAE\x82", "ஃ", "க்ஷ", "க்", "ங்", "ச்", "ஞ்", "ட்", "ண்", "த்", "ந்",
+                       "ப்", "ம்", "ய்", "ர்", "ல்", "வ்", "ழ்", "ள்", "ற்", "ன்", "ஜ்", "ஶ்", "ஷ்",
+                       "ஸ்", "ஹ்", "க்ஷ்"
+               ],
                'tk' => [ "Ç", "Ä", "Ž", "Ň", "Ö", "Ş", "Ü", "Ý" ],
                'tl' => [ "Ñ", "Ng" ],
                'tr' => [ "Ç", "Ğ", "İ", "Ö", "Ş", "Ü" ],
@@ -188,20 +193,11 @@ class IcuCollation extends Collation {
        }
 
        public function getSortKey( $string ) {
-               // intl extension produces non null-terminated
-               // strings. Appending '' fixes it so that it doesn't generate
-               // a warning on each access in debug php.
-               MediaWiki\suppressWarnings();
-               $key = $this->mainCollator->getSortKey( $string ) . '';
-               MediaWiki\restoreWarnings();
-               return $key;
+               return $this->mainCollator->getSortKey( $string );
        }
 
        public function getPrimarySortKey( $string ) {
-               MediaWiki\suppressWarnings();
-               $key = $this->primaryCollator->getSortKey( $string ) . '';
-               MediaWiki\restoreWarnings();
-               return $key;
+               return $this->primaryCollator->getSortKey( $string );
        }
 
        public function getFirstLetter( $string ) {
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 13be911..3ebc3ec 100644 (file)
@@ -782,8 +782,10 @@ abstract class DatabaseMysqlBase extends Database {
                        throw new InvalidArgumentException( "Position not an instance of MySQLMasterPos" );
                }
 
-               if ( $this->lastKnownSlavePos && $this->lastKnownSlavePos->hasReached( $pos ) ) {
-                       return 0;
+               if ( $this->getLBInfo( 'is static' ) === true ) {
+                       return 0; // this is a copy of a read-only dataset with no master DB
+               } elseif ( $this->lastKnownSlavePos && $this->lastKnownSlavePos->hasReached( $pos ) ) {
+                       return 0; // already reached this point for sure
                }
 
                # Commit any open transactions
index b78793f..5b048b5 100644 (file)
@@ -452,6 +452,15 @@ abstract class LBFactory implements DestructibleService {
                        }
                } );
        }
+
+       /**
+        * Close all open database connections on all open load balancers.
+        * @since 1.28
+        */
+       public function closeAll() {
+               $this->forEachLBCallMethod( 'closeAll', [] );
+       }
+
 }
 
 /**
index 5578099..d96c665 100644 (file)
@@ -1334,7 +1334,7 @@ class LoadBalancer {
 
                $lagTimes = $this->getLagTimes( $wiki );
                foreach ( $lagTimes as $i => $lag ) {
-                       if ( $lag > $maxLag ) {
+                       if ( $this->mLoads[$i] > 0 && $lag > $maxLag ) {
                                $maxLag = $lag;
                                $host = $this->mServers[$i]['host'];
                                $maxIndex = $i;
@@ -1402,7 +1402,7 @@ class LoadBalancer {
                }
 
                $pos = $pos ?: $this->getConnection( DB_MASTER )->getMasterPos();
-               if ( !$pos ) {
+               if ( !( $pos instanceof DBMasterPos ) ) {
                        return false; // something is misconfigured
                }
 
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 65a8c0e..d294fd2 100644 (file)
@@ -42,48 +42,95 @@ class LinksDeletionUpdate extends SqlDataUpdate implements EnqueueableDataUpdate
                } elseif ( $pageId ) {
                        $this->pageId = $pageId;
                } else {
-                       throw new MWException( "Page ID not known, perhaps the page doesn't exist?" );
+                       throw new InvalidArgumentException( "Page ID not known. Page doesn't exist?" );
                }
        }
 
        public function doUpdate() {
-               # Page may already be deleted, so don't just getId()
+               $config = RequestContext::getMain()->getConfig();
+               $batchSize = $config->get( 'UpdateRowsPerQuery' );
+
+               // Page may already be deleted, so don't just getId()
                $id = $this->pageId;
                // Make sure all links update threads see the changes of each other.
                // This handles the case when updates have to batched into several COMMITs.
                $scopedLock = LinksUpdate::acquirePageLock( $this->mDb, $id );
 
-               # Delete restrictions for it
+               // Delete restrictions for it
                $this->mDb->delete( 'page_restrictions', [ 'pr_page' => $id ], __METHOD__ );
 
-               # Fix category table counts
+               // Fix category table counts
                $cats = $this->mDb->selectFieldValues(
                        'categorylinks',
                        'cl_to',
                        [ 'cl_from' => $id ],
                        __METHOD__
                );
-               $this->page->updateCategoryCounts( [], $cats );
+               $catBatches = array_chunk( $cats, $batchSize );
+               foreach ( $catBatches as $catBatch ) {
+                       $this->page->updateCategoryCounts( [], $catBatch );
+                       if ( count( $catBatches ) > 1 ) {
+                               $this->mDb->commit( __METHOD__, 'flush' );
+                               wfGetLBFactory()->waitForReplication( [ 'wiki' => $this->mDb->getWikiID() ] );
+                       }
+               }
 
-               # If using cascading deletes, we can skip some explicit deletes
+               // If using cascading deletes, we can skip some explicit deletes
                if ( !$this->mDb->cascadingDeletes() ) {
-                       # Delete outgoing links
-                       $this->mDb->delete( 'pagelinks', [ 'pl_from' => $id ], __METHOD__ );
-                       $this->mDb->delete( 'imagelinks', [ 'il_from' => $id ], __METHOD__ );
-                       $this->mDb->delete( 'categorylinks', [ 'cl_from' => $id ], __METHOD__ );
-                       $this->mDb->delete( 'templatelinks', [ 'tl_from' => $id ], __METHOD__ );
-                       $this->mDb->delete( 'externallinks', [ 'el_from' => $id ], __METHOD__ );
-                       $this->mDb->delete( 'langlinks', [ 'll_from' => $id ], __METHOD__ );
-                       $this->mDb->delete( 'iwlinks', [ 'iwl_from' => $id ], __METHOD__ );
+                       // Delete outgoing links
+                       $this->batchDeleteByPK(
+                               'pagelinks',
+                               [ 'pl_from' => $id ],
+                               [ 'pl_from', 'pl_namespace', 'pl_title' ],
+                               $batchSize
+                       );
+                       $this->batchDeleteByPK(
+                               'imagelinks',
+                               [ 'il_from' => $id ],
+                               [ 'il_from', 'il_to' ],
+                               $batchSize
+                       );
+                       $this->batchDeleteByPK(
+                               'categorylinks',
+                               [ 'cl_from' => $id ],
+                               [ 'cl_from', 'cl_to' ],
+                               $batchSize
+                       );
+                       $this->batchDeleteByPK(
+                               'templatelinks',
+                               [ 'tl_from' => $id ],
+                               [ 'tl_from', 'tl_namespace', 'tl_title' ],
+                               $batchSize
+                       );
+                       $this->batchDeleteByPK(
+                               'externallinks',
+                               [ 'el_from' => $id ],
+                               [ 'el_id' ],
+                               $batchSize
+                       );
+                       $this->batchDeleteByPK(
+                               'langlinks',
+                               [ 'il_from' => $id ],
+                               [ 'il_from', 'll_lang' ],
+                               $batchSize
+                       );
+                       $this->batchDeleteByPK(
+                               'iwlinks',
+                               [ 'il_from' => $id ],
+                               [ 'iwl_from', 'iwl_prefix', 'iwl_title' ],
+                               $batchSize
+                       );
+                       // Delete any redirect entry or page props entries
                        $this->mDb->delete( 'redirect', [ 'rd_from' => $id ], __METHOD__ );
                        $this->mDb->delete( 'page_props', [ 'pp_page' => $id ], __METHOD__ );
                }
 
-               # If using cleanup triggers, we can skip some manual deletes
+               // If using cleanup triggers, we can skip some manual deletes
                if ( !$this->mDb->cleanupTriggers() ) {
                        $title = $this->page->getTitle();
-                       # Find recentchanges entries to clean up...
-                       $rcIdsForTitle = $this->mDb->selectFieldValues( 'recentchanges',
+                       // Find recentchanges entries to clean up...
+                       $rcIdsForTitle = $this->mDb->selectFieldValues(
+                               'recentchanges',
                                'rc_id',
                                [
                                        'rc_type != ' . RC_LOG,
@@ -92,16 +139,21 @@ class LinksDeletionUpdate extends SqlDataUpdate implements EnqueueableDataUpdate
                                ],
                                __METHOD__
                        );
-                       $rcIdsForPage = $this->mDb->selectFieldValues( 'recentchanges',
+                       $rcIdsForPage = $this->mDb->selectFieldValues(
+                               'recentchanges',
                                'rc_id',
                                [ 'rc_type != ' . RC_LOG, 'rc_cur_id' => $id ],
                                __METHOD__
                        );
 
-                       # T98706: delete PK to avoid lock contention with RC delete log insertions
-                       $rcIds = array_merge( $rcIdsForTitle, $rcIdsForPage );
-                       if ( $rcIds ) {
-                               $this->mDb->delete( 'recentchanges', [ 'rc_id' => $rcIds ], __METHOD__ );
+                       // T98706: delete by PK to avoid lock contention with RC delete log insertions
+                       $rcIdBatches = array_chunk( array_merge( $rcIdsForTitle, $rcIdsForPage ), $batchSize );
+                       foreach ( $rcIdBatches as $rcIdBatch ) {
+                               $this->mDb->delete( 'recentchanges', [ 'rc_id' => $rcIdBatch ], __METHOD__ );
+                               if ( count( $rcIdBatches ) > 1 ) {
+                                       $this->mDb->commit( __METHOD__, 'flush' );
+                                       wfGetLBFactory()->waitForReplication( [ 'wiki' => $this->mDb->getWikiID() ] );
+                               }
                        }
                }
 
@@ -111,6 +163,26 @@ class LinksDeletionUpdate extends SqlDataUpdate implements EnqueueableDataUpdate
                } );
        }
 
+       private function batchDeleteByPK( $table, array $conds, array $pk, $bSize ) {
+               $dbw = $this->mDb; // convenience
+               $res = $dbw->select( $table, $pk, $conds, __METHOD__ );
+
+               $pkDeleteConds = [];
+               foreach ( $res as $row ) {
+                       $pkDeleteConds[] = $this->mDb->makeList( (array)$row, LIST_AND );
+                       if ( count( $pkDeleteConds ) >= $bSize ) {
+                               $dbw->delete( $table, $dbw->makeList( $pkDeleteConds, LIST_OR ), __METHOD__ );
+                               $dbw->commit( __METHOD__, 'flush' );
+                               wfGetLBFactory()->waitForReplication( [ 'wiki' => $dbw->getWikiID() ] );
+                               $pkDeleteConds = [];
+                       }
+               }
+
+               if ( $pkDeleteConds ) {
+                       $dbw->delete( $table, $dbw->makeList( $pkDeleteConds, LIST_OR ), __METHOD__ );
+               }
+       }
+
        public function getAsJobSpecification() {
                return [
                        'wiki' => $this->mDb->getWikiID(),
index ac08374..07b5614 100644 (file)
@@ -84,8 +84,6 @@ class LinksUpdate extends SqlDataUpdate implements EnqueueableDataUpdate {
         */
        private $user;
 
-       const BATCH_SIZE = 500; // try to keep typical updates in a single transaction
-
        /**
         * Constructor
         *
@@ -338,6 +336,8 @@ class LinksUpdate extends SqlDataUpdate implements EnqueueableDataUpdate {
         * @param array $insertions Rows to insert
         */
        private function incrTableUpdate( $table, $prefix, $deletions, $insertions ) {
+               $bSize = RequestContext::getMain()->getConfig()->get( 'UpdateRowsPerQuery' );
+
                if ( $table === 'page_props' ) {
                        $fromField = 'pp_page';
                } else {
@@ -354,7 +354,7 @@ class LinksUpdate extends SqlDataUpdate implements EnqueueableDataUpdate {
                        foreach ( $deletions as $ns => $dbKeys ) {
                                foreach ( $dbKeys as $dbKey => $unused ) {
                                        $curDeletionBatch[$ns][$dbKey] = 1;
-                                       if ( ++$curBatchSize >= self::BATCH_SIZE ) {
+                                       if ( ++$curBatchSize >= $bSize ) {
                                                $deletionBatches[] = $curDeletionBatch;
                                                $curDeletionBatch = [];
                                                $curBatchSize = 0;
@@ -380,7 +380,7 @@ class LinksUpdate extends SqlDataUpdate implements EnqueueableDataUpdate {
                                $toField = $prefix . '_to';
                        }
 
-                       $deletionBatches = array_chunk( array_keys( $deletions ), self::BATCH_SIZE );
+                       $deletionBatches = array_chunk( array_keys( $deletions ), $bSize );
                        foreach ( $deletionBatches as $deletionBatch ) {
                                $deleteWheres[] = [ $fromField => $this->mId, $toField => $deletionBatch ];
                        }
@@ -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 );
+               $insertBatches = array_chunk( $insertions, $bSize );
                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 ) ) {
@@ -933,6 +933,14 @@ class LinksUpdate extends SqlDataUpdate implements EnqueueableDataUpdate {
                $this->mRevision = $revision;
        }
 
+       /**
+        * @since 1.28
+        * @return null|Revision
+        */
+       public function getRevision() {
+               return $this->mRevision;
+       }
+
        /**
         * Set the User who triggered this LinksUpdate
         *
diff --git a/includes/diff/ComplexityException.php b/includes/diff/ComplexityException.php
new file mode 100644 (file)
index 0000000..10ca964
--- /dev/null
@@ -0,0 +1,30 @@
+<?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
+ * @ingroup DifferenceEngine
+ */
+
+namespace MediaWiki\Diff;
+
+use Exception;
+
+class ComplexityException extends Exception {
+       public function __construct() {
+               parent::__construct( 'Diff is too complex to generate' );
+       }
+}
index e5e082f..d38319e 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
@@ -442,6 +204,12 @@ class Diff {
         */
        public $edits;
 
+       /**
+        * @var int If this diff complexity is exceeded, a ComplexityException is thrown
+        *          0 means no limit.
+        */
+       protected $bailoutComplexity = 0;
+
        /**
         * Constructor.
         * Computes diff between sequences of strings.
@@ -449,9 +217,11 @@ class Diff {
         * @param string[] $from_lines An array of strings.
         *   Typically these are lines from a file.
         * @param string[] $to_lines An array of strings.
+        * @throws \MediaWiki\Diff\ComplexityException
         */
        public function __construct( $from_lines, $to_lines ) {
                $eng = new DiffEngine;
+               $eng->setBailoutComplexity( $this->bailoutComplexity );
                $this->edits = $eng->diff( $from_lines, $to_lines );
        }
 
@@ -559,236 +329,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
- */
-
-/**
- * @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
+ * @deprecated Alias for WordAccumulator, to be soon removed
  */
-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..babd00b
--- /dev/null
@@ -0,0 +1,842 @@
+<?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
+ */
+use MediaWiki\Diff\ComplexityException;
+
+/**
+ * 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;
+
+       protected $bailoutComplexity = 0;
+
+       // 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
+        * @throws ComplexityException
+        *
+        * @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;
+       }
+
+       /**
+        * Sets the complexity (in comparison operations) that can't be exceeded
+        * @param int $value
+        */
+       public function setBailoutComplexity( $value ) {
+               $this->bailoutComplexity = $value;
+       }
+
+       /**
+        * 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
+        * @throws ComplexityException
+        */
+       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 );
+
+               if ( $this->bailoutComplexity > 0 && $this->m * $this->n > $this->bailoutComplexity ) {
+                       throw new ComplexityException();
+               }
+
+               $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..296e3b7
--- /dev/null
@@ -0,0 +1,142 @@
+<?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\ComplexityException;
+use MediaWiki\Diff\WordAccumulator;
+
+/**
+ * Performs a word-level diff on several lines
+ *
+ * @ingroup DifferenceEngine
+ */
+class WordLevelDiff extends \Diff {
+       /**
+        * @inheritdoc
+        */
+       protected $bailoutComplexity = 40000000; // Roughly 6K x 6K words changed
+
+       /**
+        * @param string[] $linesBefore
+        * @param string[] $linesAfter
+        */
+       public function __construct( $linesBefore, $linesAfter ) {
+
+               list( $wordsBefore, $wordsBeforeStripped ) = $this->split( $linesBefore );
+               list( $wordsAfter, $wordsAfterStripped ) = $this->split( $linesAfter );
+
+               try {
+                       parent::__construct( $wordsBeforeStripped, $wordsAfterStripped );
+               } catch ( ComplexityException $ex ) {
+                       // Too hard to diff, just show whole paragraph(s) as changed
+                       $this->edits = [ new DiffOpChange( $linesBefore, $linesAfter ) ];
+               }
+
+               $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 ( $first ) {
+                               $first = false;
+                       } else {
+                               $words[] = "\n";
+                               $stripped[] = "\n";
+                       }
+                       $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 2a15fd7..c767078 100644 (file)
@@ -1928,7 +1928,9 @@ class LocalFile extends File {
                                        $dbw->rollback( __METHOD__ );
                                }
                                throw new LocalFileLockError(
-                                       "Could not acquire lock for '{$this->getName()}' ($waited sec)." );
+                                       "Could not acquire lock for '{$this->getName()}' ($waited sec): " .
+                                       $status->getWikiText( false, false, 'en' )
+                               );
                        }
                        // Release the lock *after* commit to avoid row-level contention
                        $this->locked++;
index f00e260..2fb2281 100644 (file)
@@ -59,6 +59,16 @@ class TraditionalImageGallery extends ImageGalleryBase {
                        $output .= "\n\t<li class='gallerycaption'>{$this->mCaption}</li>";
                }
 
+               if ( $this->mShowFilename ) {
+                       // Preload LinkCache info for when generating links
+                       // of the filename below
+                       $lb = new LinkBatch();
+                       foreach ( $this->mImages as $img ) {
+                               $lb->addObj( $img[0] );
+                       }
+                       $lb->execute();
+               }
+
                $lang = $this->getRenderLang();
                # Output each image...
                foreach ( $this->mImages as $pair ) {
@@ -176,6 +186,7 @@ class TraditionalImageGallery extends ImageGalleryBase {
                        }
 
                        $textlink = $this->mShowFilename ?
+                               // Preloaded into LinkCache above
                                Linker::linkKnown(
                                        $nt,
                                        htmlspecialchars( $lang->truncate( $nt->getText(), $this->mCaptionLength ) )
index 0dab3bb..8ac4cf2 100644 (file)
@@ -169,6 +169,8 @@ class HTMLForm extends ContextSource {
        protected $mShowReset = false;
        protected $mShowSubmit = true;
        protected $mSubmitFlags = [ 'constructive', 'primary' ];
+       protected $mShowCancel = false;
+       protected $mCancelTarget;
 
        protected $mSubmitCallback;
        protected $mValidationErrorMessage;
@@ -894,6 +896,7 @@ class HTMLForm extends ContextSource {
         *  - id: (string, optional) DOM id for the button.
         *  - attribs: (array, optional) Additional HTML attributes.
         *  - flags: (string|string[], optional) OOUI flags.
+        *  - framed: (boolean=true, optional) OOUI framed attribute.
         * @return HTMLForm $this for chaining calls (since 1.20)
         */
        public function addButton( $data ) {
@@ -922,6 +925,7 @@ class HTMLForm extends ContextSource {
                        'id' => null,
                        'attribs' => null,
                        'flags' => null,
+                       'framed' => true,
                ];
 
                return $this;
@@ -1106,6 +1110,21 @@ class HTMLForm extends ContextSource {
                        ) . "\n";
                }
 
+               if ( $this->mShowCancel ) {
+                       $target = $this->mCancelTarget ?: Title::newMainPage();
+                       if ( $target instanceof Title ) {
+                               $target = $target->getLocalURL();
+                       }
+                       $buttons .= Html::element(
+                                       'a',
+                                       [
+                                               'class' => $useMediaWikiUIEverywhere ? 'mw-ui-button' : null,
+                                               'href' => $target,
+                                       ],
+                                       $this->msg( 'cancel' )->text()
+                               ) . "\n";
+               }
+
                // IE<8 has bugs with <button>, so we'll need to avoid them.
                $isBadIE = preg_match( '/MSIE [1-7]\./i', $this->getRequest()->getHeader( 'User-Agent' ) );
 
@@ -1226,17 +1245,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;
        }
 
        /**
@@ -1316,6 +1343,28 @@ class HTMLForm extends ContextSource {
                return $this;
        }
 
+       /**
+        * Show a cancel button (or prevent it). The button is not shown by default.
+        * @param bool $show
+        * @return HTMLForm $this for chaining calls
+        * @since 1.27
+        */
+       public function showCancel( $show = true ) {
+               $this->mShowCancel = $show;
+               return $this;
+       }
+
+       /**
+        * Sets the target where the user is redirected to after clicking cancel.
+        * @param Title|string $target Target as a Title object or an URL
+        * @return HTMLForm $this for chaining calls
+        * @since 1.27
+        */
+       public function setCancelTarget( $target ) {
+               $this->mCancelTarget = $target;
+               return $this;
+       }
+
        /**
         * Set the id of the \<table\> or outermost \<div\> element.
         *
index 1aaa3e8..23125bd 100644 (file)
@@ -65,21 +65,7 @@ class HTMLMultiSelectField extends HTMLFormField implements HTMLNestedFilterable
 
        protected function getOneCheckbox( $checked, $attribs, $label ) {
                if ( $this->mParent instanceof OOUIHTMLForm ) {
-                       if ( $this->mOptionsLabelsNotFromMessage ) {
-                               $label = new OOUI\HtmlSnippet( $label );
-                       }
-                       return new OOUI\FieldLayout(
-                               new OOUI\CheckboxInputWidget( [
-                                       'name' => "{$this->mName}[]",
-                                       'selected' => $checked,
-                               ] + OOUI\Element::configFromHtmlAttributes(
-                                       $attribs
-                               ) ),
-                               [
-                                       'label' => $label,
-                                       'align' => 'inline',
-                               ]
-                       );
+                       throw new MWException( 'HTMLMultiSelectField#getOneCheckbox() is not supported' );
                } else {
                        $elementFunc = [ 'Html', $this->mOptionsLabelsNotFromMessage ? 'rawElement' : 'element' ];
                        $checkbox =
@@ -99,6 +85,38 @@ class HTMLMultiSelectField extends HTMLFormField implements HTMLNestedFilterable
                }
        }
 
+       /**
+        * Get the OOUI version of this field.
+        *
+        * @since 1.28
+        * @param string[] $value
+        * @return OOUI\CheckboxMultiselectInputWidget
+        */
+       public function getInputOOUI( $value ) {
+               $attr = $this->getTooltipAndAccessKey();
+               $attr['id'] = $this->mID;
+               $attr['name'] = "{$this->mName}[]";
+
+               $attr['value'] = $value;
+               $attr['options'] = $this->getOptionsOOUI();
+
+               if ( $this->mOptionsLabelsNotFromMessage ) {
+                       foreach ( $attr['options'] as &$option ) {
+                               $option['label'] = new OOUI\HtmlSnippet( $option['label'] );
+                       }
+               }
+
+               $attr += OOUI\Element::configFromHtmlAttributes(
+                       $this->getAttributes( [ 'disabled', 'tabindex' ] )
+               );
+
+               if ( $this->mClass !== '' ) {
+                       $attr['classes'] = [ $this->mClass ];
+               }
+
+               return new OOUI\CheckboxMultiselectInputWidget( $attr );
+       }
+
        /**
         * @param WebRequest $request
         *
index 12a8a1f..e5b5e68 100644 (file)
@@ -52,13 +52,14 @@ class HTMLRadioField extends HTMLFormField {
                        'id' => $this->mID,
                        'value' => $value,
                        'options' => $options,
-                       'classes' => 'mw-htmlform-flatlist-item',
                ] + OOUI\Element::configFromHtmlAttributes(
                        $this->getAttributes( [ 'disabled', 'tabindex' ] )
                ) );
        }
 
        function formatOptions( $options, $value ) {
+               global $wgUseMediaWikiUIEverywhere;
+
                $html = '';
 
                $attribs = $this->getAttributes( [ 'disabled', 'tabindex' ] );
@@ -71,12 +72,16 @@ class HTMLRadioField extends HTMLFormField {
                                $html .= $this->formatOptions( $info, $value );
                        } else {
                                $id = Sanitizer::escapeId( $this->mID . "-$info" );
+                               $classes = [ 'mw-htmlform-flatlist-item' ];
+                               if ( $wgUseMediaWikiUIEverywhere || $this->mParent instanceof VFormHTMLForm ) {
+                                       $classes[] = 'mw-ui-radio';
+                               }
                                $radio = Xml::radio( $this->mName, $info, $info === $value, $attribs + [ 'id' => $id ] );
                                $radio .= '&#160;' . call_user_func( $elementFunc, 'label', [ 'for' => $id ], $label );
 
                                $html .= ' ' . Html::rawElement(
                                        'div',
-                                       [ 'class' => 'mw-htmlform-flatlist-item mw-ui-radio' ],
+                                       [ 'class' => $classes ],
                                        $radio
                                );
                        }
index 711750b..0b22727 100644 (file)
@@ -86,6 +86,17 @@ class OOUIHTMLForm extends HTMLForm {
                        ] );
                }
 
+               if ( $this->mShowCancel ) {
+                       $target = $this->mCancelTarget ?: Title::newMainPage();
+                       if ( $target instanceof Title ) {
+                               $target = $target->getLocalURL();
+                       }
+                       $buttons .= new OOUI\ButtonWidget( [
+                               'label' => $this->msg( 'cancel' )->text(),
+                               'href' => $target,
+                       ] );
+               }
+
                foreach ( $this->mButtons as $button ) {
                        $attrs = [];
 
@@ -117,6 +128,7 @@ class OOUIHTMLForm extends HTMLForm {
                                'value' => $button['value'],
                                'label' => $label,
                                'flags' => $button['flags'],
+                               'framed' => $button['framed'],
                                'useInputTag' => $isBadIE,
                        ] + $attrs );
                }
index f3cba48..c920ac3 100644 (file)
@@ -116,6 +116,21 @@ class VFormHTMLForm extends HTMLForm {
                        ) . "\n";
                }
 
+               if ( $this->mShowCancel ) {
+                       $target = $this->mCancelTarget ?: Title::newMainPage();
+                       if ( $target instanceof Title ) {
+                               $target = $target->getLocalURL();
+                       }
+                       $buttons .= Html::element(
+                                       'a',
+                                       [
+                                               'class' => 'mw-ui-button mw-ui-big mw-ui-block',
+                                               'href' => $target,
+                                       ],
+                                       $this->msg( 'cancel' )->text()
+                               ) . "\n";
+               }
+
                foreach ( $this->mButtons as $button ) {
                        $attrs = [
                                'type' => 'submit',
index a9f219f..ae1a2a7 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().
@@ -1267,7 +1279,7 @@ abstract class Installer {
                        $command = $path . DIRECTORY_SEPARATOR . $name;
 
                        MediaWiki\suppressWarnings();
-                       $file_exists = file_exists( $command );
+                       $file_exists = is_executable( $command );
                        MediaWiki\restoreWarnings();
 
                        if ( $file_exists ) {
index 799ca58..1bd3f51 100644 (file)
@@ -540,7 +540,7 @@ class MysqlInstaller extends DatabaseInstaller {
 
                        foreach ( $createHostList as $host ) {
                                $fullName = $this->buildFullUserName( $dbUser, $host );
-                               if ( !$this->userDefinitelyExists( $dbUser, $host ) ) {
+                               if ( !$this->userDefinitelyExists( $host, $dbUser ) ) {
                                        try {
                                                $this->db->begin( __METHOD__ );
                                                $this->db->query( "CREATE USER $fullName IDENTIFIED BY $escPass", __METHOD__ );
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..c3ccb75 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-db-wiki-help": "Entra le nomine de usator e contrasigno que essera usate pro connecter al base de datos durante le operation normal del wiki.\nSi le conto non existe, e si le conto de installation possede sufficiente privilegios, iste conto de usator essera create con le minime privilegios necessari pro operar le wiki.",
        "config-db-prefix": "Prefixo de tabella del base de datos:",
        "config-db-prefix-help": "Si il es necessari usar un base de datos in commun inter multiple wikis, o inter MediaWiki e un altere application web, tu pote optar pro adder un prefixo a tote le nomines de tabella pro evitar conflictos.\nNon usa spatios.\n\nIste campo usualmente resta vacue.",
-       "config-db-charset": "Codification de characteres in le base de datos",
-       "config-charset-mysql5-binary": "MySQL 4.1/5.0 binari",
-       "config-charset-mysql5": "MySQL 4.1/5.0 UTF-8",
-       "config-charset-mysql4": "MySQL 4.0 retrocompatibile UTF-8",
-       "config-charset-help": "'''Aviso:''' Si tu usa '''UTF-8 retrocompatibile''' sur MySQL 4.1+, e postea face un copia de reserva del base de datos con <code>mysqldump</code>, tote le characteres non ASCII pote esser destruite, resultante in corruption irreversibile de tu copias de reserva!\n\nIn '''modo binari''', MediaWiki immagazina texto in UTF-8 in le base de datos in campos binari.\nIsto es plus efficiente que le modo UTF-8 de MySQL, e permitte usar le rango complete de characteres de Unicode.\nIn '''modo UTF-8''', MySQL sapera in qual codification de characteres tu datos es, e pote presentar e converter lo appropriatemente,\nma non te permittera immagazinar characteres supra le [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Plano Multilingue Basic].",
        "config-mysql-old": "MySQL $1 o plus recente es requirite, tu ha $2.",
        "config-db-port": "Porto de base de datos:",
        "config-db-schema": "Schema pro MediaWiki",
        "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..3d5a0a9 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.",
        "config-db-wiki-help": "Jiv ene Nahme un e Paßwoot aan, för dä Aanwänder för dä Zohjref op de Dahtebangk, wann et Wikki nommahl aam Loufe es.\nWann et dä Nahme en der Dahtebangk noch nit jit, un dä Aanwender för dä Zohjrevv op de Dahtebangk beim Enschtallehre jenohch Berääschtejonge hät, läht dä heh dä Aanwänder en der Dahtebangk aan un jidd_em di Rääschde, di dä nühdesch hät, ävver nit mih.",
        "config-db-prefix": "Vörsaz för de Name vun de Tabälle en de Daatebangk:",
        "config-db-prefix-help": "Wann ein Daatebangk för mih wi ein Wiki udder e Wiki uns söns jät zosamme jebruch weed, dann kam_mer noch jet vör de Tabälle ier Name säze. Esu ene Vörsaz sull dubblte Tabällename vermeide hälfe.\nDonn kein Zwescheräum enjävve!\n\nJewöhnlesch bliev dat Feld heh ävver läddesch.",
-       "config-db-charset": "Dä Daatebangk iere Zeischesaz",
-       "config-charset-mysql5-binary": "MySQL (4.1 udder 5.0) binär",
-       "config-charset-mysql5": "MySQL (4.1 udder 5.0) UTF-8",
-       "config-charset-mysql4": "MySQL 4.0 röckwääts kompatibel UTF-8",
-       "config-charset-help": "<strong>Opjepaß:</strong>\nWann De et <strong>röckwääts kompatibel UTF-8 Fommaht</strong> nemmps, met dem <i lang=\"en\">MySQL</i> singe Väsjohn 4.1 udder hüüter, dann künnt dat all di Zeische kappott maache, di nit em <i lang=\"en\" title=\"American Standard Code for Information Interchange\">ASCII</i> sen, un domet all Ding Sescherungskopieje kapott maache, wat mer nieh mieh retuur krijje kann.\n\nBeim Schpeischere em <strong>binäre Fomaat</strong> deiht MediaWiki de Täx, dä em UTF-8 Fommaht küt, en dä Dahtebangk en binähr kodehrte Dahtefälder faßhallde.\nDat es flöcker un spaasahmer wi et UTF-8 Fommaht vum <i lang=\"en\">MySQL</i> un määd_et müjjelesch, jehdes <i lang=\"en\">Unicode</i>-Zeische met faßzehallde.\n\nBeim Schpeischere em <strong>UTF-8 Fomaht</strong> deihd_et <i lang=\"en\">MySQL</i> der Zeischesaz un de Kodehrung vun dä Dahte känne, un kann se akeraht aanzeije un ömwandelle,\nallerdengs künne kein Zeische ußerhalv vum [//de.wikipedia.org/wiki/Basic_Multilingual_Plane#Gliederung_in_Ebenen_und_Bl.C3.B6cke jrondlähje Knubbel för vill Schprohche (<i lang=\"en\">Basic Multilingual Plane — BMP</i>)] afjeschpeischert wähde.",
        "config-mysql-old": "Mer bruche <i lang=\"en\">MySQL</i> $1 udder neuer. Em Momang es <i lang=\"en\">MySQL</i> $2 aam Loufe.",
        "config-db-port": "De Pooz-Nommer (<i lang=\"en\">port</i>) för de Daatebangk:",
        "config-db-schema": "Et Schehma en de Datebangk för MehdijaWikki:",
index b3aaef1..d21351d 100644 (file)
        "config-db-name": "Datubāzes nosaukums:",
        "config-db-username": "Datubāzes lietotājvārds:",
        "config-db-password": "Datubāzes parole:",
-       "config-db-charset": "Datubāzes rakstzīmju kopa",
-       "config-charset-mysql5-binary": "MySQL 4.1/5.0 binārs",
-       "config-charset-mysql5": "MySQL 4.1/5.0 UTF-8",
-       "config-charset-mysql4": "MySQL 4.0 atpakaļsaderīgs UTF-8",
        "config-db-port": "Datubāzes ports:",
        "config-db-schema": "MediaWiki shēma:",
        "config-db-schema-help": "Šī shēma derēs vairumā gadījumu.\nMainiet to tikai, ja zināt, ka tas nepieciešams.",
@@ -46,6 +42,7 @@
        "config-mysql-innodb": "InnoDB",
        "config-mysql-myisam": "MyISAM",
        "config-mysql-utf8": "UTF-8",
+       "config-mssql-windowsauth": "Windows Autentifikācija",
        "config-ns-generic": "Projekts",
        "config-ns-site-name": "Tāds pats kā viki nosaukums: $1",
        "config-ns-other": "Cits (jānorāda)",
@@ -56,6 +53,7 @@
        "config-admin-password-confirm": "Parole vēlreiz:",
        "config-admin-name-blank": "Ievadiet administratora lietotājvārdu.",
        "config-admin-email": "E-pasta adrese:",
+       "config-email-settings": "E-pasta iestatījumi",
        "config-logo": "Logo URL:",
        "config-cc-again": "Izvēlies vēlreiz...",
        "config-extensions": "Paplašinājumi",
index 77e6fd0..c401924 100644 (file)
        "config-your-language": "Vòstra lenga :",
        "config-your-language-help": "Seleccionatz la lenga d'utilizar pendent lo processus d'installacion.",
        "config-wiki-language": "Lenga del wiki :",
-       "config-wiki-language-help": "Seleccionar la lenga dins la quala lo wiki serà principalament escrich.",
+       "config-wiki-language-help": "Seleccionar la lenga dins la quala lo wiki serà principalament escrit.",
        "config-back": "← Retorn",
        "config-continue": "Contunhar →",
        "config-page-language": "Lenga",
        "config-page-welcome": "Benvenguda sus MediaWiki !",
-       "config-page-dbconnect": "Se connectar a la banca de donadas",
+       "config-page-dbconnect": "Se connectar a la basa de donadas",
        "config-page-upgrade": "Metre a jorn l’installacion existenta",
-       "config-page-dbsettings": "Paramètres de la banca de donadas",
+       "config-page-dbsettings": "Paramètres de la basa de donadas",
        "config-page-name": "Nom",
        "config-page-options": "Opcions",
        "config-page-install": "Installar",
        "config-gd": "La bibliotèca grafica GD integrada es estada trobada.\nLa miniaturizacion d'imatges serà activada se activatz lo telecargament de fichièrs.",
        "config-using-server": "Utilizacion del nom de servidor \"<nowiki>$1</nowiki>\".",
        "config-using-uri": "Utilizacion de l'URL de servidor \"<nowiki>$1$2</nowiki>\".",
-       "config-db-type": "Tipe de banca de donadas :",
-       "config-db-host": "Nom d’òste de la banca de donadas :",
-       "config-db-host-oracle": "Nom TNS de la banca de donadas :",
+       "config-db-type": "Tipe de basa de donadas :",
+       "config-db-host": "Nom d’òste de la basa de donadas :",
+       "config-db-host-oracle": "Nom TNS de la basa de donadas :",
        "config-db-wiki-settings": "Identificar aqueste wiki",
-       "config-db-name": "Nom de la banca de donadas :",
-       "config-db-name-oracle": "Esquèma de banca de donadas :",
+       "config-db-name": "Nom de la basa de donadas :",
+       "config-db-name-oracle": "Esquèma de basa de donadas :",
        "config-db-install-account": "Compte d'utilizaire per l'installacion",
-       "config-db-username": "Nom d'utilizaire de la banca de donadas :",
-       "config-db-password": "Senhal de la banca de donadas :",
+       "config-db-username": "Nom d'utilizaire de la basa de donadas :",
+       "config-db-password": "Senhal de la basa de donadas :",
        "config-db-account-lock": "Utilizar lo meteis nom d'utilizaire e lo meteis senhal pendent lo foncionament abitual",
        "config-db-wiki-account": "Compte d'utilizaire pel foncionament abitual",
-       "config-db-prefix": "Préfix de las taulas de la banca de donadas :",
-       "config-db-charset": "Jòc de caractèrs de la banca de donadas",
-       "config-charset-mysql5-binary": "MySQL 4.1/5.0 binari",
-       "config-charset-mysql5": "MySQL 4.1/5.0 UTF-8",
-       "config-charset-mysql4": "MySQL 4.0 retrocompatible UTF-8",
+       "config-db-prefix": "Prefix de las taulas de la basa de donadas :",
        "config-mysql-old": "MySQL $1 o version ulteriora es requesit, avètz $2.",
-       "config-db-port": "Pòrt de la banca de donadas :",
+       "config-db-port": "Pòrt de la basa de donadas :",
        "config-db-schema": "Esquèma per MediaWiki",
-       "config-pg-test-error": "Impossible de se connectar a la banca de donadas '''$1''' : $2",
+       "config-pg-test-error": "Impossible de se connectar a la basa de donadas '''$1''' : $2",
        "config-sqlite-dir": "Dorsièr de las donadas SQLite :",
        "config-oracle-def-ts": "Espaci d'emmagazinatge (''tablespace'') per defaut :",
        "config-oracle-temp-ts": "Espaci d'emmagazinatge (''tablespace'') temporari :",
        "config-header-sqlite": "Paramètres de SQLite",
        "config-header-oracle": "Paramètres d’Oracle",
        "config-header-mssql": "Paramètres de Microsoft SQL Server",
-       "config-invalid-db-type": "Tipe de banca de donadas invalid",
+       "config-invalid-db-type": "Tipe de basa de donadas invalid",
        "config-missing-db-name": "Vos cal entrar una valor per « {{int:config-db-name}} ».",
        "config-missing-db-host": "Vos cal entrar una valor per « {{int:config-db-host}} ».",
        "config-missing-db-server-oracle": "Vos cal entrar una valor per « {{int:config-db-oracle}} ».",
        "config-postgres-old": "PostgreSQL $1 o version ulteriora es requesit, avètz $2.",
        "config-sqlite-readonly": "Lo fichièr <code>$1</code> es pas accessible en escritura.",
-       "config-sqlite-cant-create-db": "Impossible de crear lo fichièr de banca de donadas <code>$1</code>.",
+       "config-sqlite-cant-create-db": "Impossible de crear lo fichièr de basa de donadas <code>$1</code>.",
        "config-regenerate": "Regenerar LocalSettings.php →",
        "config-show-table-status": "Fracàs de la requèsta <code>SHOW TABLE STATUS</code> !",
-       "config-db-web-account": "Compte de la banca de donadas per l'accès Web",
+       "config-db-web-account": "Compte de la basa de donadas per l'accès Web",
        "config-db-web-account-same": "Utilizatz lo meteis compte que per l'installacion",
        "config-db-web-create": "Creatz lo compte se existís pas ja",
        "config-mysql-engine": "Motor d'emmagazinatge :",
        "config-mysql-innodb": "InnoDB",
        "config-mysql-myisam": "MyISAM",
-       "config-mysql-charset": "Jòc de caractèrs de la banca de donadas :",
+       "config-mysql-charset": "Jòc de caractèrs de la basa de donadas :",
        "config-mysql-binary": "Binari",
        "config-mysql-utf8": "UTF-8",
        "config-mssql-auth": "Tipe d’autentificacion :",
        "config-admin-error-bademail": "Avètz entrat una adreça de corrièr electronic invalida",
        "config-optional-continue": "Me pausar mai de questions.",
        "config-optional-skip": "N'ai pro, installar simplament lo wiki.",
-       "config-profile": "Perfil dels dreches d’utilizaires :",
+       "config-profile": "Perfil dels dreits d’utilizaires :",
        "config-profile-wiki": "Wiki dobèrt",
        "config-profile-no-anon": "Creacion de compte requesida",
        "config-profile-fishbowl": "Editors autorizats solament",
        "config-profile-private": "Wiki privat",
-       "config-license": "Dreches d'autor e licéncia :",
+       "config-license": "Dreits d'autor e licéncia :",
        "config-license-none": "Pas cap de licéncia en bas de pagina",
        "config-license-cc-by-sa": "Creative Commons atribucion partiment a l'identic",
        "config-license-cc-by": "Creative Commons Atribucion",
        "config-instantcommons": "Activar ''InstantCommons''",
        "config-cc-again": "Causissètz tornarmai...",
        "config-advanced-settings": "Configuracion avançada",
-       "config-cache-options": "Paramètres per la mesa en escondedor dels objèctes :",
+       "config-cache-options": "Paramètres per la mesa en cache dels objèctes :",
        "config-memcached-servers": "servidors per Memcached :",
        "config-extensions": "Extensions",
        "config-skins": "Abilhatges",
        "config-skins-use-as-default": "Utilizar aqueste abilhatge per defaut",
-       "config-install-step-done": "fach",
+       "config-install-step-done": "fait",
        "config-install-step-failed": "fracàs",
        "config-install-extensions": "Inclusion de las extensions",
-       "config-install-database": "Creacion de la banca de donadas",
+       "config-install-database": "Creacion de la basa de donadas",
        "config-install-schema": "Creacion d'esquèma",
        "config-install-pg-schema-not-exist": "L'esquèma PostgreSQL existís pas",
        "config-install-pg-commit": "Validacion de las modificacions",
        "config-install-pg-plpgsql": "Verificacion del lengatge PL/pgSQL",
-       "config-install-user": "Creacion d'un utilizaire de la banca de donadas",
+       "config-install-user": "Creacion d'un utilizaire de la basa de donadas",
        "config-install-user-alreadyexists": "L'utilizaire « $1 » existís ja.",
        "config-install-user-create-failed": "Fracàs al moment de la creacion de l'utilizaire « $1 » : $2",
        "config-install-user-grant-failed": "Fracàs al moment de l'apondon de permissions a l'utilizaire « $1 » : $2",
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 21f0cb0..9779fc9 100644 (file)
@@ -20,7 +20,8 @@
                        "Seb35",
                        "Striking Blue",
                        "Ильнар",
-                       "Macofe"
+                       "Macofe",
+                       "StasR"
                ]
        },
        "config-desc": "Инсталлятор MediaWiki",
@@ -43,7 +44,7 @@
        "config-back": "← Назад",
        "config-continue": "Далее →",
        "config-page-language": "Язык",
-       "config-page-welcome": "MediaWiki проектына рәхим итегез!",
+       "config-page-welcome": "Добро пожаловать в MediaWiki!",
        "config-page-dbconnect": "Подключение к базе данных",
        "config-page-upgrade": "Обновление существующей установки",
        "config-page-dbsettings": "Настройки базы данных",
        "config-db-wiki-help": "Введите имя пользователя и пароль, которые будут использоваться для подключения к базе данных во время обычной работы вики.\nЕсли такой учётной записи не существует, а установочная учётная запись имеет достаточно привилегий, то обычная учётная запись будет создана с минимально необходимыми для работы вики привилегиями.",
        "config-db-prefix": "Префикс таблиц базы данных:",
        "config-db-prefix-help": "Если вам нужно делить одну базу данных между несколькими вики, или между MediaWiki и другими веб-приложениями, вы можете добавить префикс для всех имён таблиц.\nНе используйте пробелы.\n\nЭто поле обычно остаётся пустым.",
-       "config-db-charset": "Кодировка базы данных",
-       "config-charset-mysql5-binary": "MySQL 4.1/5.0 бинарная",
-       "config-charset-mysql5": "MySQL 4.1/5.0 UTF-8",
-       "config-charset-mysql4": "MySQL 4.0 обратно совместимая с UTF-8",
-       "config-charset-help": "'''Внимание.''' Если вы используете '''обратно совместый UTF-8''' на MySQL 4.1+ и создаёте резервные копии базы данных с помощью <code>mysqldump</code>, то все не-ASCII символы могут быть искажены, а резервная копия окажется негодной!\n\nВ '''бинарном режиме''' MediaWiki хранит юникодный текст в базе в виде двоичных полей.\nЭто более эффективно, чем MySQL в режиме UTF-8, позволяет использовать полный набор символов Юникода.\nВ '''режиме UTF-8''' MySQL будет знать к какому набору символу относятся ваши данные, сможет представлять и преобразовать их надлежащим образом (буква Ё окажется при сортировке после буквы Е, а не после буквы Я, как в бинарном режиме),\nно не позволит вам сохранять символы, выходящие за пределы [//ru.wikipedia.org/wiki/Символы,_представленные_в_Юникоде#.D0.91.D0.B0.D0.B7.D0.BE.D0.B2.D0.B0.D1.8F_.D0.BC.D0.BD.D0.BE.D0.B3.D0.BE.D1.8F.D0.B7.D1.8B.D0.BA.D0.BE.D0.B2.D0.B0.D1.8F_.D0.BF.D0.BB.D0.BE.D1.81.D0.BA.D0.BE.D1.81.D1.82.D1.8C BMP].",
        "config-mysql-old": "Необходим MySQL $1 или более поздняя версия. У вас установлен MySQL $2.",
        "config-db-port": "Порт базы данных:",
        "config-db-schema": "Схема для MediaWiki",
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 b7653be..9711496 100644 (file)
@@ -244,6 +244,7 @@ class RefreshLinksJob extends Job {
                        // Needed by things like Echo notifications which need
                        // to know which user caused the links update
                        if ( $update instanceof LinksUpdate ) {
+                               $update->setRevision( $revision );
                                if ( !empty( $this->params['triggeringUser'] ) ) {
                                        $userInfo = $this->params['triggeringUser'];
                                        if ( $userInfo['userId'] ) {
diff --git a/includes/libs/HtmlArmor.php b/includes/libs/HtmlArmor.php
new file mode 100644 (file)
index 0000000..511e1c9
--- /dev/null
@@ -0,0 +1,56 @@
+<?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
+ * @license GPL-2.0+
+ * @author Kunal Mehta <legoktm@member.fsf.org>
+ */
+
+/**
+ * Marks HTML that shouldn't be escaped
+ *
+ * @since 1.28
+ */
+class HtmlArmor {
+
+       /**
+        * @var string
+        */
+       private $value;
+
+       /**
+        * @param string $value
+        */
+       public function __construct( $value ) {
+               $this->value = $value;
+       }
+
+       /**
+        * Provide a string or HtmlArmor object
+        * and get safe HTML back
+        *
+        * @param string|HtmlArmor $input
+        * @return string safe for usage in HTML
+        */
+       public static function getHtml( $input ) {
+               if ( $input instanceof HtmlArmor ) {
+                       return $input->value;
+               } else {
+                       return htmlspecialchars( $input );
+               }
+       }
+}
index 470a38c..f12cb4c 100644 (file)
@@ -58,7 +58,7 @@ use Psr\Log\NullLogger;
  * to avoid collisions with keys that are not wrapped as metadata arrays. The
  * prefixes are as follows:
  *   - a) "WANCache:v" : used for regular value keys
- *   - b) "WANCache:s" : used for temporarily storing values of tombstoned keys
+ *   - b) "WANCache:i" : used for temporarily storing values of tombstoned keys
  *   - c) "WANCache:t" : used for storing timestamp "check" keys
  *
  * @ingroup Cache
@@ -127,11 +127,14 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface {
        const ERR_RELAY = 4; // relay broadcast failed
 
        const VALUE_KEY_PREFIX = 'WANCache:v:';
-       const STASH_KEY_PREFIX = 'WANCache:s:';
+       const INTERIM_KEY_PREFIX = 'WANCache:i:';
        const TIME_KEY_PREFIX = 'WANCache:t:';
 
        const PURGE_VAL_PREFIX = 'PURGED:';
 
+       const VFLD_DATA = 'WOC:d'; // key to the value of versioned data
+       const VFLD_VERSION = 'WOC:v'; // key to the version of the value present
+
        const MAX_PC_KEYS = 1000; // max keys to keep in process cache
 
        const DEFAULT_PURGE_CHANNEL = 'wancache-purge';
@@ -207,14 +210,17 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface {
         * That method has cache slam avoiding features for hot/expensive keys.
         *
         * @param string $key Cache key
-        * @param mixed $curTTL Approximate TTL left on the key if present [returned]
+        * @param mixed $curTTL Approximate TTL left on the key if present/tombstoned [returned]
         * @param array $checkKeys List of "check" keys
+        * @param float &$asOf UNIX timestamp of cached value; null on failure [returned]
         * @return mixed Value of cache key or false on failure
         */
-       final public function get( $key, &$curTTL = null, array $checkKeys = [] ) {
+       final public function get( $key, &$curTTL = null, array $checkKeys = [], &$asOf = null ) {
                $curTTLs = [];
-               $values = $this->getMulti( [ $key ], $curTTLs, $checkKeys );
+               $asOfs = [];
+               $values = $this->getMulti( [ $key ], $curTTLs, $checkKeys, $asOfs );
                $curTTL = isset( $curTTLs[$key] ) ? $curTTLs[$key] : null;
+               $asOf = isset( $asOfs[$key] ) ? $asOfs[$key] : null;
 
                return isset( $values[$key] ) ? $values[$key] : false;
        }
@@ -228,13 +234,15 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface {
         * @param array $curTTLs Map of (key => approximate TTL left) for existing keys [returned]
         * @param array $checkKeys List of check keys to apply to all $keys. May also apply "check"
         *  keys to specific cache keys only by using cache keys as keys in the $checkKeys array.
+        * @param float[] &$asOfs Map of (key =>  UNIX timestamp of cached value; null on failure)
         * @return array Map of (key => value) for keys that exist
         */
        final public function getMulti(
-               array $keys, &$curTTLs = [], array $checkKeys = []
+               array $keys, &$curTTLs = [], array $checkKeys = [], array &$asOfs = []
        ) {
                $result = [];
                $curTTLs = [];
+               $asOfs = [];
 
                $vPrefixLen = strlen( self::VALUE_KEY_PREFIX );
                $valueKeys = self::prefixCacheKeys( $keys, self::VALUE_KEY_PREFIX );
@@ -297,6 +305,7 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface {
                                }
                        }
                        $curTTLs[$key] = $curTTL;
+                       $asOfs[$key] = ( $value !== false ) ? $wrappedValues[$vKey][self::FLD_TIME] : null;
                }
 
                return $result;
@@ -761,13 +770,18 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface {
         *      higher this is set, the higher the worst-case staleness can be.
         *      Use WANObjectCache::TSE_NONE to disable this logic.
         *      Default: WANObjectCache::TSE_NONE.
-        *   - pcTTL : process cache the value in this PHP instance with this TTL. This avoids
+        *   - pcTTL: Process cache the value in this PHP instance with this TTL. This avoids
         *      network I/O when a key is read several times. This will not cache if the callback
         *      returns false however. Note that any purges will not be seen while process cached;
         *      since the callback should use slave DBs and they may be lagged or have snapshot
         *      isolation anyway, this should not typically matter.
         *      Default: WANObjectCache::TTL_UNCACHEABLE.
-        * @return mixed Value to use for the key
+        *   - version: Integer version number. This allows for callers to make breaking changes to
+        *      how values are stored while maintaining compatability and correct cache purges. New
+        *      versions are stored alongside older versions concurrently. Avoid storing class objects
+        *      however, as this reduces compatibility (due to serialization).
+        *      Default: null.
+        * @return mixed Value found or written to the key
         */
        final public function getWithSetCallback( $key, $ttl, $callback, array $opts = [] ) {
                $pcTTL = isset( $opts['pcTTL'] ) ? $opts['pcTTL'] : self::TTL_UNCACHEABLE;
@@ -776,8 +790,43 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface {
                $value = ( $pcTTL >= 0 ) ? $this->procCache->get( $key ) : false;
 
                if ( $value === false ) {
+                       unset( $opts['minTime'] ); // not a public feature
+
                        // Fetch the value over the network
-                       $value = $this->doGetWithSetCallback( $key, $ttl, $callback, $opts );
+                       if ( isset( $opts['version'] ) ) {
+                               $version = $opts['version'];
+                               $asOf = null;
+                               $cur = $this->doGetWithSetCallback(
+                                       $key,
+                                       $ttl,
+                                       function ( $oldValue, &$ttl, &$setOpts ) use ( $callback, $version ) {
+                                               $oldData = $oldValue ? $oldValue[self::VFLD_DATA] : false;
+                                               return [
+                                                       self::VFLD_DATA => $callback( $oldData, $ttl, $setOpts ),
+                                                       self::VFLD_VERSION => $version
+                                               ];
+                                       },
+                                       $opts,
+                                       $asOf
+                               );
+                               if ( $cur[self::VFLD_VERSION] === $version ) {
+                                       // Value created or existed before with version; use it
+                                       $value = $cur[self::VFLD_DATA];
+                               } else {
+                                       // Value existed before with a different version; use variant key.
+                                       // Reflect purges to $key by requiring that this key value be newer.
+                                       $value = $this->doGetWithSetCallback(
+                                               'cache-variant:' . md5( $key ) . ":$version",
+                                               $ttl,
+                                               $callback,
+                                               // Regenerate value if not newer than $key
+                                               [ 'version' => null, 'minTime' => $asOf ] + $opts
+                                       );
+                               }
+                       } else {
+                               $value = $this->doGetWithSetCallback( $key, $ttl, $callback, $opts );
+                       }
+
                        // Update the process cache if enabled
                        if ( $pcTTL >= 0 && $value !== false ) {
                                $this->procCache->set( $key, $value, $pcTTL );
@@ -795,21 +844,29 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface {
         * @param string $key
         * @param integer $ttl
         * @param callback $callback
-        * @param array $opts
+        * @param array $opts Options map for getWithSetCallback() which also includes:
+        *   - minTime: Treat values older than this UNIX timestamp as not existing. Default: null.
+        * @param float &$asOf Cache generation timestamp of returned value [returned]
         * @return mixed
         */
-       protected function doGetWithSetCallback( $key, $ttl, $callback, array $opts ) {
+       protected function doGetWithSetCallback( $key, $ttl, $callback, array $opts, &$asOf = null ) {
                $lowTTL = isset( $opts['lowTTL'] ) ? $opts['lowTTL'] : min( self::LOW_TTL, $ttl );
                $lockTSE = isset( $opts['lockTSE'] ) ? $opts['lockTSE'] : self::TSE_NONE;
                $checkKeys = isset( $opts['checkKeys'] ) ? $opts['checkKeys'] : [];
+               $minTime = isset( $opts['minTime'] ) ? $opts['minTime'] : 0.0;
+               $versioned = isset( $opts['version'] );
 
                // Get the current key value
                $curTTL = null;
-               $cValue = $this->get( $key, $curTTL, $checkKeys ); // current value
+               $cValue = $this->get( $key, $curTTL, $checkKeys, $asOf ); // current value
                $value = $cValue; // return value
 
                // Determine if a regeneration is desired
-               if ( $value !== false && $curTTL > 0 && !$this->worthRefresh( $curTTL, $lowTTL ) ) {
+               if ( $value !== false
+                       && $curTTL > 0
+                       && $this->isValid( $value, $versioned, $asOf, $minTime )
+                       && !$this->worthRefresh( $curTTL, $lowTTL )
+               ) {
                        return $value;
                }
 
@@ -829,15 +886,18 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface {
                        if ( $this->cache->lock( $key, 0, self::LOCK_TTL ) ) {
                                // Lock acquired; this thread should update the key
                                $lockAcquired = true;
-                       } elseif ( $value !== false ) {
+                       } elseif ( $value !== false && $this->isValid( $value, $versioned, $asOf, $minTime ) ) {
                                // If it cannot be acquired; then the stale value can be used
                                return $value;
                        } else {
-                               // Use the stash value for tombstoned keys to reduce regeneration load.
+                               // Use the INTERIM value for tombstoned keys to reduce regeneration load.
                                // For hot keys, either another thread has the lock or the lock failed;
-                               // use the stash value from the last thread that regenerated it.
-                               $value = $this->cache->get( self::STASH_KEY_PREFIX . $key );
-                               if ( $value !== false ) {
+                               // use the INTERIM value from the last thread that regenerated it.
+                               $wrapped = $this->cache->get( self::INTERIM_KEY_PREFIX . $key );
+                               $value = $this->unwrap( $wrapped, microtime( true ) );
+                               if ( $value !== false && $this->isValid( $value, $versioned, $asOf, $minTime ) ) {
+                                       $asOf = $wrapped[self::FLD_TIME];
+
                                        return $value;
                                }
                        }
@@ -850,11 +910,13 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface {
                // Generate the new value from the callback...
                $setOpts = [];
                $value = call_user_func_array( $callback, [ $cValue, &$ttl, &$setOpts ] );
+               $asOf = microtime( true );
                // When delete() is called, writes are write-holed by the tombstone,
-               // so use a special stash key to pass the new value around threads.
+               // so use a special INTERIM key to pass the new value around threads.
                if ( $useMutex && $value !== false && $ttl >= 0 ) {
                        $tempTTL = max( 1, (int)$lockTSE ); // set() expects seconds
-                       $this->cache->set( self::STASH_KEY_PREFIX . $key, $value, $tempTTL );
+                       $wrapped = $this->wrap( $value, $tempTTL, $asOf );
+                       $this->cache->set( self::INTERIM_KEY_PREFIX . $key, $wrapped, $tempTTL );
                }
 
                if ( $lockAcquired ) {
@@ -1005,6 +1067,25 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface {
                return mt_rand( 1, 1e9 ) <= 1e9 * $chance;
        }
 
+       /**
+        * Check whether $value is appropriately versioned and not older than $minTime (if set)
+        *
+        * @param array $value
+        * @param bool $versioned
+        * @param float $asOf The time $value was generated
+        * @param float $minTime The last time the main value was generated (0.0 if unknown)
+        * @return bool
+        */
+       protected function isValid( $value, $versioned, $asOf, $minTime ) {
+               if ( $versioned && !isset( $value[self::VFLD_VERSION] ) ) {
+                       return false;
+               } elseif ( $minTime > 0 && $asOf < $minTime ) {
+                       return false;
+               }
+
+               return true;
+       }
+
        /**
         * Do not use this method outside WANObjectCache
         *
diff --git a/includes/linker/LinkRenderer.php b/includes/linker/LinkRenderer.php
new file mode 100644 (file)
index 0000000..432dcb2
--- /dev/null
@@ -0,0 +1,448 @@
+<?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
+ * @license GPL-2.0+
+ * @author Kunal Mehta <legoktm@member.fsf.org>
+ */
+namespace MediaWiki\Linker;
+
+use DummyLinker;
+use Hooks;
+use Html;
+use HtmlArmor;
+use Linker;
+use MediaWiki\MediaWikiServices;
+use Sanitizer;
+use Title;
+use TitleFormatter;
+
+/**
+ * Class that generates HTML <a> links for pages.
+ *
+ * @since 1.28
+ */
+class LinkRenderer {
+
+       /**
+        * Whether to force the pretty article path
+        *
+        * @var bool
+        */
+       private $forceArticlePath = false;
+
+       /**
+        * A PROTO_* constant or false
+        *
+        * @var string|bool|int
+        */
+       private $expandUrls = false;
+
+       /**
+        * @var int
+        */
+       private $stubThreshold = 0;
+
+       /**
+        * @var TitleFormatter
+        */
+       private $titleFormatter;
+
+       /**
+        * Whether to run the legacy Linker hooks
+        *
+        * @var bool
+        */
+       private $runLegacyBeginHook = true;
+
+       /**
+        * @param TitleFormatter $titleFormatter
+        */
+       public function __construct( TitleFormatter $titleFormatter ) {
+               $this->titleFormatter = $titleFormatter;
+       }
+
+       /**
+        * @param bool $force
+        */
+       public function setForceArticlePath( $force ) {
+               $this->forceArticlePath = $force;
+       }
+
+       /**
+        * @return bool
+        */
+       public function getForceArticlePath() {
+               return $this->forceArticlePath;
+       }
+
+       /**
+        * @param string|bool|int $expand A PROTO_* constant or false
+        */
+       public function setExpandURLs( $expand ) {
+               $this->expandUrls = $expand;
+       }
+
+       /**
+        * @return string|bool|int a PROTO_* constant or false
+        */
+       public function getExpandURLs() {
+               return $this->expandUrls;
+       }
+
+       /**
+        * @param int $threshold
+        */
+       public function setStubThreshold( $threshold ) {
+               $this->stubThreshold = $threshold;
+       }
+
+       /**
+        * @return int
+        */
+       public function getStubThreshold() {
+               return $this->stubThreshold;
+       }
+
+       /**
+        * @param bool $run
+        */
+       public function setRunLegacyBeginHook( $run ) {
+               $this->runLegacyBeginHook = $run;
+       }
+
+       /**
+        * @param LinkTarget $target
+        * @param string|HtmlArmor|null $text
+        * @param array $extraAttribs
+        * @param array $query
+        * @return string
+        */
+       public function makeLink(
+               LinkTarget $target, $text = null, array $extraAttribs = [], array $query = []
+       ) {
+               $title = Title::newFromLinkTarget( $target );
+               if ( $title->isKnown() ) {
+                       return $this->makeKnownLink( $target, $text, $extraAttribs, $query );
+               } else {
+                       return $this->makeBrokenLink( $target, $text, $extraAttribs, $query );
+               }
+       }
+
+       /**
+        * Get the options in the legacy format
+        *
+        * @param bool $isKnown Whether the link is known or broken
+        * @return array
+        */
+       private function getLegacyOptions( $isKnown ) {
+               $options = [ 'stubThreshold' => $this->stubThreshold ];
+               if ( $this->forceArticlePath ) {
+                       $options[] = 'forcearticlepath';
+               }
+               if ( $this->expandUrls === PROTO_HTTP ) {
+                       $options[] = 'http';
+               } elseif ( $this->expandUrls === PROTO_HTTPS ) {
+                       $options[] = 'https';
+               }
+
+               $options[] = $isKnown ? 'known' : 'broken';
+
+               return $options;
+       }
+
+       private function runBeginHook( LinkTarget $target, &$text, &$extraAttribs, &$query, $isKnown ) {
+               $ret = null;
+               if ( !Hooks::run( 'HtmlPageLinkRendererBegin',
+                       [ $this, $target, &$text, &$extraAttribs, &$query, &$ret ] )
+               ) {
+                       return $ret;
+               }
+
+               // Now run the legacy hook
+               return $this->runLegacyBeginHook( $target, $text, $extraAttribs, $query, $isKnown );
+       }
+
+       private function runLegacyBeginHook( LinkTarget $target, &$text, &$extraAttribs, &$query,
+               $isKnown
+       ) {
+               if ( !$this->runLegacyBeginHook || !Hooks::isRegistered( 'LinkBegin' ) ) {
+                       // Disabled, or nothing registered
+                       return null;
+               }
+
+               $realOptions = $options = $this->getLegacyOptions( $isKnown );
+               $ret = null;
+               $dummy = new DummyLinker();
+               $title = Title::newFromLinkTarget( $target );
+               if ( $text !== null ) {
+                       $realHtml = $html = HtmlArmor::getHtml( $text );
+               } else {
+                       $realHtml = $html = null;
+               }
+               if ( !Hooks::run( 'LinkBegin',
+                       [ $dummy, $title, &$html, &$extraAttribs, &$query, &$options, &$ret ] )
+               ) {
+                       return $ret;
+               }
+
+               if ( $html !== null && $html !== $realHtml ) {
+                       // &$html was modified, so re-armor it as $text
+                       $text = new HtmlArmor( $html );
+               }
+
+               // Check if they changed any of the options, hopefully not!
+               if ( $options !== $realOptions ) {
+                       $factory = MediaWikiServices::getInstance()->getLinkRendererFactory();
+                       // They did, so create a separate instance and have that take over the rest
+                       $newRenderer = $factory->createFromLegacyOptions( $options );
+                       // Don't recurse the hook...
+                       $newRenderer->setRunLegacyBeginHook( false );
+                       if ( in_array( 'known', $options, true ) ) {
+                               return $newRenderer->makeKnownLink( $title, $text, $extraAttribs, $query );
+                       } elseif ( in_array( 'broken', $options, true ) ) {
+                               return $newRenderer->makeBrokenLink( $title, $text, $extraAttribs, $query );
+                       } else {
+                               return $newRenderer->makeLink( $title, $text, $extraAttribs, $query );
+                       }
+               }
+
+               return null;
+       }
+
+       /**
+        * If you have already looked up the proper CSS classes using Linker::getLinkColour()
+        * or some other method, use this to avoid looking it up again.
+        *
+        * @param LinkTarget $target
+        * @param string|HtmlArmor|null $text
+        * @param string $classes CSS classes to add
+        * @param array $extraAttribs
+        * @param array $query
+        * @return string
+        */
+       public function makePreloadedLink(
+               LinkTarget $target, $text = null, $classes, array $extraAttribs = [], array $query = []
+       ) {
+               // Run begin hook
+               $ret = $this->runBeginHook( $target, $text, $extraAttribs, $query, true );
+               if ( $ret !== null ) {
+                       return $ret;
+               }
+               $target = $this->normalizeTarget( $target );
+               $url = $this->getLinkURL( $target, $query );
+               $attribs = [ 'class' => $classes ];
+               $prefixedText = $this->titleFormatter->getPrefixedText( $target );
+               if ( $prefixedText !== '' ) {
+                       $attribs['title'] = $prefixedText;
+               }
+
+               $attribs = [
+                       'href' => $url,
+               ] + $this->mergeAttribs( $attribs, $extraAttribs );
+
+               if ( $text === null ) {
+                       $text = $this->getLinkText( $target );
+               }
+
+               return $this->buildAElement( $target, $text, $attribs, true );
+       }
+
+       /**
+        * @param LinkTarget $target
+        * @param string|HtmlArmor|null $text
+        * @param array $extraAttribs
+        * @param array $query
+        * @return string
+        */
+       public function makeKnownLink(
+               LinkTarget $target, $text = null, array $extraAttribs = [], array $query = []
+       ) {
+               $classes = [];
+               if ( $target->isExternal() ) {
+                       $classes[] = 'extiw';
+               }
+               $colour = Linker::getLinkColour( $target, $this->stubThreshold );
+               if ( $colour !== '' ) {
+                       $classes[] = $colour;
+               }
+
+               return $this->makePreloadedLink(
+                       $target,
+                       $text,
+                       $classes ? implode( ' ', $classes ) : '',
+                       $extraAttribs,
+                       $query
+               );
+       }
+
+       /**
+        * @param LinkTarget $target
+        * @param string|HtmlArmor|null $text
+        * @param array $extraAttribs
+        * @param array $query
+        * @return string
+        */
+       public function makeBrokenLink(
+               LinkTarget $target, $text = null, array $extraAttribs = [], array $query = []
+       ) {
+               // Run legacy hook
+               $ret = $this->runBeginHook( $target, $text, $extraAttribs, $query, false );
+               if ( $ret !== null ) {
+                       return $ret;
+               }
+
+               # We don't want to include fragments for broken links, because they
+               # generally make no sense.
+               if ( $target->hasFragment() ) {
+                       $target = $target->createFragmentTarget( '' );
+               }
+               $target = $this->normalizeTarget( $target );
+
+               if ( !isset( $query['action'] ) && $target->getNamespace() !== NS_SPECIAL ) {
+                       $query['action'] = 'edit';
+                       $query['redlink'] = '1';
+               }
+
+               $url = $this->getLinkURL( $target, $query );
+               $attribs = [ 'class' => 'new' ];
+               $prefixedText = $this->titleFormatter->getPrefixedText( $target );
+               if ( $prefixedText !== '' ) {
+                       // This ends up in parser cache!
+                       $attribs['title'] = wfMessage( 'red-link-title', $prefixedText )
+                               ->inContentLanguage()
+                               ->text();
+               }
+
+               $attribs = [
+                       'href' => $url,
+               ] + $this->mergeAttribs( $attribs, $extraAttribs );
+
+               if ( $text === null ) {
+                       $text = $this->getLinkText( $target );
+               }
+
+               return $this->buildAElement( $target, $text, $attribs, false );
+       }
+
+       /**
+        * Builds the final <a> element
+        *
+        * @param LinkTarget $target
+        * @param string|HtmlArmor $text
+        * @param array $attribs
+        * @param bool $isKnown
+        * @return null|string
+        */
+       private function buildAElement( LinkTarget $target, $text, array $attribs, $isKnown ) {
+               $ret = null;
+               if ( !Hooks::run( 'HtmlPageLinkRendererEnd',
+                       [ $this, $target, $isKnown, &$text, &$attribs, &$ret ] )
+               ) {
+                       return $ret;
+               }
+
+               $html = HtmlArmor::getHtml( $text );
+
+               // Run legacy hook
+               if ( Hooks::isRegistered( 'LinkEnd' ) ) {
+                       $dummy = new DummyLinker();
+                       $title = Title::newFromLinkTarget( $target );
+                       $options = $this->getLegacyOptions( $isKnown );
+                       if ( !Hooks::run( 'LinkEnd',
+                               [ $dummy, $title, $options, &$html, &$attribs, &$ret ] )
+                       ) {
+                               return $ret;
+                       }
+               }
+
+               return Html::rawElement( 'a', $attribs, $html );
+       }
+
+       /**
+        * @param LinkTarget $target
+        * @return string non-escaped text
+        */
+       private function getLinkText( LinkTarget $target ) {
+               $prefixedText = $this->titleFormatter->getPrefixedText( $target );
+               // If the target is just a fragment, with no title, we return the fragment
+               // text.  Otherwise, we return the title text itself.
+               if ( $prefixedText === '' && $target->hasFragment() ) {
+                       return $target->getFragment();
+               }
+
+               return $prefixedText;
+       }
+
+       private function getLinkURL( LinkTarget $target, array $query = [] ) {
+               // TODO: Use a LinkTargetResolver service instead of Title
+               $title = Title::newFromLinkTarget( $target );
+               $proto = $this->expandUrls !== false
+                       ? $this->expandUrls
+                       : PROTO_RELATIVE;
+               if ( $this->forceArticlePath ) {
+                       $realQuery = $query;
+                       $query = [];
+               } else {
+                       $realQuery = [];
+               }
+               $url = $title->getLinkURL( $query, false, $proto );
+
+               if ( $this->forceArticlePath && $realQuery ) {
+                       $url = wfAppendQuery( $url, $realQuery );
+               }
+
+               return $url;
+       }
+
+       /**
+        * Normalizes the provided target
+        *
+        * @todo move the code from Linker actually here
+        * @param LinkTarget $target
+        * @return LinkTarget
+        */
+       private function normalizeTarget( LinkTarget $target ) {
+               return Linker::normaliseSpecialPage( $target );
+       }
+
+       /**
+        * Merges two sets of attributes
+        *
+        * @param array $defaults
+        * @param array $attribs
+        *
+        * @return array
+        */
+       private function mergeAttribs( $defaults, $attribs ) {
+               if ( !$attribs ) {
+                       return $defaults;
+               }
+               # Merge the custom attribs with the default ones, and iterate
+               # over that, deleting all "false" attributes.
+               $ret = [];
+               $merged = Sanitizer::mergeAttributes( $defaults, $attribs );
+               foreach ( $merged as $key => $val ) {
+                       # A false value suppresses the attribute
+                       if ( $val !== false ) {
+                               $ret[$key] = $val;
+                       }
+               }
+               return $ret;
+       }
+
+}
diff --git a/includes/linker/LinkRendererFactory.php b/includes/linker/LinkRendererFactory.php
new file mode 100644 (file)
index 0000000..7124be1
--- /dev/null
@@ -0,0 +1,88 @@
+<?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
+ * @license GPL-2.0+
+ * @author Kunal Mehta <legoktm@member.fsf.org>
+ */
+namespace MediaWiki\Linker;
+
+use TitleFormatter;
+use User;
+
+/**
+ * Factory to create LinkRender objects
+ * @since 1.28
+ */
+class LinkRendererFactory {
+
+       /**
+        * @var TitleFormatter
+        */
+       private $titleFormatter;
+
+       /**
+        * @param TitleFormatter $titleFormatter
+        */
+       public function __construct( TitleFormatter $titleFormatter ) {
+               $this->titleFormatter = $titleFormatter;
+       }
+
+       /**
+        * @return LinkRenderer
+        */
+       public function create() {
+               return new LinkRenderer( $this->titleFormatter );
+       }
+
+       /**
+        * @param User $user
+        * @return LinkRenderer
+        */
+       public function createForUser( User $user ) {
+               $linkRenderer = $this->create();
+               $linkRenderer->setStubThreshold( $user->getStubThreshold() );
+
+               return $linkRenderer;
+       }
+
+       /**
+        * @param array $options
+        * @return LinkRenderer
+        */
+       public function createFromLegacyOptions( array $options ) {
+               $linkRenderer = $this->create();
+
+               if ( in_array( 'forcearticlepath', $options, true ) ) {
+                       $linkRenderer->setForceArticlePath( true );
+               }
+
+               if ( in_array( 'http', $options, true ) ) {
+                       $linkRenderer->setExpandURLs( PROTO_HTTP );
+               } elseif ( in_array( 'https', $options, true ) ) {
+                       $linkRenderer->setExpandURLs( PROTO_HTTPS );
+               }
+
+               if ( isset( $options['stubThreshold'] ) ) {
+                       $linkRenderer->setStubThreshold(
+                               $options['stubThreshold']
+                       );
+               }
+
+               return $linkRenderer;
+       }
+}
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 012d53c..c205626 100644 (file)
@@ -54,12 +54,14 @@ class DeleteLogFormatter extends LogFormatter {
                        // 'filearchive' for file versions, or a comma-separated list of log_ids for log
                        // entries. $subtype here is 'revision' for page revisions and file
                        // versions, or 'event' for log entries.
-                       if ( ( $subtype === 'event' && count( $params ) === 6 )
-                               || ( $subtype === 'revision' && isset( $params[3] )
-                                       && ( $params[3] === 'revision' || $params[3] === 'oldimage'
-                                               || $params[3] === 'archive' || $params[3] === 'filearchive' )
+                       if (
+                               ( $subtype === 'event' && count( $params ) === 6 )
+                               || (
+                                       $subtype === 'revision' && isset( $params[3] )
+                                       && in_array( $params[3], [ 'revision', 'archive', 'oldimage', 'filearchive' ] )
                                )
                        ) {
+                               // See RevDelList::getLogParams()/RevDelLogList::getLogParams()
                                $paramStart = $subtype === 'revision' ? 4 : 3;
 
                                $old = $this->parseBitField( $params[$paramStart + 1] );
@@ -70,7 +72,8 @@ class DeleteLogFormatter extends LogFormatter {
                                foreach ( $hid as $v ) {
                                        $changes[] = $this->msg( "$v-hid" )->plain();
                                }
-                               // messages used: revdelete-content-unhid, revdelete-summary-unhid, revdelete-uname-unhid
+                               // messages used: revdelete-content-unhid, revdelete-summary-unhid,
+                               // revdelete-uname-unhid
                                foreach ( $unhid as $v ) {
                                        $changes[] = $this->msg( "$v-unhid" )->plain();
                                }
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..13e5f14 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();
        }
 
        /**
@@ -1634,7 +1628,8 @@ class WikiPage implements Page, IDBAccessObject {
                }
 
                // Get the pre-save transform content and final parser output
-               $editInfo = $this->prepareContentForEdit( $content, null, $user, $serialFormat );
+               $useCache = !( $flags & EDIT_FORCE_BOT ); // avoid statsd noise (T136678)
+               $editInfo = $this->prepareContentForEdit( $content, null, $user, $serialFormat, $useCache );
                $pstContent = $editInfo->pstContent; // Content object
                $meta = [
                        'bot' => ( $flags & EDIT_FORCE_BOT ),
@@ -2999,6 +2994,7 @@ class WikiPage implements Page, IDBAccessObject {
         * to do the dirty work
         *
         * @todo Separate the business/permission stuff out from backend code
+        * @todo Remove $token parameter. Already verified by RollbackAction and ApiRollback.
         *
         * @param string $fromP Name of the user whose edits to rollback.
         * @param string $summary Custom summary. Set to default summary if empty.
@@ -3029,7 +3025,7 @@ class WikiPage implements Page, IDBAccessObject {
                $rollbackErrors = $this->mTitle->getUserPermissionsErrors( 'rollback', $user );
                $errors = array_merge( $editErrors, wfArrayDiff2( $rollbackErrors, $editErrors ) );
 
-               if ( !$user->matchEditToken( $token, [ $this->mTitle->getPrefixedText(), $fromP ] ) ) {
+               if ( !$user->matchEditToken( $token, 'rollback' ) ) {
                        $errors[] = [ 'sessionfailure' ];
                }
 
index 3b8b513..01cce02 100644 (file)
@@ -461,12 +461,13 @@ class CoreParserFunctions {
                        }
                } else {
                        $converter = $parser->getConverterLanguage()->getConverter();
-                       return '<span class="error">' .
+                       $parser->getOutput()->addWarning(
                                wfMessage( 'restricted-displaytitle',
                                        // Message should be parsed, but this param should only be escaped.
                                        $converter->markNoConversion( wfEscapeWikiText( $text ) )
-                               )->inContentLanguage()->text() .
-                               '</span>';
+                               )->text()
+                       );
+                       $parser->addTrackingCategory( 'restricted-displaytitle-ignored' );
                }
        }
 
@@ -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 8575e69..1c6f404 100644 (file)
@@ -287,9 +287,10 @@ class LinkHolderArray {
                $colours = [];
                $linkCache = LinkCache::singleton();
                $output = $this->parent->getOutput();
+               $linkRenderer = $this->parent->getLinkRenderer();
+               $threshold = $linkRenderer->getStubThreshold();
 
                $dbr = wfGetDB( DB_SLAVE );
-               $threshold = $this->parent->getOptions()->getStubThreshold();
 
                # Sort by namespace
                ksort( $this->internals );
@@ -352,9 +353,6 @@ class LinkHolderArray {
                                $pdbk = $title->getPrefixedDBkey();
                                $linkCache->addGoodLinkObjFromRow( $title, $s );
                                $output->addLink( $title, $s->page_id );
-                               # @todo FIXME: Convoluted data flow
-                               # The redirect status and length is passed to getLinkColour via the LinkCache
-                               # Use formal parameters instead
                                $colours[$pdbk] = Linker::getLinkColour( $title, $threshold );
                                // add id to the extension todolist
                                $linkcolour_ids[$s->page_id] = $pdbk;
@@ -387,6 +385,8 @@ class LinkHolderArray {
                                }
                                if ( $displayText === '' ) {
                                        $displayText = null;
+                               } else {
+                                       $displayText = new HtmlArmor( $displayText );
                                }
                                if ( !isset( $colours[$pdbk] ) ) {
                                        $colours[$pdbk] = 'new';
@@ -395,15 +395,16 @@ class LinkHolderArray {
                                if ( $colours[$pdbk] == 'new' ) {
                                        $linkCache->addBadLinkObj( $title );
                                        $output->addLink( $title, 0 );
-                                       $type = [ 'broken' ];
+                                       $link = $linkRenderer->makeBrokenLink(
+                                               $title, $displayText, $attribs, $query
+                                       );
                                } else {
-                                       if ( $colours[$pdbk] != '' ) {
-                                               $attribs['class'] = $colours[$pdbk];
-                                       }
-                                       $type = [ 'known', 'noclasses' ];
+                                       $link = $linkRenderer->makePreloadedLink(
+                                               $title, $displayText, $colours[$pdbk], $attribs, $query
+                                       );
                                }
-                               $replacePairs[$searchkey] = Linker::link( $title, $displayText,
-                                               $attribs, $query, $type );
+
+                               $replacePairs[$searchkey] = $link;
                        }
                }
                $replacer = new HashtableReplacer( $replacePairs, 1 );
@@ -429,11 +430,12 @@ class LinkHolderArray {
                # Make interwiki link HTML
                $output = $this->parent->getOutput();
                $replacePairs = [];
-               $options = [
-                       'stubThreshold' => $this->parent->getOptions()->getStubThreshold(),
-               ];
+               $linkRenderer = $this->parent->getLinkRenderer();
                foreach ( $this->interwikis as $key => $link ) {
-                       $replacePairs[$key] = Linker::link( $link['title'], $link['text'], [], [], $options );
+                       $replacePairs[$key] = $linkRenderer->makeLink(
+                               $link['title'],
+                               new HtmlArmor( $link['text'] )
+                       );
                        $output->addInterwikiLink( $link['title'] );
                }
                $replacer = new HashtableReplacer( $replacePairs, 1 );
@@ -573,9 +575,6 @@ class LinkHolderArray {
                                                $entry['pdbk'] = $varPdbk;
 
                                                // set pdbk and colour
-                                               # @todo FIXME: Convoluted data flow
-                                               # The redirect status and length is passed to getLinkColour via the LinkCache
-                                               # Use formal parameters instead
                                                $colours[$varPdbk] = Linker::getLinkColour( $variantTitle, $threshold );
                                                $linkcolour_ids[$s->page_id] = $pdbk;
                                        }
index 96674be..116b274 100644 (file)
@@ -20,6 +20,8 @@
  * @file
  * @ingroup Parser
  */
+use MediaWiki\Linker\LinkRenderer;
+use MediaWiki\MediaWikiServices;
 
 /**
  * @defgroup Parser Parser
@@ -121,9 +123,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>';
@@ -243,6 +250,11 @@ class Parser {
        /** @var SectionProfiler */
        protected $mProfiler;
 
+       /**
+        * @var LinkRenderer
+        */
+       protected $mLinkRenderer;
+
        /**
         * @param array $conf
         */
@@ -883,6 +895,24 @@ class Parser {
                return $this->mPreprocessor;
        }
 
+       /**
+        * Get a LinkRenderer instance to make links with
+        *
+        * @since 1.28
+        * @return LinkRenderer
+        */
+       public function getLinkRenderer() {
+               if ( !$this->mLinkRenderer ) {
+                       $this->mLinkRenderer = MediaWikiServices::getInstance()
+                               ->getLinkRendererFactory()->create();
+                       $this->mLinkRenderer->setStubThreshold(
+                               $this->getOptions()->getStubThreshold()
+                       );
+               }
+
+               return $this->mLinkRenderer;
+       }
+
        /**
         * Replaces all occurrences of HTML-style comments and the given tags
         * in the text with a random marker and returns the next text. The output
@@ -1429,7 +1459,7 @@ class Parser {
                                        substr( $m[0], 0, 20 ) . '"' );
                        }
                        $url = wfMessage( $urlmsg, $id )->inContentLanguage()->text();
-                       return Linker::makeExternalLink( $url, "{$keyword} {$id}", true, $cssClass );
+                       return Linker::makeExternalLink( $url, "{$keyword} {$id}", true, $cssClass, [], $this->mTitle );
                } elseif ( isset( $m[6] ) && $m[6] !== '' ) {
                        # ISBN
                        $isbn = $m[6];
@@ -1517,7 +1547,7 @@ class Parser {
                        $text = Linker::makeExternalLink( $url,
                                $this->getConverterLanguage()->markNoConversion( $url, true ),
                                true, 'free',
-                               $this->getExternalLinkAttribs( $url ) );
+                               $this->getExternalLinkAttribs( $url ), $this->mTitle );
                        # Register it in the output object...
                        # Replace unnecessary URL escape codes with their equivalent characters
                        $pasteurized = self::normalizeLinkUrl( $url );
@@ -1814,7 +1844,7 @@ class Parser {
                        # Funny characters like ö aren't valid in URLs anyway
                        # This was changed in August 2004
                        $s .= Linker::makeExternalLink( $url, $text, false, $linktype,
-                               $this->getExternalLinkAttribs( $url ) ) . $dtrail . $trail;
+                               $this->getExternalLinkAttribs( $url ), $this->mTitle ) . $dtrail . $trail;
 
                        # Register link in the output object.
                        # Replace unnecessary URL escape codes with the referenced character
@@ -1852,17 +1882,28 @@ class Parser {
         * (depending on configuration, namespace, and the URL's domain) and/or a
         * target attribute (depending on configuration).
         *
-        * @param string|bool $url Optional URL, to extract the domain from for rel =>
+        * @param string $url URL to extract the domain from for rel =>
         *   nofollow if appropriate
         * @return array Associative array of HTML attributes
         */
-       public function getExternalLinkAttribs( $url = false ) {
+       public function getExternalLinkAttribs( $url ) {
                $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;
        }
 
@@ -2313,7 +2354,7 @@ class Parser {
                        # batch file existence checks for NS_FILE and NS_MEDIA
                        if ( $iw == '' && $nt->isAlwaysKnown() ) {
                                $this->mOutput->addLink( $nt );
-                               $s .= $this->makeKnownLinkHolder( $nt, $text, [], $trail, $prefix );
+                               $s .= $this->makeKnownLinkHolder( $nt, $text, $trail, $prefix );
                        } else {
                                # Links will be added to the output link list after checking
                                $s .= $holders->makeHolder( $nt, $text, [], $trail, $prefix );
@@ -2331,22 +2372,20 @@ class Parser {
         *
         * @param Title $nt
         * @param string $text
-        * @param array|string $query
         * @param string $trail
         * @param string $prefix
         * @return string HTML-wikitext mix oh yuck
         */
-       public function makeKnownLinkHolder( $nt, $text = '', $query = [], $trail = '', $prefix = '' ) {
+       protected function makeKnownLinkHolder( $nt, $text = '', $trail = '', $prefix = '' ) {
                list( $inside, $trail ) = Linker::splitTrail( $trail );
 
-               if ( is_string( $query ) ) {
-                       $query = wfCgiToArray( $query );
-               }
                if ( $text == '' ) {
                        $text = htmlspecialchars( $nt->getPrefixedText() );
                }
 
-               $link = Linker::linkKnown( $nt, "$prefix$text$inside", [], $query );
+               $link = $this->getLinkRenderer()->makeKnownLink(
+                       $nt, new HtmlArmor( "$prefix$text$inside" )
+               );
 
                return $this->armorLinks( $link ) . $trail;
        }
index 729b9db..91cd0f4 100644 (file)
@@ -701,7 +701,7 @@ class ParserOptions {
                }
                // Check the object and lazy-loaded options
                return (
-                       $this->mUserLang->getCode() === $other->mUserLang->getCode() &&
+                       $this->mUserLang->equals( $other->mUserLang ) &&
                        $this->getDateFormat() === $other->getDateFormat()
                );
        }
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 1e7329a..b06553a 100644 (file)
@@ -468,7 +468,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
                if ( !file_exists( $localPath ) ) {
                        throw new MWException( __METHOD__ . ": skip function file not found: \"$localPath\"" );
                }
-               $contents = file_get_contents( $localPath );
+               $contents = $this->stripBom( file_get_contents( $localPath ) );
                if ( $this->getConfig()->get( 'ResourceLoaderValidateStaticJS' ) ) {
                        $contents = $this->validateScriptFile( $localPath, $contents );
                }
@@ -810,7 +810,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
                        if ( !file_exists( $localPath ) ) {
                                throw new MWException( __METHOD__ . ": script file not found: \"$localPath\"" );
                        }
-                       $contents = file_get_contents( $localPath );
+                       $contents = $this->stripBom( file_get_contents( $localPath ) );
                        if ( $this->getConfig()->get( 'ResourceLoaderValidateStaticJS' ) ) {
                                // Static files don't really need to be checked as often; unlike
                                // on-wiki module they shouldn't change unexpectedly without
@@ -882,7 +882,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
                        $style = $this->compileLessFile( $localPath, $context );
                        $this->hasGeneratedStyles = true;
                } else {
-                       $style = file_get_contents( $localPath );
+                       $style = $this->stripBom( file_get_contents( $localPath ) );
                }
 
                if ( $flip ) {
@@ -990,7 +990,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
                        $localPath = $this->getLocalPath( $templatePath );
                        if ( file_exists( $localPath ) ) {
                                $content = file_get_contents( $localPath );
-                               $templates[$alias] = $content;
+                               $templates[$alias] = $this->stripBom( $content );
                        } else {
                                $msg = __METHOD__ . ": template file not found: \"$localPath\"";
                                wfDebugLog( 'resourceloader', $msg );
@@ -999,4 +999,20 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
                }
                return $templates;
        }
+
+       /**
+        * Takes an input string and removes the UTF-8 BOM character if present
+        *
+        * We need to remove these after reading a file, because we concatenate our files and
+        * the BOM character is not valid in the middle of a string.
+        * We already assume UTF-8 everywhere, so this should be safe.
+        *
+        * @return string input minus the intial BOM char
+        */
+       protected function stripBom( $input ) {
+               if ( substr_compare( "\xef\xbb\xbf", $input, 0, 3 ) === 0 ) {
+                       return substr( $input, 3 );
+               }
+               return $input;
+       }
 }
diff --git a/includes/resourceloader/ResourceLoaderUserGroupsModule.php b/includes/resourceloader/ResourceLoaderUserGroupsModule.php
deleted file mode 100644 (file)
index b225185..0000000
+++ /dev/null
@@ -1,70 +0,0 @@
-<?php
-/**
- * ResourceLoader module for user customizations.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (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
- */
-
-/**
- * Module for user customizations
- */
-class ResourceLoaderUserGroupsModule extends ResourceLoaderWikiModule {
-
-       protected $origin = self::ORIGIN_USER_SITEWIDE;
-       protected $targets = [ 'desktop', 'mobile' ];
-
-       /**
-        * @param ResourceLoaderContext $context
-        * @return array
-        */
-       protected function getPages( ResourceLoaderContext $context ) {
-               $useSiteJs = $this->getConfig()->get( 'UseSiteJs' );
-               $useSiteCss = $this->getConfig()->get( 'UseSiteCss' );
-               if ( !$useSiteJs && !$useSiteCss ) {
-                       return [];
-               }
-
-               $user = $context->getUserObj();
-               if ( $user->isAnon() ) {
-                       return [];
-               }
-
-               $pages = [];
-               foreach ( $user->getEffectiveGroups() as $group ) {
-                       if ( $group == '*' ) {
-                               continue;
-                       }
-                       if ( $useSiteJs ) {
-                               $pages["MediaWiki:Group-$group.js"] = [ 'type' => 'script' ];
-                       }
-                       if ( $useSiteCss ) {
-                               $pages["MediaWiki:Group-$group.css"] = [ 'type' => 'style' ];
-                       }
-               }
-               return $pages;
-       }
-
-       /**
-        * Get group name
-        *
-        * @return string
-        */
-       public function getGroup() {
-               return 'user';
-       }
-}
index c38f8d8..8d4f263 100644 (file)
@@ -28,6 +28,7 @@
 class ResourceLoaderUserModule extends ResourceLoaderWikiModule {
 
        protected $origin = self::ORIGIN_USER_INDIVIDUAL;
+       protected $targets = [ 'desktop', 'mobile' ];
 
        /**
         * Get list of pages used by this module
@@ -36,30 +37,43 @@ class ResourceLoaderUserModule extends ResourceLoaderWikiModule {
         * @return array List of pages
         */
        protected function getPages( ResourceLoaderContext $context ) {
-               $allowUserJs = $this->getConfig()->get( 'AllowUserJs' );
-               $allowUserCss = $this->getConfig()->get( 'AllowUserCss' );
-               if ( !$allowUserJs && !$allowUserCss ) {
-                       return [];
-               }
-
+               $config = $this->getConfig();
                $user = $context->getUserObj();
                if ( $user->isAnon() ) {
                        return [];
                }
 
-               // Needed so $excludepages works
+               // Use localised/normalised variant to ensure $excludepage matches
                $userPage = $user->getUserPage()->getPrefixedDBkey();
-
                $pages = [];
-               if ( $allowUserJs ) {
+
+               if ( $config->get( 'AllowUserJs' ) ) {
                        $pages["$userPage/common.js"] = [ 'type' => 'script' ];
                        $pages["$userPage/" . $context->getSkin() . '.js'] = [ 'type' => 'script' ];
                }
-               if ( $allowUserCss ) {
+
+               if ( $config->get( 'AllowUserCss' ) ) {
                        $pages["$userPage/common.css"] = [ 'type' => 'style' ];
                        $pages["$userPage/" . $context->getSkin() . '.css'] = [ 'type' => 'style' ];
                }
 
+               $useSiteJs = $config->get( 'UseSiteJs' );
+               $useSiteCss = $config->get( 'UseSiteCss' );
+               // User group pages are maintained site-wide and enabled with site JS/CSS.
+               if ( $useSiteJs || $useSiteCss ) {
+                       foreach ( $user->getEffectiveGroups() as $group ) {
+                               if ( $group == '*' ) {
+                                       continue;
+                               }
+                               if ( $useSiteJs ) {
+                                       $pages["MediaWiki:Group-$group.js"] = [ 'type' => 'script' ];
+                               }
+                               if ( $useSiteCss ) {
+                                       $pages["MediaWiki:Group-$group.css"] = [ 'type' => 'style' ];
+                               }
+                       }
+               }
+
                // Hack for bug 26283: if we're on a preview page for a CSS/JS page,
                // we need to exclude that page from this module. In that case, the excludepage
                // parameter will be set to the name of the page we need to exclude.
@@ -69,6 +83,7 @@ class ResourceLoaderUserModule extends ResourceLoaderWikiModule {
                        // just like the keys in $pages[] above
                        unset( $pages[$excludepage] );
                }
+
                return $pages;
        }
 
index a3f8825..e3ada8e 100644 (file)
@@ -61,6 +61,9 @@ class ResourceLoaderWikiModule extends ResourceLoaderModule {
        // Group of module
        protected $group;
 
+       // Whether to enable variable expansion (e.g. "{skin}")
+       protected $allowVariables = false;
+
        /**
         * @param array $options For back-compat, this can be omitted in favour of overwriting getPages.
         */
@@ -76,6 +79,7 @@ class ResourceLoaderWikiModule extends ResourceLoaderModule {
                                case 'scripts':
                                case 'group':
                                case 'targets':
+                               case 'allowVariables':
                                        $this->{$member} = $option;
                                        break;
                        }
@@ -105,19 +109,30 @@ class ResourceLoaderWikiModule extends ResourceLoaderModule {
                // Filter out pages from origins not allowed by the current wiki configuration.
                if ( $config->get( 'UseSiteJs' ) ) {
                        foreach ( $this->scripts as $script ) {
-                               $pages[$script] = [ 'type' => 'script' ];
+                               $page = $this->expandVariables( $context, $script );
+                               $pages[$page] = [ 'type' => 'script' ];
                        }
                }
 
                if ( $config->get( 'UseSiteCss' ) ) {
                        foreach ( $this->styles as $style ) {
-                               $pages[$style] = [ 'type' => 'style' ];
+                               $page = $this->expandVariables( $context, $style );
+                               $pages[$page] = [ 'type' => 'style' ];
                        }
                }
 
                return $pages;
        }
 
+       private function expandVariables( ResourceLoaderContext $context, $pageName ) {
+               if ( !$this->allowVariables ) {
+                       return $pageName;
+               }
+               return strtr( $pageName, [
+                       '{skin}' => $context->getSkin()
+               ] );
+       }
+
        /**
         * Get group name
         *
index 9bb1dc5..72c460e 100644 (file)
@@ -41,15 +41,32 @@ class RevDelArchiveList extends RevDelRevisionList {
                        $timestamps[] = $db->timestamp( $id );
                }
 
-               return $db->select( 'archive', Revision::selectArchiveFields(),
-                               [
-                                       'ar_namespace' => $this->title->getNamespace(),
-                                       'ar_title' => $this->title->getDBkey(),
-                                       'ar_timestamp' => $timestamps
-                               ],
-                               __METHOD__,
-                               [ 'ORDER BY' => 'ar_timestamp DESC' ]
-                       );
+               $tables = [ 'archive' ];
+               $fields = Revision::selectArchiveFields();
+               $conds = [
+                       'ar_namespace' => $this->title->getNamespace(),
+                       'ar_title' => $this->title->getDBkey(),
+                       'ar_timestamp' => $timestamps,
+               ];
+               $join_conds = [];
+               $options = [ 'ORDER BY' => 'ar_timestamp DESC' ];
+
+               ChangeTags::modifyDisplayQuery(
+                       $tables,
+                       $fields,
+                       $conds,
+                       $join_conds,
+                       $options,
+                       ''
+               );
+
+               return $db->select( $tables,
+                       $fields,
+                       $conds,
+                       __METHOD__,
+                       $options,
+                       $join_conds
+               );
        }
 
        public function newItem( $row ) {
index b555592..87e641d 100644 (file)
@@ -125,6 +125,13 @@ abstract class RevDelList extends RevisionListBase {
                        $status->itemStatuses = [];
                }
 
+               // For multi-item deletions, set the old/new bitfields in log_params such that "hid X"
+               // shows in logs if field X was hidden from ANY item and likewise for "unhid Y". Note the
+               // form does not let the same field get hidden and unhidden in different items at once.
+               $virtualOldBits = 0;
+               $virtualNewBits = 0;
+               $logType = 'delete';
+
                // @codingStandardsIgnoreStart Generic.CodeAnalysis.ForLoopWithTestFunctionCall.NotAllowed
                for ( $this->reset(); $this->current(); $this->next() ) {
                        // @codingStandardsIgnoreEnd
@@ -144,7 +151,8 @@ abstract class RevDelList extends RevisionListBase {
                        $newBits = RevisionDeleter::extractBitfield( $bitPars, $oldBits );
 
                        if ( $oldBits == $newBits ) {
-                               $itemStatus->warning( 'revdelete-no-change', $item->formatDate(), $item->formatTime() );
+                               $itemStatus->warning(
+                                       'revdelete-no-change', $item->formatDate(), $item->formatTime() );
                                $status->failCount++;
                                continue;
                        } elseif ( $oldBits == 0 && $newBits != 0 ) {
@@ -157,21 +165,21 @@ abstract class RevDelList extends RevisionListBase {
 
                        if ( $item->isHideCurrentOp( $newBits ) ) {
                                // Cannot hide current version text
-                               $itemStatus->error( 'revdelete-hide-current', $item->formatDate(), $item->formatTime() );
+                               $itemStatus->error(
+                                       'revdelete-hide-current', $item->formatDate(), $item->formatTime() );
                                $status->failCount++;
                                continue;
-                       }
-                       if ( !$item->canView() ) {
+                       } elseif ( !$item->canView() ) {
                                // Cannot access this revision
                                $msg = ( $opType == 'show' ) ?
                                        'revdelete-show-no-access' : 'revdelete-modify-no-access';
                                $itemStatus->error( $msg, $item->formatDate(), $item->formatTime() );
                                $status->failCount++;
                                continue;
-                       }
                        // Cannot just "hide from Sysops" without hiding any fields
-                       if ( $newBits == Revision::DELETED_RESTRICTED ) {
-                               $itemStatus->warning( 'revdelete-only-restricted', $item->formatDate(), $item->formatTime() );
+                       } elseif ( $newBits == Revision::DELETED_RESTRICTED ) {
+                               $itemStatus->warning(
+                                       'revdelete-only-restricted', $item->formatDate(), $item->formatTime() );
                                $status->failCount++;
                                continue;
                        }
@@ -181,6 +189,16 @@ abstract class RevDelList extends RevisionListBase {
 
                        if ( $ok ) {
                                $idsForLog[] = $item->getId();
+                               // If any item field was suppressed or unsupressed
+                               if ( ( $oldBits | $newBits ) & $this->getSuppressBit() ) {
+                                       $logType = 'suppress';
+                               }
+                               // Track which fields where (un)hidden for each item
+                               $addedBits = ( $oldBits ^ $newBits ) & $newBits;
+                               $removedBits = ( $oldBits ^ $newBits ) & $oldBits;
+                               $virtualNewBits |= $addedBits;
+                               $virtualOldBits |= $removedBits;
+
                                $status->successCount++;
                                if ( $item->getAuthorId() > 0 ) {
                                        $authorIds[] = $item->getAuthorId();
@@ -188,7 +206,8 @@ abstract class RevDelList extends RevisionListBase {
                                        $authorIPs[] = $item->getAuthorName();
                                }
                        } else {
-                               $itemStatus->error( 'revdelete-concurrent-change', $item->formatDate(), $item->formatTime() );
+                               $itemStatus->error(
+                                       'revdelete-concurrent-change', $item->formatDate(), $item->formatTime() );
                                $status->failCount++;
                        }
                }
@@ -220,17 +239,19 @@ abstract class RevDelList extends RevisionListBase {
                }
 
                // Log it
-               // @FIXME: $newBits/$oldBits set in for loop, makes IDE warnings too
-               $this->updateLog( [
-                       'title' => $this->title,
-                       'count' => $successCount,
-                       'newBits' => $newBits,
-                       'oldBits' => $oldBits,
-                       'comment' => $comment,
-                       'ids' => $idsForLog,
-                       'authorIds' => $authorIds,
-                       'authorIPs' => $authorIPs
-               ] );
+               $this->updateLog(
+                       $logType,
+                       [
+                               'title' => $this->title,
+                               'count' => $successCount,
+                               'newBits' => $virtualNewBits,
+                               'oldBits' => $virtualOldBits,
+                               'comment' => $comment,
+                               'ids' => $idsForLog,
+                               'authorIds' => $authorIds,
+                               'authorIPs' => $authorIPs
+                       ]
+               );
 
                // Clear caches
                $that = $this;
@@ -254,6 +275,7 @@ abstract class RevDelList extends RevisionListBase {
 
        /**
         * Record a log entry on the action
+        * @param string $logType One of (delete,suppress)
         * @param array $params Associative array of parameters:
         *     newBits:         The new value of the *_deleted bitfield
         *     oldBits:         The old value of the *_deleted bitfield.
@@ -264,18 +286,12 @@ abstract class RevDelList extends RevisionListBase {
         *     authorsIPs:      The array of the IP/anon user offenders
         * @throws MWException
         */
-       protected function updateLog( $params ) {
+       private function updateLog( $logType, $params ) {
                // Get the URL param's corresponding DB field
                $field = RevisionDeleter::getRelationType( $this->getType() );
                if ( !$field ) {
                        throw new MWException( "Bad log URL param type!" );
                }
-               // Put things hidden from sysops in the suppression log
-               if ( ( $params['newBits'] | $params['oldBits'] ) & $this->getSuppressBit() ) {
-                       $logType = 'suppress';
-               } else {
-                       $logType = 'delete';
-               }
                // Add params for affected page and ids
                $logParams = $this->getLogParams( $params );
                // Actually add the deletion log entry
index bc2b2e9..27e5148 100644 (file)
@@ -94,13 +94,33 @@ class RevDelRevisionList extends RevDelList {
                        return $live;
                }
 
-               // Check if any requested revisions are available fully deleted.
-               $archived = $db->select( [ 'archive' ], Revision::selectArchiveFields(),
-                       [
-                               'ar_rev_id' => $ids
+               $archiveQueryInfo = [
+                       'tables' => [ 'archive' ],
+                       'fields' => Revision::selectArchiveFields(),
+                       'conds' => [
+                               'ar_rev_id' => $ids,
                        ],
+                       'options' => [ 'ORDER BY' => 'ar_rev_id DESC' ],
+                       'join_conds' => [],
+               ];
+
+               ChangeTags::modifyDisplayQuery(
+                       $archiveQueryInfo['tables'],
+                       $archiveQueryInfo['fields'],
+                       $archiveQueryInfo['conds'],
+                       $archiveQueryInfo['join_conds'],
+                       $archiveQueryInfo['options'],
+                       ''
+               );
+
+               // Check if any requested revisions are available fully deleted.
+               $archived = $db->select(
+                       $archiveQueryInfo['tables'],
+                       $archiveQueryInfo['fields'],
+                       $archiveQueryInfo['conds'],
                        __METHOD__,
-                       [ 'ORDER BY' => 'ar_rev_id DESC' ]
+                       $archiveQueryInfo['options'],
+                       $archiveQueryInfo['join_conds']
                );
 
                if ( $archived->numRows() == 0 ) {
index dcef95c..0171ed9 100644 (file)
@@ -54,6 +54,12 @@ abstract class SearchEngine {
        /** @var array Feature values */
        protected $features = [];
 
+       /** @const string profile type for completionSearch */
+       const COMPLETION_PROFILE_TYPE = 'completionSearchProfile';
+
+       /** @const string profile type for query independent ranking features */
+       const FT_QUERY_INDEP_PROFILE_TYPE = 'fulltextQueryIndepProfile';
+
        /**
         * Perform a full text search query and return a result set.
         * If full text searches are not supported or disabled, return null.
@@ -631,6 +637,24 @@ abstract class SearchEngine {
                return MediaWikiServices::getInstance()->getSearchEngineConfig()->getSearchTypes();
        }
 
+       /**
+        * Get a list of supported profiles.
+        * Some search engine implementations may expose specific profiles to fine-tune
+        * its behaviors.
+        * The profile can be passed as a feature data with setFeatureData( $profileType, $profileName )
+        * The array returned by this function contains the following keys:
+        * - name: the profile name to use with setFeatureData
+        * - desc-message: the i18n description
+        * - default: set to true if this profile is the default
+        *
+        * @since 1.28
+        * @param $profileType the type of profiles
+        * @return array|null the list of profiles or null if none available
+        */
+       public function getProfiles( $profileType ) {
+               return null;
+       }
+
 }
 
 /**
index 29878d4..719f905 100644 (file)
@@ -384,7 +384,7 @@ final class Session implements \Countable, \Iterator, \ArrayAccess {
         * @return string[] Encryption key, HMAC key
         */
        private function getSecretKeys() {
-               global $wgSessionSecret, $wgSecretKey;
+               global $wgSessionSecret, $wgSecretKey, $wgSessionPbkdf2Iterations;
 
                $wikiSecret = $wgSessionSecret ?: $wgSecretKey;
                $userSecret = $this->get( 'wsSessionSecret', null );
@@ -392,14 +392,51 @@ final class Session implements \Countable, \Iterator, \ArrayAccess {
                        $userSecret = \MWCryptRand::generateHex( 32 );
                        $this->set( 'wsSessionSecret', $userSecret );
                }
+               $iterations = $this->get( 'wsSessionPbkdf2Iterations', null );
+               if ( $iterations === null ) {
+                       $iterations = $wgSessionPbkdf2Iterations;
+                       $this->set( 'wsSessionPbkdf2Iterations', $iterations );
+               }
 
-               $keymats = hash_pbkdf2( 'sha256', $wikiSecret, $userSecret, 10001, 64, true );
+               $keymats = hash_pbkdf2( 'sha256', $wikiSecret, $userSecret, $iterations, 64, true );
                return [
                        substr( $keymats, 0, 32 ),
                        substr( $keymats, 32, 32 ),
                ];
        }
 
+       /**
+        * Decide what type of encryption to use, based on system capabilities.
+        * @return array
+        */
+       private function getEncryptionAlgorithm() {
+               global $wgSessionInsecureSecrets;
+
+               if (
+                       function_exists( 'openssl_encrypt' )
+                       && in_array( 'aes-256-ctr', openssl_get_cipher_methods(), true )
+               ) {
+                       return [ 'openssl', 'aes-256-ctr' ];
+               } elseif (
+                       function_exists( 'mcrypt_encrypt' )
+                       && in_array( 'rijndael-128', mcrypt_list_algorithms(), true )
+                       && in_array( 'ctr', mcrypt_list_modes(), true )
+               ) {
+                       return [ 'mcrypt', 'rijndael-128', 'ctr' ];
+               } elseif ( $wgSessionInsecureSecrets ) {
+                       // @todo: import a pure-PHP library for AES instead of this
+                       return [ 'insecure' ];
+               } else {
+                       throw new \BadMethodCallException(
+                               'Encryption is not available. You really should install the PHP OpenSSL extension, ' .
+                               'or failing that the mcrypt extension. But if you really can\'t and you\'re willing ' .
+                               'to accept insecure storage of sensitive session data, set ' .
+                               '$wgSessionInsecureSecrets = true in LocalSettings.php to make this exception go away.'
+                       );
+               }
+
+       }
+
        /**
         * Set a value in the session, encrypted
         *
@@ -409,8 +446,6 @@ final class Session implements \Countable, \Iterator, \ArrayAccess {
         * @param mixed $value
         */
        public function setSecret( $key, $value ) {
-               global $wgSessionInsecureSecrets;
-
                list( $encKey, $hmacKey ) = $this->getSecretKeys();
                $serialized = serialize( $value );
 
@@ -420,27 +455,27 @@ final class Session implements \Countable, \Iterator, \ArrayAccess {
                // Encrypt
                // @todo: import a pure-PHP library for AES instead of doing $wgSessionInsecureSecrets
                $iv = \MWCryptRand::generate( 16, true );
-               if ( function_exists( 'openssl_encrypt' ) ) {
-                       $ciphertext = openssl_encrypt( $serialized, 'aes-256-ctr', $encKey, OPENSSL_RAW_DATA, $iv );
-                       if ( $ciphertext === false ) {
-                               throw new UnexpectedValueException( 'Encryption failed: ' . openssl_error_string() );
-                       }
-               } elseif ( function_exists( 'mcrypt_encrypt' ) ) {
-                       $ciphertext = mcrypt_encrypt( 'rijndael-128', $encKey, $serialized, 'ctr', $iv );
-                       if ( $ciphertext === false ) {
-                               throw new UnexpectedValueException( 'Encryption failed' );
-                       }
-               } elseif ( $wgSessionInsecureSecrets ) {
-                       $ex = new \Exception( 'No encryption is available, storing data as plain text' );
-                       $this->logger->warning( $ex->getMessage(), [ 'exception' => $ex ] );
-                       $ciphertext = $serialized;
-               } else {
-                       throw new \BadMethodCallException(
-                               'Encryption is not available. You really should install the PHP OpenSSL extension, ' .
-                               'or failing that the mcrypt extension. But if you really can\'t and you\'re willing ' .
-                               'to accept insecure storage of sensitive session data, set ' .
-                               '$wgSessionInsecureSecrets = true in LocalSettings.php to make this exception go away.'
-                       );
+               $algorithm = $this->getEncryptionAlgorithm();
+               switch ( $algorithm[0] ) {
+                       case 'openssl':
+                               $ciphertext = openssl_encrypt( $serialized, $algorithm[1], $encKey, OPENSSL_RAW_DATA, $iv );
+                               if ( $ciphertext === false ) {
+                                       throw new \UnexpectedValueException( 'Encryption failed: ' . openssl_error_string() );
+                               }
+                               break;
+                       case 'mcrypt':
+                               $ciphertext = mcrypt_encrypt( $algorithm[1], $encKey, $serialized, $algorithm[2], $iv );
+                               if ( $ciphertext === false ) {
+                                       throw new \UnexpectedValueException( 'Encryption failed' );
+                               }
+                               break;
+                       case 'insecure':
+                               $ex = new \Exception( 'No encryption is available, storing data as plain text' );
+                               $this->logger->warning( $ex->getMessage(), [ 'exception' => $ex ] );
+                               $ciphertext = $serialized;
+                               break;
+                       default:
+                               throw new \LogicException( 'invalid algorithm' );
                }
 
                // Seal
@@ -459,8 +494,6 @@ final class Session implements \Countable, \Iterator, \ArrayAccess {
         * @return mixed
         */
        public function getSecret( $key, $default = null ) {
-               global $wgSessionInsecureSecrets;
-
                // Fetch
                $encrypted = $this->get( $key, null );
                if ( $encrypted === null ) {
@@ -488,38 +521,35 @@ final class Session implements \Countable, \Iterator, \ArrayAccess {
                }
 
                // Decrypt
-               // @todo: import a pure-PHP library for AES instead of doing $wgSessionInsecureSecrets
-               if ( function_exists( 'openssl_decrypt' ) ) {
-                       $serialized = openssl_decrypt(
-                               base64_decode( $ciphertext ), 'aes-256-ctr', $encKey, OPENSSL_RAW_DATA, base64_decode( $iv )
-                       );
-                       if ( $serialized === false ) {
-                               $ex = new \Exception( 'Decyption failed: ' . openssl_error_string() );
-                               $this->logger->debug( $ex->getMessage(), [ 'exception' => $ex ] );
-                               return $default;
-                       }
-               } elseif ( function_exists( 'mcrypt_decrypt' ) ) {
-                       $serialized = mcrypt_decrypt(
-                               'rijndael-128', $encKey, base64_decode( $ciphertext ), 'ctr', base64_decode( $iv )
-                       );
-                       if ( $serialized === false ) {
-                               $ex = new \Exception( 'Decyption failed' );
-                               $this->logger->debug( $ex->getMessage(), [ 'exception' => $ex ] );
-                               return $default;
-                       }
-               } elseif ( $wgSessionInsecureSecrets ) {
-                       $ex = new \Exception(
-                               'No encryption is available, retrieving data that was stored as plain text'
-                       );
-                       $this->logger->warning( $ex->getMessage(), [ 'exception' => $ex ] );
-                       $serialized = base64_decode( $ciphertext );
-               } else {
-                       throw new \BadMethodCallException(
-                               'Encryption is not available. You really should install the PHP OpenSSL extension, ' .
-                               'or failing that the mcrypt extension. But if you really can\'t and you\'re willing ' .
-                               'to accept insecure storage of sensitive session data, set ' .
-                               '$wgSessionInsecureSecrets = true in LocalSettings.php to make this exception go away.'
-                       );
+               $algorithm = $this->getEncryptionAlgorithm();
+               switch ( $algorithm[0] ) {
+                       case 'openssl':
+                               $serialized = openssl_decrypt( base64_decode( $ciphertext ), $algorithm[1], $encKey,
+                                       OPENSSL_RAW_DATA, base64_decode( $iv ) );
+                               if ( $serialized === false ) {
+                                       $ex = new \Exception( 'Decyption failed: ' . openssl_error_string() );
+                                       $this->logger->debug( $ex->getMessage(), [ 'exception' => $ex ] );
+                                       return $default;
+                               }
+                               break;
+                       case 'mcrypt':
+                               $serialized = mcrypt_decrypt( $algorithm[1], $encKey, base64_decode( $ciphertext ),
+                                       $algorithm[2], base64_decode( $iv ) );
+                               if ( $serialized === false ) {
+                                       $ex = new \Exception( 'Decyption failed' );
+                                       $this->logger->debug( $ex->getMessage(), [ 'exception' => $ex ] );
+                                       return $default;
+                               }
+                               break;
+                       case 'insecure':
+                               $ex = new \Exception(
+                                       'No encryption is available, retrieving data that was stored as plain text'
+                               );
+                               $this->logger->warning( $ex->getMessage(), [ 'exception' => $ex ] );
+                               $serialized = base64_decode( $ciphertext );
+                               break;
+                       default:
+                               throw new \LogicException( 'invalid algorithm' );
                }
 
                $value = unserialize( $serialized );
index c3481e8..3e5ef3b 100644 (file)
@@ -383,7 +383,7 @@ final class SessionManager implements SessionManagerInterface {
                        wfDeprecated( __METHOD__, '1.27' );
                        return \MediaWiki\Auth\AuthManager::singleton()->autoCreateUser(
                                $user,
-                               \MediaWiki\Auth\AuthManager::AUTOCREATE_SOURCE_SESSSION,
+                               \MediaWiki\Auth\AuthManager::AUTOCREATE_SOURCE_SESSION,
                                false
                        )->isGood();
                }
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 0e4252c..8dff163 100644 (file)
@@ -47,6 +47,7 @@ abstract class LoginSignupSpecialPage extends AuthManagerSpecialPage {
        protected $mEntryErrorType = 'error';
 
        protected $mLoaded = false;
+       protected $mLoadedRequest = false;
        protected $mSecureLoginUrl;
 
        /** @var string */
@@ -89,19 +90,20 @@ abstract class LoginSignupSpecialPage extends AuthManagerSpecialPage {
                $wgUseMediaWikiUIEverywhere = true;
        }
 
+       protected function setRequest( array $data, $wasPosted = null ) {
+               parent::setRequest( $data, $wasPosted );
+               $this->mLoadedRequest = false;
+       }
+
        /**
-        * Load data from request.
-        * @private
-        * @param string $subPage Subpage of Special:Userlogin
+        * Load basic request parameters for this Special page.
+        * @param $subPage
         */
-       protected function load( $subPage ) {
-               global $wgSecureLogin;
-
-               if ( $this->mLoaded ) {
+       private function loadRequestParameters( $subPage ) {
+               if ( $this->mLoadedRequest ) {
                        return;
                }
-               $this->mLoaded = true;
-
+               $this->mLoadedRequest = true;
                $request = $this->getRequest();
 
                $this->mPosted = $request->wasPosted();
@@ -114,6 +116,22 @@ abstract class LoginSignupSpecialPage extends AuthManagerSpecialPage {
                $this->mLanguage = $request->getText( 'uselang' );
                $this->mReturnTo = $request->getVal( 'returnto', '' );
                $this->mReturnToQuery = $request->getVal( 'returntoquery', '' );
+       }
+
+       /**
+        * Load data from request.
+        * @private
+        * @param string $subPage Subpage of Special:Userlogin
+        */
+       protected function load( $subPage ) {
+               global $wgSecureLogin;
+
+               $this->loadRequestParameters( $subPage );
+               if ( $this->mLoaded ) {
+                       return;
+               }
+               $this->mLoaded = true;
+               $request = $this->getRequest();
 
                $securityLevel = $this->getRequest()->getText( 'force' );
                if (
@@ -185,6 +203,12 @@ abstract class LoginSignupSpecialPage extends AuthManagerSpecialPage {
                return $params;
        }
 
+       protected function beforeExecute( $subPage ) {
+               // finish initializing the class before processing the request - T135924
+               $this->loadRequestParameters( $subPage );
+               return parent::beforeExecute( $subPage );
+       }
+
        /**
         * @param string|null $subPage
         */
@@ -652,37 +676,26 @@ abstract class LoginSignupSpecialPage extends AuthManagerSpecialPage {
                                if ( $wgLoginLanguageSelector && $this->mLanguage ) {
                                        $linkq .= '&uselang=' . $this->mLanguage;
                                }
-                               $createOrLoginHref = $linkTitle->getLocalURL( $linkq );
-
-                               if ( $this->getUser()->isLoggedIn() ) {
-                                       $createOrLoginHtml = Html::rawElement( 'div',
-                                               [ 'class' => 'mw-ui-vform-field' ],
-                                               Html::element( 'a',
-                                                       [
-                                                               'id' => 'mw-createaccount-join',
-                                                               'href' => $createOrLoginHref,
-                                                               // put right after all auth inputs in the tab order
-                                                               'tabindex' => 100,
-                                                       ],
-                                                       $this->msg( 'userlogin-createanother' )->escaped()
-                                               )
-                                       );
-                               } else {
-                                       $createOrLoginHtml = Html::rawElement( 'div',
-                                               [ 'id' => 'mw-createaccount-cta',
-                                                       'class' => 'mw-ui-vform-field' ],
-                                               $this->msg( 'userlogin-noaccount' )->escaped()
-                                               . Html::element( 'a',
-                                                       [
-                                                               'id' => 'mw-createaccount-join',
-                                                               'href' => $createOrLoginHref,
-                                                               'class' => 'mw-ui-button',
-                                                               'tabindex' => 100,
-                                                       ],
-                                                       $this->msg( 'userlogin-joinproject' )->escaped()
-                                               )
-                                       );
-                               }
+
+                               $loggedIn = $this->getUser()->isLoggedIn();
+                               $createOrLoginHtml = Html::rawElement( 'div',
+                                       [ 'id' => 'mw-createaccount' . ( !$loggedIn ? '-cta' : '' ),
+                                               'class' => ( $loggedIn ? 'mw-form-related-link-container' : 'mw-ui-vform-field' ) ],
+                                       ( $loggedIn ? '' : $this->msg( 'userlogin-noaccount' )->escaped() )
+                                       . Html::element( 'a',
+                                               [
+                                                       'id' => 'mw-createaccount-join' . ( $loggedIn ? '-loggedin' : '' ),
+                                                       'href' => $linkTitle->getLocalURL( $linkq ),
+                                                       'class' => ( $loggedIn ? '' : 'mw-ui-button' ),
+                                                       'tabindex' => 100,
+                                               ],
+                                               $this->msg(
+                                                       ( $this->getUser()->isLoggedIn() ?
+                                                               'userlogin-createanother' :
+                                                               'userlogin-joinproject'
+                                                       ) )->escaped()
+                                       )
+                               );
                                $form->addFooterText( $createOrLoginHtml );
                        }
                }
@@ -825,7 +838,7 @@ abstract class LoginSignupSpecialPage extends AuthManagerSpecialPage {
                array $requests, array $fieldInfo, array &$formDescriptor, $action
        ) {
                $coreFieldDescriptors = $this->getFieldDefinitions( $this->fakeTemplate );
-               $specialFields = array_merge( [ 'extraInput', 'linkcontainer' ],
+               $specialFields = array_merge( [ 'extraInput', 'linkcontainer', 'entryError' ],
                        array_keys( $this->fakeTemplate->getExtraInputDefinitions() ) );
 
                // keep the ordering from getCoreFieldDescriptors() where there is no explicit weight
@@ -1027,8 +1040,8 @@ abstract class LoginSignupSpecialPage extends AuthManagerSpecialPage {
                                'linkcontainer' => [
                                        // help link
                                        'type' => 'info',
-                                       'cssclass' => 'mw-form-related-link-container',
-                                       'id' => 'mw-userlogin-help',
+                                       'cssclass' => 'mw-form-related-link-container mw-userlogin-help',
+                                       // 'id' => 'mw-userlogin-help', // FIXME HTMLInfoField ignores this
                                        'raw' => true,
                                        'default' => Html::element( 'a', [
                                                'href' => Skin::makeInternalOrExternalUrl( wfMessage( 'helplogin-url' )
@@ -1055,6 +1068,17 @@ abstract class LoginSignupSpecialPage extends AuthManagerSpecialPage {
                        // 'required' => true,
                ];
 
+               if ( $this->mEntryError ) {
+                       $fieldDefinitions['entryError'] = [
+                               'type' => 'info',
+                               'default' => Html::rawElement( 'div', [ 'class' => $this->mEntryErrorType . 'box', ],
+                                       $this->mEntryError ),
+                               'raw' => true,
+                               'rawrow' => true,
+                               'weight' => -100,
+                       ];
+               }
+
                if ( !$this->showExtraInformation() ) {
                        unset( $fieldDefinitions['linkcontainer'] );
                }
index dbbee71..7c7f017 100644 (file)
@@ -46,7 +46,7 @@ class SpecialBlockList extends SpecialPage {
                $out = $this->getOutput();
                $lang = $this->getLanguage();
                $out->setPageTitle( $this->msg( 'ipblocklist' ) );
-               $out->addModuleStyles( [ 'mediawiki.special', 'mediawiki.special.blocklist' ] );
+               $out->addModuleStyles( [ 'mediawiki.special' ] );
 
                $request = $this->getRequest();
                $par = $request->getVal( 'ip', $par );
index 382dac7..4da8049 100644 (file)
@@ -81,12 +81,6 @@ class SpecialChangeCredentials extends AuthManagerSpecialPage {
                        return;
                }
 
-               if ( $this->getRequest()->getCheck( 'wpCancel' ) ) {
-                       $returnUrl = $this->getReturnUrl() ?: Title::newMainPage()->getFullURL();
-                       $this->getOutput()->redirect( $returnUrl );
-                       return;
-               }
-
                if ( !$this->authRequests ) {
                        // messages used: changecredentials-invalidsubpage, removecredentials-invalidsubpage
                        $this->showSubpageList( $this->msg( static::$messagePrefix . '-invalidsubpage', $subPage ) );
@@ -149,12 +143,8 @@ class SpecialChangeCredentials extends AuthManagerSpecialPage {
                );
 
                // messages used: changecredentials-submit removecredentials-submit
-               // changecredentials-submit-cancel removecredentials-submit-cancel
                $form->setSubmitTextMsg( static::$messagePrefix . '-submit' );
-               $form->addButton( [
-                       'name' => 'wpCancel',
-                       'value' => $this->msg( static::$messagePrefix . '-submit-cancel' )->text()
-               ] );
+               $form->showCancel()->setCancelTarget( $this->getReturnUrl() ?: Title::newMainPage() );
 
                return $form;
        }
index 9891f86..87a5b27 100644 (file)
@@ -20,6 +20,7 @@
  * @file
  * @ingroup SpecialPage
  */
+use MediaWiki\MediaWikiServices;
 
 /**
  * Implements Special:Prefixindex
@@ -165,6 +166,8 @@ class SpecialPrefixindex extends SpecialAllPages {
                $prefixList = $this->getNamespaceKeyAndText( $namespace, $prefix );
                $namespaces = $wgContLang->getNamespaces();
                $res = null;
+               $n = 0;
+               $nextRow = null;
 
                if ( !$prefixList || !$fromList ) {
                        $out = $this->msg( 'allpagesbadtitle' )->parseAsBlock();
@@ -191,7 +194,10 @@ class SpecialPrefixindex extends SpecialAllPages {
                        }
 
                        $res = $dbr->select( 'page',
-                               [ 'page_namespace', 'page_title', 'page_is_redirect' ],
+                               array_merge(
+                                       [ 'page_namespace', 'page_title' ],
+                                       LinkCache::getSelectFields()
+                               ),
                                $conds,
                                __METHOD__,
                                [
@@ -203,29 +209,30 @@ class SpecialPrefixindex extends SpecialAllPages {
 
                        // @todo FIXME: Side link to previous
 
-                       $n = 0;
                        if ( $res->numRows() > 0 ) {
                                $out = Html::openElement( 'ul', [ 'class' => 'mw-prefixindex-list' ] );
+                               $linkCache = MediaWikiServices::getInstance()->getLinkCache();
 
                                $prefixLength = strlen( $prefix );
-                               while ( ( $n < $this->maxPerPage ) && ( $s = $res->fetchObject() ) ) {
-                                       $t = Title::makeTitle( $s->page_namespace, $s->page_title );
-                                       if ( $t ) {
-                                               $displayed = $t->getText();
-                                               // Try not to generate unclickable links
-                                               if ( $this->stripPrefix && $prefixLength !== strlen( $displayed ) ) {
-                                                       $displayed = substr( $displayed, $prefixLength );
-                                               }
-                                               $link = ( $s->page_is_redirect ? '<div class="allpagesredirect">' : '' ) .
-                                                       Linker::linkKnown(
-                                                               $t,
-                                                               htmlspecialchars( $displayed ),
-                                                               $s->page_is_redirect ? [ 'class' => 'mw-redirect' ] : []
-                                                       ) .
-                                                       ( $s->page_is_redirect ? '</div>' : '' );
-                                       } else {
-                                               $link = '[[' . htmlspecialchars( $s->page_title ) . ']]';
+                               foreach ( $res as $row ) {
+                                       if ( $n >= $this->maxPerPage ) {
+                                               $nextRow = $row;
+                                               break;
                                        }
+                                       $title = Title::newFromRow( $row );
+                                       // Make sure it gets into LinkCache
+                                       $linkCache->addGoodLinkObjFromRow( $title, $row );
+                                       $displayed = $title->getText();
+                                       // Try not to generate unclickable links
+                                       if ( $this->stripPrefix && $prefixLength !== strlen( $displayed ) ) {
+                                               $displayed = substr( $displayed, $prefixLength );
+                                       }
+                                       $link = ( $title->isRedirect() ? '<div class="allpagesredirect">' : '' ) .
+                                               Linker::linkKnown(
+                                                       $title,
+                                                       htmlspecialchars( $displayed )
+                                               ) .
+                                               ( $title->isRedirect() ? '</div>' : '' );
 
                                        $out .= "<li>$link</li>\n";
                                        $n++;
@@ -254,9 +261,9 @@ class SpecialPrefixindex extends SpecialAllPages {
 
                $topOut = $this->namespacePrefixForm( $namespace, $prefix );
 
-               if ( $res && ( $n == $this->maxPerPage ) && ( $s = $res->fetchObject() ) ) {
+               if ( $res && ( $n == $this->maxPerPage ) && $nextRow ) {
                        $query = [
-                               'from' => $s->page_title,
+                               'from' => $nextRow->page_title,
                                'prefix' => $prefix,
                                'hideredirects' => $this->hideRedirects,
                                'stripprefix' => $this->stripPrefix,
@@ -270,7 +277,7 @@ class SpecialPrefixindex extends SpecialAllPages {
 
                        $nextLink = Linker::linkKnown(
                                $this->getPageTitle(),
-                               $this->msg( 'nextpage', str_replace( '_', ' ', $s->page_title ) )->escaped(),
+                               $this->msg( 'nextpage', str_replace( '_', ' ', $nextRow->page_title ) )->escaped(),
                                [],
                                $query
                        );
index d474ba5..b98ddda 100644 (file)
@@ -105,7 +105,7 @@ class SpecialSearch extends SpecialPage {
                $out = $this->getOutput();
                $out->allowClickjacking();
                $out->addModuleStyles( [
-                       'mediawiki.special', 'mediawiki.special.search', 'mediawiki.ui', 'mediawiki.ui.button',
+                       'mediawiki.special', 'mediawiki.special.search.styles', 'mediawiki.ui', 'mediawiki.ui.button',
                        'mediawiki.ui.input', 'mediawiki.widgets.SearchInputWidget.styles',
                ] );
                $this->addHelpLink( 'Help:Searching' );
@@ -1241,16 +1241,19 @@ class SpecialSearch extends SpecialPage {
                        'dataLocation' => 'content',
                ] );
 
+               $layout = new OOUI\ActionFieldLayout( $searchWidget, new OOUI\ButtonInputWidget( [
+                       'type' => 'submit',
+                       'label' => $this->msg( 'searchbutton' )->text(),
+                       'flags' => [ 'progressive', 'primary' ],
+               ] ), [
+                       'align' => 'top',
+               ] );
+
                $out =
                        Html::hidden( 'title', $this->getPageTitle()->getPrefixedText() ) .
                        Html::hidden( 'profile', $this->profile ) .
                        Html::hidden( 'fulltext', 'Search' ) .
-                       $searchWidget .
-                       new OOUI\ButtonInputWidget( [
-                               'type' => 'submit',
-                               'label' => $this->msg( 'searchbutton' )->text(),
-                               'flags' => [ 'progressive', 'primary' ],
-                       ] );
+                       $layout;
 
                // Results-info
                if ( $totalNum > 0 && $this->offset < $totalNum ) {
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 09111f6..4b731cb 100644 (file)
@@ -368,7 +368,7 @@ class SpecialUpload extends SpecialPage {
                $sessionKey = $this->mUpload->stashSession();
 
                // Add styles for the warning, reused from the live preview
-               $this->getOutput()->addModuleStyles( 'mediawiki.special.upload' );
+               $this->getOutput()->addModuleStyles( 'mediawiki.special.upload.styles' );
 
                $warningHtml = '<h2>' . $this->msg( 'uploadwarning' )->escaped() . "</h2>\n"
                        . '<div class="mw-destfile-warning"><ul>';
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 cca54b3..259d1f9 100644 (file)
@@ -57,8 +57,8 @@ class WithoutInterwikiPage extends PageQueryPage {
                        ]
                ];
 
-               $htmlForm = HTMLForm::factory( 'inline', $formDescriptor, $this->getContext() );
-               $htmlForm->setWrapperLegendMsg( 'withoutinterwiki-legend' )
+               $htmlForm = HTMLForm::factory( 'ooui', $formDescriptor, $this->getContext() );
+               $htmlForm->setWrapperLegend( '' )
                        ->setSubmitTextMsg( 'withoutinterwiki-submit' )
                        ->setMethod( 'get' )
                        ->prepareForm()
index 2f2cbc2..8e4fbaa 100644 (file)
@@ -56,7 +56,7 @@ class AllMessagesTablePager extends TablePager {
 
                $this->lang = ( $langObj ? $langObj : $wgContLang );
                $this->langcode = $this->lang->getCode();
-               $this->foreign = $this->langcode !== $wgContLang->getCode();
+               $this->foreign = !$this->lang->equals( $wgContLang );
 
                $request = $this->getRequest();
 
index 4af5cf6..951cb52 100644 (file)
@@ -699,7 +699,7 @@ class LoginFormPreAuthManager extends SpecialPage {
 
                $u->setEmail( $this->mEmail );
                $u->setRealName( $this->mRealName );
-               SessionManager::singleton()->invalidateSessionsForUser( $u );
+               $u->setToken();
 
                Hooks::run( 'LocalUserCreated', [ $u, $autocreate ] );
                $oldUser = $u;
@@ -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;
@@ -1716,6 +1718,7 @@ class LoginFormPreAuthManager extends SpecialPage {
                }
 
                SessionManager::getGlobalSession()->resetId();
+               SessionManager::getGlobalSession()->resetAllTokens();
        }
 
        /**
index 38e9ecd..a937e75 100644 (file)
@@ -105,10 +105,16 @@ class MediaWikiTitleCodec implements TitleFormatter, TitleParser {
         */
        public function formatTitle( $namespace, $text, $fragment = '', $interwiki = '' ) {
                if ( $namespace !== false ) {
-                       $namespace = $this->getNamespaceName( $namespace, $text );
+                       // Try to get a namespace name, but fallback
+                       // to empty string if it doesn't exist
+                       try {
+                               $nsName = $this->getNamespaceName( $namespace, $text );
+                       } catch ( InvalidArgumentException $e ) {
+                               $nsName = '';
+                       }
 
-                       if ( $namespace !== '' ) {
-                               $text = $namespace . ':' . $text;
+                       if ( $namespace !== 0 ) {
+                               $text = $nsName . ':' . $text;
                        }
                }
 
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..9e50f36 100644 (file)
@@ -198,12 +198,6 @@ class User implements IDBAccessObject {
         */
        protected static $mAllRights = false;
 
-       /**
-        * An in-process cache for user data lookup
-        * @var HashBagOStuff
-        */
-       protected static $inProcessCache;
-
        /** Cache variables */
        // @{
        /** @var int */
@@ -425,6 +419,7 @@ class User implements IDBAccessObject {
         */
        public function loadFromId( $flags = self::READ_NORMAL ) {
                if ( $this->mId == 0 ) {
+                       // Anonymous users are not in the database (don't need cache)
                        $this->loadDefaults();
                        return false;
                }
@@ -432,17 +427,13 @@ class User implements IDBAccessObject {
                // Try cache (unless this needs data from the master DB).
                // NOTE: if this thread called saveSettings(), the cache was cleared.
                $latest = DBAccessObjectUtils::hasFlags( $flags, self::READ_LATEST );
-               if ( $latest || !$this->loadFromCache() ) {
-                       wfDebug( "User: cache miss for user {$this->mId}\n" );
-                       // Load from DB (make sure this thread sees its own changes)
-                       if ( wfGetLB()->hasOrMadeRecentMasterChanges() ) {
-                               $flags |= self::READ_LATEST;
-                       }
+               if ( $latest ) {
                        if ( !$this->loadFromDatabase( $flags ) ) {
-                               // Can't load from ID, user is anonymous
+                               // Can't load from ID
                                return false;
                        }
-                       $this->saveToCache();
+               } else {
+                       $this->loadFromCache();
                }
 
                $this->mLoadedItems = true;
@@ -458,10 +449,8 @@ class User implements IDBAccessObject {
         */
        public static function purge( $wikiId, $userId ) {
                $cache = ObjectCache::getMainWANInstance();
-               $processCache = self::getInProcessCache();
                $key = $cache->makeGlobalKey( 'user', 'id', $wikiId, $userId );
                $cache->delete( $key );
-               $processCache->delete( $key );
        }
 
        /**
@@ -473,81 +462,42 @@ class User implements IDBAccessObject {
                return $cache->makeGlobalKey( 'user', 'id', wfWikiID(), $this->mId );
        }
 
-       /**
-        * @since 1.27
-        * @return HashBagOStuff
-        */
-       protected static function getInProcessCache() {
-               if ( !self::$inProcessCache ) {
-                       self::$inProcessCache = new HashBagOStuff( [ 'maxKeys' => 10 ] );
-               }
-               return self::$inProcessCache;
-       }
-
        /**
         * Load user data from shared cache, given mId has already been set.
         *
-        * @return bool false if the ID does not exist or data is invalid, true otherwise
+        * @return bool True
         * @since 1.25
         */
        protected function loadFromCache() {
-               if ( $this->mId == 0 ) {
-                       $this->loadDefaults();
-                       return false;
-               }
-
                $cache = ObjectCache::getMainWANInstance();
-               $processCache = self::getInProcessCache();
-               $key = $this->getCacheKey( $cache );
-               $data = $processCache->get( $key );
-               if ( !is_array( $data ) ) {
-                       $data = $cache->get( $key );
-                       if ( !is_array( $data )
-                               || !isset( $data['mVersion'] )
-                               || $data['mVersion'] < self::VERSION
-                       ) {
-                               // Object is expired
-                               return false;
-                       }
-                       $processCache->set( $key, $data );
-               }
-               wfDebug( "User: got user {$this->mId} from cache\n" );
+               $data = $cache->getWithSetCallback(
+                       $this->getCacheKey( $cache ),
+                       $cache::TTL_HOUR,
+                       function ( $oldValue, &$ttl, array &$setOpts ) {
+                               $setOpts += Database::getCacheSetOptions( wfGetDB( DB_SLAVE ) );
+                               wfDebug( "User: cache miss for user {$this->mId}\n" );
 
-               // Restore from cache
-               foreach ( self::$mCacheVars as $name ) {
-                       $this->$name = $data[$name];
-               }
+                               $this->loadFromDatabase();
+                               $this->loadGroups();
+                               $this->loadOptions();
 
-               return true;
-       }
+                               $data = [];
+                               foreach ( self::$mCacheVars as $name ) {
+                                       $data[$name] = $this->$name;
+                               }
 
-       /**
-        * Save user data to the shared cache
-        *
-        * This method should not be called outside the User class
-        */
-       public function saveToCache() {
-               $this->load();
-               $this->loadGroups();
-               $this->loadOptions();
+                               return $data;
 
-               if ( $this->isAnon() ) {
-                       // Anonymous users are uncached
-                       return;
-               }
+                       },
+                       [ 'pcTTL' => $cache::TTL_PROC_LONG, 'version' => self::VERSION ]
+               );
 
-               $data = [];
+               // Restore from cache
                foreach ( self::$mCacheVars as $name ) {
-                       $data[$name] = $this->$name;
+                       $this->$name = $data[$name];
                }
-               $data['mVersion'] = self::VERSION;
-               $opts = Database::getCacheSetOptions( wfGetDB( DB_SLAVE ) );
 
-               $cache = ObjectCache::getMainWANInstance();
-               $processCache = self::getInProcessCache();
-               $key = $this->getCacheKey( $cache );
-               $cache->set( $key, $data, $cache::TTL_HOUR, $opts );
-               $processCache->set( $key, $data );
+               return true;
        }
 
        /** @name newFrom*() static factory methods */
@@ -674,12 +624,26 @@ class User implements IDBAccessObject {
         * This can optionally create the user if it doesn't exist, and "steal" the
         * account if it does exist.
         *
+        * "Stealing" an existing user is intended to make it impossible for normal
+        * authentication processes to use the account, effectively disabling the
+        * account for normal use:
+        * - Email is invalidated, to prevent account recovery by emailing a
+        *   temporary password and to disassociate the account from the existing
+        *   human.
+        * - The token is set to a magic invalid value, to kill existing sessions
+        *   and to prevent $this->setToken() calls from resetting the token to a
+        *   valid value.
+        * - SessionManager is instructed to prevent new sessions for the user, to
+        *   do things like deauthorizing OAuth consumers.
+        * - AuthManager is instructed to revoke access, to invalidate or remove
+        *   passwords and other credentials.
+        *
         * @param string $name Username
         * @param array $options Options are:
         *  - validate: As for User::getCanonicalName(), default 'valid'
         *  - create: Whether to create the user if it doesn't already exist, default true
-        *  - steal: Whether to reset the account's password and email if it
-        *    already exists, default false
+        *  - steal: Whether to "disable" the account for normal use if it already
+        *    exists, default false
         * @return User|null
         * @since 1.27
         */
@@ -715,9 +679,8 @@ class User implements IDBAccessObject {
                }
                $user = self::newFromRow( $row );
 
-               // A user is considered to exist as a non-system user if it has a
-               // password set, or a temporary password set, or an email set, or a
-               // non-invalid token.
+               // A user is considered to exist as a non-system user if it can
+               // authenticate, or has an email set, or has a non-invalid token.
                if ( !$user->mEmail && $user->mToken === self::INVALID_TOKEN ) {
                        if ( $wgDisableAuthManager ) {
                                $passwordFactory = new PasswordFactory();
@@ -1256,8 +1219,8 @@ class User implements IDBAccessObject {
                // Paranoia
                $this->mId = intval( $this->mId );
 
-               // Anonymous user
                if ( !$this->mId ) {
+                       // Anonymous users are not in the database
                        $this->loadDefaults();
                        return false;
                }
@@ -1467,6 +1430,24 @@ class User implements IDBAccessObject {
                return $toPromote;
        }
 
+       /**
+        * Builds update conditions. Additional conditions may be added to $conditions to
+        * protected against race conditions using a compare-and-set (CAS) mechanism
+        * based on comparing $this->mTouched with the user_touched field.
+        *
+        * @param DatabaseBase $db
+        * @param array $conditions WHERE conditions for use with DatabaseBase::update
+        * @return array WHERE conditions for use with DatabaseBase::update
+        */
+       protected function makeUpdateConditions( DatabaseBase $db, array $conditions ) {
+               if ( $this->mTouched ) {
+                       // CAS check: only update if the row wasn't changed sicne it was loaded.
+                       $conditions['user_touched'] = $db->timestamp( $this->mTouched );
+               }
+
+               return $conditions;
+       }
+
        /**
         * Bump user_touched if it didn't change since this object was loaded
         *
@@ -1484,16 +1465,14 @@ class User implements IDBAccessObject {
                }
 
                // Get a new user_touched that is higher than the old one
-               $oldTouched = $this->mTouched;
                $newTouched = $this->newTouchedTimestamp();
 
                $dbw = wfGetDB( DB_MASTER );
                $dbw->update( 'user',
                        [ 'user_touched' => $dbw->timestamp( $newTouched ) ],
-                       [
+                       $this->makeUpdateConditions( $dbw, [
                                'user_id' => $this->mId,
-                               'user_touched' => $dbw->timestamp( $oldTouched ) // CAS check
-                       ],
+                       ] ),
                        __METHOD__
                );
                $success = ( $dbw->affectedRows() > 0 );
@@ -2367,16 +2346,13 @@ class User implements IDBAccessObject {
                }
 
                $cache = ObjectCache::getMainWANInstance();
-               $processCache = self::getInProcessCache();
                $key = $this->getCacheKey( $cache );
                if ( $mode === 'refresh' ) {
                        $cache->delete( $key, 1 );
-                       $processCache->delete( $key );
                } else {
                        wfGetDB( DB_MASTER )->onTransactionPreCommitOrIdle(
-                               function() use ( $cache, $processCache, $key ) {
+                               function() use ( $cache, $key ) {
                                        $cache->delete( $key );
-                                       $processCache->delete( $key );
                                }
                        );
                }
@@ -3859,6 +3835,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 +3843,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();
@@ -3873,8 +3851,15 @@ class User implements IDBAccessObject {
                        $session->setLoggedOutTimestamp( time() );
                        $session->setUser( new User );
                        $session->set( 'wsUserID', 0 ); // Other code expects this
+                       $session->resetAllTokens();
                        ScopedCallback::consume( $delay );
+                       $error = false;
                }
+               \MediaWiki\Logger\LoggerFactory::getInstance( 'authmanager' )->info( 'Logout', [
+                       'event' => 'logout',
+                       'successful' => $error === false,
+                       'status' => $error ?: 'success',
+               ] );
        }
 
        /**
@@ -3900,7 +3885,6 @@ class User implements IDBAccessObject {
                // Get a new user_touched that is higher than the old one.
                // This will be used for a CAS check as a last-resort safety
                // check against race conditions and slave lag.
-               $oldTouched = $this->mTouched;
                $newTouched = $this->newTouchedTimestamp();
 
                $dbw = wfGetDB( DB_MASTER );
@@ -3914,10 +3898,9 @@ class User implements IDBAccessObject {
                                'user_token' => strval( $this->mToken ),
                                'user_email_token' => $this->mEmailToken,
                                'user_email_token_expires' => $dbw->timestampOrNull( $this->mEmailTokenExpires ),
-                       ], [ /* WHERE */
+                       ], $this->makeUpdateConditions( $dbw, [ /* WHERE */
                                'user_id' => $this->mId,
-                               'user_touched' => $dbw->timestamp( $oldTouched ) // CAS check
-                       ], __METHOD__
+                       ] ), __METHOD__
                );
 
                if ( !$dbw->affectedRows() ) {
index 3bd3a4c..419ee47 100644 (file)
@@ -136,8 +136,9 @@ class BatchRowIterator implements RecursiveIterator {
         */
        public function extractPrimaryKeys( $row ) {
                $pk = [];
-               foreach ( $this->primaryKey as $column ) {
-                       $pk[$column] = $row->$column;
+               foreach ( $this->primaryKey as $alias => $column ) {
+                       $name = is_numeric( $alias ) ? $column : $alias;
+                       $pk[$name] = $row->{$name};
                }
                return $pk;
        }
@@ -228,8 +229,9 @@ class BatchRowIterator implements RecursiveIterator {
 
                $maxRow = end( $this->current );
                $maximumValues = [];
-               foreach ( $this->primaryKey as $column ) {
-                       $maximumValues[$column] = $this->db->addQuotes( $maxRow->$column );
+               foreach ( $this->primaryKey as $alias => $column ) {
+                       $name = is_numeric( $alias ) ? $column : $alias;
+                       $maximumValues[$column] = $this->db->addQuotes( $maxRow->{$name} );
                }
 
                $pkConditions = [];
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 e7643b1..0a6ccd3 100644 (file)
@@ -4190,6 +4190,17 @@ class Language {
                return $lang;
        }
 
+       /**
+        * Compare with an other language object
+        *
+        * @since 1.28
+        * @param Language $lang
+        * @return boolean
+        */
+       public function equals( Language $lang ) {
+               return $lang->getCode() === $this->mCode;
+       }
+
        /**
         * Get the internal language code for this language object
         *
index e4998fc..b7943ed 100644 (file)
@@ -3820,7 +3820,6 @@ public static $zh2Hant = [
 '并吞' => '併吞',
 '并拢' => '併攏',
 '并案' => '併案',
-'并火' => '併火',
 '并为一家' => '併為一家',
 '并为一体' => '併為一體',
 '并叠' => '併疊',
@@ -4498,7 +4497,6 @@ public static $zh2Hant = [
 '嘴里' => '嘴裡',
 '恶心' => '噁心',
 '噙齿戴发' => '噙齒戴髮',
-'喷洒' => '噴洒',
 '当啷' => '噹啷',
 '当当' => '噹噹',
 '噜苏' => '嚕囌',
@@ -5507,6 +5505,7 @@ public static $zh2Hant = [
 '所有只' => '所有只',
 '所托' => '所託',
 '扁拟谷盗虫' => '扁擬穀盜蟲',
+'手冢治虫' => '手塚治虫',
 '手塚治虫' => '手塚治虫',
 '手折' => '手摺',
 '手表态' => '手表態',
@@ -6336,15 +6335,9 @@ public static $zh2Hant = [
 '洄游' => '洄遊',
 '洋河大曲' => '洋河大麯',
 '洒家' => '洒家',
-'洒扫' => '洒掃',
-'洒水' => '洒水',
-'洒洒' => '洒洒',
 '洒淅' => '洒淅',
-'洒涤' => '洒滌',
-'洒滌' => '洒滌',
 '洒濯' => '洒濯',
 '洒然' => '洒然',
-'洒脱' => '洒脫',
 '洗炼' => '洗鍊',
 '洗练' => '洗鍊',
 '洗发' => '洗髮',
@@ -6570,7 +6563,6 @@ public static $zh2Hant = [
 '沈阳' => '瀋陽',
 '泸州大曲' => '瀘州大麯',
 '沥干' => '瀝乾',
-'潇洒' => '瀟洒',
 '弥山遍野' => '瀰山遍野',
 '弥漫' => '瀰漫',
 '弥弥' => '瀰瀰',
@@ -6874,7 +6866,6 @@ public static $zh2Hant = [
 '着眼于' => '着眼於',
 '着眼於' => '着眼於',
 '困乏' => '睏乏',
-'困了' => '睏了',
 '困倦' => '睏倦',
 '困觉' => '睏覺',
 '睡游病' => '睡遊病',
@@ -9883,6 +9874,7 @@ public static $zh2Hans = [
 '塏' => '垲',
 '塒' => '埘',
 '塗' => '涂',
+'塚' => '冢',
 '塟' => '葬',
 '塢' => '坞',
 '塤' => '埙',
@@ -10094,7 +10086,6 @@ public static $zh2Hans = [
 '廵' => '巡',
 '廹' => '迫',
 '廻' => '回',
-'廼' => '乃',
 '弒' => '弑',
 '弔' => '吊',
 '弳' => '弪',
@@ -14282,8 +14273,8 @@ public static $zh2TW = [
 '法属圭亚那' => '法屬蓋亞那',
 '波斯尼亚' => '波士尼亞',
 '波斯尼亞' => '波士尼亞',
-'波斯尼亚和黑塞哥维那' => '波士尼亞赫塞哥維納',
-'波斯尼亞黑塞哥維那' => '波士尼亞赫塞哥維納',
+'æ³¢æ\96¯å°¼äº\9aå\92\8cé»\91å¡\9eå\93¥ç»´é\82£' => '波士尼äº\9eè\88\87赫å¡\9eå\93¥ç¶­ç´\8d',
+'波斯尼亞和黑塞哥維那' => '波士尼亞與赫塞哥維納',
 '博茨瓦納' => '波札那',
 '博茨瓦纳' => '波札那',
 '波黑' => '波赫',
@@ -14531,6 +14522,7 @@ public static $zh2TW = [
 '分辨率' => '解析度',
 '解像度' => '解析度',
 '译码' => '解碼',
+'触摸屏' => '觸控螢幕',
 '出租车' => '計程車',
 '约翰逊' => '詹森',
 '诺曼底' => '諾曼第',
@@ -16240,7 +16232,7 @@ public static $zh2HK = [
 '法里,' => '法裏,',
 '玻里尼西亞' => '波利尼西亞',
 '波士尼亞' => '波斯尼亞',
-'波士尼äº\9e赫å¡\9eå\93¥ç¶­ç´\8d' => 'æ³¢æ\96¯å°¼äº\9e黑塞哥維那',
+'波士尼äº\9eè\88\87赫å¡\9eå\93¥ç¶­ç´\8d' => 'æ³¢æ\96¯å°¼äº\9eå\92\8c黑塞哥維那',
 '宝莱坞' => '波里活',
 '寶萊塢' => '波里活',
 '幫浦' => '泵',
@@ -19150,7 +19142,7 @@ public static $zh2CN = [
 '沿著述' => '沿著述',
 '玻里尼西亞' => '波利尼西亚',
 '波士尼亞' => '波斯尼亚',
-'波士尼亞赫塞哥維納' => '波斯尼亚和黑塞哥维那',
+'波士尼äº\9eè\88\87赫å¡\9eå\93¥ç¶­ç´\8d' => 'æ³¢æ\96¯å°¼äº\9aå\92\8cé»\91å¡\9eå\93¥ç»´é\82£',
 '鐵達尼號' => '泰坦尼克号',
 '幫浦' => '泵',
 '辛巴威' => '津巴布韦',
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..311c6bc 100644 (file)
        "createacct-another-realname-tip": "الاسم الحقيقي اختياري.\nإذا اخترت توفيره فسيستخدم لنسبة عمل المستخدم إليه.",
        "pt-login": "دخول",
        "pt-login-button": "دخول",
+       "pt-login-continue-button": "مواصلة تسجيل الدخول",
        "pt-createaccount": "إنشاء حساب",
        "pt-userlogout": "خروج",
        "php-mail-error-unknown": "خطأ غير معروف في وظيفة البريد PHP's mail()",
        "botpasswords-no-provider": "BotPasswordsSessionProvider غير متاح.",
        "botpasswords-restriction-failed": "قيود كلمة مرور البوت تمنع هذا الولوج.",
        "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": "تحتاج إلى إدخال كلمة السر الخاصة بك لتأكيد هذا التغيير.",
        "rollback": "استرجاع التعديلات",
        "rollbacklink": "استرجع",
        "rollbacklinkcount": "استرجع {{PLURAL:$1|لا تعديلات|تعديلا واحدا|تعديلين|$1 تعديلات|$1 تعديلاً|تعديل}}",
-       "rollbacklinkcount-morethan": "استرجاع أكثر من {{PLURAL:$1||تعديل|تعديلين|$1 تعديلات|$1 تعديلاً|$1 تعديل}}",
+       "rollbacklinkcount-morethan": "استرجاع أكثر من {{PLURAL:$1|تعديل|تعديل|تعديلين|$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}}]]).",
        "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..7627107 100644 (file)
        "toc": "ایچینده‌کیلر",
        "showtoc": "گؤستر",
        "hidetoc": "گیزلت",
-       "collapsible-collapse": "ییغیشلات",
-       "collapsible-expand": "گئÙ\86Û\8cØ´Ù\84ت",
+       "collapsible-collapse": "گیزلت",
+       "collapsible-expand": "گؤستر",
        "confirmable-confirm": "{{GENDER:$1|سیز}} اطمینانیز وار می؟",
        "confirmable-yes": "هن",
        "confirmable-no": "یوْخ",
        "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..7b3fd52 100644 (file)
@@ -25,7 +25,8 @@
                        "Айсар",
                        "Lizalizaufa",
                        "Кутлубаева Кунсулу Закиевна",
-                       "Вильданова Гюзель"
+                       "Вильданова Гюзель",
+                       "Ilmira"
                ]
        },
        "tog-underline": "Һылтанмалар аҫтына һыҙыу:",
        "accmailtext": "[[User talk:$1|$1]] өсөн осраҡлы яһалған серһүҙ $2 адресына ебәрелде.\n\nТанылғандан һуң был иҫәп яҙмаһы өсөн серһүҙҙе ''[[Special:ChangePassword|серһүҙҙе үҙгәртеү өсөн махсус биттә үҙгәртә алаһығыҙ]]''.",
        "newarticle": "(Яңы)",
        "newarticletext": "Һеҙ һылтанма буйынса әлегә яһалмаған биткә күстегеҙ.\nЯңы бит яһар өсөн аҫтағы тәҙрәгә текст керетегеҙ (тулыраҡ мәғлүмәт өсөн [$1 ярҙам битен] ҡарағыҙ).\nӘгәр был биткә яңылыш килеп эләккән булһағыҙ, браузерығыҙҙың '''артҡа''' төймәһенә баҫығыҙ.",
-       "anontalkpagetext": "----\n<em>Был фекер алышыу бите, иҫәп яҙыуы булдырмаған йәки уны ҡулланмаған аноним ҡатнашыусының бите.</em>\nШуның өсөн ҡулланыусыны таныу өсөн IP-адресы ҡулланыла.\nӘгәр һеҙ аноним ҡулланыусы булһағыҙ һәм һеҙгә ебәрелмәгән хәбәрҙәр алдым тиһәгеҙ (бер IP-адрес күп ҡулланыусы өсөн булырға мөмкин) һәм башҡа бындай аңлашылмаусанлыҡтар килеп сыҡмаһын өсөн, зинар, [[Special:UserLogin|системаға керегеҙ]] йәки [[Special:CreateAccount|теркәлегеҙ]].",
+       "anontalkpagetext": "----\n<em>Был фекер алышыу бите, иҫәп яҙыуы булдырмаған йәки уны ҡулланмаған аноним ҡатнашыусының бите.</em>\nҠулланыусыны таныу өсөн IP-адресы ҡулланыла.\nӘгәр һеҙ аноним ҡулланыусы булһағыҙ һәм һеҙгә ебәрелмәгән хәбәрҙәр алдым тиһәгеҙ (бер IP-адрес күп ҡулланыусы өсөн булырға мөмкин), һәм башҡа бындай аңлашылмаусанлыҡтар килеп сыҡмаһын өсөн, [[Special:UserLogin|системаға керегеҙ]] йәки [[Special:CreateAccount|теркәлегеҙ]].",
        "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": "\"{{FULLPAGENAME}}\" исемле биттең $1 номерлы өлгөһө юҡ.\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": "Медиафайлдар менән бәйләнеш",
        "confirm-watch-top": "Был битте күҙәтеү исемлегенә өҫтәргәме?",
        "confirm-unwatch-button": "Тамам",
        "confirm-unwatch-top": "Был битте күҙәтеү исемлегенән сығарырғамы?",
+       "confirm-rollback-button": "Яҡшы",
+       "confirm-rollback-top": "Был биттәге үҙгәртеүҙе кире алырғамы?",
        "quotation-marks": "\"$1\"",
        "imgmultipageprev": "← алдағы бит",
        "imgmultipagenext": "киләһе бит →",
        "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": "Ысын исемегеҙ",
+       "authprovider-resetpass-skip-label": "Ҡалдырып торорға",
+       "cannotauth-not-allowed": "Һеҙ был битте ҡуллана алмайһығыҙ.",
+       "changecredentials": "Иҫәп мәғлүмәттәрен үҙгәртеү",
+       "changecredentials-submit": "Иҫәп мәғлүмәттәрен үҙгәртеү",
+       "removecredentials": "Иҫәп мәғлүмәттәрен юйырға",
+       "removecredentials-submit": "Иҫәп мәғлүмәттәрен юйырға",
+       "credentialsform-account": "Иҫәп хужаһы"
 }
index 7a39fa8..b911fe3 100644 (file)
        "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": "<strong>Цяпер Вы ўвайшлі ў {{GRAMMAR:вінавальны|{{SITENAME}}}} як «$1».</strong>",
        "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.",
        "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": "Скасаваць",
        "accmailtext": "Створаны адвольны пароль для [[User talk:$1|$1]] быў адасланы па адрасе $2. Яго можна зьмяніць на старонцы ''[[Special:ChangePassword|зьмены паролю]]'' пасьля ўваходу.",
        "newarticle": "(Новая)",
        "newarticletext": "Вы прыйшлі па спасылцы на старонку, якая яшчэ не існуе.\nКаб стварыць яе, напішыце тэкст у полі ніжэй (глядзіце [$1 старонку дапамогі] для дадатковай інфармацыі).\nКалі Вы трапілі сюды памылкова, націсьніце кнопку «<strong>назад</strong>» у вашым браўзэры.",
-       "anontalkpagetext": "----''Гэта старонка гутарак ананімнага ўдзельніка, які яшчэ не стварыў сабе рахунак альбо не ўжывае яго. Таму мы вымушаныя ўжываць лічбавы IP-адрас дзеля ягонай ідэнтыфікацыі. Адзін IP-адрас можа выкарыстоўвацца некалькімі ўдзельнікамі. Калі Вы — ананімны ўдзельнік і лічыце, што атрымалі не прызначаныя Вам камэнтары, калі ласка, [[Special:CreateAccount|стварыце рахунак]] альбо [[Special:UserLogin|увайдзіце ў сыстэму]], каб у будучыні пазьбегнуць магчымай блытаніны зь іншымі ананімнымі ўдзельнікамі.''",
+       "anontalkpagetext": "----\n<em>Гэта старонка гутарак ананімнага ўдзельніка, які яшчэ не стварыў сабе рахунак альбо не ўжывае яго.</em>\nТаму мы вымушаныя ўжываць лічбавы IP-адрас дзеля ягонай ідэнтыфікацыі. Адзін IP-адрас можа выкарыстоўвацца некалькімі ўдзельнікамі. Калі Вы — ананімны ўдзельнік і лічыце, што атрымалі не прызначаныя Вам камэнтары, калі ласка, [[Special:CreateAccount|стварыце рахунак]] альбо [[Special:UserLogin|ўвайдзіце ў сыстэму]], каб у будучыні пазьбегнуць магчымай блытаніны зь іншымі ананімнымі ўдзельнікамі.",
        "noarticletext": "Цяпер тэкст на гэтай старонцы адсутнічае.\nВы можаце [[Special:Search/{{PAGENAME}}|пашукаць гэтую назву]] сярод іншых старонак, <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} пашукаць у адпаведных журналах падзеяў]\nальбо [{{fullurl:{{FULLPAGENAME}}|action=edit}} стварыць гэтую старонку]</span>.",
        "noarticletext-nopermission": "Цяпер на гэтай старонцы тэкст адсутнічае.\nВы можаце [[Special:Search/{{PAGENAME}}|пашукаць назву гэтай старонкі]] на іншых старонках, альбо <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} пашукаць зьвязаныя запісы ў журналах]</span>, але ў вас няма дазволу ствараць гэтую старонку.",
        "missing-revision": "Вэрсія старонкі №$1 з назвай «{{FULLPAGENAME}}» не існуе.\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 fceab4d..a52e33b 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": "Заблакаваць удзельніка",
        "confirm-watch-top": "Дабавіць старонку ў спіс назірання",
        "confirm-unwatch-button": "ОК",
        "confirm-unwatch-top": "Выняць гэту старонку з вашага спіса назірання?",
+       "confirm-rollback-top": "Адкаціць праўкі гэтай старонкі?",
        "quotation-marks": "«$1»",
        "imgmultipageprev": "← папярэдняя старонка",
        "imgmultipagenext": "наступная старонка →",
        "revdelete-restricted": "пастаўленыя абмежаванні на адміністратараў",
        "revdelete-unrestricted": "знятыя абмежаванні з адміністратараў",
        "logentry-block-block": "$1 заблакірава{{GENDER:$2|ў|ла}} {{GENDER:$4|$3}} на перыяд $5 $6",
+       "logentry-block-unblock": "$1 {{GENDER:$2|разблакаваў|разблакавала}} {{GENDER:$4|$3}}",
        "logentry-block-reblock": "$1 {{GENDER:$2|памяняў|памяняла}} настройкі блакіроўкі {{GENDER:$4|$3}} на перыяд $5 $6",
        "logentry-suppress-reblock": "$1 {{GENDER:$2|памяняў|памяняла}} параметры блакіроўкі {{GENDER:$4|$3}} на перыяд $5 $6",
+       "logentry-import-interwiki": "$1 {{GENDER:$2|імпартаваў|імпартавала}} $3 з іншай вікі",
        "logentry-move-move": "$1 {{GENDER:$2|перанёс|перанесла}} старонку $3 у $4",
        "logentry-move-move-noredirect": "$1 {{GENDER:$2|перанёс|перанесла}} старонку $3 у $4, не пакінуўшы перасылкі",
        "logentry-move-move_redir": "$1 {{GENDER:$2|перанёс|перанесла}} старонку $3 у $4 па-над перасылкаю",
index 849daa1..f47e41a 100644 (file)
        "policy-url": "Project:Политика",
        "portal": "Портал на общността",
        "portal-url": "Проект:Портал на общността",
-       "privacy": "Ð\97аÑ\89иÑ\82а Ð½Ð° Ð»Ð¸Ñ\87ниÑ\82е Ð´Ð°Ð½Ð½Ð¸",
+       "privacy": "Ð\9fовеÑ\80иÑ\82елноÑ\81Ñ\82",
        "privacypage": "Проект:Защита на личните данни",
        "badaccess": "Грешка при достъп",
        "badaccess-group0": "Нямате права да извършите исканото действие.",
        "delete-toobig": "Тази страница има голяма редакционна история с над $1 {{PLURAL:$1|версия|версии}}. Изтриването на такива страници е ограничено, за да се предотвратят евентуални поражения на {{SITENAME}}.",
        "delete-warning-toobig": "Тази страница има голяма редакционна история с над $1 {{PLURAL:$1|версия|версии}}. Възможно е изтриването да наруши някои операции в базата данни на {{SITENAME}}; необходимо е особено внимание при продължаване на действието.",
        "deleteprotected": "Не можете да изтриете страницата, защото е защитена.",
+       "deleting-backlinks-warning": "<strong>Внимание:</strong> [[Special:WhatLinksHere/{{FULLPAGENAME}}|Други страници]] сочат към или включват като шаблон страницата, която се опитвате да изтриете.",
        "rollback": "Отмяна на промените",
        "rollbacklink": "отмяна",
        "rollbacklinkcount": "отмяна на $1 {{PLURAL:$1|редакция|редакции}}",
        "revdelete-uname-hid": "скрито потребителско име",
        "revdelete-restricted": "добавени ограничения за администраторите",
        "revdelete-unrestricted": "премахнати ограничения за администраторите",
-       "logentry-suppress-block": "$1 {{GENDER:$2|блокира}} {{GENDER:$4|$3}} за срок от $5 $6",
-       "logentry-suppress-reblock": "$1 {{GENDER:$2|промени}} настройките на блокиране на {{GENDER:$4|$3}} за срок от $5 $6",
+       "logentry-block-block": "$1 блокира {{GENDER:$4|$3}} със срок на изтичане $5 $6",
+       "logentry-block-reblock": "$1 промени настройките на блокиране на {{GENDER:$4|$3}} със срок на изтичане $5 $6",
+       "logentry-suppress-block": "$1 {{GENDER:$2|блокира}} {{GENDER:$4|$3}} със срок на изтичане $5 $6",
+       "logentry-suppress-reblock": "$1 {{GENDER:$2|промени}} настройките на блокиране на {{GENDER:$4|$3}} със срок на изтичане $5 $6",
        "logentry-move-move": "$1 {{GENDER:$2|премести}} страница „$3“ като „$4“",
        "logentry-move-move-noredirect": "$1 {{GENDER:$2|премести}} страницата „$3“ като „$4“ без пренасочване",
        "logentry-move-move_redir": "$1 {{GENDER:$2|премести}} страницата $3 като $4 (върху пренасочване)",
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 fa75a26..dfd246e 100644 (file)
@@ -45,7 +45,7 @@
        "tog-ccmeonemails": "हमरा द्वारा अन्य सदस्यन के भेजल गइल ईमेल के कॉपी हमरो के भेजल जाय",
        "tog-diffonly": "अन्तर देखावत समय अंतर की नीचे पन्ना के सामग्री मत देखावल जाव।",
        "tog-showhiddencats": "छिपल श्रेणियन के भी देखावल जाय",
-       "tog-norollbackdiff": "सà¤\82पादन à¤°à¥\8bलबà¥\88à¤\95 à¤\95à¤\87ला à¤\95à¥\87 à¤¬à¤¾à¤¦ à¤\85नà¥\8dतर मत देखावल जाव",
+       "tog-norollbackdiff": "रà¥\8bलबà¥\88à¤\95 à¤\95à¤\87ला à¤\95à¥\87 à¤¬à¤¾à¤¦ à¤\85à¤\82तर मत देखावल जाव",
        "tog-useeditwarning": "जो हम कौनों पन्ना पर संपादन करत घरी परिवर्तन के बिना सहेजले छोड़ देईं त हमके खबर कइल जाव",
        "tog-prefershttps": "जब खाता में लॉगिन करीं त हमेशा सुरक्षित कनेक्शन के प्रयोग कइल जाय",
        "underline-always": "हमेशा",
        "morenotlisted": "इ सूची पूर्ण नइखे।",
        "mypage": "पन्ना",
        "mytalk": "हमार बातचीत पन्ना",
-       "anontalk": "à¤\87 à¤\86à¤\87॰पà¥\80 à¤\96ातिर à¤µà¤¾à¤°à¥\8dता",
+       "anontalk": "बातà¤\9aà¥\80त",
        "navigation": "नेविगेशन",
        "and": "&#32;अउर",
        "qbfind": "खोज",
        "nstab-template": "टेम्पलेट",
        "nstab-help": "मदद पन्ना",
        "nstab-category": "श्रेणी",
+       "mainpage-nstab": "मुख्य पन्ना",
        "nosuchaction": "अईसन कौनो कार्रवाई नाहि",
        "nosuchactiontext": "इ यू॰आर॰एल द्वारा निर्दिष्ट क्रिया अवैध बा।\nरउआ यू॰आर॰एल गलत लिखले होखब, या कउनो गलत कड़ी के प्रयोग कइले होखब।\nइ {{SITENAME}} के सॉफ़्टवेयर में त्रुटि भी हो सकत बा।",
        "nosuchspecialpage": "अईसन कौनो ख़ाश पन्ना नाहि",
        "laggedslavemode": "'''चेतावनी:''' इ पन्ना पर हाल के बदलाव ना होखे के आशंका बा।",
        "readonly": "डेटाबेस लॉक बा",
        "enterlockreason": "लॉक करे के कारण दिहीं, साथे लॉक खुले के समय के लगभग आकलन दिहीं।",
-       "readonlytext": "शायद à¤®à¥\87à¤\82à¤\9fà¥\87ननà¥\8dस à¤\95à¥\87 à¤\9aलतà¥\87 à¤¡à¤¾à¤\9fाबà¥\87स à¤¨à¤¯à¤¾ à¤¸à¤\82पादन à¤\86 à¤\85नà¥\8dय à¤¬à¤¦à¤²à¤¾à¤µ à¤¸à¥\87 à¤²à¥\89à¤\95 à¤\95रल à¤\97à¤\88ल à¤¬à¤¾, à¤\9cà¥\87à¤\95रा à¤¬à¤¾à¤¦ à¤\87 à¤\95à¥\87 à¤¸à¤¾à¤®à¤¾à¤¨à¥\8dय à¤¸à¥\8dथितà¥\80 à¤®à¥\87à¤\82 à¤\86 à¤\9cायà¥\87 à¤\95à¥\87 à¤\9aाहà¥\80à¤\82।\n\nà¤\9cà¤\89न à¤ªà¥\8dरबनà¥\8dधà¤\95 à¤\87 à¤\95à¥\87 à¤²à¥\89à¤\95 à¤\95à¤\87लà¥\87 à¤°à¤¹à¤²à¤¨ à¤\89 à¤¹à¤\87 à¤\95ारण à¤¦à¥\87हलà¥\87 à¤¬à¤¾à¤¡à¤¼à¤¨: $1",
+       "readonlytext": "डाà¤\9fाबà¥\87स à¤¨à¤¯à¤¾ à¤¸à¤\82पादन à¤\86 à¤\85नà¥\8dय à¤¬à¤¦à¤²à¤¾à¤µ à¤\96ातिर à¤²à¥\89à¤\95 à¤\95रल à¤\97à¤\87ल à¤¬à¤¾, à¤¶à¤¾à¤¯à¤¦ à¤°à¥\81à¤\9fà¥\80न à¤®à¥\87à¤\82à¤\9fà¥\87ननà¥\8dस à¤\95à¥\87 à¤\9aलतà¥\87, à¤\9cà¥\87à¤\95रा à¤¬à¤¾à¤¦ à¤\8f à¤\95à¥\87 à¤¸à¤¾à¤®à¤¾à¤¨à¥\8dय à¤¸à¥\8dथितà¥\80 à¤®à¥\87à¤\82 à¤\86 à¤\9cायà¥\87 à¤\95à¥\87 à¤\9aाहà¥\80à¤\82।\n\nà¤\9cà¤\89न à¤¸à¤¿à¤¸à¥\8dà¤\9fम à¤ªà¥\8dरबà¤\82धà¤\95 à¤\8fह à¤\95à¥\87 à¤²à¥\89à¤\95 à¤\95à¤\87लà¥\87 à¤°à¤¹à¤²à¤¨ à¤\95ारण à¤¦à¥\87हलà¥\87 à¤¬à¤¾à¤¡à¤¼à¤¨ à¤\95ि: $1",
        "missing-article": "डेटाबास ऊ पन्ना के पाठ्य के ना खोज पाईल जौन ई के खोजे के रहल, नामित \"$1\" $2.\nई सब साधारणत: निम्नलिखीत अप्रचलित अन्तर अथवा एगो पन्ना पर इतिहास के लिंक जौन मिटा दिहल गईल बा के कारण भईल।\n\nयदि ई बात नईखे, त हो सकत बा सॉफ्टवेयर में बग पावत होखब।\nकृपया ई एगो  [[Special:ListUsers/sysop|प्रबन्धक]] के यू आर एल के बारे में एगो नोट बनाके खबर करीं।",
        "missingarticle-rev": "(संशोधन#: $1)",
        "missingarticle-diff": "(अंतर: $1, $2)",
        "nocookieslogin": "{{SITENAME}} प्रयोगकर्ता लोग के खाता में प्रवेश करावे खातिर कुकिज के प्रयोग करेला।\nराउर कुकिज असक्षम बा।\nकृपया उ के सक्षम करीं आ फिर से कोशिश करीं",
        "nocookiesfornew": "स्रोत के पुष्टि ना हो पावे के कारण इ खाता निर्मित ना करल गइल। \nसुनिश्चित करीं कि रउआ कुकीज़ सक्षम कइले बानी, पृष्ठ के पुनः लोड करीं आ पुनः प्रयास करीं।",
        "noname": "रउआ उपयुक्त प्रयोगकर्ता नाम नईखीं निर्दिष्ट कईले।",
-       "loginsuccesstitle": "à¤\96ाता à¤ªà¥\8dरवà¥\87श à¤®à¥\87à¤\82 à¤¸à¤«à¤²",
+       "loginsuccesstitle": "लà¥\89à¤\97िन à¤ªà¥\82रा",
        "loginsuccess": "''' \"$1\" के रुप में रउआ {{SITENAME}} में अब प्रवेश कर चुकल बानी।'''",
-       "nosuchuser": "\"$1\" à¤¨à¤¾à¤® à¤¸à¥\87 à¤\95à¥\8cनà¥\8b à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता à¤¨à¤\88à¤\96न।\nपà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता à¤¨à¤¾à¤® à¤¸à¤\82वà¥\87दनशà¥\80ल à¤®à¤¾à¤®à¤²à¤¾ à¤¬à¤¾à¥¤\nशबà¥\8dद-वरà¥\8dतनà¥\80 à¤\95à¥\87 à¤\9cाà¤\81à¤\9a à¤\95रà¥\80à¤\82, à¤\86 à¤\9aाहà¥\87 [[Special:CreateAccount|एगो नया खाता बनाईं]]।",
+       "nosuchuser": "\"$1\" à¤¨à¤¾à¤\81व à¤\95à¥\87 à¤\95à¥\8cनà¥\8b à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता à¤¨à¤\87à¤\96न।\nपà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता à¤¨à¤¾à¤® à¤¸à¤\82वà¥\87दनशà¥\80ल à¤®à¤¾à¤®à¤²à¤¾ à¤¬à¤¾à¥¤\nशबà¥\8dद à¤\86 à¤\87सà¥\8dपà¥\87लिà¤\82à¤\97 à¤\95à¥\87 à¤\9cाà¤\81à¤\9a à¤\95रà¥\80à¤\82, à¤¯à¤¾ [[Special:CreateAccount|एगो नया खाता बनाईं]]।",
        "nosuchusershort": "ई नाम से कौनो प्रयोगकर्ता नईखन \"$1\".\nआपन शब्द-वर्तनी के जाँच करीं।",
        "nouserspecified": "रउआ एगो प्रयोगकर्ता नाम निर्दिष्ट करे के बा।",
        "login-userblocked": "ई प्रयोगकर्ता के खाता निष्क्रिय हो चुकल बा। प्रवेश के आज्ञा नईखे।",
        "wrongpasswordempty": "गुप्त-शब्द खाली बा। कृपया फिर से कोशिश करीं।",
        "passwordtooshort": "गुप्त-शब्द कम से कम {{PLURAL:$1|1 अक्षर|$1 अक्षर}} के होवे के चाहीं।",
        "passwordtoolong": "गुप्त-शब्द {{PLURAL:$1|$1 अक्षर}} से अधिक लमहर नइखे हो सकत।",
+       "passwordtoopopular": "अक्सरहा बीछल जाए वाला पासवर्ड ना इस्तेमाल होखी। कौनों अउरी खास अलग टाइप के पासवर्ड चुनीं।",
        "password-name-match": "राउर गुप्त-शब्द राउर प्रयोगकर्ता नाम से अलग होवे के चाहीं।",
        "password-login-forbidden": "इस सदस्यनाम आ गुप्तशब्द के प्रयोग वर्जित बा।",
        "mailmypassword": "गुप्तशब्द रिसेट करीं",
index 18d2978..b252e2a 100644 (file)
@@ -27,7 +27,8 @@
                        "Aashaa",
                        "Sayma Jahan",
                        "Macofe",
-                       "Bodhisattwa"
+                       "Bodhisattwa",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "সংযোগগুলির নিচে দাগ দেখানো হোক:",
        "filereadonlyerror": "\"$1\" ফাইলটিকে পরিবর্তন করা সম্ভব হচ্ছে না কারণ \"$2\" ফাইল সংগ্রহস্থল শুধুমাত্র-পঠন মোডে আছে।\n\nসিস্টেম প্রশাসক যিনি এটি বন্ধ করেছেন তিনি এই ব্যাখ্যা দিয়েছেন: \"$3\"।",
        "invalidtitle-knownnamespace": "অবৈধ শিরোনাম, যেখানে নামস্থান \"$2\" এবং লেখা হয়েছে \"$3\"",
        "invalidtitle-unknownnamespace": "অবৈধ শিরোনাম, যেখানে ব্যবহৃত হয়েছে অপরিচিত নামস্থান সংখ্যা $1 এবং লেখা হয়েছে \"$2\"",
-       "exception-nologin": "লà¦\97à¦\87ন à¦\95রা à¦¹à¦¯à¦¼নি",
+       "exception-nologin": "পà§\8dরবà§\87শ à¦\95রà§\87ন নি",
        "exception-nologin-text": "এই কাজ করা বা পাতাটি দেখার জন্য অনুগ্রহ করে প্রবেশ করুন।",
        "exception-nologin-text-manual": "অনুগ্রহ করে এই পাতা দেখতে অথবা পরিবর্তন করতে $1 করুন।",
        "virus-badscanner": "ভুল কনফিগারেশন: অজ্ঞাত ভাইরাস স্কেনার: ''$1''",
        "password-change-forbidden": "আপনি এই উইকিতে পাসওয়ার্ড পরিবর্তন করতে পারবেন না।",
        "externaldberror": "হয় কোন বহিঃস্থ যাচাইকরণ ডাটাবেজ ত্রুটি ঘটেছে অথবা আপনার বহিঃস্থ অ্যাকাউন্ট হালনাগাদ করার অনুমতি নেই।",
        "login": "প্রবেশ",
+       "login-security": "আপনার পরিচয় যাচাই করুন",
        "nav-login-createaccount": "প্রবেশ/নতুন অ্যাকাউন্ট",
        "userlogin": "প্রবেশ/নতুন অ্যাকাউন্ট",
        "userloginnocreate": "প্রবেশ",
        "createaccount": "নতুন অ্যাকাউন্ট খুলুন",
        "gotaccount": "আপনার কি ইতিমধ্যে একটি অ্যাকাউন্ট তৈরি করা আছে? '''$1''' করুন।",
        "gotaccountlink": "প্রবেশ",
-       "userlogin-resetlink": "à¦\86পনার à¦²à¦\97à¦\87নà§\87র à¦¬à¦¿à¦¸à§\8dতারিত তথ্যাদি ভুলে গেছেন?",
+       "userlogin-resetlink": "à¦\86পনার à¦ªà§\8dরবà§\87শà¦\95রণà§\87র তথ্যাদি ভুলে গেছেন?",
        "userlogin-resetpassword-link": "পাসওয়ার্ড ভুলে গেছেন?",
-       "userlogin-helplink2": "লগইন সংক্রান্ত সাহায্য",
-       "userlogin-loggedin": "আপনি বর্তমানে {{GENDER:$1|$1}} হিসাবে লগইন আছেন।\nঅন্য ব্যবহারকারী নামে লগইন করতে চাইলে নিচের ফর্মটি ব্যবহার করুন।",
+       "userlogin-helplink2": "প্রবেশ সংক্রান্ত সাহায্য",
+       "userlogin-loggedin": "আপনি বর্তমানে {{GENDER:$1|$1}} হিসাবে প্রবেশরত আছেন।\nঅন্য ব্যবহারকারী নামে প্রবেশ করতে চাইলে নিচের ফর্মটি ব্যবহার করুন।",
+       "userlogin-reauth": "আপনি যে {{GENDER:$1|$1}} তা যাচাই করতে আপনাকে আবার অবশ্যই প্রবেশ করতে হবে।",
        "userlogin-createanother": "আরেকটি অ্যাকাউন্ট তৈরি করুন",
        "createacct-emailrequired": "ইমেইল ঠিকানা",
        "createacct-emailoptional": "ইমেইল ঠিকানা (ঐচ্ছিক)",
        "user-mail-no-addy": "কোনো ইমেইল ঠিকানা ছাড়াই ইমেইল করার চেষ্টা করা হয়েছে।",
        "user-mail-no-body": "অত্যান্ত সংক্ষিপ্ত অথবা কোনো তথ্য ছাড়াই ইমেইল পাঠানোর চেষ্টা করা হয়েছিল।",
        "changepassword": "পাসওয়ার্ড পরিবর্তন",
-       "resetpass_announce": "লà¦\97à¦\87ন করার জন্য আপনাকে অবশ্যই এনটি নতুন পাসওয়ার্ড নির্ধারণ করতে হবে।",
+       "resetpass_announce": "পà§\8dরবà§\87শ করার জন্য আপনাকে অবশ্যই এনটি নতুন পাসওয়ার্ড নির্ধারণ করতে হবে।",
        "resetpass_text": "<!-- এখানে লেখা যোগ করুন -->",
        "resetpass_header": "পাসওয়ার্ড পরিবর্তন করো",
        "oldpassword": "পুরনো পাসওয়ার্ড:",
        "botpasswords-deleted-body": "ব্যবহারকারী \"$2\"-এর \"$1\" নামের বটের জন্য বট পাসওয়ার্ড মুছে ফেলা হয়েছিল।",
        "botpasswords-no-provider": "BotPasswordsSessionProvider উপলব্ধ নয়।",
        "resetpass_forbidden": "পাসওয়ার্ড পরিবর্তন করা সম্ভব নয়",
-       "resetpass-no-info": "এই পাতাটিতে সরাসরি প্রবেশাধিকার পেতে আপনাকে অবশ্যই লগইন করতে হবে।",
+       "resetpass_forbidden-reason": "পাসওয়ার্ড পরিবর্তন করা যাবে না: $1",
+       "resetpass-no-info": "এই পাতাটিতে সরাসরি প্রবেশাধিকার পেতে আপনাকে অবশ্যই প্রবেশ করতে হবে।",
        "resetpass-submit-loggedin": "পাসওয়ার্ড পরিবর্তন",
        "resetpass-submit-cancel": "বাতিল",
        "resetpass-wrong-oldpass": "ভুল অস্থায়ী অথবা বর্তমান পাসওয়ার্ড।\nসম্ভবতঃ আপনি ইতোমধ্যেই আপনার পাসওয়ার্ডটি পরিবর্তন করেছেন অথবা একটি নতুন অস্থায়ী পাসওয়ার্ডের জন্য অনুরোধ করেছেন।",
        "resetpass-recycled": "অনুগ্রহ করে বর্তমানে ব্যবহার করছেন এমন পাসওয়ার্ডের পরিবর্তে নতুন একটি পাসওয়ার্ড নির্ধারণ করুন।",
-       "resetpass-temp-emailed": "সাময়িà¦\95ভাবà§\87 à¦¬à§\8dযবহার à¦\95রার à¦\95à§\8bড à¦¦à¦¿à¦¯à¦¼à§\87 à¦\86পনি à¦²à¦\97à¦\87ন à¦\95রà§\87à¦\9bà§\87ন।\nলà¦\97à¦\87ন করার জন্য আপনাকে অবশ্যই একটি নতুন পাসওয়ার্ড নির্ধারন করতে হবে:",
+       "resetpass-temp-emailed": "à¦\86পনি à¦\87মà§\87à¦\87লà¦\95à§\83ত à¦¸à¦¾à¦®à¦¯à¦¼à¦¿à¦\95 à¦\95à§\8bড à¦¦à¦¿à¦¯à¦¼à§\87 à¦ªà§\8dরবà§\87শ à¦\95রà§\87à¦\9bà§\87ন।\nপà§\8dরবà§\87শ করার জন্য আপনাকে অবশ্যই একটি নতুন পাসওয়ার্ড নির্ধারন করতে হবে:",
        "resetpass-temp-password": "অস্থায়ী পাসওয়ার্ড:",
        "resetpass-abort-generic": "পাসওয়ার্ড পরিবর্তন একটি এক্সটেনশনের কারণে স্থগিত করা হয়েছে।",
        "resetpass-expired": "আপনার পাসওয়ার্ডের মেয়াদ উত্তীর্ণ হয়েছে। অনুগ্রহ করে নতুন পাসওয়ার্ড নির্ধারণ করুন।",
        "passwordreset-emailsentusername": "যদি এই ব্যবহারকারী নামের সাথে ই-মেইল ঠিকানা সংযুক্ত করা থাকে, তাহলে একটি পাসওয়ার্ড বদলের ইমেইল পাঠানো হবে।",
        "passwordreset-emailsent-capture": "স্মরণ করিয়ে দেয়ার জন্য একটি ইমেইল করা হয়েছে, যা নিচে দেখানো হচ্ছে।",
        "passwordreset-emailerror-capture": "স্মরণ করিয়ে দেয়ার জন্য একটি ইমেইল তৈরী করা হয়েছিল, যা নিচে দেখানো হচ্ছে, তবে $1 {{GENDER:$2|ব্যবহারকারীকে}} এটি পাঠানো যায়নি!",
+       "passwordreset-invalideamil": "ভুল ইমেইল ঠিকানা",
        "changeemail": "ই-মেইল ঠিকানা পরিবর্তন বা বাতিল",
        "changeemail-header": "আপনার ইমেল ঠিকানা পরিবর্তন করতে এই ফরমটি পূরণ করুন। আপনি যদি আপনার একাউন্ট থেকে যে কোন ইমেল ঠিকানার এসোসিয়েশন অপসারণ করতে চান, তাহলে ফরমটি জমা দেওয়ার সময় নতুন ইমেইল ঠিকানা খালি রাখুন।",
        "changeemail-passwordrequired": "এই পরিবর্তন নিশ্চিত করতে আপনাকে আপনার পাসওয়ার্ড লিখতে হবে।",
-       "changeemail-no-info": "à¦\8fà¦\87 à¦ªà¦¾à¦¤à¦¾à¦\9fিতà§\87 à¦¸à¦°à¦¾à¦¸à¦°à¦¿ à¦ªà§\8dরবà§\87শাধিà¦\95ার à¦ªà§\87তà§\87 à¦\86পনাà¦\95à§\87 à¦\85বশà§\8dযà¦\87 à¦²à¦\97à¦\87ন করতে হবে।",
+       "changeemail-no-info": "à¦\8fà¦\87 à¦ªà¦¾à¦¤à¦¾à¦\9fিতà§\87 à¦¸à¦°à¦¾à¦¸à¦°à¦¿ à¦ªà§\8dরবà§\87শাধিà¦\95ার à¦ªà§\87তà§\87 à¦\86পনাà¦\95à§\87 à¦\85বশà§\8dযà¦\87 à¦ªà§\8dরবà§\87শ করতে হবে।",
        "changeemail-oldemail": "বর্তমান ই-মেইল ঠিকানা:",
        "changeemail-newemail": "নতুন ই-মেইল ঠিকানা:",
        "changeemail-none": "(কিছু নাই)",
        "changeemail-submit": "ই-মেইল পরিবর্তন",
        "changeemail-throttled": "আপনি পরপর বেশ কয়েকবার প্রবেশের চেষ্টা করেছেন। পুনরায় চেষ্টা করার পূর্বে অনুগ্রহ করে $1 অপেক্ষা করুন।",
        "changeemail-nochange": "দয়া করে একটি ভিন্ন নতুন ইমেইল ঠিকানা লিখুন।",
-       "resettokens": "রিসà§\87à¦\9f à¦\9fà§\8bà¦\95à§\87ন",
-       "resettokens-text": "à¦\86পনি à¦\9fà§\8bà¦\95à§\87ন à¦°à¦¿à¦¸à§\87à¦\9f করতে পারেন, যা অ্যাকাউন্টের সাথে সম্পর্কিত আপনার ব্যক্তিগত তথ্য দেখার কাজে ব্যবহার করা হয়।",
-       "resettokens-no-tokens": "রিসà§\87à¦\9f করার মত কোনো টোকেন নেই।",
+       "resettokens": "à¦\9fà§\8bà¦\95à§\87ন à¦ªà§\81নà¦\83সà§\8dথাপন à¦\95রà§\81ন",
+       "resettokens-text": "à¦\86পনি à¦\9fà§\8bà¦\95à§\87ন à¦ªà§\81নà¦\83সà§\8dথাপন করতে পারেন, যা অ্যাকাউন্টের সাথে সম্পর্কিত আপনার ব্যক্তিগত তথ্য দেখার কাজে ব্যবহার করা হয়।",
+       "resettokens-no-tokens": "পà§\81নà¦\83সà§\8dথাপন করার মত কোনো টোকেন নেই।",
        "resettokens-tokens": "টোকেন:",
        "resettokens-token-label": "$1 (বর্তমান: $2)",
        "resettokens-watchlist-token": "ওয়েব ফিড (Atom/RSS) টোকেন পরিবর্তনের জন্য [[Special:Watchlist|নজরতালিকায় থাকা পাতাগুলোতে পরিবর্তন এসেছে]]",
        "showdiff": "পরিবর্তনসমূহ",
        "blankarticle": "<strong>সতর্ক বার্তা:</strong> আপনি একটি খালি পাতা তৈরী করতে যাচ্ছেন।\nআপনি যদি পুনরায় \"{{int:savearticle}}\" বাটন ক্লিক করেন তাহলে, পাতাটি তৈরী হবে যেখানে কোনো তথ্য লেখা নেই।",
        "anoneditwarning": "<strong>সতর্কতা:</strong> আপনি বর্তমানে প্রবেশ করেননি। যদি আপনি সম্পাদনা করেন এই পাতার সম্পাদনার ইতিহাসে আপনার আইপি ঠিকানা সার্বজনীনভাবে সংরক্ষিত হবে। যদি আপনি  <strong>[$1 প্রবেশ করেন]</strong> বা  <strong>[$2 একটি অ্যাকাউন্ট তৈরি করেন]</strong>, তাহলে আপনি আপনার আইপি ঠিকানা গোপন রাখতে পারবেন ও অন্যান্য অনেক কিছু সুবিধা পাবেন।",
-       "anonpreviewwarning": "আপনি লগ ইন করেননি। এই পাতার সম্পাদনার ইতিহাসে আপনার আইপি সংখ্যা সংরক্ষিত হবে।",
+       "anonpreviewwarning": "<em>আপনি প্রবেশ করেননি। সম্পাদনা করলে এই পাতার সম্পাদনার ইতিহাসে আপনার আইপি ঠিকানা সংরক্ষিত হবে।</em>",
        "missingsummary": "'''খেয়াল করুন''':  আপনি কিন্তু সম্পাদনার সারাংশ দেননি। আবার যদি \"সংরক্ষণ\" বোতামে ক্লিক করেন, তাহলে ঐ সারাংশ বাক্যটি ছাড়াই আপনার সম্পাদনা সংরক্ষিত হবে।",
        "selfredirect": "<strong>সতর্কতা:</strong> আপনি এই পাতাকে এর নিজের দিকে পুনঃনির্দেশিত করছেন।\nআপনাকে পুনঃনির্দেশিত করার জন্য হয় ভুল লক্ষ্য নির্দিষ্ট করেছেন, অথবা আপনি ভুল পাতা সম্পাদনা করছেন।\nআপনি যদি আবার \"{{int:savearticle}}\" ক্লিক করেন, পুনর্নির্দেশ যেকোনোভাবেই হোক তৈরি করা হবে।",
        "missingcommenttext": "দয়া করে নিচে মন্তব্য যোগ করুন।",
        "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}}}} অপসারণ লগে] বিস্তারিত তথ্য জানা যাবে।",
        "content-failed-to-parse": "$1 মডেলের জন্য $2 কন্টেন্ট পার্স করা যাচ্ছে না: $3",
        "invalid-content-data": "ভুল কন্টেন্ট ডাটা",
        "content-not-allowed-here": "\"$1\" কন্টেন্টটি [[$2]] পাতায় অনুমোদিত নয়",
-       "editwarning-warning": "à¦\8fà¦\87 à¦ªà¦¾à¦¤à¦¾à¦\9fি à¦¤à§\8dযাà¦\97 à¦\95রলà§\87 à¦\86পনার à¦\86পনার à¦\95রা à¦ªà¦°à¦¿à¦¬à¦°à§\8dতনà¦\97à§\81লà§\8b à¦¹à¦¾à¦°à¦¿à¦¯à¦¼à§\87 à¦¯à§\87তà§\87 à¦ªà¦¾à¦°à§\87।\nà¦\86পনি à¦¯à¦¦à¦¿ à¦²à¦\97à¦\87ন করা থাকেন, আপনি এই সতর্কীকরণ বার্তাটি আপনার পছন্দের \"সম্পাদনা\" অনুচ্ছেদ থেকে নিস্ক্রিয় করতে পারেন।",
+       "editwarning-warning": "à¦\8fà¦\87 à¦ªà¦¾à¦¤à¦¾à¦\9fি à¦¤à§\8dযাà¦\97 à¦\95রলà§\87 à¦\86পনার à¦\86পনার à¦\95রা à¦ªà¦°à¦¿à¦¬à¦°à§\8dতনà¦\97à§\81লà§\8b à¦¹à¦¾à¦°à¦¿à¦¯à¦¼à§\87 à¦¯à§\87তà§\87 à¦ªà¦¾à¦°à§\87।\nà¦\86পনি à¦¯à¦¦à¦¿ à¦ªà§\8dরবà§\87শ করা থাকেন, আপনি এই সতর্কীকরণ বার্তাটি আপনার পছন্দের \"সম্পাদনা\" অনুচ্ছেদ থেকে নিস্ক্রিয় করতে পারেন।",
        "editpage-notsupportedcontentformat-title": "উল্লেখিত পদ্ধতি সমর্থনযোগ্য নয়।",
        "editpage-notsupportedcontentformat-text": "$1 লেখার ফরম্যাট, $2 কন্টেন্ট মডেলের উপযোগী নয়।",
        "content-model-wikitext": "উইকিটেক্সট",
        "prefs-displaywatchlist": "প্রদর্শনী অপশন",
        "prefs-tokenwatchlist": "টোকেন",
        "prefs-diffs": "পার্থক্য",
-       "prefs-help-prefershttps": "পরবরà§\8dতà§\80 à¦²à¦\97à¦\87নের পর থেকে এই পরিবর্তনগুলো কার্যকর হবে।",
+       "prefs-help-prefershttps": "পরবরà§\8dতà§\80 à¦ªà§\8dরবà§\87শের পর থেকে এই পরিবর্তনগুলো কার্যকর হবে।",
        "prefswarning-warning": "আপানি পছন্দসমূহ পাতায় পাতায় পরিবর্তন করেছেন যেগুলো সংরক্ষণ করা হয়নি। আপনি যদি এই পাতাটি ছেড়ে যাওয়ার আগে \"$1\" ক্লিক না করেন তবে পছন্দসমূহ হালনাগাদ হবে না।",
        "prefs-tabs-navigation-hint": "সাহায্য: আপনি ডান এবং বাম অ্যারো বাটন ব্যবহার করে বিভিন্ন ট্যাবগুলোতে যেতে পারবেন।",
        "userrights": "ব্যবহারকারী অধিকার ব্যবস্থাপনা",
        "right-siteadmin": "ডাটাবেজ বন্ধ এবং খুলুন",
        "right-override-export-depth": "৫ম স্তর পর্যন্ত সংযুক্তিসহ একটি পাতা রপ্তানী করুন",
        "right-sendemail": "অন্য ব্যবহারকারীকে ইমেইল পাঠান",
-       "right-passwordreset": "পাসà¦\93য়ারà§\8dড à¦°à¦¿à¦¸à§\87à¦\9f ইমেইল দেখুন",
+       "right-passwordreset": "পাসà¦\93য়ারà§\8dড à¦ªà§\81নà¦\83সà§\8dথাপনà§\87র ইমেইল দেখুন",
        "right-managechangetags": "ডাটাবেস থেকে [[Special:Tags|ট্যাগ]] তৈরি ও অপসারণ করুন",
        "right-applychangetags": "সম্পাদনার সাথে [[Special:Tags|ট্যাগ]] যুক্ত করুন",
        "right-changetags": "নির্দিষ্ট সংস্করণ এবং দীর্ঘ সম্পাদনাগুলোতে [[Special:Tags|ট্যাগ]] সংযোজন ও অপসারণ করুন",
        "img-auth-nopathinfo": "PATH_INFO পাওয়া যাচ্ছে না।\nআপনার সার্ভার থেকে এই তথ্য পাঠানোর জন্য কনফিগার করা হয়নি।\nএটি হয়তো CGI ভিত্তিক এবং img_auth সমর্থন করে না।\nবিস্তারিত দেখুন https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization।",
        "img-auth-notindir": "অনুরোধকৃত পাথটি কনফিগার করা আপলোড ডিরেক্টরী নয়।",
        "img-auth-badtitle": "\"$1\" থেকে একটি সঠিক শিরনাম তৈরী করা যাচ্ছে না।",
-       "img-auth-nologinnWL": "à¦\86পনি à¦²à¦\97à¦\87ন à¦\95রà§\87ননি à¦\8fবà¦\82 \"$1\" à¦¨à¦\9cরতালিà¦\95ায় à¦¨à¦¾ই।",
+       "img-auth-nologinnWL": "à¦\86পনি à¦ªà§\8dরবà§\87শ à¦\95রà§\87ননি à¦\8fবà¦\82 \"$1\" à¦¨à¦\9cরতালিà¦\95ায় à¦¨à§\87ই।",
        "img-auth-nofile": "ফাইল \"$1\" নাই।",
        "img-auth-isdir": "আপনি \"$1\" ডিরেক্টরী দেখতে চেষ্ঠা করছেন।\nশুধুমাত্র ফাইল দেখার অনুমতি রয়েছে।",
        "img-auth-streaming": "স্ট্রিমিং \"$1\"।",
        "mimesearch-summary": "এই পাতা তাদের MIME-এর ধরণের জন্য ফাইল ফিল্টার করা সক্ষম করে। ইনপুট: contenttype/subtype বা contenttype/*, উদা: <code>image/jpeg</code>।",
        "mimetype": "MIME ধরন:",
        "download": "ডাউনলোড",
-       "unwatchedpages": "নà¦\9cরà§\87 à¦¨à¦¾ à¦°à¦¾à¦\96া à¦ªà¦¾à¦¤à¦¾à¦\97à§\81লি",
+       "unwatchedpages": "নà¦\9cরà§\87 à¦¨à¦¾ à¦°à¦¾à¦\96া à¦ªà¦¾à¦¤à¦¾à¦¸à¦®à§\82হ",
        "listredirects": "তালিকা পুনর্নির্দেশগুলি",
        "listduplicatedfiles": "সদৃশ ফাইলের তালিকা",
        "listduplicatedfiles-summary": "এটি ফাইলসমূহের একটি তালিকা যেখানে একটি ফাইলের সাম্প্রতিকতম সংস্করণ অন্য আরেকটি ফাইলের সাম্প্রতিকতম সংস্করণের প্রতিলিপি। শুধু স্থানীয় ফাইল বিবেচনা করা হয়েছে।",
        "trackingcategories-msg": "বিষয়শ্রেণী অনুসরণ করা হচ্ছে",
        "trackingcategories-name": "বার্তা নাম",
        "trackingcategories-desc": "বিষয়শ্রেণী অন্তর্ভুক্তির মানদণ্ড",
+       "restricted-displaytitle-ignored": "উপেক্ষিত প্রদর্শন শিরোনামসহ পাতা",
+       "restricted-displaytitle-ignored-desc": "পাতাটি একটি <code><nowiki>{{DISPLAYTITLE}}</nowiki></code> উপেক্ষা করেছে কারণ এটা পাতাটির আসল শিরোনামের সাথে সমতুল্য নয়।",
        "broken-file-category-desc": "এই পাতায় একটি ভাঙ্গা ফাইলের লিঙ্ক রয়েছে (একটি ফাইল এম্বেড করার জন্য একটি লিঙ্ক যখন ফাইলটির অস্তিত্ব নেই)",
        "trackingcategories-nodesc": "কোন বর্ণনা নেই।",
        "trackingcategories-disabled": "বিষয়শ্রেণীটি বিকল",
        "enotif_lastvisited": "আপনার শেষ আগমনের পরে সংঘটিত সমস্ত পরিবর্তনের জন্য $1 দেখুন।",
        "enotif_lastdiff": "এই পরিবর্তনটি দেখার জন্য $1 দেখুন।",
        "enotif_anon_editor": "বেনামী ব্যবহারকারী $1",
-       "enotif_body": "পà§\8dরিয় $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nসমà§\8dপাদà¦\95à§\87র à¦¸à¦¾à¦°à¦¾à¦\82শ: $PAGESUMMARY $PAGEMINOREDIT\n\nসমà§\8dপাদà¦\95à§\87র à¦¸à¦¾à¦¥à§\87 à¦¯à§\8bà¦\97াযà§\8bà¦\97à§\87র à¦\89পায়:\nà¦\87মà§\87à¦\87ল: $PAGEEDITOR_EMAIL\nà¦\89à¦\87à¦\95ি: $PAGEEDITOR_WIKI\n\nপাতাà¦\9fির à¦ªà¦°à¦¬à¦°à§\8dতà§\80 à¦ªà¦°à¦¿à¦¬à¦°à§\8dতনà¦\97à§\81লà§\8b à¦\9cনà§\8dয à¦\86র à¦\95à§\8bন à¦¬à¦¿à¦\9cà§\8dà¦\9eপà§\8dতি à¦ªà¦¾à¦ à¦¾à¦¨à§\8b à¦¹à¦¬à§\87 à¦¨à¦¾, à¦¯à¦¤à¦\95à§\8dষণ à¦¨à¦¾ à¦\86পনি à¦²à¦\97 à¦\87ন à¦\95রার à¦¸à¦®à¦¯à¦¼ à¦\8fà¦\87 à¦ªà¦¾à¦¤à¦¾à¦¯à¦¼ à¦¬à§\8dরাà¦\89à¦\9c à¦\95রবà§\87ন। à¦\8fà¦\9bাড়া à¦\86পনি à¦\86পনার à¦¨à¦\9cরতালিà¦\95ায় à¦°à¦¾à¦\96া à¦¸à¦¬à¦\97à§\81লি à¦ªà¦¾à¦¤à¦¾ à¦\9cনà§\8dয à¦¬à¦¿à¦\9cà§\8dà¦\9eপà§\8dতি à¦«à§\8dলà§\8dযাà¦\97 à¦¶à§\81রà§\81র à¦\85বসà§\8dথায় à¦«à¦¿à¦°à¦¿à¦¯à¦¼à§\87 à¦¨à¦¿à¦¤à§\87 à¦ªà¦¾à¦°à§\87ন।\n\nà¦\86পনার à¦¬à¦¨à§\8dধà§\81তà§\8dবপà§\82রà§\8dণ {{SITENAME}} à¦¬à¦¿à¦\9cà§\8dà¦\9eপà§\8dতি à¦¸à¦¿à¦¸à§\8dà¦\9fà§\87ম\n\n--\nইমেইল বিজ্ঞপ্তি সেটিং পরিবর্তনের জন্য দেখুন\n{{canonicalurl:{{#special:Preferences}}}}\n\nআপনার নজরতালিকা সেটিংস পরিবর্তন করতে চাইলে দেখুন, \n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nনজরতালিকা থেকে কোন পাতা অপসারণ করতে চাইলে এখানে যান:\n$UNWATCHURL\n\nপ্রতিক্রিয়া জানাতে ও আরও সহযোগিতার জন্য:\n$HELPPAGE",
+       "enotif_body": "পà§\8dরিয় $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nসমà§\8dপাদà¦\95à§\87র à¦¸à¦¾à¦°à¦¾à¦\82শ: $PAGESUMMARY $PAGEMINOREDIT\n\nসমà§\8dপাদà¦\95à§\87র à¦¸à¦¾à¦¥à§\87 à¦¯à§\8bà¦\97াযà§\8bà¦\97à§\87র à¦\89পায়:\nà¦\87মà§\87à¦\87ল: $PAGEEDITOR_EMAIL\nà¦\89à¦\87à¦\95ি: $PAGEEDITOR_WIKI\n\nপাতাà¦\9fির à¦ªà¦°à¦¬à¦°à§\8dতà§\80 à¦ªà¦°à¦¿à¦¬à¦°à§\8dতনà¦\97à§\81লà§\8b à¦\9cনà§\8dয à¦\86র à¦\95à§\8bন à¦¬à¦¿à¦\9cà§\8dà¦\9eপà§\8dতি à¦ªà¦¾à¦ à¦¾à¦¨à§\8b à¦¹à¦¬à§\87 à¦¨à¦¾, à¦¯à¦¤à¦\95à§\8dষণ à¦¨à¦¾ à¦\86পনি à¦ªà§\8dরবà§\87শ à¦\95রার à¦¸à¦®à¦¯à¦¼ à¦\8fà¦\87 à¦ªà¦¾à¦¤à¦¾à¦¯à¦¼ à¦¬à§\8dরাà¦\89à¦\9c à¦\95রবà§\87ন। à¦\8fà¦\9bাড়া à¦\86পনি à¦\86পনার à¦¨à¦\9cরতালিà¦\95ায় à¦°à¦¾à¦\96া à¦¸à¦¬à¦\97à§\81লি à¦ªà¦¾à¦¤à¦¾ à¦\9cনà§\8dয à¦¬à¦¿à¦\9cà§\8dà¦\9eপà§\8dতি à¦«à§\8dলà§\8dযাà¦\97 à¦¶à§\81রà§\81র à¦\85বসà§\8dথায় à¦«à¦¿à¦°à¦¿à¦¯à¦¼à§\87 à¦¨à¦¿à¦¤à§\87 à¦ªà¦¾à¦°à§\87ন।\n\nà¦\86পনার à¦¬à¦¨à§\8dধà§\81তà§\8dবপà§\82রà§\8dণ {{SITENAME}} à¦¬à¦¿à¦\9cà§\8dà¦\9eপà§\8dতি à¦¬à§\8dযবসà§\8dথা\n\n--\nইমেইল বিজ্ঞপ্তি সেটিং পরিবর্তনের জন্য দেখুন\n{{canonicalurl:{{#special:Preferences}}}}\n\nআপনার নজরতালিকা সেটিংস পরিবর্তন করতে চাইলে দেখুন, \n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nনজরতালিকা থেকে কোন পাতা অপসারণ করতে চাইলে এখানে যান:\n$UNWATCHURL\n\nপ্রতিক্রিয়া জানাতে ও আরও সহযোগিতার জন্য:\n$HELPPAGE",
        "created": "তৈরী হয়েছিল",
        "changed": "পরিবর্তিত",
        "deletepage": "পাতাটি মুছে ফেলা হোক",
        "revertpage": "[[Special:Contributions/$2|$2]] ([[User talk:$2|আলাপ]]) এর সম্পাদিত সংস্করণ হতে [[User:$1|$1]] এর সম্পাদিত সর্বশেষ সংস্করণে ফেরত যাওয়া হয়েছে।",
        "revertpage-nouser": "একজন গোপন ব্যবহারকারী কর্তৃক সম্পাদিত সম্পাদনাটি বাতিলপূর্বক {{GENDER:$1|[[User:$1|$1]]}}-এর সর্বশেষ সম্পাদনায় ফেরত যাওয়া হয়েছে।",
        "rollback-success": "$1-এর সম্পাদনাগুলি পূর্বাবস্থায় ফিরিয়ে নেওয়া হয়েছে; $2-এর করা শেষ সংস্করণে পাতাটি ফেরত নেওয়া হয়েছে।",
+       "rollback-success-notify": "$1-এর সম্পাদনাগুলি বাতিল করা হয়েছে; \n$2-এর করা শেষ সংস্করণে ফেরত নেওয়া হয়েছে। [$3 পরিবর্তন দেখুন]",
        "sessionfailure-title": "সেশন পরিত্যক্ত",
        "sessionfailure": "আপনার প্রবেশ সেশনে একটি সমস্যা হয়েছে বলে মনে হচ্ছে;\nসেশন হাইজ্যাক প্রতিরোধের উপায় হিসেবে এই কাজটি বাতিল করা হয়েছে।\nঅনুগ্রহ ব্রাউজারের \"পিছনে\" বোতাম চাপুন এবং যে পাতা থেকে এসেছিলেন, তা পুনঃলোড করুন এবং আবার চেষ্টা করুন।",
+       "changecontentmodel": "একটি পাতার বিষয়বস্তুর মডেল পরিবর্তন",
        "changecontentmodel-legend": "বিষয়বস্তুর মডেল পরিবর্তন করুন",
        "changecontentmodel-title-label": "পাতার শিরোনাম",
        "changecontentmodel-model-label": "পাতার বিষয়বস্তুর প্রতিরূপ",
        "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",
        "confirm-watch-top": "এই পাতাটি আপনার নজরতালিকায় যুক্ত করা হবে?",
        "confirm-unwatch-button": "ঠিক আছে",
        "confirm-unwatch-top": "এই পাতাটি আপনার নজরতালিকা থেকে সরিয়ে ফেলতে ইচ্ছুক?",
+       "confirm-rollback-button": "ঠিক আছে",
+       "confirm-rollback-top": "এই পাতায় করা সম্পাদনাগুলি প্রত্যাবর্তন করবেন?",
        "quotation-marks": "\"$1\"",
        "imgmultipageprev": "← পূর্ববর্তী পাতা",
        "imgmultipagenext": "পরবর্তী পাতা →",
        "timezone-local": "স্থানীয়",
        "duplicate-defaultsort": "<strong>সতর্কীকরণ:</strong> পূর্বনির্ধারিত সাজানোর চাবি \"$2\" পূর্বের পূর্বনির্ধারিত সাজানোর চাবি \"$1\" কে অগ্রাহ্য করে।",
        "duplicate-displaytitle": "<strong>সতর্কীকরণ:</strong> প্রদর্শন শিরোনাম \"$2\" আগের প্রদর্শন শিরোনাম \"$1\" অগ্রাহ্য করবে।",
+       "restricted-displaytitle": "<strong>সতর্কবার্তা:</strong> প্রদর্শন শিরোনাম \"$1\" উপেক্ষা করা হয়েছে যেহেতু এটি পাতার আসল শিরোনামের সাথে সমতুল্য নয়।",
        "invalid-indicator-name": "<strong>ত্রুটি:</strong> পাতার অবস্থা নির্দেশক <code>name</code> অ্যাট্রিবিউট খালি হতে পারবে না।",
        "version": "সংস্করণ",
        "version-extensions": "ইন্সটলকৃত এক্সটেনশনসমূহ",
        "blankpage": "খালি পাতা",
        "intentionallyblankpage": "এই পাতাটি ইচ্ছা করে খালি রাখা হয়েছে",
        "external_image_whitelist": "  #এই লাইন ঠিক যেমন আছে<প্রাক> তেমন রাখুন<pre>\n #রেগুলার এক্সপ্রেশনের টুকরা নীচে (শুধুমাত্র অংশ / / মধ্যে যে যায়) বসান\n#এইগুলি এক্সটার্নাল (hotlinked) ইমেজের URL-এর সাথে মেলানো হবে\n#যেগুলি মিলবে, সেগুলি চিত্র হিসাবে প্রদর্শিত হবে, অন্যথায় শুধুমাত্র ইমেজ লিঙ্ক প্রদর্শিত হবে\n#যে লাইনের প্রারম্ভে # আছে সেই লাইনগুলি মন্তব্যসমূহ হিসাবে ব্যবহার করা হয়\n#এটি কেস-অসংবেদী\n\n#এই রেখার উপরের regex টুকরা বসান. এই লাইন ঠিক যেমন আছে তেমন রাখুন</pre>",
-       "tags": "সঠিà¦\95 à¦\9aà§\87à¦\9eà§\8dà¦\9c ট্যাগ",
+       "tags": "বà§\88ধ à¦ªà¦°à¦¿à¦¬à¦°à§\8dতন ট্যাগ",
        "tag-filter": "[[Special:Tags|ট্যাগ]] ছাকনী:",
        "tag-filter-submit": "ছাকনী",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|ট্যাগ}}]]: $2)",
        "searchsuggest-containing": "যা আছে...",
        "api-error-badaccess-groups": "আপনার এই উইকিতে ফাইল আপলোডের অনুমতি নেই।",
        "api-error-badtoken": "অভ্যন্তরীণ ত্রুটি: খারাপ টোকেন।",
+       "api-error-blocked": "আপনাকে সম্পাদনা করা থেকে বাধা দেয়া হয়েছে।",
        "api-error-copyuploaddisabled": "এই সার্ভারে ইউআরএল-এর মাধ্যমে আপলোড করার সুবিধা নিস্ক্রিয় রয়েছে।",
        "api-error-duplicate": "ইতোমধ্যে এই সাইটে একই রকমের বিষয় সমৃদ্ধ {{PLURAL:$1|অন্য ফাইল|কিছু অন্য ফাইল}} রয়েছে।",
        "api-error-duplicate-archive": "একই নাম ও বিষয়বস্তু বিশিষ্ট {{PLURAL:$1|অপর একটি ফাইল|কয়েকটি ফাইল}} পূর্বে এই উইকিতে ছিলো, এবং {{PLURAL:$1|সেটিকে|সেগুলোকে}} অপসারণ করা হয়েছে।",
        "api-error-invalid-file-key": "অভ্যন্তরীণ ত্রুটি: অস্থায়ী সংরক্ষণশালায় ফাইলটি খুঁজে পাওয়া যায়নি।",
        "api-error-missingparam": "অভ্যন্তরীণ ত্রুটি: অনুরোধে কিছু প্যারামিটারের ঘাটতি রয়েছে।",
        "api-error-missingresult": "অভ্যন্তরীণ ত্রুটি: সফলভাবে অনুলিপি করা হয়েছে কিনা তা নিশ্চিত করা সম্ভব হয়নি।",
-       "api-error-mustbeloggedin": "ফাà¦\87ল à¦\86পলà§\8bড à¦\95রার à¦\9cনà§\8dয à¦\86পনাà¦\95à§\87 à¦\85বশà§\8dযà¦\87 à¦\8fà¦\87 à¦\89à¦\87à¦\95িতà§\87 à¦ªà§\8dরবà§\87শ à¦¬à¦¾ à¦²à¦\97à¦\87ন à¦\95রতà§\87 à¦¹à¦¬à§\87।",
+       "api-error-mustbeloggedin": "ফাইল আপলোড করার জন্য আপনাকে অবশ্যই এই উইকিতে প্রবেশ করতে হবে।",
        "api-error-mustbeposted": "অভ্যন্তরীণ ত্রুটি: এই অনুরোধের জন্য এইচটিটিপি পোস্ট প্রয়োজন।",
        "api-error-noimageinfo": "আপলোড সফল হয়েছে, কিন্তু ফাইলটি সম্পর্কে সার্ভার কোন তথ্য প্রদান করে নি।",
        "api-error-nomodule": "অভ্যন্তরীণ ত্রুটি: কোন আপলোড মডিউল সেট করা হয়নি।",
        "log-action-filter-protect-unprotect": "অসুরক্ষা",
        "log-action-filter-rights-autopromote": "স্বয়ংক্রিয় পরিবর্তন",
        "log-action-filter-upload-upload": "নতুন আপলোড",
-       "log-action-filter-upload-overwrite": "পুনঃআপলোড"
+       "log-action-filter-upload-overwrite": "পুনঃআপলোড",
+       "authmanager-userdoesnotexist": "ব্যবহারকারী অ্যাকাউন্ট \"$1\" অনিবন্ধিত।",
+       "authmanager-email-help": "ইমেইল ঠিকানা",
+       "authprovider-resetpass-skip-label": "উপেক্ষা করো",
+       "authprovider-resetpass-skip-help": "পাসওয়ার্ড পুনঃস্থাপন করা উপেক্ষা করুন।",
+       "authform-wrongtoken": "ভুল টোকেন",
+       "removecredentials-submit": "পরিচয়পত্র সরান",
+       "credentialsform-account": "অ্যাকাউন্টের নাম:",
+       "linkaccounts": "অ্যাকাউন্ট সংযোগ করুন"
 }
index e4ed30f..180cb03 100644 (file)
        "mw-widgets-titleinput-description-new-page": "stranica još ne postoji",
        "mw-widgets-titleinput-description-redirect": "preusmjerava na $1",
        "api-error-blacklisted": "Molimo izaberite drugačiji, deskriptivniji naziv.",
-       "randomrootpage": "Slučajna root stranica"
+       "randomrootpage": "Slučajna root stranica",
+       "log-action-filter-block": "Vrsta blokiranja:",
+       "log-action-filter-delete": "Vrsta brisanja:",
+       "log-action-filter-all": "Sve",
+       "log-action-filter-block-block": "Blokiranje",
+       "log-action-filter-block-reblock": "Izmjena blokiranja",
+       "log-action-filter-block-unblock": "Deblokiranje",
+       "log-action-filter-delete-delete": "Brisanje stranice",
+       "log-action-filter-delete-restore": "Vraćanje obrisane stranice",
+       "log-action-filter-delete-event": "Brisanje unosa u zapisniku",
+       "log-action-filter-delete-revision": "Brisanje izmjene"
 }
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..ee86067 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é)",
        "createacct-email-ph": "Zadejte svou e-mailovou adresu",
        "createacct-another-email-ph": "Zadejte e-mailovou adresu",
        "createaccountmail": "Použít dočasné náhodné heslo a odeslat ho na uvedenou e-mailovou adresu",
+       "createaccountmail-help": "Lze využít k založení účtu pro jinou osobu bez prozrazení hesla.",
        "createacct-realname": "Skutečné jméno (nepovinné)",
        "createaccountreason": "Důvod:",
        "createacct-reason": "Důvod",
        "createacct-reason-ph": "Proč si vytváříte další účet",
+       "createacct-reason-help": "Zpráva zobrazená v knize nových uživatelů",
        "createacct-submit": "Vytvořit účet",
        "createacct-another-submit": "Vytvořit účet",
+       "createacct-continue-submit": "Pokračovat v zakládání účtu",
+       "createacct-another-continue-submit": "Pokračovat v zakládání účtu",
        "createacct-benefit-heading": "{{grammar:4sg|{{SITENAME}}}} tvoří lidé jako vy.",
        "createacct-benefit-body1": "{{PLURAL:$1|editace|editace|editací}}",
        "createacct-benefit-body2": "{{PLURAL:$1|stránka|stránky|stránek}}",
        "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",
        "passwordreset-emailsentusername": "Pokud je u tohoto účtu nastavena e-mailová adresa, bude vám zaslán e-mail pro získání nového hesla.",
        "passwordreset-emailsent-capture": "Byl odeslán e-mail pro získání nového hesla, který je zobrazen níže.",
        "passwordreset-emailerror-capture": "Byl vygenerován e-mail pro získání nového hesla, který je zobrazen níže, ale {{GENDER:$2|uživateli|uživatelce}} se ho nepodařilo odeslat: $1",
+       "passwordreset-emailsent-capture2": "{{PLURAL:$1|Byl odeslán e-mail|Byly odeslány e-maily}} pro získání nového hesla. {{PLURAL:$1|Uživatelské jméno a heslo jsou zobrazeny|Seznam uživatelských jmen a hesel je zobrazen}} níže.",
+       "passwordreset-emailerror-capture2": "{{GENDER:$2|Uživateli|Uživatelce}} se nepodařilo odeslat e-mail: $1 {{PLURAL:$3|Uživatelské jméno a heslo jsou zobrazeny|Seznam uživatelských jmen a hesel je zobrazen}} níže.",
+       "passwordreset-nocaller": "Musí být uveden volající",
+       "passwordreset-nosuchcaller": "Volající neexistuje: $1",
+       "passwordreset-ignored": "Žádost o nové heslo nebyla zpracována. Možná není nakonfigurován žádný poskytovatel?",
+       "passwordreset-invalideamil": "Neplatná e-mailová adresa",
+       "passwordreset-nodata": "Nebylo zadáno uživatelské jméno ani e-mailová adresa",
        "changeemail": "Změna nebo odstranění e-mailové adresy",
        "changeemail-header": "Vyplněním tohoto formuláře můžete změnit svou e-mailovou adresu. Pokud chcete ze svého účtu odstranit vazbu na všechny e-mailové adresy, ponechte při odeslání formuláře novou e-mailovou adresu prázdnou.",
        "changeemail-passwordrequired": "Pro potvrzení této změny musíte zadat své heslo.",
        "trackingcategories-msg": "Sledovací kategorie",
        "trackingcategories-name": "Název hlášení",
        "trackingcategories-desc": "Kritéria pro vložení do kategorie",
+       "restricted-displaytitle-ignored": "Stránky s ignorovanými zobrazovanými názvy",
+       "restricted-displaytitle-ignored-desc": "Stránka obsahuje příkaz <code><nowiki>{{DISPLAYTITLE}}</nowiki></code>, který se ignoruje, protože není ekvivalentní skutečnému názvu stránky.",
        "noindex-category-desc": "Stránka není indexována roboty, protože obsahuje kouzelné slovo <code><nowiki>__NOINDEX__</nowiki></code> a je ve jmenném prostoru, ve kterém je tento příznak dovolen.",
        "index-category-desc": "Stránka obsahuje kouzelné slovo <code><nowiki>__INDEX__</nowiki></code> (a je ve jmenném prostoru, ve kterém je tento příznak dovolen), takže je indexována roboty, přestože by normálně nebyla.",
        "post-expand-template-inclusion-category-desc": "Stránka je po rozbalení všech šablon větší než <code>$wgMaxArticleSize</code>, takže některé šablony rozbaleny nebyly.",
        "rollbacklinkcount": "vrácení $1 {{PLURAL:$1|editace|editací}} zpět",
        "rollbacklinkcount-morethan": "vrácení více než $1 {{PLURAL:$1|editace|editací}} zpět",
        "rollbackfailed": "Nešlo vrátit zpět",
+       "rollback-missingparam": "V požadavku chybí povinné parametry.",
        "cantrollback": "Nelze vrátit zpět poslední editaci, neboť poslední přispěvatel je jediným autorem této stránky.",
        "alreadyrolled": "Nelze vrátit zpět poslední editaci [[:$1]] od uživatele [[User:$2|$2]] ([[User talk:$2|diskuse]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]), protože někdo jiný již stránku editoval nebo vrátil tuto změnu zpět.\n\nPoslední editaci této stránky {{GENDER:$3|provedl|provedla|provedl uživatel}} [[User:$3|$3]] ([[User talk:$3|diskuse]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "editcomment": "Shrnutí editace bylo: <em>$1</em>.",
        "revertpage": "Editace uživatele „[[Special:Contributions/$2|$2]]“ ([[User talk:$2|diskuse]]) vráceny do předchozího stavu, jehož autorem je „[[User:$1|$1]]“",
        "revertpage-nouser": "Editace skrytého uživatele vráceny do předchozího stavu, jehož {{GENDER:$1|autorem|autorkou}} je „[[User:$1|$1]]“",
        "rollback-success": "Editace uživatele $1 byly vráceny na poslední verzi od uživatele $2.",
+       "rollback-success-notify": "Editace uživatele $1 byly vráceny;\nobnovena poslední verze od uživatele $2. [$3 Zobrazit změny]",
        "sessionfailure-title": "Chyba relace",
        "sessionfailure": "Zřejmě je nějaký problém s vaším přihlášením;\nvámi požadovaná činnost byla stornována jako prevence před neoprávněným přístupem.\nStiskněte tlačítko „zpět“, obnovte stránku, ze které jste přišli, a zkuste činnost znovu.",
        "changecontentmodel": "Změna modelu obsahu stránky",
        "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",
        "locknoconfirm": "Nebylo zaškrtnuto políčko potvrzení.",
        "lockdbsuccesssub": "Databáze uzamčena",
        "unlockdbsuccesssub": "Databáze odemčena",
-       "lockdbsuccesstext": "Databáze {{grammar:2sg|{{SITENAME}}}} byla úspěšně uzamčena.\n<br />Nezapomeňte ji po dokončení údržby [[Special:UnlockDB|odemknout]].",
+       "lockdbsuccesstext": "Databáze {{grammar:2sg|{{SITENAME}}}} byla uzamčena.<br />\nNezapomeňte ji po dokončení údržby [[Special:UnlockDB|odemknout]].",
        "unlockdbsuccesstext": "Databáze {{grammar:2sg|{{SITENAME}}}} je odemčena.",
        "lockfilenotwritable": "Do souboru zámku databáze nelze zapisovat. Pro zamčení či odemčení databáze musí mít webový server právo zápisu do tohoto souboru.",
        "databaselocked": "Databáze je již zamčená.",
        "confirm-watch-top": "Přidat tuto stránku mezi sledované?",
        "confirm-unwatch-button": "OK",
        "confirm-unwatch-top": "Vyjmout tuto stránku ze sledovaných?",
+       "confirm-rollback-button": "OK",
+       "confirm-rollback-top": "Vrátit editace této stránky?",
        "ellipsis": "…",
        "percent": "$1&#160;%",
        "quotation-marks": "„$1“",
        "log-action-filter-suppress-block": "Utajení uživatele zablokováním",
        "log-action-filter-suppress-reblock": "Utajení uživatele novým zablokováním",
        "log-action-filter-upload-upload": "Nové načtení",
-       "log-action-filter-upload-overwrite": "Znovunačtení"
+       "log-action-filter-upload-overwrite": "Znovunačtení",
+       "authmanager-authn-not-in-progress": "Autentizace neprobíhá nebo se ztratila data sezení. Začněte prosím znovu od začátku.",
+       "authmanager-authn-no-primary": "Uvedené přihlašovací údaje se nepodařilo autentizovat.",
+       "authmanager-authn-no-local-user": "Uvedené přihlašovací údaje neodpovídají žádnému uživateli této wiki.",
+       "authmanager-authn-no-local-user-link": "Uvedené přihlašovací údaje jsou platné, ale nejsou přiřazeny žádnému uživateli na této wiki. Přihlašte se jiným způsobem nebo si založte nový uživatelský účet a budete mít možnost s tímto účtem propojit vaše stávající přihlašovací údaje.",
+       "authmanager-authn-autocreate-failed": "Automatické založení lokálního účtu se nezdařilo: $1",
+       "authmanager-change-not-supported": "Uvedené přihlašovací údaje nelze změnit, protože by je nikdo nepoužíval.",
+       "authmanager-create-disabled": "Zakládání účtů je zakázáno.",
+       "authmanager-create-from-login": "Pro založení účtu vyplňte níže uvedená pole.",
+       "authmanager-create-not-in-progress": "Zakládání účtu neprobíhá nebo se ztratila data sezení. Začněte prosím znovu od začátku.",
+       "authmanager-create-no-primary": "Uvedené přihlašovací údaje nelze použít pro založení účtu.",
+       "authmanager-link-no-primary": "Uvedené přihlašovací údaje nelze použít pro propojení účtů.",
+       "authmanager-link-not-in-progress": "Propojování účtů neprobíhá nebo se ztratila data sezení. Začněte prosím znovu od začátku.",
+       "authmanager-authplugin-setpass-failed-title": "Změna hesla se nezdařila",
+       "authmanager-authplugin-setpass-failed-message": "Autentizační modul změnu hesla zamítl.",
+       "authmanager-authplugin-create-fail": "Autentizační modul založení účtu zamítl.",
+       "authmanager-authplugin-setpass-denied": "Autentizační modul neumožňuje měnit hesla.",
+       "authmanager-authplugin-setpass-bad-domain": "Neplatná doména.",
+       "authmanager-autocreate-noperm": "Automatické zakládání účtů není povoleno.",
+       "authmanager-autocreate-exception": "Automatické založení účtu je dočasně zakázáno kvůli předchozím chybám.",
+       "authmanager-userdoesnotexist": "Uživatelský účet „$1“ není zaregistrován.",
+       "authmanager-userlogin-remembermypassword-help": "Zda se má heslo zapamatovat déle než jen po dobu tohoto sezení.",
+       "authmanager-username-help": "Uživatelské jméno pro autentizaci.",
+       "authmanager-password-help": "Heslo pro autentizaci.",
+       "authmanager-domain-help": "Doména pro externí autentizaci.",
+       "authmanager-retype-help": "Heslo znovu pro potvrzení.",
+       "authmanager-email-label": "E-mail",
+       "authmanager-email-help": "E-mailová adresa",
+       "authmanager-realname-label": "Skutečné jméno",
+       "authmanager-realname-help": "Skutečné jméno uživatele",
+       "authmanager-provider-password": "Autentizace pomocí hesla",
+       "authmanager-provider-password-domain": "Autentizace pomocí hesla a domény",
+       "authmanager-provider-temporarypassword": "Dočasné heslo",
+       "authprovider-confirmlink-message": "Na základě vašich nedávných pokusů o přihlášení mohou být s vaším účtem na wiki propojeny následující účty. Propojením umožníte přihlášení pomocí těchto účtů. Vyberte účty, se kterými chcete svůj účet propojit.",
+       "authprovider-confirmlink-request-label": "Účty, se kterými chcete svůj účet propojit",
+       "authprovider-confirmlink-success-line": "$1: Úspěšně propojeno.",
+       "authprovider-confirmlink-failed": "Propojení účtů se nezdařilo zcela: $1",
+       "authprovider-confirmlink-ok-help": "Pokračovat po zobrazení hlášení o chybách propojení.",
+       "authprovider-resetpass-skip-label": "Přeskočit",
+       "authprovider-resetpass-skip-help": "Přeskočit nastavení nového hesla.",
+       "authform-nosession-login": "Autentizace byla úspěšná, ale váš prohlížeč si neumí „zapamatovat“, že je přihlášený.\n\n$1",
+       "authform-nosession-signup": "Účet byl založen, ale váš prohlížeč si neumí „zapamatovat“, že je přihlášený.\n\n$1",
+       "authform-newtoken": "Chybí token. $1",
+       "authform-notoken": "Chybí token",
+       "authform-wrongtoken": "Chybný token",
+       "specialpage-securitylevel-not-allowed-title": "Není povoleno",
+       "specialpage-securitylevel-not-allowed": "Je nám líto, ale nemáte povolení použít tuto stránku, protože se nepodařilo ověřit vaši totožnost.",
+       "authpage-cannot-login": "Nepodařilo se zahájit přihlašování.",
+       "authpage-cannot-login-continue": "Nepodařilo se pokračovat v přihlašování. Patrně vypršela platnost vašeho sezení.",
+       "authpage-cannot-create": "Nepodařilo se zahájit zakládání účtu.",
+       "authpage-cannot-create-continue": "Nepodařilo se pokračovat v zakládání účtu. Patrně vypršela platnost vašeho sezení.",
+       "authpage-cannot-link": "Nepodařilo se zahájit propojování účtů.",
+       "authpage-cannot-link-continue": "Nepodařilo se pokračovat v propojování účtů. Patrně vypršela platnost vašeho sezení.",
+       "cannotauth-not-allowed-title": "Přístup odmítnut",
+       "cannotauth-not-allowed": "Nemáte oprávnění použít tuto stránku",
+       "changecredentials": "Změna přihlašovacích údajů",
+       "changecredentials-submit": "Změnit přihlašovací údaje",
+       "changecredentials-invalidsubpage": "$1 není platný typ přihlašovacích údajů.",
+       "changecredentials-success": "Vaše přihlašovací údaje byly změněny.",
+       "removecredentials": "Odstranění přihlašovacích údajů",
+       "removecredentials-submit": "Odstranit přihlašovací údaje",
+       "removecredentials-invalidsubpage": "$1 není platný typ přihlašovacích údajů.",
+       "removecredentials-success": "Vaše přihlašovací údaje byly odstraněny.",
+       "credentialsform-provider": "Typ přihlašovacích údajů:",
+       "credentialsform-account": "Název účtu:",
+       "cannotlink-no-provider-title": "Neexistují účty k propojení",
+       "cannotlink-no-provider": "Neexistují účty k propojení.",
+       "linkaccounts": "Propojení účtů",
+       "linkaccounts-success-text": "Účet byl propojen.",
+       "linkaccounts-submit": "Propojit účty",
+       "unlinkaccounts": "Zrušení propojení účtů",
+       "unlinkaccounts-success": "Propojení účtu bylo zrušeno."
 }
index efe2990..d614209 100644 (file)
        "missingcommenttext": "Аяларах, тархасшăн, хăвар пĕлтерĕве çырăр.",
        "summary-preview": "Ăнлантару çапла пулĕ:",
        "subject-preview": "Статья ячĕ çапла пулĕ:",
-       "blockedtitle": "Хутшăнакана ĕçлеме чарнă",
+       "blockedtitle": "Хутшăнакана чарса хунă",
        "blockedtext": "'''Ку аккаунта е IP-адреса ĕçлеме чарнă.'''\n\n$1 администратор ĕçлеме чарнă. Сăлтавĕ çакă: ''«$2»''.\n\n* Чарнă вăхăт: $8\n* Çак вăхăтчен чарнă: $6\n* Çакна чарнă: $7\n\n$1 хутшăнакан патне, е ытти [[{{MediaWiki:Grouppage-sysop}}|администраторсем]] патне эсир çыру ярса меншĕн ĕçлеме чарнине сӳтсе явма пултаратăр.\n\nАсăрхар: [[Special:Preferences|хăвăрăн ĕнерлевсенче]] эл. почта адресне çирĕплетмен пулсан, е сайта кĕмен пулсан — администратор патне çыру яраймастăр. Администратор сире çыру яма чарнă пулсан — ку хутĕнче те çыру яраймăр.\n\nСирĕн IP-адрес — $3, чару идентификаторĕ — #$5. Çырусенче, тархасшăн, вĕсене пĕлтерĕр.",
        "blockednoreason": "сăлтавне пĕлтермен",
        "loginreqtitle": "Сайта кĕмелле",
        "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": "Шырамалли",
        "listusers-submit": "Кăтарт",
        "listusers-noresult": "Хутшăнакансем тупăнмарĕç.",
+       "listusers-blocked": "(чарса хунă)",
+       "activeusers-count": "$1 {{PLURAL:$1|тӳрлетни|тӳрлетнисем}} юлашки {{PLURAL:$3|кун|$3 кунсенче}}",
        "activeusers-hidesysops": "Администраторĕсене пытар",
        "listgrouprights-group": "Ушкăн",
        "listgrouprights-helppage": "Help:Ушкăн прависем",
        "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..6732e34 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.",
        "trackingcategories-msg": "Tracking-Kategorie",
        "trackingcategories-name": "Name der Nachricht",
        "trackingcategories-desc": "Kategorieeinbindungskriterien",
+       "restricted-displaytitle-ignored": "Seiten mit ignorierten Anzeigetiteln",
+       "restricted-displaytitle-ignored-desc": "Die Seite hat einen ignorierten <code><nowiki>{{DISPLAYTITLE}}</nowiki></code>, da er nicht mit dem tatsächlichen Seitentitel äquivalent ist.",
        "noindex-category-desc": "Die Seite wird nicht von Bots indexiert, da sie das magische Wort <code><nowiki>__NOINDEX__</nowiki></code> enthält und sich in einem Namensraum befindet, wo dieses Flag erlaubt ist.",
        "index-category-desc": "Die Seite enthält ein <code><nowiki>__INDEX__</nowiki></code> und befindet sich in einem Namensraum, in dem dieses Flag erlaubt ist. Daher wird sie ausnahmsweise von Bots indiziert.",
        "post-expand-template-inclusion-category-desc": "Die Seitengröße ist nach dem Expandieren aller Vorlagen größer als <code>$wgMaxArticleSize</code>, so dass einige Vorlagen nicht expandiert wurden.",
        "rollbacklinkcount": "{{PLURAL:$1|Eine Version|$1 Versionen}} zurücksetzen",
        "rollbacklinkcount-morethan": "Mehr als {{PLURAL:$1|eine Version|$1 Versionen}} zurücksetzen",
        "rollbackfailed": "Zurücksetzen gescheitert",
+       "rollback-missingparam": "In der Anfrage fehlen erforderliche Parameter.",
        "cantrollback": "Die Änderung kann nicht zurückgesetzt werden, da es keine früheren Autoren gibt.",
        "alreadyrolled": "Das Zurücksetzen der Änderungen von [[User:$2|$2]] ([[User talk:$2|Diskussion]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) an [[:$1]] ist gescheitert, da in der Zwischenzeit ein anderer Benutzer die Seite geändert hat.\n\nDie letzte Änderung stammt von [[User:$3|$3]] ([[User talk:$3|Diskussion]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "editcomment": "Die Änderungszusammenfassung lautet: <em>$1</em>.",
        "revertpage": "Änderungen von [[Special:Contributions/$2|$2]] ([[User talk:$2|Diskussion]]) wurden auf die letzte Version von [[User:$1|$1]] zurückgesetzt",
        "revertpage-nouser": "Änderungen von einem versteckten Benutzer rückgängig gemacht und letzte Version von {{GENDER:$1|[[User:$1|$1]]}} wiederhergestellt",
        "rollback-success": "Die Änderungen von $1 wurden rückgängig gemacht und die letzte Version von $2 wurde wiederhergestellt.",
+       "rollback-success-notify": "Bearbeitungen von $1 rückgängig gemacht;\nzurückgeändert auf die letzte Version von $2. [$3 Änderungen zeigen]",
        "sessionfailure-title": "Sitzungsfehler",
        "sessionfailure": "Es gab ein Problem bei der Übertragung deiner Benutzerdaten.\nDiese Aktion wurde daher sicherheitshalber abgebrochen, um eine falsche Zuordnung deiner Änderungen zu einem anderen Benutzer zu verhindern.\nBitte gehe zurück zur vorherigen Seite, lade sie erneut und versuche, den Vorgang erneut auszuführen.",
        "changecontentmodel": "Inhaltsmodell einer Seite ändern",
        "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",
        "confirm-watch-top": "Diese Seite zur persönlichen Beobachtungsliste hinzufügen?",
        "confirm-unwatch-button": "OK",
        "confirm-unwatch-top": "Diese Seite von der persönlichen Beobachtungsliste entfernen?",
+       "confirm-rollback-button": "Okay",
+       "confirm-rollback-top": "Bearbeitungen an dieser Seite zurücksetzen?",
        "ellipsis": "…",
        "percent": "$1&#160;%",
        "quotation-marks": "„$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": "Anmeldeinformationen ändern",
+       "changecredentials-invalidsubpage": "$1 ist kein gültiger Typ für Anmeldeinformationen.",
+       "changecredentials-success": "Deine Anmeldeinformationen wurden geändert.",
+       "removecredentials": "Anmeldeinformationen entfernen",
+       "removecredentials-submit": "Anmeldeinformationen entfernen",
+       "removecredentials-invalidsubpage": "$1 ist kein gültiger Typ für Anmeldeinformationen.",
+       "removecredentials-success": "Deine Anmeldeinformationen wurden entfernt.",
+       "credentialsform-provider": "Typ der Anmeldeinformationen:",
+       "credentialsform-account": "Benutzername:",
+       "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..47b057b 100644 (file)
@@ -64,7 +64,7 @@
        "tog-ccmeonemails": "E-posteyanê ke ez karberanê binan rê rışenan, mı rê kopya inan bırışe",
        "tog-diffonly": "Qıyasê versiyonan de tek ferqan bımocne, pela butıne nê",
        "tog-showhiddencats": "Kategoriyanê dızdiye bımocne",
-       "tog-norollbackdiff": "Peyserardışi ra dıme ferqi caverde",
+       "tog-norollbackdiff": "Peyser ardışi ra dıme ferqi measne",
        "tog-useeditwarning": "Wexto ke mı yew pela nizami be vurnayışanê nêqeydbiyayeyan caverdê, hay be mı ser de",
        "tog-prefershttps": "Ronışten akerden de  greyo itimadın bıkarne",
        "underline-always": "Tım",
        "december-date": "Kanun $1",
        "period-am": "AM",
        "period-pm": "PM",
-       "pagecategories": "{{PLURAL:$1|Kategoriye|Kategoriyi}}",
+       "pagecategories": "{{PLURAL:$1|Kategori|Kategoriy}}",
        "category_header": "Pelê ke kategoriya \"$1\" derê",
        "subcategories": "Kategoriyê bınêni",
        "category-media-header": "Dosyeyê ke kategoriya \"$1\" derê",
        "qbedit": "Bıvurne",
        "qbpageoptions": "Ena pele",
        "qbmyoptions": "Pelê mı",
-       "faq": "PZP (Persê ke zehf persiyenê)",
+       "faq": "PZP",
        "faqpage": "Project: PZP",
        "actions": "Hereketi",
        "namespaces": "Heruna naman",
        "history": "Tarixê pele",
        "history_short": "Tarix",
        "updatedmarker": "cıkewtena mına peyêne ra dıme biyo rocane",
-       "printableversion": "Asaena çapkerdene",
+       "printableversion": "Versiyonê nusterin",
        "permalink": "Gıreyo jûqere",
        "print": "Çap ke",
        "view": "Bıvêne",
        "aboutpage": "Project:Heqa",
        "copyright": "Zerrekacı $1 bındı not biya.",
        "copyrightpage": "{{ns:project}}:Heqa telifi",
-       "currentevents": "Veng û vac",
+       "currentevents": "Hediseyê rocaneyi",
        "currentevents-url": "Project:Rocani hadisey",
        "disclaimers": "Redê mesuliyeti",
        "disclaimerpage": "Project:Reddê mesuliyetê bıngey",
        "mainpage": "Pela Seri",
        "mainpage-description": "Pela seri",
        "policy-url": "Project:Terzê hereketi",
-       "portal": "Portalê kome",
-       "portal-url": "Project:Portalê kome",
-       "privacy": "Madê dızdêni",
+       "portal": "Portalê cemaeti",
+       "portal-url": "Project:Portalê cemaeti",
+       "privacy": "Politikay Nımnayışi",
        "privacypage": "Project:Xısusiyetê nımtışi",
        "badaccess": "Xeta mısadey",
        "badaccess-group0": "Heqa şıma çıniya, karo ke şıma waşt, bıkerê.",
        "viewsourcelink": "çımey bıvêne",
        "editsectionhint": "Leteyo ke bıvuriyo: $1",
        "toc": "Sernameyê meselan",
-       "showtoc": "bımocne",
+       "showtoc": "bıasene",
        "hidetoc": "bınımne",
        "collapsible-collapse": "Teng ke",
        "collapsible-expand": "Hera ke",
        "feed-invalid": "Qeydey cıresnayışê  beğşi nêvêreno.",
        "feed-unavailable": "Cıresnayışê şebekey çıniyê",
        "site-rss-feed": "$1 Cıresnayışê RSSi",
-       "site-atom-feed": "$1 Wari kerdrna Atomi",
+       "site-atom-feed": "$1 Cıresnayışê atomi",
        "page-rss-feed": "\"$1\" Cıresnayışê RSSi",
        "page-atom-feed": "\"$1\" Cıresnayışê atomi",
        "feed-atom": "Atom",
        "createacct-another-submit": "Hesab vıraze",
        "createacct-benefit-heading": "{{SITENAME}} meş de merduman şi",
        "createacct-benefit-body1": "{{PLURAL:$1|vurnayış|vurnayışi}}",
-       "createacct-benefit-body2": "{{PLURAL:$1|pele|peli}}",
+       "createacct-benefit-body2": "{{PLURAL:$1|wesiqe|wesiqey}}",
        "createacct-benefit-body3": "{{PLURAL:$1|iştıraqkerdoğo nıkayên|iştıraqkerdoğê nıkayêni}}",
        "badretype": "Parolayê ke şıma nuşti yewbini nêtepışneni.",
        "userexists": "Jewna karber enê nami karneno.\nMara reca xorê jewna name bınusnê.",
        "createaccount-text": "Kesê, be e-posteyê şıma ra {{SITENAME}} ($4) de, ebe nameyê \"$2\" u parola \"$3\" ra yew hesab vıraşto.\nŞıma gani cı kewê u parola xo nıka bıvurnê.",
        "login-throttled": "Demekê $1 cıwa ver de şıma zah teşebbusê hesab akerdış kerd.\nBıne vındere u newe ra dest pê bıkere.",
        "login-abort-generic": "Dekewtışê şıma xırabo-terkneyayo",
+       "login-migrated-generic": "Hesabê şıma wedatiya yo u ena wiki de bamey şıma çıni yo.",
        "loginlanguagelabel": "Zıwan: $1",
        "suspicious-userlogout": "Waştişê tu ya veciyayişi kebul nibiya cunki ihtimal o ke waştiş yew browser ya zi proksiyê heripiyaye ra ameya.",
        "createacct-another-realname-tip": "Nameyo raştıkên keyfiyo.\nŞıma nameyo xoyo raştıkên ke bımocnê, seba iştırakanê karberi be ney ra istıfade beno.",
        "pt-login": "Cı kewe",
        "pt-login-button": "Cı kewe",
+       "pt-login-continue-button": "Cıkewten rê dewam ke",
        "pt-createaccount": "Hesab vıraze",
        "pt-userlogout": "Veciyayış",
        "php-mail-error-unknown": "PHP's mail() fonksiyoni de xırabin vıcyê.",
        "newpassword": "Parola newiye:",
        "retypenew": "Parola newiye tekrar ke:",
        "resetpass_submit": "Parola eyar kere u newe ra dekewe",
-       "changepassword-success": "Parola şıma be serkewtış vuriye!",
+       "changepassword-success": "Parolay şıma vuryaya!",
        "changepassword-throttled": "Şıma zaf ronıştış akerdış ke.Kerem ke verdi dekewten $1 bıpawe.",
+       "botpasswords": "Paroleyê botan",
+       "botpasswords-createnew": "Newe Paroleyê boti vıraze",
+       "botpasswords-editexisting": "Mewcud parolaye boti timar ke",
        "botpasswords-label-appid": "Nameyê boti:",
        "botpasswords-label-create": "Vıraze",
        "botpasswords-label-update": "Rocane ke",
        "botpasswords-label-cancel": "Bıtexelne",
        "botpasswords-label-delete": "Bestere",
        "botpasswords-label-resetpassword": "Parola raçarne",
-       "botpasswords-label-grants-column": "Daye",
+       "botpasswords-label-grants-column": "Dayen",
+       "botpasswords-created-title": "Parolay boti vırazi yê",
+       "botpasswords-updated-title": "Parolay boti rocane yê",
+       "botpasswords-deleted-title": "Parolay boti esteri yê",
        "resetpass_forbidden": "parolayi nêvuryayi",
        "resetpass-no-info": "şıma gani hesab akere u hona bıeşke bırese cı",
        "resetpass-submit-loggedin": "Parola bıvurne",
        "passwordreset-emailsentemail": "Eke na seba hesabê şıma yew adresa e-posteyê qeydına, yew e-posteyê parola nênkerdışi rışiyeno.",
        "passwordreset-emailsent-capture": "Yew e-posteyê esterıtışê parolayo ke rışiya, no cêr mocniyayo.",
        "passwordreset-emailerror-capture": "Yew e-posteyê esterıtışê parolayo ke rışiya, no cêr mocniyayo, ema {{GENDER:$2|karber}}i rê rıştış de mıwefeq nêbi: $1",
-       "changeemail": "E-posta adresa xo bıvurnê",
+       "changeemail": "E-posta adresa xo wedarne",
        "changeemail-header": "E-posya adresta hesabdê xo bıvurnê",
        "changeemail-no-info": "Şıma gani bıkewê pele ke derdest bıresê na pele.",
        "changeemail-oldemail": "E-postay şımawa nıkaêne:",
        "sig_tip": "İmzay şıma be morê zemani",
        "hr_tip": "Xeta verardiye (teserrufın bıgureyne/bıxebetne)",
        "summary": "Xulasa:",
-       "subject": "Mewzu/sernuşte:",
+       "subject": "Mewzu:",
        "minoredit": "No yew vurnayışo werdiyo",
        "watchthis": "Ena pele seyr ke",
        "savearticle": "Pele qeyd ke",
+       "publishpage": "Perer bıhesırne",
        "preview": "Verqayt",
        "showpreview": "Verqayti bımocne",
        "showdiff": "Vurnayışan bımocne",
        "missingcommenttext": "Cêr de jû fıkır bınusên, şıma rê zehmet.",
        "missingcommentheader": "'''Diqet:''' Şıma seba nê fıkrvaci yew mewzu/sernuşte nênuşt.\nEke şıma reyna \"{{int:savearticle}}\" bıtıknê, vırnayışê şıa bê mewzu/sernuşte do qeyd bo.",
        "summary-preview": "Verqaytê xulasa:",
-       "subject-preview": "Verqaytê mewzu/sernuştey:",
+       "subject-preview": "Verqaytê mewzu:",
+       "previewerrortext": "Verqaytê vurnayış de şıma dı xırabin amê meydan",
        "blockedtitle": "Karber blokekerdeo",
        "blockedtext": "<strong>No nameyê karberi ya zi na adresa IP blokekerdeya.</strong>\n\nVıraştoğê blokeyi: $1\nSebebê blokeyi: <em>$2</em>.\n\n* Sıftekerdena blokeyi: $8\n* Qediyayışê blokeyi: $6\n* Blokebiyaye: $7\n\nŞıma şenê  $1 de ya zi  yewna [[{{MediaWiki:Grouppage-sysop}}|administrator]]i de irtıbat kewê ke na mesela sero werênê, cemaet vırazê. \nŞıma nêşenê xısusiyetê \"karberi rê e-posta bırışe\" bıgureynê/bıxebetnê heta ke [[Special:Preferences|Tercihanê hesabi]] de yew e-posteyo ke vêreno, beli bi û şıma gureynayışê cı ra mehrum nêbiyê.\nIP adresa şımaya nıkayêne $3o û numreyê bloki #$5.\nŞıma rê zehmet, eke kewnê ra dıme, teferruatanê corênan not kerên.",
        "autoblockedtext": "IP adresê şıma otomotikmen kerda kılit, çıkı $1 verniya nê hesabi grota.\nSebebê cı zi:\n\n:''$2''\n\n* Dest pê kerdışê verni grotışi: $8\n* Qedyayişê verni grotışi: $6\n* Qayile ke bloqe bıbo: $7\n\nŞıma qayile qey weri kewtışê na mesela,  $1 ya na [[{{MediaWiki:Grouppage-sysop}}|serkaran ra]] yewi ra şenê irtibat kewê.\n\nNot, [[Special:Preferences|Tercihê karberi]] eke şıma yew e-postayo raşt nênuşt se şıma nêşenê na xususiyet ra \"karber rê e-posta bırışê\" istifade bıkeri.\n\nIP adresiya şıma yo nıkayên $3 u ID şıma yo ke musade nêdaye #$5. Eke şıma yew tehqiqat vırazeni malumatê corênan xo vira mekerê.",
        "newarticle": "(Newe)",
        "newarticletext": "To yew gıre tıkna be ra yew pela ke hewna çıniya.\nSeba afernayışê pele ra, qutiya metnê cêrêni bıgurene (seba melumati qaytê [$1 pela peşti] ke).\nEke be ğeletine ameya tiya, wa gocega <strong>peyser</strong>i programê xo de bıtıkne.",
        "anontalkpagetext": "----''No pel, pel o karbero hesab a nêkerdeyan o, ya zi karbero hesab akerdeyan o labele pê hesabê xo nêkewto de. No sebeb ra ma IP adres şuxulneni û ney IP adresan herkes eşkeno bıvino. Eke şıma qayil niye ina bo xo ri [[Special:CreateAccount|yew hesab bıvıraze]] veyaxut [[Special:UserLogin|hesab akere]].''",
-       "noarticletext": "Ena pele de hewna theba çıniyo.\nTı şenay zerreyê pelanê binan de [[Special:Search/{{PAGENAME}}|seba sernameyê ena pele cı geyre]],\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} qeydan miyan de cı geyre],\nya zi [{{fullurl:{{FULLPAGENAME}}|action=edit}} ena pele vıraze]</span>.",
+       "noarticletext": "Ena pele de hewna theba çıni yo.\nTı şenê zerreyê pelanê binan de [[Special:Search/{{PAGENAME}}|qandê  sernameyê ena pele cı geyre]],\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} qeydan miyan de cı geyre],\nya zi [{{fullurl:{{FULLPAGENAME}}|action=edit}} ena pele vıraze]</span>.",
        "noarticletext-nopermission": "Ena pele de hewna theba çıniyo.\nTı şenay zerreyê pelanê binan de [[Special:Search/{{PAGENAME}}|seba sernameyê na pele cı geyre]], ya zi <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} qeydan miyan de cı geyre]</span>, ema destur çıniyo ke na pele vırazê.",
        "missing-revision": "Rewizyonê name dê pela da #$1 \"{{FULLPAGENAME}}\" dı çıniyo.\n\nNo normal de tarix dê pelanê besterneyan dı ena xırabin asena.\nDetayê besternayışi [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} tiya dı] aseno.",
        "userpage-userdoesnotexist": "Hesabê karberi \"<nowiki>$1</nowiki>\" qeyd nêbiyo.\nKerem ke, tı ke wazenay na pele bafernê/bıvurnê, qontrol ke.",
        "userpage-userdoesnotexist-view": "Hesabê karberi \"$1\" qeyd nêbiyo.",
        "blocked-notice-logextract": "No karber/na karbere emanet blokekerdeyo/blokekediya.\nCıkewtışo tewr peyêno ke bloke biyo, cêr seba referansi belikerdeyo:",
-       "clearyourcache": "'''Not:''' Bahde sazkerdışi, gani hafızayê cı gerayoğ pak bıbo.\n*'''Mozilla / Firefox / Safari:''' ''Shift'' ri gıştê şıma ser nayi pel newe ra bar kere yana zi''Ctrl-Shift-R'' bıkere u (qey Apple Mac ''Cmd-Shift-R'');,\n*'''IE:''' ''Ctrl-F5' piya pıploxnê ke wa newe bo', \n* '''Operar:'''hacetan ra şı rê →tercihan ra bıvurnen",
+       "clearyourcache": "'''Not:''' Bahde sazkerdışi, gani hafızayê cı gerayoğ pak bıbo.\n*'''Mozilla / Firefox / Safari:''' ''Shift'' ri gıştê şıma ser nayi pel newe ra bar kere yana zi''Ctrl-Shift-R'' bıkere u (qey Apple Mac ''Cmd-Shift-R'');,\n*'''IE:''' ''Ctrl-F5' piya pıploxnê ke wa newe bo', \n* '''Opera:'''hacetan ra şı rê →tercihan ra bıvurnen",
        "usercssyoucanpreview": "'''Yardim:''' Ser \"{{int:showpreview}}\" sima eskeni CSSe newe test bikeri.",
        "userjsyoucanpreview": "'''Yardim:''' Ser \"{{int:showpreview}}\" sima eskeni CSSe newe test bikeri.",
        "usercsspreview": "'''şıma tena verqaydê dosyayê CSS vineni.''' '''Dosyayê Karberi CSS hema qayd nebiyo!'''",
        "yourdiff": "pêverronayiş",
        "copyrightwarning": "'''Recaya iqazi:'''Sita {{SITENAME}} ra iştıraqi pêro umışiya $2 zerredeyo (teferuatan rê $1 bıvênê).\n\nİştıraqê şıma, şıma qayıl niyê ke yewna merdumi kerpeyina bıvurnê ya zi yewna cayi ra vıla kerê ke, iştıraq mekewê.<br />\nFına zi qayılê ke iştıraq kewê, şıma qayılê ke şar vaco eno nuşte fılan kesi nusnayo ya zi meqemanê resmiyan ra zanayışê cı û malumatê cı esto / cayanê xoseran ra gırewtışi rê şıma garanti danê. '''Tiya de şıma werê telifi ra ke mısade nêgırewto, eserê cı tiya vıla mekerê! '''",
        "copyrightwarning2": "Ney bızanê ke nuşteyê ke şıma ruşnenê (şawenê) keyepela {{SITENAME}} herkes eşkeno nê nuşteyanê şıma ser kay bıkero. Eke şıma qayil niyê kes bıvurno, nuşteyanê xo meerzê ita. <br />\nWexto ke şıma nuşteyi zi erzenê ita; şıma gani teahud bıdê koti ra ardo (qandê teferuati ra referans: $1).",
+       "editpage-cannot-use-custom-model": "Zerrekê  modelê ena peler şıma nêşenê bıvurnê",
        "longpageerror": "'''Xırab: Dergeya nuşte dê şıma nezdi {{PLURAL:$1|kilobayto|$1 kilobayto}}, feqet {{PLURAL:$2|kilobayt|$2 kilobayt}} ra vêşiyo. Qeyd biyayişê cı nêbeno'''",
        "readonlywarning": "'''Diqet: Semedê mıqayti, database kılit biyo. No sebeb ra vurnayişê şıma qayd nêbeno. Nuşteyanê şıma yewna serkar eşkeno wedaro u pey ra şıma eşkeni reyna ita de qayd bıker'''\n\nSerkar o ke kılit kerdo; no beyanat dayo: $1",
        "protectedpagewarning": "'''Diqet: No pel pawyeno, teyna serkari eşkeni bıvurni.'''\nWexta ke şıma no pel vurneni diqet bıkeri:",
        "permissionserrorstext": "Qey {{PLURAL:$1|sebebê|sebebê}} cêrini ra icazeyê şıma çin o:",
        "permissionserrorstext-withaction": "{{PLURAL:$1|Sebeba|Sebeb da}} cêri ra icazetê $2 çıniyo:",
        "recreate-moveddeleted-warn": "'''Hişyari: no pel o ke şıma vırazeni vere cû vırazyayo.'''\n\nDiqet bıkeri no vurnayişê şıma re gerek esto:",
-       "moveddeleted-notice": "Na per besternyaya.\nQeydé  besternayışi uq hewadayışi cér dé deyayo.",
+       "moveddeleted-notice": "Ena pela esteriya ya.\nQeydé  esternayışi u wedarnayışi cér dé deya yo.",
        "log-fulllog": "Temamê rocaneyi bıvine",
        "edit-hook-aborted": "Vurnayiş vınderiya.\nYew sebeb beyan nibı.",
        "edit-gone-missing": "Pel rocanebiyaye niyo.\nHewna kerde aseno.",
        "undo-success": "No vurnayiş tepeye geryeno. pêverronayişêyê cêrıni kontrol bıkeri.",
        "undo-failure": "Sebayê pêverameyişê vurnayişan karo tepêya gırewtış nêbı.",
        "undo-norev": "Vurnayiş tepêya nêgeryeno çunke ya vere cû hewna biyo ya zi ca ra çino.",
-       "undo-summary": "Vırnayışê $1'i [[Special:Contributions/$2|$2i]] ([[User talk:$2|Werênayış]]) peyser gırewt",
+       "undo-summary": "Vırnayışê $1'i [[Special:Contributions/$2|$2i]] ([[User talk:$2|Werênayış]]) peyser gırot",
        "undo-summary-username-hidden": "Rewizyona veri $1'i hewada",
        "cantcreateaccounttitle": "Nêşenay hesab rakerê",
        "cantcreateaccount-text": "Hesabvıraştışê na IP adrese ('''$1''') terefê [[User:$3|$3]] kılit biyo.\n\nSebebo ke terefê $3 ra diyao ''$2''",
        "rev-deleted-event": "(fealiyetê cıkewtışi esteriyo)",
        "rev-deleted-user-contribs": "[nameyê karberi ya zi adresa IPy esteriya - vurnayış iştırakan ra nımniyo]",
        "rev-deleted-text-permission": "Çımraviyarnayışê ena pele '''esteriyo'''.\nBeno ke [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log] de teferruat esto.",
+       "rev-suppressed-text-permission": "Çımraviyarnayışê ena pele '''degusneyayo'''.\nŞıma be idarekerina xo ra şenê ey bıvênê; beno ke [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} degusnayış] de teferruat esto.",
        "rev-deleted-text-unhide": "Çımra viyarnayışê ena pele '''besterêno'''.\nBeno ke [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} besternayış] de teferruat esto.\nŞıma be idarekerina xo ra şenê hewna [$1 nê çımra viyarnayışi bıvinê], eke wazenê dewam kerê.",
        "rev-suppressed-text-unhide": "Çımra viyarnayışê ena pele '''Degusneyayo'''.\nBeno ke [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} degustış] de teferruat esto.\nŞıma be idarekerina xo ra şenê hewna [$1 nê çımraviyarnayışi bıvênê], eke wazenê dewam kerê.",
        "rev-deleted-text-view": "Çımra viyarnayışê ena pele '''besternêno'''.\nŞıma be idarekerina xo ra şenê ey bıvênê; beno ke [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} besternayış] de teferruat esto.",
        "rev-deleted-diff-view": "Jew timarkerdışê ena versiyon '''wedariyayo''.\nÎdarekarî şenê ena versiyon bivîne; belki tiya de [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} wedarnayişî] de teferruat esto.",
        "rev-suppressed-diff-view": "Jew timarkerdışê ena versiyon '''Ploxneyış'' biyo.\nÎdarekarî eşkeno ena dif bivîne; belki tiya de [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} ploxnayış] de teferruat esto.",
        "rev-delundel": "bımocne/bınımne",
-       "rev-showdeleted": "bımocne",
+       "rev-showdeleted": "bıasene",
        "revisiondelete": "Çımraviyarnayışan bestere/peyser biya",
        "revdelete-nooldid-title": "Çımraviyarnayışo waşte nêvêreno",
        "revdelete-nooldid-text": "Şıma vıraştışê nê fonksiyoni rê ya yew çımraviyarnayışo waşte diyar nêkerdo, çımraviyarnayışo diyarkerde çıniyo, ya ki şıma wazenê ke çımraviyarnayışê nıkayêni bınımnê.",
        "revdelete-legend": "Şertanê vênayışi rone",
        "revdelete-hide-text": "Nuştey revizyoni",
        "revdelete-hide-image": "zerreyê dosyay bınımnê",
-       "revdelete-hide-name": "hedef u vaqa' bınımne",
+       "revdelete-hide-name": "hedef u parametreyan bınımne",
        "revdelete-hide-comment": "Xulasa bıvurne",
        "revdelete-hide-user": "IP asresa/namey  vırnoği",
        "revdelete-hide-restricted": "Malumatan pa serkaran u karberan ra bınım.",
        "revdelete-unsuppress": "reizyonê ke tepiya anciye serbest ker",
        "revdelete-log": "Sebeb:",
        "revdelete-submit": "Cewab be {{PLURAL:$1|çımraviyarnayışi|çımraviyarnayışan}} de",
-       "revdelete-success": "''''Esayişê revizyoni bi muvaffaqi eyar bi.'''",
+       "revdelete-success": "Asayişê revizyoni rocaneya",
        "revdelete-failure": "'''Esayişê revizyoni eyar nibeno:'''\n$1",
        "logdelete-success": "'''Esayişê rocaneyi bı muvaffaqi eyar bı.'''",
        "logdelete-failure": "'''Esayişê rocaneyi eyar nêbı:'''\n$1",
        "notextmatches": "tekê (zewcê) nuştey pele çıniyê",
        "prevn": "{{PLURAL:$1|$1}} verên",
        "nextn": "{{PLURAL:$1|$1}} peyên",
+       "prev-page": "Pela verên",
+       "next-page": "Pela peyên",
        "prevn-title": "$1o verên  {{PLURAL:$1|netice|neticeyan}}",
        "nextn-title": "$1o ke yeno {{PLURAL:$1|netice|neticey}}",
        "shown-title": "bimocne $1î  {{PLURAL:$1|netice|neticeyan}} ser her pel",
        "searchprofile-images-tooltip": "Dosya cı geyr",
        "searchprofile-everything-tooltip": "Tedeesteyan hemine cı geyre (pelanê mınaqeşeyi zi tey)",
        "searchprofile-advanced-tooltip": "qe cayê nimeyî bigêre",
-       "search-result-size": "$1 ({{PLURAL:$2|1 çekuyo|$2 çekuyê}})",
+       "search-result-size": "$1 ({{PLURAL:$2|1 çeku|$2 çekuy}})",
        "search-result-category-size": "{{PLURAL:$1|1 eza|$1 ezayan}} ({{PLURAL:$2|1 kategoriyê bini|$2 kategirayanê binan}}, {{PLURAL:$3|1 dosya|$3 dosyayan}})",
        "search-redirect": "($1 ra ardış)",
        "search-section": "(qısmê $1)",
        "search-category": "(kategori $1)",
        "search-file-match": "(zerreyê dosya yewbini gêno)",
        "search-suggest": "To va: $1",
+       "search-rewritten": "Neticey $ asenê.  Herunda ney wa neticey $2  bıasê",
        "search-interwiki-caption": "Proceyê bıray",
        "search-interwiki-default": "$1 ra neticey:",
        "search-interwiki-more": "(véşi)",
        "showingresultsinrange": "{{PLURAL:$1|<strong>1</strong> netice|<strong>$1</strong> neticey}} be mabeynê #<strong>$2</strong> ra be #<strong>$3</strong> cêr asenê.",
        "search-showingresults": "{{PLURAL:$4|Netice <strong>$1</strong> be <strong>$3</strong>|Neticeyi <strong>$1 - $2</strong> be <strong>$3</strong>}}",
        "search-nonefound": "Zey perskerdışê şıma netice nêvêniya.",
+       "search-nonefound-thiswiki": "Ena sita dı zey waşten da şıma theba nêvineya",
        "powersearch-legend": "Cıgeyrayışo hera",
        "powersearch-ns": "Cayanê nameyan de cıgeyrayış:",
        "powersearch-togglelabel": "Kontrol ke:",
        "prefs-labs": "Xacetê labs",
        "prefs-user-pages": "Pela Karberi",
        "prefs-personal": "Pela karberi",
-       "prefs-rc": "Vurnayışê peyêni",
+       "prefs-rc": "Vurriyayışê peyêni",
        "prefs-watchlist": "Lista seyrkerdışi",
        "prefs-watchlist-days": "Rocê ke lista seyrkerdışi de bêrê ramocnaene",
        "prefs-watchlist-days-max": "tewr vêşi $1 {{PLURAL:$1|roci|roci}}",
        "group": "Grube:",
        "group-user": "Karberi",
        "group-autoconfirmed": "Karberê ke otomatikmen biyê araşt",
-       "group-bot": "Boti",
+       "group-bot": "Roboti",
        "group-sysop": "İdarekari",
-       "group-bureaucrat": "Burokrati",
-       "group-suppress": "Çımpawıteni",
+       "group-bureaucrat": "Buroqrati",
+       "group-suppress": "Çımpawıti",
        "group-all": "(pêro)",
        "group-user-member": "{{GENDER:$1|karber}}",
        "group-autoconfirmed-member": "{{GENDER:$1|Karberê ke otomatikmen biyê araşt}}",
        "nchanges": "$1 {{PLURAL:$1|fın vurna|fıni vurna}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|ra yok wazino}}",
        "enhancedrc-history": "tarix",
-       "recentchanges": "Vurnayışê peyêni",
+       "recentchanges": "Vurriyayışê peyêni",
        "recentchanges-legend": "Tercihê vurnayışanê peyênan",
        "recentchanges-summary": "Ena pele de wiki sero vurnayışanê peyênan teqib ke.",
        "recentchanges-noresult": "Goreyê kriteranê kıfşkerdeyan ra qet yew vurnayış nêvêniya.",
        "recentchanges-legend-heading": "<strong>Kıtabek:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|Lista pelanê neweyan]] zi bıvêne)",
        "recentchanges-legend-plusminus": "''(±123)''",
+       "recentchanges-submit": "Bıasene",
        "rcnotefrom": "Cêr de <strong>$2</strong> ra nata vurnayışiyê asenê (tewr vêşi <strong>$1</strong> asenê).",
        "rclistfrom": "$3 $2 ra tepiya vurnayışanê neweyan bımocne",
        "rcshowhideminor": "vurnayışê werdiyi $1",
-       "rcshowhideminor-show": "Bımocne",
+       "rcshowhideminor-show": "Bıasene",
        "rcshowhideminor-hide": "Bınımne",
        "rcshowhidebots": "botan $1",
-       "rcshowhidebots-show": "Bımocne",
+       "rcshowhidebots-show": "Bıasene",
        "rcshowhidebots-hide": "Bınımne",
        "rcshowhideliu": "karberê qeydbiyayeyi $1",
-       "rcshowhideliu-show": "Bımocne",
+       "rcshowhideliu-show": "Bıasene",
        "rcshowhideliu-hide": "Bınımne",
        "rcshowhideanons": "karberê bênameyi $1",
-       "rcshowhideanons-show": "Bımocne",
+       "rcshowhideanons-show": "Bıasene",
        "rcshowhideanons-hide": "Bınımne",
        "rcshowhidepatr": "$1 vurnayışê ke dewriya geyrayê",
-       "rcshowhidepatr-show": "Bımocne",
+       "rcshowhidepatr-show": "Bıasene",
        "rcshowhidepatr-hide": "Bınımne",
        "rcshowhidemine": "vurnayışanê mı $1",
-       "rcshowhidemine-show": "Bımocne",
+       "rcshowhidemine-show": "Bıasene",
        "rcshowhidemine-hide": "Bınımne",
        "rcshowhidecategorization": "kategorizasyonê pele $1",
-       "rcshowhidecategorization-show": "Bımocne",
+       "rcshowhidecategorization-show": "Bıasne",
        "rcshowhidecategorization-hide": "Bınımne",
        "rclinks": "Peyniya $2 rocan de $1 vurnayışan bımocne <br />$3",
        "diff": "ferq",
        "hist": "verên",
        "hide": "Bınımne",
-       "show": "Bımocne",
+       "show": "Bıasne",
        "minoreditletter": "q",
        "newpageletter": "N",
        "boteditletter": "b",
        "statistics-header-hooks": "Yewbina istatistiki",
        "statistics-articles": "Pelê zerreki",
        "statistics-pages": "Peli",
-       "statistics-pages-desc": "Pelanê hemî ke wîkî de estê, pelanê mineqeşeyî, redireksiyon ucb... dehil o.",
+       "statistics-pages-desc": "Wiki de peley pêro, kategoriy, hetenayışi wesaire...",
        "statistics-files": "Dosyayê bar biye",
-       "statistics-edits": "{{SITENAME}} saz kerdış ra hetana newke amora vırnayışan",
+       "statistics-edits": "Ronayen da {{SITENAME}} ra newke amora vıryayışan",
        "statistics-edits-average": "Her pele sero nısbi vurnayış",
        "statistics-users": "[[Special:ListUsers|Karber]]ê qeydıni",
        "statistics-users-active": "Karberê aktifi",
        "pageswithprop-submit": "Şo",
        "pageswithprop-prophidden-long": "Erca metinda derger nımneya ($1)",
        "pageswithprop-prophidden-binary": "Erca dıdıyına ($1) nımneyé",
-       "doubleredirects": "Serşıkıtışê dıleti",
+       "doubleredirects": "Hetenayışê dıleti",
        "doubleredirectstext": "no pel pelê ray motışani liste keno.\ngıreyê her satıri de gıreyi; raş motışê yewın u dıyıni esto.\n<del>serê ey nuşteyi</del> safi biye.",
        "double-redirect-fixed-move": "[[$1]] kırışiye.\nNa otomatikmen biye rocaniye û nıka [[$2]] ser şıknena.",
        "double-redirect-fixed-maintenance": "Serkışışteno dıletê [[$1]] ra  pela da [[$2]] vuriyeno.",
        "withoutinterwiki": "Pelê ke zıwananê binan rê gıreyê cı çıniyo",
        "withoutinterwiki-summary": "Enê pelî ke versiyonê ziwanî binî ra link nidano.",
        "withoutinterwiki-legend": "Verole",
-       "withoutinterwiki-submit": "Bımocne",
+       "withoutinterwiki-submit": "Bıasene",
        "fewestrevisions": "Pelê be senık çımraviyarnayışi",
        "nbytes": "$1 {{PLURAL:$1|bayt|bayti}}",
-       "ncategories": "$1 {{PLURAL:$1|Kategoriye|Kategoriyi}}",
+       "ncategories": "$1 {{PLURAL:$1|Kategori|Kategoriy}}",
        "ninterwikis": "$1 {{PLURAL:$1|interwiki|interwikiy}}",
        "nlinks": "$1 {{PLURAL:$1|link|linkî}}",
        "nmembers": "$1 {{PLURAL:$1|eza|ezayan}}",
        "mostrevisions": "Pelan ke tewr zaf revizyonî biyê.",
        "prefixindex": "Veroleya peley pêro",
        "prefixindex-namespace": "Peleyê Veroleyıni ($1 cay nami)",
+       "prefixindex-submit": "Bıasene",
        "prefixindex-strip": "Listeya réz bıyayışi",
        "shortpages": "Pelê kılmeki",
        "longpages": "Pelê dergeki",
        "protectedpages-performer": "Şeveknayışê karberi",
        "protectedpages-params": "Parametreyê şeveknayışi",
        "protectedpages-reason": "Sebeb",
+       "protectedpages-submit": "Asayışê pela",
        "protectedpages-unknown-timestamp": "Nêzanaye",
        "protectedpages-unknown-performer": "Karbero nêzanaye",
        "protectedtitles": "Sernameyê pawıteyi",
        "usereditcount": "$1 {{PLURAL:$1|vurnayîş|vurnayîşî}}",
        "usercreated": "$2 de $1 {{GENDER:$3|viraziya}}",
        "newpages": "Pelê newey",
+       "newpages-submit": "Bıasene",
        "newpages-username": "Nameyê karberi:",
        "ancientpages": "Pelê kehenêri",
-       "move": "Bere",
-       "movethispage": "Ena pele bere",
+       "move": "Wegi",
+       "movethispage": "Ena peler wegi",
        "unusedimagestext": "Enê dosyey estê, feqet zerrey yew pele de wedardey niyê.\nXo vira mekerê ke, sıteyê webiê bini şenê direkt ebe URLi yew dosya ra gırê bê, u wına şenê verba gurênayışo feal de tiya hewna lista bê.",
        "unusedcategoriestext": "Kategoriyê ke cêr derê, nê bıbê zi, terefê qet madeyan ya zi kategoriyan ra nêgureniyenê.",
        "notargettitle": "Hedef çini yo",
        "apisandbox": "API qumdor",
        "apisandbox-submit": "Bıwazê",
        "apisandbox-reset": "Bestere",
-       "apisandbox-examples": "Misal",
-       "apisandbox-results": "Netice",
+       "apisandbox-examples": "Misali",
+       "apisandbox-dynamic-parameters": "Parametreya debyayi",
+       "apisandbox-dynamic-parameters-add-label": "Parametre dek:",
+       "apisandbox-dynamic-parameters-add-placeholder": "Nmaey parametrey",
+       "apisandbox-results": "Neticey",
+       "apisandbox-sending-request": "API waştış rışêno...",
        "apisandbox-request-url-label": "URL waştış:",
        "apisandbox-request-time": "Demê waştışi: $1",
        "booksources": "Çımeyê kıtaban",
        "specialloguserlabel": "Kerdoğ:",
        "speciallogtitlelabel": "Meqsed (sername ya zi {{ns:user}}:karberi rê nameyê karberi):",
        "log": "Qeydi",
+       "logeventslist-submit": "Bıasene",
        "all-logs-page": "Umumi qeydi pêro",
        "alllogstext": "qey {{SITENAME}}i mocnayişê heme rocaneyani.\ntipa rocaneyi, nameyê karberi (herfa pil u qıci re hessas a), ya zi peli (reyna hessasiyê herfa pil u qıciyi) bıweçine u esayiş qıc kerê.",
-       "logempty": "qaydi de weina yew malumat çino",
+       "logempty": "Qeydan dı malumato unasin çıni yo.",
        "log-title-wildcard": "sername yê ke pê ney nuşteyi destkenêpê bıgêr.",
        "showhideselectedlogentries": "Qeydê weçinayışê bımocne/bınımne dekerê",
+       "log-edit-tags": "Etiketanê weçinayê qeydan bıvurnê",
+       "checkbox-select": "Weçinaye: $1",
+       "checkbox-all": "Pêro",
+       "checkbox-none": "Temam",
        "allpages": "Peli pêro",
        "nextpage": "Pela badê cû ($1)",
        "prevpage": "Pela verêne ($1)",
        "cachedspecial-viewing-cached-ts": "Na pela raşt niya, şımayê enewke versiyonê verhafızada na pela vinenê.",
        "cachedspecial-refresh-now": "Peyêni bıvin.",
        "categories": "Kategoriy",
+       "categories-submit": "Bıasene",
        "categoriespagetext": "{{PLURAL:$1|Kategoriya cêrene|Kategoriyanê cêrênan}} de peli ya zi medya estê.\n[[Special:UnusedCategories|Kategoriyê ke nêxebetiyenê]] tiya de nêmocniyayê.\n[[Special:WantedCategories|Kategoriyanê waşteyeyan]] de zi bıvêne.",
        "categoriesfrom": "Kategoriyê ke be ninan dest pêkenê, bımocne:",
        "deletedcontributions": "İştırakê karberi esterdi",
        "linksearch-line": "$1, $2 ra link biya",
        "linksearch-error": "jokeri têna nameyê makina ya serekini de aseni/eseni.",
        "listusersfrom": "karber ê ke pey ıney detpêkeni ramocın:",
-       "listusers-submit": "Bımocne",
+       "listusers-submit": "Bıasene",
        "listusers-noresult": "karber nêdiyayo/a.",
        "listusers-blocked": "(blok biy)",
        "activeusers": "Listey karberan de aktivan",
        "activeusers-intro": "Ena yew listeya karberê ke $1 {{PLURAL:$1|roc|rocan}} ra tepya iştiraq kerdo ênan mocneno.",
-       "activeusers-count": "$1 peyni {{PLURAL:$3|roz de|$3 rozan de}} $1 {{PLURAL:$1|hereket|hereketi}} kerdê",
+       "activeusers-count": "Peyni  {{PLURAL:$3|roc de|$3 rocan de}} $1  {{PLURAL:$1|hereket kerdo|hereketi kerdê}}",
        "activeusers-from": "Enê karberi ra tepya bımocne:",
        "activeusers-hidebots": "Botan bınımne",
        "activeusers-hidesysops": "İdarekaran bınımne",
        "activeusers-noresult": "Karberi nêdiyayê.",
+       "activeusers-submit": "Karberanê aktivan bıasene",
        "listgrouprights": "heqê grubê karberi",
        "listgrouprights-summary": "wikiya cêrın a ke tede grubê karberi nişane biyê, listeya heqê cıresayişê inan o.\nqey heqê şexsi de [[{{MediaWiki:Listgrouprights-helppage}}|hema malumato ziyed]] belka esto.",
        "listgrouprights-key": "* <span class=\"listgrouprights-granted\">Heqa daiye</span>\n* <span class=\"listgrouprights-revoked\">Heqa gıreti</span>",
        "listgrouprights-group": "Grube",
        "listgrouprights-rights": "Heqqî",
        "listgrouprights-helppage": "Help:Heqqanê gruban",
-       "listgrouprights-members": "[lista ezayan]",
+       "listgrouprights-members": "[listey ezayan]",
        "listgrouprights-right-display": "<span class=\"listgrouprights-granted\">$1 <code>($2)</code></span>",
        "listgrouprights-right-revoked": "<span class=\"listgrouprights-revoked\">$1 <code>($2)</code></span>",
        "listgrouprights-addgroup": "{{PLURAL:$2|Grube|Gruban}} cı kerê: $1",
        "listgrouprights-removegroup-self": "Hesabê xo ra {{PLURAL:$2|grube|gruban}} bıvecê: $1",
        "listgrouprights-addgroup-self-all": "şıma eşkeni hesabê xo re heme gruban têare bıkerî",
        "listgrouprights-removegroup-self-all": "şıma hesabê xo ra eşkeni heme gruban bıveci",
+       "listgrouprights-namespaceprotection-header": "Kılm kerdena nameyan",
        "listgrouprights-namespaceprotection-namespace": "Heruna nami",
        "trackingcategories": "Kategoriyê teqibi",
        "trackingcategories-msg": "Kategoriya teqibi",
        "wlnote": "$3 saete $4 ra dıme {{PLURAL:$2|yew saete de|'''$2''' saetan de}} {{PLURAL:$1|vurnayışo peyên|vurnayışê '''$1''' peyêni}} cêrderê.",
        "wlshowlast": "Peyni de vurnayışan ra  $1 seata u $2 roca  bımocnê",
        "watchlist-hide": "Bınımne",
+       "watchlist-submit": "Bıasene",
        "wlshowtime": "Peyênan bımocne:",
        "wlshowhideminor": "vurnayışê werdiyi",
        "wlshowhidebots": "boti",
        "delete-confirm": "\"$1\" bestere",
        "delete-legend": "Bestere",
        "historywarning": "'''Teme:''' Pela ke şıma esterenê tede yew viyarte be teqriben $1 {{PLURAL:$1|versiyon esto|versiyoni estê}}:",
+       "historyaction-submit": "Bıasene",
        "confirmdeletetext": "Tı ho yew pele u tarixê pele wederneno.\nTı ra rica keno, tı zani tı ho sekeno, tı zani neticeyanê eno wedarnayışi u tı zani tı ser [[{{MediaWiki:Policy-url}}|poliçe]] kar keno.",
        "actioncomplete": "Kar bi temam",
        "actionfailed": "kar nêbı",
        "changecontentmodel-title-label": "Sernameyê pele",
        "changecontentmodel-model-label": "Modelê zerrekiyo newe",
        "changecontentmodel-reason-label": "Sebeb:",
+       "changecontentmodel-submit": "Bıvurne",
        "log-name-contentmodel": "Qeydê vurnayışanê modelê zerreki",
+       "logentry-contentmodel-change-revertlink": "peyser biya",
+       "logentry-contentmodel-change-revert": "peyser biya",
        "protectlogpage": "Qeydê staryayan",
        "protectlogtext": "Şıma vurnayişê gırewtışê/wedarnayışê pawıtişi vinenê.\nQey malumato ziyede [[Special:ProtectedPages|Peleyê ke star biye]] bewni rê êna .",
        "protectedarticle": "\"[[$1]]\" kılit biyo",
        "protect-othertime": "Wextê binî:",
        "protect-othertime-op": "wextê binî",
        "protect-existing-expiry": "wextê qediyayişi yê mewcudi: $3, $2",
+       "protect-existing-expiry-infinity": "Mewcud drmê qedyayışi:Bewext",
        "protect-otherreason": "sebebo bin/sebebê ilaveyi",
        "protect-otherreason-op": "Sebebo bin",
        "protect-dropdown": "*sebebê pawıtışi ye pêroyiye\n** vandalizmo hed ra vecaye\n** spamo hed ra vecaye\n** şêrê/herbê vurnayişi\n** pel o ke zaf wayirê trafiki yo",
        "maximum-size": "Ebatê maximumî",
        "pagesize": "(bitî)",
        "restriction-edit": "Bıvurne",
-       "restriction-move": "Bere",
+       "restriction-move": "Berr",
        "restriction-create": "Vıraze",
        "restriction-upload": "Bar ke",
        "restriction-level-sysop": "tam pawiyayo",
        "namespace_association": "Heruna nameyanê elaqedaran",
        "tooltip-namespace_association": "Herunda canemiya elekeyın nışan kerdışi sero qıse kerdışi yana zerre dekerdışi rê ena dora tesdiqi nışan kerê",
        "blanknamespace": "(Ser)",
-       "contributions": "İştıraqê {{GENDER:$1|karber}}i",
+       "contributions": "Dekerdışê {{GENDER:$1|karber}}i",
        "contributions-title": "Dekerdenê karber de $1",
        "mycontris": "İştıraqi",
        "anoncontribs": "İştıraqi",
        "sp-contributions-username": "Adresa IPy ya zi nameyê karberi:",
        "sp-contributions-toponly": "Tenya rewizyonanê tewr peyniyan bimocne",
        "sp-contributions-submit": "Cı geyre",
-       "whatlinkshere": "Pele rê gırey",
+       "whatlinkshere": "Pele rê gıreyi",
        "whatlinkshere-title": "Per da \"$1\" rê perê ke gre danê",
        "whatlinkshere-page": "Pele:",
        "linkshere": "Ena peleyan grey biya '''[[:$1]]''':",
        "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",
+       "whatlinkshere-submit": "Şo",
        "autoblockid": "Otomatik vındarnayış #$1",
        "block": "Karberi vındarne",
        "unblock": "Hesabê karberi akerê",
-       "blockip": "Karberi kılit ke",
+       "blockip": "{{GENDER:$1|Karberi}} kılit ke",
        "blockip-legend": "Karber blok bike",
-       "blockiptext": "pê şuxulnayişê formê cêrıni, şıma eşkeni verniyê vurnayişkerdışê yew karberi ya zi yew IPyi bıgêrî. No têna qey verni-gırewtışê vandalizmiyo u gani şıma [[{{MediaWiki:Policy-url}}|qaydeyan]] re diqqet bıkeri. cêr de muheqqeq sebebê verni-grewtışi bınusi. (mesela: -nê- pelani de vandalizm kerdo).",
+       "blockiptext": "pê şuxulnayişê formê cêrıni, şıma eşkeni verniyê vurnayişkerdışê yew karberi ya zi yew IPyi bıgêrî. No têna qey verni-gırewtışê vandalizmiyo u gani şıma [[{{MediaWiki:Policy-url}}|qaydeyan]] re diqqet bıkeri. cêr de muheqqeq sebebê verni-grewtışi bınusi. (mesela: -nê- pelani de vandalizm kerdo)",
        "ipaddressorusername": "Adresa IPy ya zi nameyê karberi:",
        "ipbexpiry": "Qedyayış:",
        "ipbreason": "Sebeb:",
        "ipb-unblock": "Yew adresê IPî ya zi nameyê karberî blok bike",
        "ipb-blocklist": "Blokî ke hama estê ey bivîne",
        "ipb-blocklist-contribs": "Qandê {{GENDER:$1|}} ra iştıraqi",
+       "ipb-blocklist-duration-left": "$1 vet",
        "unblockip": "Hesabê karberî a bike",
        "unblockiptext": "Cıreştışê nuştışê IP ya zi karberio ke ver ra gêriyayo, seba peyser barkerdışi dey rê formê cêrêni bıgurenên.",
        "ipusubmit": "Enê kılitkerdışi wedare",
        "movepage-page-moved": "pelê $1i kırışiya pelê $2i.",
        "movepage-page-unmoved": "pelê $1i nêkırışiyeno sernameyê $2i.",
        "movepage-max-pages": "tewr ziyed $1 {{PLURAL:$1|peli|peli}} kırışiya u hıni ziyedê ıney otomotikmen nêkırışiyeno.",
-       "movelogpage": "Qeydê berdışi",
+       "movelogpage": "Qeydê wegrotışi",
        "movelogpagetext": "nameyê liste ya ke cêr de yo, pelê vuriyayeyani mocneno",
        "movesubpage": "{{PLURAL:$1|Subpage|pelê bınıni}}",
        "movesubpagetext": "{{PLURAL:$1|pelê bınıni yê|pelê bınıni yê}} no $1 peli cer de yo.",
        "import": "Peleyi import bik",
        "importinterwiki": "Zewbina wiki ra ard",
        "import-interwiki-text": "qey kırıştışê zerreyi yew wiki u pel bıvıcinê.\ntarixê revizyon u nameyê nuştoxi pawyene.\nkarê zerredayişê benateyê wikiyani[[Special:Log/import|zerreyê rocaneyê kırıştî de]] qeyd beno.",
+       "import-interwiki-sourcewiki": "Çıme wiki:",
+       "import-interwiki-sourcepage": "Çıme pela:",
        "import-interwiki-history": "Qeydanê pele pêrune kopya ke",
        "import-interwiki-templates": "Şablonan pêro zerre ke",
        "import-interwiki-submit": "Zerre ke",
+       "import-mapping-default": "Hesıbyaye lokasyonan miyan ke",
+       "import-mapping-namespace": "Dek yu canamey miyan",
+       "import-mapping-subpage": "Bınnpeley ena peler deyne azere ke",
        "import-upload-filename": "Nameyê dosyayi:",
        "import-comment": "Mışewre:",
        "importtext": "Kerem ke dosyay, çımeyê wiki ra pê [[Special:Export|kırıştışê teberdayişi]] bıdê teber, Komputerê xo de qeyd kerê u bar kerê tiya.",
        "tooltip-ca-unprotect": "Starkerdışe ena peler bıvurne",
        "tooltip-ca-delete": "Ena pele bestere",
        "tooltip-ca-undelete": "peli biyarê halê ver hewnakerdışi",
-       "tooltip-ca-move": "Ena pele bere",
+       "tooltip-ca-move": "Ena peler wegi",
        "tooltip-ca-watch": "Ena pele lista xoya seyrkerdışi ke",
        "tooltip-ca-unwatch": "Ena pele lista xoya seyrkerdışi ra vece",
-       "tooltip-search": "{{SITENAME}} de bıvin",
+       "tooltip-search": "{{SITENAME}} de cı geyre",
        "tooltip-search-go": "Ebe nê namey tami şo yew pela ke esta",
-       "tooltip-search-fulltext": "Pela miyan dı bı geyr ena metin",
-       "tooltip-p-logo": "pela seri ziyaret ke",
+       "tooltip-search-fulltext": "Pelan miyan de nê metıni cı geyre",
+       "tooltip-p-logo": "Pela seri bıvêne",
        "tooltip-n-mainpage": "Şo pela seri",
        "tooltip-n-mainpage-description": "Şo pela seri",
        "tooltip-n-portal": "Heqa proceyi de, çı şenay bıkerê, çı koti vêniyeno",
        "tooltip-feed-atom": "Qe ena pele atom feed",
        "tooltip-t-contributions": "Yew lista iştırakanê {{GENDER:$1|nê karberi}}",
        "tooltip-t-emailuser": "Ena karber ri yew email bışırav",
-       "tooltip-t-upload": "Dosyey bar ke",
+       "tooltip-t-upload": "Dosyeyan bar ke",
        "tooltip-t-specialpages": "Yew lista pelanê xasanê pêroyinan",
        "tooltip-t-print": "Hewl versiyona ploğnayışa na perer",
        "tooltip-t-permalink": "Gırêyo daimi be ena versiyonê pele",
        "tooltip-preferences-save": "Terciha qeyd ke",
        "tooltip-summary": "Yew xulasaya kilm binuse",
        "interlanguage-link-title": "$1 - $2",
+       "common.css": "/************************************************\n * COMMON CSS\n *\n * Any CSS placed in this page will be used on \n * all skins, please think carefully about if it\n * belongs here (and not in one of the skin CSS\n * pages) before adding it. Thanks.\n ************************************************/\n\n/* <table class=\"highlighthovertable\"> */\ntable.highlighthovertable tr:hover,\ntable.highlighthovertable tr:hover td,\ntable.mw-ext-translate-groupstatistics tr:hover,\ntable.mw-ext-translate-groupstatistics tr:hover td {\n background-color: white;\n}\n\n\n/* Babel wrapper layout. */\n/* XXX: This is either redundant or should be in-core */\n/* @noflip */table.mw-babel-wrapper {\n\twidth:        238px;\n\tfloat:        right;\n\tclear:        right;\n\tmargin:       1em;\n\tborder-style: solid;\n\tborder-width: 1px;\n\tborder-color: #99B3FF;\n}\n\n/* Babel box layout. */\n/* @noflip */div.mw-babel-box {\n\tfloat:  left;\n\tclear:  left;\n\tmargin: 1px;\n}\n\ndiv.mw-babel-box table {\n\twidth: 238px;\n}\n\ndiv.mw-babel-box table th {\n\twidth:       238px;\n\twidth:       45px;\n\theight:      45px;\n\tfont-size:   14pt;\n\tfont-family: monospace;\n}\n\ndiv.mw-babel-box table td {\n\tfont-size:   8pt;\n\tpadding:     4pt;\n\tline-height: 1.25em;\n}\n\n/* Babel box colours. */\ndiv.mw-babel-box-0 {\n\tborder: solid #B7B7B7 1px;\n}\n\ndiv.mw-babel-box-1 {\n\tborder: solid #C0C8FF 1px;\n}\n\ndiv.mw-babel-box-2 {\n\tborder: solid #77E0E8 1px;\n}\n\ndiv.mw-babel-box-3 {\n\tborder: solid #99B3FF 1px;\n}\n\ndiv.mw-babel-box-4 {\n\tborder: solid #CCCC00 1px;\n}\n\ndiv.mw-babel-box-5 {\n\tborder: solid #F99C99 1px;\n}\n\ndiv.mw-babel-box-N {\n\tborder: solid #6EF7A7 1px;\n}\n\ndiv.mw-babel-box-0 table th {\n\tbackground-color: #B7B7B7;\n}\n\ndiv.mw-babel-box-1 table th {\n\tbackground-color: #C0C8FF;\n}\n\ndiv.mw-babel-box-2 table th {\n\tbackground-color: #77E0E8;\n}\n\ndiv.mw-babel-box-3 table th {\n\tbackground-color: #99B3FF;\n}\n\ndiv.mw-babel-box-4 table th {\n\tbackground-color: #CCCC00;\n}\n\ndiv.mw-babel-box-5 table th {\n\tbackground-color: #F99C99;\n}\n\ndiv.mw-babel-box-N table th{\n\tbackground-color: #6EF7A7;\n}\n\ndiv.mw-babel-box-0 table {\n\tbackground-color: #E8E8E8;\n}\n\ndiv.mw-babel-box-1 table {\n\tbackground-color: #F0F8FF;\n}\n\ndiv.mw-babel-box-2 table {\n\tbackground-color: #D0F8FF;\n}\n\ndiv.mw-babel-box-3 table {\n\tbackground-color: #E0E8FF;\n}\n\ndiv.mw-babel-box-4 table {\n\tbackground-color: #FFFF99;\n}\n\ndiv.mw-babel-box-5 table {\n\tbackground-color: #F9CBC9;\n}\n\ndiv.mw-babel-box-N table {\n\tbackground-color: #C5FCDC;\n}\n\n.babel-box td.babel-footer {\n\ttext-align: center;\n}\n\n/* Styling for portals. */\ndiv.table {\n    display:        table;\n    vertical-align: top;\n    width:          100%;\n}\n\ndiv.table-row {\n    display:        table-row;\n    vertical-align: top;\n}\n\ndiv.table-cell {\n    display:        table-cell;\n    vertical-align: top;\n}\n\nbody.ns-100 table.mw-babel-wrapper {\n    border:           solid 1px #bbbbbb;\n    background-color: #f0f0f0;\n    margin-left:      1em;\n}\n\n.graytext {\n    color: #aaa;\n}\n\n/* On [[Special:RecentChanges]] and [[Special:Watchlist]] make the new pages symbol bold green and the minor edit symbol gray. */\n.newpage {\n    color:       green;\n    font-weight: bold\n}\n\n.minoredit,\n.minor {\n    color: gray;\n}\n\n/* Monospace diffs, this makes more sense since diffs show what would be seen in the edit box. */\n/* Note: Anno 2012 many browsers don't use monospace in the textarea anymore by default, notably Chrome and Safari don't (unless the user overrides this in the preferences) */\n.diff-context,\n.diff-deletedline,\n.diff-addedline {\n    font-family: monospace, \"Courier New\";\n/* Just guess does the stupid wikidiff2 extensions add extra whitespace around..... */\n    white-space: -moz-pre-wrap;\n    white-space: pre-wrap;\n}\n \n.diffchange {\n    border: 1px dotted rgb( 170, 170, 170 );\n}\n\n/* It is unclear what the following CSS does, please add comments if you can clarify. */\n/* The box which is 400px high and if its content is longer, it gets the scrollbar */\n.scrollme {\n    overflow: scroll;\n    width:    100%;\n    height:   400px;\n}\n\n/* Standard Navigationsleisten, aka box hiding thingy from .de.  Documentation at [[Wikipedia:NavFrame]]. */\ndiv.Boxmerge, div.NavFrame { margin: 0; padding: 4px; border-collapse: collapse;}\ndiv.Boxmerge div.NavFrame { border-style: none; border-style: hidden; }\ndiv.NavFrame + div.NavFrame { border-top-style: none; border-top-style: hidden; }\ndiv.NavFrame div.NavHead { height: 1.6em; position:relative; }\ndiv.NavEnd { margin: 0; padding: 0; line-height: 1px; clear: both; }\na.NavToggle { position: absolute; top: 0; right: 5px; }\n.note-flaggedrevs * a.NavToggle { right: 12px; } /* For [[Template:Flagged Revs]] */\n\n/* Template:Languages */\n.bw-languages {\n    border:          1px solid #aaaaaa;\n    padding:         0.2em;\n    border-collapse: collapse;\n    line-height:     1.2;\n    font-size:       95%;\n    margin:          1px 1px;\n}\n.bw-languages-title {\n    width:        180px;\n    border:       1px solid #aaaaaa;\n    background:   #EEF3E2;\n    padding:      0.5em;\n    font-weight:  bold;\n}\n.bw-languages-links { padding:0.5em; background:#F6F9ED; }\n\n/* Senseless in this project */\n#editpage-copywarn { display: none; }\n\n/* Hide warnings about bad links on MediaWiki:Common.css */\n.page-MediaWiki_Common_css .mw-translate-messagechecks { display: none; }\n\n/*******************\n** Faciliate RTL translation\n*******************/\n/* @noflip */\n#bodyContent .arabic a {\n\tpadding-right:0;\n\tbackground:none;\n}\n\n.vatop tr, tr.vatop, .vatop td, .vatop th {\n vertical-align: top;\n}\n\n.bw-languages {\n direction: ltr;\n}\n\n/* prevent wrapping of lines in LQT TOC if not necessary */\ntable.lqt_toc {\n\twidth: auto;\n}\n\n/* [[m:MediaZilla:35337]] */\n@media (-webkit-min-device-pixel-ratio: 1.5), (min-resolution: 1.5dppx) {\n        #p-logo a {\n                background-image: url(\"//translatewiki.net/images/thumb/7/7c/Translatewiki-logo-bare.svg/152px-Translatewiki-logo-bare.svg.png\") !important;\n                background-size: auto 135px;\n        }\n}\n@media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 2dppx) {\n        #p-logo a {\n                background-image: url(\"//translatewiki.net/images/thumb/7/7c/Translatewiki-logo-bare.svg/202px-Translatewiki-logo-bare.svg.png\") !important;\n                background-size: auto 135px;\n        }\n}\n\n/* qqq visibility, [[Thread:Support/Suggestion: Add this CSS to MediaWiki:Common.css]] */\n \n.mw-sp-translate-edit-info .mw-content-ltr {\n  background-position:left center;\n  padding-left:45px;\n}\nfieldset.mw-sp-translate-edit-info .mw-centent-rtl {\n  background-position:right center;\n  padding-right:45px;\n}\n\n/* Semantic MediaWiki - make special properties easier to identify */\n\n.smwbuiltin a,\n.smwbuiltin a.new {\n\tcolor: #FF8000;\n}\n\n/* Recentchangestext toggle link */\n.white-link a {\n    color: #fff;\n}",
        "common.js": "/* Any JavaScript here will be loaded for all users on every page load. */",
        "anonymous": "{{PLURAL:$1|karberê|karberê}} anonimi yê keyepelê {{SITENAME}}i",
        "siteuser": "karberê {{SITENAME}}i $1",
        "file-info-png-frames": "$1 {{PLURAL:$1|çerçeve|çerçeveyi}}",
        "file-no-thumb-animation": "'''Not: Dılet tekniko limit, gırd agozneya resm de qıckek de animasyoni miyan dı nêbo.'''",
        "file-no-thumb-animation-gif": "'''Not: Dılet tekniko limit, gırd agozneya resm de qıckek de  GIF imaci de animasyon do nêbo.'''",
-       "newimages": "Galeriya dosyayan dê newan",
+       "newimages": "Galeriye Dosyan dê newan",
        "imagelisttext": "Cêr de yew listeyê '''$1''' esto {{PLURAL:$1|dosya|dosyayi}} veçiniya $2.",
        "newimages-summary": "Ena pela xasi dosyayi ke peni de bar biyayeyi mocnane.",
        "newimages-legend": "Avrêc",
        "confirm-watch-top": "Ena pele lista xoya seyrkerdışi ke",
        "confirm-unwatch-button": "TEMAM",
        "confirm-unwatch-top": "Ena pele lista xoya seyirkerdışi ra bıvece?",
+       "confirm-rollback-button": "TEMAM",
        "semicolon-separator": "&#32;",
        "comma-separator": ",&#32;",
        "colon-separator": ":&#32;",
        "version-hook-name": "Nameyê çengelî",
        "version-hook-subscribedby": "Eza biyayoğ",
        "version-version": "($1)",
+       "version-no-ext-name": "[namr çıno]",
        "version-license": "Lisansê MediaWiki",
        "version-ext-license": "Lisans",
        "version-ext-colheader-name": "Dergiye",
+       "version-skin-colheader-name": "Çerme",
        "version-ext-colheader-version": "Versiyon",
        "version-ext-colheader-license": "Lisans",
        "version-ext-colheader-description": "Şınasnayış",
        "version-entrypoints-header-url": "GRE",
        "version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgArticlePath Article path]",
        "version-entrypoints-scriptpath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgScriptPath Script path]",
+       "version-libraries-library": "Kıtıbxane",
+       "version-libraries-version": "Versiyon",
+       "version-libraries-license": "Lisans",
+       "version-libraries-description": "Şınasnayış",
+       "version-libraries-authors": "Nuştekari",
        "redirect": "Serşıkıtena dosya, karberi, pele ya ki revizyonê kamiya dosya",
        "redirect-summary": "Na pela xase to hetê yew dosya (nameyê dosya dayeyo), yew pele (kamiya revizyoni ya zi pele dayiya) ya zi yew pela karberi (kamiya karberiya reqemkiye dayiya) ser şıknena. Gurenayış: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], ya zi  [[{{#Special:Redirect}}/user/101]].",
        "redirect-submit": "Şo",
        "redirect-page": "Kamiya pele",
        "redirect-revision": "Çımraviyarnayışê pele",
        "redirect-file": "Namey dosya",
+       "redirect-logid": "Qeydé  ID",
        "redirect-not-exists": "Erc nêvineyê",
        "fileduplicatesearch": "Dosyayanê zey pêyan cı geyrê",
        "fileduplicatesearch-summary": "Dosyanê çıftan bınê têmiyankewteyan de bıgeyre.",
        "fileduplicatesearch-result-1": "Dosyayê ''$1î'' de hem-kopya çini yo.",
        "fileduplicatesearch-result-n": "Dosyayê ''$1î'' de {{PLURAL:$2|1 hem-kopya|$2 hem-kopyayî'}} esto.",
        "fileduplicatesearch-noresults": "Ebe namey \"$1\" ra dosya nêdiyayê.",
-       "specialpages": "Pelê xasi",
+       "specialpages": "Peleyê xısusiy",
        "specialpages-note-top": "Kıtabek",
        "specialpages-note": "* Pelê xasê normali.\n* <span class=\"mw-specialpagerestricted\">Pelê xasê nımıtey.</span>",
        "specialpages-group-maintenance": "Raporê pawıtışi",
        "blankpage": "Pela venge",
        "intentionallyblankpage": "Ena pel bi zanayişî weng mendo.",
        "external_image_whitelist": "  #no satır zey xo verde/raverde<pre>\n#parçeyê ifadeya rêzbiyayeyani (têna zerreyê ıney de // ) u çıtayo/çiyo zi mende cêr de têare kerê.\n#ney URL ya (hotlink) resmê teberi de hemcıta benî.\n#Ê yê ke hemcıt (eşleşmek-hemçift) biyê zey resımi asenî, eqsê hal de zi zey gıreyê resmi aseno.\nsatır ê ke pê ney # # destpêkenê zey mışore/mıjore muamele vineno.\n#herfa gırd û qıci ferq nêkeno\n\n#parçeyê ifadeya rêzbiyayeyani bıerzê serê ney satıri. no satır zey xo verde/raverde </pre>",
-       "tags": "Etiketê vurnayîşê raştî",
+       "tags": "Ravêrde vurnayışanê etiketa",
        "tag-filter": "Parzûnê [[Special:Tags|etiketi]]:",
        "tag-filter-submit": "Avrêc",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Etiket|Etiketi}}]]: $2)",
        "tags-description-header": "Tam arezekerdışê maneyê cı",
        "tags-active-header": "Activ o?",
        "tags-hitcount-header": "Vurnayîşî ke etiket biyê",
+       "tags-actions-header": "Kerdışi",
        "tags-active-yes": "Eya",
        "tags-active-no": "Nê",
+       "tags-source-extension": "Teref dê yo dergeneki ra şınasiyayo",
        "tags-edit": "bıvurne",
+       "tags-delete": "bestere",
+       "tags-activate": "Aktiv ke",
+       "tags-deactivate": "Aktiv mek",
        "tags-hitcount": "$1 {{PLURAL:$1|vurnayış|vurnayışi}}",
+       "tags-create-tag-name": "Nameyê etiketi:",
+       "tags-create-reason": "Sebeb:",
+       "tags-create-submit": "Vıraze",
        "comparepages": "Pela miqeyese ke",
        "compare-page1": "Pele 1",
        "compare-page2": "Pele 2",
index 051f1a8..a51080f 100644 (file)
        "tog-watchlisthideliu": "प्रवेश गरेका प्रयोगकर्ताहरूको सम्पादन ध्यान सूचीबठेई लुकाउन्या",
        "tog-watchlisthideanons": "अज्ञात प्रयोगकर्ताहरूबाट गरिएको सम्पादन ध्यान सूचीबठेई लुकाउन्या",
        "tog-watchlisthidepatrolled": "बोट सम्पादनहरू ध्यान सूचीबठेई लुकाउन्या",
+       "tog-watchlisthidecategorization": "पृष्ठहरुको श्रेणीकरण लुकौन्या",
        "tog-ccmeonemails": "मुईले अन्य प्रयोगकर्ताहरूलाई पठाउन्या इ-मेलको प्रतिलिपि मुईलाई पठाउन्या",
        "tog-diffonly": "तलका पानाहरुको भिन्नहरू सामग्री नदेखाउन्या",
        "tog-showhiddencats": "लुकाइएका श्रेणीहरू धेखाउन्या",
-       "tog-norollbackdiff": "पà¥\88लासà¥\8dथितिमà¥\80 à¤«à¤°à¥\8dà¤\95ाà¤\8fपà¤\9bि भिन्नता हटाउन्या",
+       "tog-norollbackdiff": "पà¥\88लासà¥\8dथितिमà¥\80 à¤«à¤°à¥\8dà¤\95ाà¤\8fपà¤\9bा भिन्नता हटाउन्या",
        "tog-useeditwarning": "सम्पादनहरू सङ्ग्रह नगरिएका अवस्थामी अर्को पानामी जान खोज्या चेतावनी धेखाउन्या",
        "tog-prefershttps": "प्रवेश गर्दा जबलै सुरक्षित जडानको प्रयोग गर्न्या",
        "underline-always": "सधैं",
        "october-date": "अक्टोबर $1",
        "november-date": "नोभेम्बर $1",
        "december-date": "डिसेम्बर $1",
+       "period-am": "रात १२ बज्या बठे छाकला सम्म",
+       "period-pm": "छाकला बठे रात १२ बज्या सम्म",
        "pagecategories": "{{PLURAL:$1|श्रेणी|श्रेणीहरू}}",
        "category_header": "\"$1\" श्रेणीमी भया लेखहरू",
        "subcategories": "उपश्रेणीहरू",
        "versionrequiredtext": "ये पाना प्रयोग गर्नका लागि MediaWiki $1 संस्करण चाहिन्छ ।\nहेर  [[Special:Version|version page]]",
        "ok": "भयो",
        "retrievedfrom": " \"$1\" बठे निकालिया",
-       "youhavenewmessages": "तमखी लेखा($2)मी $1 छ।",
+       "youhavenewmessages": "तमखी लेखा($3)मी $1 ($2) छ ।",
        "youhavenewmessagesfromusers": "तमखी लेखा {{PLURAL:$3|प्रयोगकर्ता|$3 प्रयोगकर्तान}}($2)बठे$1",
        "youhavenewmessagesmanyusers": "तमलाई धेरै प्रयोगकर्ताहरू($2) बठे $1 छ ।",
        "newmessageslinkplural": "{{PLURAL:$1|एक नौलो रैबार|999=नौला रैबारहरू}}",
        "viewsource-title": " $1 को स्रोत हेर",
        "actionthrottled": "कार्य रोकिईयो",
        "actionthrottledtext": "स्पामको रोकथामको लागि , तमीलाई यो कार्य नापै समयमी मैथै पटक गद्दाबठे सिमित गरियाको छ, र तमीले आफ्नो सिमा पार गरिसक्याछौ ।\nकृपया केही मिनेट पछि पुन: प्रयास गर  ।",
+       "protectedpagetext": "यो पृष्ठ सम्पादन हुनबठे बचाउन सम्पादनमी तथा अन्य कार्यमी रोक लगाइया छ।",
+       "viewsourcetext": "तम ये पृष्ठको स्रोत हेद्दु सकुन्छौ और उईको नक्कल उताद्दु सकुन्छौ |",
        "viewyourtext": "यै पानामी रह्याका '''तमरा सम्पादनहरू''' हेद्द या प्रतिलिपी गद्द सक्द्या हौ :",
        "editinginterface": "<strong>चेतावनी:</strong> तमी यै पानालाई सम्पादन गद्द लाग्याछौ, जनले सफ्टवेयरको लागि \nइन्टरफेस सामग्रीहरू प्रदान गरन्छ।\nयै पानामी गरियाको परिवर्तनले यै विकिमी अरु प्रयोगकर्तानको इन्टरफेसको प्रदर्शनमी प्रभाव पडन्छ ।",
        "namespaceprotected": "तमलाई '''$1'''  नेमस्पेसमी रह्याका पानाहरू सम्पादन गद्या अनुमति छैन ।",
        "customcssprotected": "तमलाई यो  पानो सम्पादन गद्दे अनुमति छैन, किनकी यैमी कुनै अर्को प्रयोगकर्ताको व्यक्तिगत अभिरुचीहरू संग्रहित छन् ।",
        "customjsprotected": "तमलाई यो जाभास्कृप्ट पानो सम्पादन गद्दे अनुमति छैन, किनकी यैमी कुनै अर्को प्रयोगकर्ताको व्यक्तिगत अभिरुचीहरू संग्रहित छन् ।",
+       "mycustomcssprotected": "ये CSS पृष्ठ सम्पादन गद्दका लागि तमलाइ अनुमति छैन ।",
+       "mycustomjsprotected": "ये JavaScript पृष्ठ सम्पादन गद्द लागि तमलाई अनुमति छैन।",
+       "myprivateinfoprotected": "तमसँग तमरो निजी जानकारीहरू सम्पादन ग्द्दे अनुमती छैन |",
+       "mypreferencesprotected": "तमसंग तमरो अभिरुचीहरू सम्पादन ग्द्दे अनुमती छैन |",
        "ns-specialprotected": "विशेष पृष्ठहरू सम्पादन अद्दु नाइँ सकिनो।",
        "titleprotected": "[[User:$1|$1]]द्वारा ये शीर्षक निर्माणहुनबठे जोगाइया छ।\nकारण <em>$2</em> हो ।",
        "filereadonlyerror": "फाइल \"$1\" लाई परिवर्तन अद्दु नाइँ सकिनो क्याईकि फाइल भण्डार  \"$2\" केवल पढ्ने स्थिति (read-only mode)मी छ।\n\nयेलाई सुरक्षित गर्ने प्रवन्धकले  यो कारण दियाकाछन् : ''$3''।",
        "virus-scanfailed": "जँचाई असफल(कोड $1)",
        "virus-unknownscanner": "थानभया एन्टीभाइरस:",
        "logouttext": "<strong>तमी अहिल बाहिर निस्क्याका  छौ।</strong>\n\nयाद राख्या तमीले ब्राउजरको क्याच खालि नगर्यासम्म कुनै पानाहरूमी तमी अझैं प्रवेश गरिरख्याको धेकाउन सक्छ।",
+       "cannotlogoutnow-title": "अईल भाईर निकल्ल नाइँ पाईनो",
+       "cannotlogoutnow-text": "भाईर निकल्ल असंभव छ जब प्रयोग $1",
        "welcomeuser": "$1स्वागत छ!",
        "welcomecreation-msg": "तमरो खाता तयार भयो । \nतमले चाहेको खण्डमी {{SITENAME}} [[Special:Preferences|रोजाइहरू]] परिवर्तन गद्द सक्द्याहौ ।",
        "yourname": "प्रयोगकर्ता नाम:",
        "yourdomainname": "तमरो ज्ञानक्षेत्र(डोमेन):",
        "password-change-forbidden": "ये विकिमी पासवर्ड परिवर्तन गर्न सक्नुहुन्न।",
        "login": "प्रवेश (लगईन)",
+       "login-security": "तमरो पहिचान जाचँ गर",
        "nav-login-createaccount": "प्रवेश गर्ने/नयाँ खाता बनाउन्या",
        "userlogin": "प्रवेश गर्ने / नयाँ खाता बनाउन्या",
        "userloginnocreate": "प्रवेश",
        "createacct-reason-ph": "क्याई तम नयाँ खाता खोल्ला छौ?",
        "createacct-submit": "तमरो खाता सिर्जना गर",
        "createacct-another-submit": "दोसरो खाता सिर्जना गर",
+       "createacct-continue-submit": "खाता खोल्लु जारि राख",
+       "createacct-another-continue-submit": "खाता खोल्लु जारि राख",
        "createacct-benefit-heading": "{{SITENAME}} तम जसाई मान्सुनले सिर्जना गरिया हो ।",
        "createacct-benefit-body1": "{{PLURAL:$1|सम्पादन|सम्पादनहरू}}",
        "createacct-benefit-body2": "{{PLURAL:$1|पाना|पानाहरू}}",
        "loginsuccesstitle": "प्रवेश सफल",
        "loginsuccess": "'''तमले {{SITENAME}}मी  \"$1\" को रुपमी प्रवेश गरया छौ।'''",
        "nouserspecified": "प्रयोगकर्ता नाम दिनु अनिवार्य छ।",
+       "login-userblocked": "ये प्रयोगकर्तालाई रोक लगाया छ। प्रवेश गददु अनुमति छैन।",
+       "wrongpassword": "पासवर्ड गलत हालियो।\nकृपया आजी प्रयास गरया।",
+       "wrongpasswordempty": "हालिएया पासवर्ड खालि थ्यो।\nकृपया आजी प्रयास गरया।",
+       "password-name-match": "तमरो प्रवेशशव्द प्रयोगकर्ता नाम है फरक हुनपडन्छ ।",
+       "password-login-forbidden": "ये प्रयोगकर्ता नाम र प्रवेश शव्द वर्जित गरिया छ।",
        "mailmypassword": "पासवर्ड पूर्वनिर्धारित गर",
        "passwordremindertitle": "{{SITENAME}}का लागि नयाँ अस्थायी पासवर्ड",
        "passwordremindertext": "कसैले (सायद तमी, IP ठेगाना $1 बाट), {{SITENAME}}($4) को लागि नौलो पासवर्ड अनुरोध गर्या छ । प्रयोगकर्ता \"$2\" को लागि नौलो अस्थायी पासवर्ड \"$3\"तयार पारिया छ । यदि यो तमरो इच्छामी भयाको भया अहिले तमीले लगइन गरीबर नौलो पासवर्ड छान्नु पड्ड्या हुन्छ ।\nतमरो अस्थायी पासवर्ड  {{PLURAL:$5|एक दिन|$5 दिनहरू पछि}} अमान्य हुन्याछ ।\n\nयदि कोही अरुले नै अनुरोध गर्याको हो भण्या , या तमीले आफ्नो पासवर्ड सम्झ्यौ भण्या, अथवा\nत्यैलाई परिवर्तन गर्न चाहन्नौ भण्या, तमीले यो सन्देसको वेवास्ता गद्दसक्द्याहौ र पुरानै पासवर्ड प्रयोग गरिरहन सक्द्याहौ ।",
        "createacct-another-realname-tip": "वास्तविक नाम ऐच्छिक हो ।\nतमले यो खुलायौ भण्या तमरो काममी प्रयोगकर्ता श्रेय दिनका निउती यैको प्रयोग गरिन्या छ ।",
        "pt-login": "प्रवेश (लग ईन)",
        "pt-login-button": "प्रवेश",
+       "pt-login-continue-button": "प्रवेश जारी राख",
        "pt-createaccount": "नयाँ खाता खोल",
        "pt-userlogout": "बाहिर निस्कन्या (लग आउट)",
        "php-mail-error-unknown": "PHP मेल() क्रियामा अज्ञात गल्ती",
        "resetpass_submit": "पासवर्ड व्यवस्थित गरी र प्रवेशगर्ने",
        "changepassword-success": "तमरो पासवर्ड सफलतापूर्वक परिवर्तन भयो!",
        "changepassword-throttled": "तमले अलै भौत फेर प्रवेशका निम्ति प्रयास गरया छौ।\nकृपया $1 थोक्कै जागी मात्र प्रयास गर।",
+       "botpasswords": "बोट पासवर्ड",
+       "botpasswords-label-appid": "बोट नाम:",
+       "botpasswords-label-create": "सृजना गर",
+       "botpasswords-label-update": "नयाँ बनाउनु",
+       "botpasswords-label-cancel": "रद्द",
+       "botpasswords-label-delete": "मेट्न्या",
+       "botpasswords-label-resetpassword": "पासवर्ड पूर्वनिर्धारित गर",
+       "botpasswords-label-grants": "अनुदान आवेदन:",
+       "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": "इमेल ठेगाना बदेल",
+       "passwordreset-invalideamil": "अबैध ई-मेल ठेगाना",
+       "changeemail": "इमेल ठेगाना बदेल वा हटा",
        "changeemail-header": "आफ्नो इमेल ठेगाना परिवर्तन गद्द यो फारम भर । यैलाई पुष्टि गद्द तमीले आफ्नो पासवर्ड हाल्नु पडन्छ।",
        "changeemail-oldemail": "अईलको इमेल-ठेगाना:",
        "changeemail-newemail": "नयाँ इमेल-ठेगाना:",
        "sig_tip": "तमरो समयछाप सहितको दस्तखत",
        "hr_tip": "क्षितिजिय रेखा (कम प्रयोग गर्नुहोस्)",
        "summary": "सारांश:",
-       "subject": "विषय/शीर्षक:",
+       "subject": "विषय:",
        "minoredit": "यो नानो सम्पादन हो",
        "watchthis": "यै पानाको ध्यान राख",
        "savearticle": "सङ्ग्रह गर",
+       "publishpage": "प्रकाशित पृष्ठ",
        "preview": "पूर्वावलोकन",
        "showpreview": "पूर्वालोकन धेकाउन्या",
        "showdiff": "परिवर्तन धेकाउन्या",
        "selfredirect": "<strong>चेतावनी:</strong> तम यै पानालाई आफुमी पुनः निर्देशित गद्द लाग्याछौ ।\nहुनसक्छ तम अनुप्रेषितको लागि गलत लक्ष्य निर्दिष्ट गद्द लाग्याछौ, वा गलत पानाको सम्पादन गद्द लाग्याछौ ।\nतम पुनः एकपल्ट \"{{int:savearticle}}\" क्लिक गद्दाछौ, पुनः निर्देशित तसै लै बनाइन्याछ।",
        "missingcommentheader": "'''याद गर :''' तमीले टिप्पणीमी विषय /शीर्ष पंक्ति  दियाका छैनौ ।\nतमीले फेरि \"{{int:savearticle}}\"  थिच्यौ भण्या , तमरो सम्पादन यसै रुपमी संग्रहित हुन्याछ ।",
        "summary-preview": "सारांश पूर्वालोकन:",
-       "subject-preview": "विषय/शीर्षपंक्ति पूर्वरुप:",
+       "subject-preview": "विषय पूर्वरुप:",
        "previewerrortext": "तमरो परिवर्तनको पूर्वावलोकन बनाउन खोज्दा समस्या आयाको छ ।",
        "blockedtitle": "प्रयोककर्तालाई रोक लगाइया छ",
        "blockedtext": "'''तमरो प्रयोगकर्ता नाम या IP ठेगानालाई रोक लगाइएको छ ।'''\n\nरोक लगाउने  $1.\nरोक लगाउनाको कारण ''$2''.\n\n* रोक सुरू हुने : $8\n* रोक सकिने: $6\n* रोकबाट लक्षित: $7\n\nतमले  $1 वा और कोइ  [[{{MediaWiki:Grouppage-sysop}}|प्रवन्धक]] सँग रोकको बारेमी छलफल गर्न सम्पर्क गद्द सकुन्छौ ।\nतमले  'प्रयोगकर्तालाई इ-मेल गर्ने ' सुविधा मान्य इमेल ठेगाना [[Special:Preferences|रोजाइहरू]] मी नखुलाए सम्म प्रयोगगर्न पाउनुहुन्या छैन र यैको प्रयोग गर्नबठे रोक लगाइया छैन ।\nतमरो IP ठेगाना $3 को, र रोक्का संख्या #$5.\nकृपया तमरा प्रश्नमी सबै जानकारी खुलाया ।",
        "autoblockedtext": "तमरो IP ठेगानामी रोक लगाइयाकोछ किन भण्या यो अर्को प्रयोगकर्ताले प्रयोग गर्याको थ्यो, जैलाई $1ले रोक लगायाका थ्या । \nरोक लगाउनाको कारण:\n:''$2''  \n\n* रोकावट सुरु: $8\n* रोकावट सकिन्या: $6\n* रोकावटको प्रयोजन: $7\n\nतम $1 सित सम्पर्क गर्न सकन्छौ अथवा कुनै [[{{MediaWiki:Grouppage-sysop}}|प्रबन्धक]]सँग रोकबारे चर्चा गर्न सकन्छौ ।\n\nध्यान दिया कि तमले यै प्रयोगकर्ताकी लेखा ई-मेलको प्रयोग तबसम्म गद्द नाइसक्दा जबसम्म तमरो [[Special:Preferences|रोजाई]] दर्ता गद्दाइनौ वा यो ई-मेलको प्रयोगमी रोक लगाइयाको हुँदैन । \n\nतमरो वर्तमान IP ठेगाना हो- $3, अनि रोक लगाइयाको ID हो- #$5.\nकृपया कुनै बेला सोधनी गद्दु पड्या उपर्युक्त विवरण दर्शाया ।",
        "blockednoreason": "कारण दिइईया नाइँथिन",
        "whitelistedittext": "पाना सम्पादन गर्न तमले $1 गद्दु पडन्छ।",
+       "nosuchsectiontitle": " खण्ड फेला नाइँपडयो",
        "nosuchsectiontext": "तमले तसो खण्डको सम्पादन गद्या प्रयास गर्यौ जो अस्तित्वमी छैन।\nयैको नाम बदलियाको अथवा मेटाइयाको हुनुपडन्छ जब तमी यै पानालाई हेद्द लाग्याका छियौ ।",
        "loginreqtitle": "प्रवेशगर्नु जरुरी छ।",
        "loginreqlink": "प्रवेश (लग ईन)",
        "anontalkpagetext": "----''यो कुरडी पानो अज्ञात प्रयोगकर्ताको हो जनले अहिलसम्म खाता बनायाकै छैन, अथवा जनले यै पानाको उपयोग गर्दैन।\nयस कारण हामीले उनलाई उनरो आइ पी (IP) ठेगानाले चिन्न सकन्छौ। \nयस्तो आइ पी (IP) ठेगाना धेरै प्रयोगकर्तानको साझा हुनसकन्छ ।\nयदि तमी अज्ञात प्रयोगकर्ता हौ र तमलाई अचाहिँदो टिप्पणी भयाको अनुभव गद्दा छौ भण्या भविष्यमी अन्य अज्ञात प्रयोगकर्तासँगको भ्रमबाट बाँच्न कृपया [[Special:CreateAccount|खाता खोल]] अथवा [[Special:UserLogin|प्रवेश गर]] ''",
        "noarticletext": "यै लेखमी अहिल क्यै पन पाठ नाइथी  ।\nतमले और पृष्ठमी\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>.",
+       "userpage-userdoesnotexist-view": "प्रयोगकर्ता खाता \"$1\" दर्ता गरिया छैन।",
        "userinvalidcssjstitle": "<strong>चेतावनी:</strong> यहाँ कोइपनि \"$1\" नामको खोल नाइथिन् ।\nप्रचलित .css तथा .js पानाहरूले निम्नपद शीर्षक प्रयोग गद्दान्, जस्तै {{ns:user}}:Foo/Vector.css को सट्टामी {{ns:user}}:Foo/vector.css",
        "updated": "नौला",
        "note": "'''सूचना:'''",
        "template-protected": "(सुरक्षित)",
        "template-semiprotected": "(अर्ध-सुरक्षित)",
        "hiddencategories": "यो पानो निम्न {{PLURAL:$1|1 लुकाइयाको श्रेणी|$1 लुकाइयाका श्रेणीहरू}}को हिस्सादार(सदस्य) हो :",
+       "sectioneditnotsupported-title": "खण्ड सम्पादन असमर्थित",
+       "sectioneditnotsupported-text": "ये पृष्ठमी खण्ड सम्पादन असमर्थित",
        "permissionserrors": "अधिकारमी त्रुटी",
        "permissionserrorstext-withaction": "$2 कि लेखा तमलाईँ अनुमति नाइथिन , यिन {{PLURAL:$1|कारणले|कारणहरुले}} गद्दा :",
        "moveddeleted-notice": "पानो मेटियाको छ।\nमेटियाका और सारियाका पानाहरूको सूची तल्तिर सन्दर्भखी लेखा दियाको छ।",
        "invalid-content-data": "अमान्य सामग्री डेटा",
        "content-not-allowed-here": "सामग्री \"$1\"  [[$2]] पानामी राख्न अनुमती छैन ।",
        "editwarning-warning": "यै पानाबठे बाहिर जाँदा तमले गर्याको कुनै पनि परिवर्तन हराउन्याछ ।\nयदि तमले लग इन गर्याको छ भण्या तमी यै सूचनालाई धेकाउन आफ्नो रोजाईहरूको \"{{int:prefs-editing}}\" भागमी गइबर बन्द गद्द सक्द्याहौ।",
+       "editpage-notsupportedcontentformat-title": "सामग्री प्रकार समर्थित नाइँथिन",
        "content-model-wikitext": "विकिपाठ",
        "content-model-text": "साधारण पाठ",
        "content-model-javascript": "जाभास्क्रिप्ट",
        "converter-manual-rule-error": "म्यानुअल भाषा अनुवाद सिध्दान्तमी समस्या धेखियो",
        "cantcreateaccounttitle": "खाता बनाउन सकिएन",
        "viewpagelogs": "यै पानाका लगहरू हेर",
+       "nohistory": "ये पृष्ठका लागी कोइ सम्पादन इतिहास छैन।",
        "currentrev": "अहिलको पुनरावलोकन",
        "currentrev-asof": "$1को रुपमी अहिलको पुनरावलोकनहरू",
        "revisionasof": "$1 जस्तै गरी पुनरावलोकन",
        "revdelete-submit": "{{PLURAL:$1|छानिया संशोधन|छान्निया संशोधनहरू}}मी प्रयोग गर्न्या",
        "revdelete-success": "'''संशोधन दृश्यता सफलतापूर्वक अद्यतन भयो।'''",
        "revdelete-failure": "'''संशोधन दृश्यता अद्यतन गर्न सकिएन:'''\n$1",
-       "logdelete-success": "'''लग दृष्टि सफलतापूर्वक मिलाइयो ।'''",
+       "logdelete-success": "लग दृष्टि मिलाइयो ।",
        "logdelete-failure": "'''लग दृष्टि मिलाउन सकिएन :'''\n$1",
        "revdel-restore": "दृष्टि परिवर्तन गर्न्या",
        "pagehist": "पाना इतिहास",
        "mergehistory-submit": "पुनरावलोकहरू जोड",
        "mergehistory-empty": "कोइलै पुनरावलोकनहरू जोड्ड नाइँमिल्लो ।",
        "mergehistory-done": "$3 {{PLURAL:$3|संस्करण|संस्करणहरू}}  $1बठे सफलतापूर्वक [[:$2]]मी थपियो ।",
+       "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": "स्रोत र गन्तव्य पाना एउटै हुनसक्दैनन्",
        "prefs-rc": "नौला परिवर्तनहरू",
        "prefs-watchlist": "मेरो ध्यान सूची",
        "prefs-editwatchlist": "अवलोकनसूची सम्पादन",
+       "prefs-editwatchlist-raw": "कच्चा अवलोकनसूची सम्पादन गद्दा",
+       "prefs-editwatchlist-clear": "तमरो अवलोकनसूची मेटा",
        "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-help-email-required": "इमेल ठेगाना चाहिन्छ ।",
+       "prefs-info": "साधारण जानकारी",
+       "prefs-i18n": "अन्तर्राष्ट्रियकरण",
+       "prefs-signature": "हस्ताक्षर",
+       "prefs-dateformat": "मिति ढाँचा",
+       "prefs-timeoffset": "समय अफसेट",
+       "prefs-advancedediting": "सामान्य विकल्पहरू",
+       "prefs-editor": "सम्पादक",
+       "prefs-preview": "पूर्वावलोकन",
+       "prefs-advancedrc": "उन्नत विकल्पहरू",
+       "prefs-advancedrendering": "उन्नत विकल्पहरु",
+       "prefs-advancedsearchoptions": "उन्नत विकल्पहरू",
+       "prefs-advancedwatchlist": "उन्नत विकल्पहरू",
+       "prefs-displayrc": "धेकिन्या विकल्पहरू",
+       "prefs-displaywatchlist": "धेकिन्या विकल्पहरू",
+       "prefs-tokenwatchlist": "टोकन",
+       "prefs-diffs": "फरक",
        "prefs-help-prefershttps": "यो रोजाई तमरो अर्को  लग इन बठे लागु हुन्याछ ।",
+       "userrights": "प्रयोगकर्ता अधिकार व्यवस्थापन",
+       "userrights-lookup-user": "प्रयोगकर्ता समूह व्यवस्थापन गर",
+       "userrights-user-editname": "प्रयोगकर्ता नाम दिय:",
+       "editusergroup": "सम्पादन{{लिंग:$1}}समूहहरु",
+       "userrights-editusergroup": "प्रयोगकर्ता समूह सम्पादन गर",
+       "saveusergroups": "सुरक्षित{{लिंग:$1}}समूहहरु",
+       "userrights-groupsmember": "को सदस्य:",
+       "userrights-groupsmember-auto": "अंतर्निहित सदस्य:",
+       "userrights-reason": "कारण:",
        "userrights-unchangeable-col": "तमीले परिवर्तन गद्द नसक्ने समूहहरू",
        "userrights-conflict": "प्रयोगकर्ताको अधिकार परिवर्तनमी मतभेद भयो ! कृपया तमरो परिवर्तन पुनरावलोकन तथा पुष्टि गर ।",
        "userrights-removed-self": "तमीले सफलतापूर्वक आफ्नो अधिकारहरूलाई मेटायौ । त्यै कारण तमी अब यो पानो हेद्द नाइसक्दा ।",
+       "group": "समूह:",
        "group-user": "प्रयोगकर्ताहरू",
        "group-autoconfirmed": "स्वत स्थापित प्रयोगकर्ताहरू",
+       "group-bot": "बोटहरू",
+       "group-sysop": "प्रवन्धकहरू",
+       "group-bureaucrat": "प्रशासकहरू",
+       "group-suppress": "लुकौन्या वाला",
+       "group-all": "(सबै)",
+       "group-user-member": "{{लिङग:$1|प्रयोगकर्ता}}",
+       "group-autoconfirmed-member": "{{लिङग:$1|स्वनिर्धारित प्रयोगकर्ता}}",
+       "group-bot-member": "{{लिङग:$1|बोट}}",
+       "group-sysop-member": "{{लिङग:$1|प्रबन्धक}}",
+       "group-bureaucrat-member": "{{लिङग:$1|प्रशासक}}",
+       "group-suppress-member": "{{लिङग:$1|दबाउन्या}}",
+       "grouppage-user": "{{एनयस:आयोजना}}:प्रयोगकर्ताहरू",
+       "grouppage-autoconfirmed": "{{एनयस:आयोजना}}:स्वनिर्धारित प्रयोगकर्ताहरू",
+       "grouppage-bot": "{{एनयस:आयोजना}}:बोटहरु",
+       "grouppage-sysop": "{{एनयस:आयोजना}}:प्रबन्धकहरु",
+       "grouppage-bureaucrat": "{{एनयस:आयोजना}}:प्रशासकहरु",
+       "grouppage-suppress": "{{एनयस:आयोजना}}:लुकौन्या",
+       "right-read": "पृष्ठहरू पढ",
+       "right-edit": "पृष्ठहरू सम्पादन गर",
+       "right-createpage": "पृष्ठ निर्माण गर(छलफल पृष्ठहरू बाहेक)",
+       "right-createtalk": "छलफल पृष्ठ सृजना गर",
+       "right-createaccount": "नयाँ प्रयोगकर्ता खाता सृजना गर।",
+       "right-minoredit": "सम्पादनलाई सामान्य चिनो लगाउन्या",
+       "right-move": "पृष्ठहरू साददे",
        "right-move-subpages": "तिनीहरूको उपपाना सहित पानाको नाम बदल्ने",
        "right-move-rootuserpages": "मूल(root) प्रयोगकर्ताको पानाहरू साद्या",
+       "right-move-categorypages": "श्रेणी पृष्ठ सार",
        "right-movefile": "फाइलहरूको नाम बदल्न्या",
+       "right-suppressredirect": "पृष्ठ सार्दा स्रोत पृष्ठबठेई पठाउने लिंक नबनाउन्या",
        "right-upload": "फाइलहरू अपलोड गर्न्या",
+       "right-reupload": "रहेका फाइललाई अधिलेखन गर्न्या",
+       "right-reupload-own": "आफैले अपलोड  गरया रई आया फाइल अधिलेखन गर्न्या",
        "right-reupload-shared": "साझा मिडिया भण्डारमी स्थानियरुपमी फाइलहरू अधिक्रमण गर्न्या",
+       "right-upload_by_url": "URL बठे फाइल उर्ध्वभरण गर्ने",
+       "right-purge": "साइटको क्याश( cache) निश्चित नगरिकनै पर्ज(Purge) गर्ने",
        "right-writeapi": "लेखन API प्रयोग गद्य्या",
        "right-bigdelete": "लामो इतिहास भयाका पानाहरू मेट्ट्या",
        "right-deleterevision": "खुलाइयाको पानाहरू मेटाउन्या र मेटायाको रद्द गद्या",
index 2500688..5affcd4 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": "Μετάβαση",
        "timezone-local": "Τοπικό",
        "duplicate-defaultsort": "'''Προειδοποίηση:''' Το προεπιλεγμένο κλειδί ταξινόμησης «$2» υπερισχύει του προηγούμενου προεπιλεγμένου κλειδιού «$1».",
        "duplicate-displaytitle": "<strong>Προειδοποίηση:</strong> Ο εμφανιζόμενος τίτλος «$2» παρακάμπτει τον προηγούμενο «$1».",
+       "restricted-displaytitle": "<strong>Προειδοποίηση:</strong> Η εμφάνιση τίτλου \"$1\" αγνοήθηκε καθώς δεν είναι αντίστοιχη με τον πραγματικό τίτλο της σελίδας.",
        "invalid-indicator-name": "<strong>Σφάλμα:</strong> Η ιδιότητα <code>name</code> των δεικτών κατάστασης σελίδων δεν πρέπει να είναι κενή.",
        "version": "Έκδοση",
        "version-extensions": "Εγκαταστημένες επεκτάσεις",
index 8b9fefe..e6a8141 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.",
        "rollbacklinkcount": "rollback $1 {{PLURAL:$1|edit|edits}}",
        "rollbacklinkcount-morethan": "rollback more than $1 {{PLURAL:$1|edit|edits}}",
        "rollbackfailed": "Rollback failed",
+       "rollback-missingparam": "Missing required parameters on request.",
        "cantrollback": "Cannot revert edit;\nlast contributor is only author of this page.",
        "alreadyrolled": "Cannot rollback last edit of [[:$1]] by [[User:$2|$2]] ([[User talk:$2|talk]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]);\nsomeone else has edited or rolled back the page already.\n\nThe last edit to the page was by [[User:$3|$3]] ([[User talk:$3|talk]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "editcomment": "The edit summary was: <em>$1</em>.",
        "revertpage": "Reverted edits by [[Special:Contributions/$2|$2]] ([[User talk:$2|talk]]) to last revision by [[User:$1|$1]]",
        "revertpage-nouser": "Reverted edits by a hidden user to last revision by {{GENDER:$1|[[User:$1|$1]]}}",
        "rollback-success": "Reverted edits by $1;\nchanged back to last revision by $2.",
+       "rollback-success-notify": "Reverted edits by $1;\nchanged back to last revision by $2. [$3 Show changes]",
        "sessionfailure-title": "Session failure",
        "sessionfailure": "There seems to be a problem with your login session;\nthis action has been canceled as a precaution against session hijacking.\nGo back to the previous page, reload that page and then try again.",
        "changecontentmodel" : "Change content model of a page",
        "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",
        "confirm-watch-top": "Add this page to your watchlist?",
        "confirm-unwatch-button": "OK",
        "confirm-unwatch-top": "Remove this page from your watchlist?",
+       "confirm-rollback-button": "OK",
+       "confirm-rollback-top": "Revert edits to this page?",
        "semicolon-separator": ";&#32;",
        "comma-separator": ",&#32;",
        "colon-separator": ":&#32;",
        "cannotauth-not-allowed-title": "Permission denied",
        "cannotauth-not-allowed": "You are not allowed to use this page",
        "changecredentials" : "Change credentials",
-       "changecredentials-submit": "Change",
-       "changecredentials-submit-cancel": "Cancel",
+       "changecredentials-submit": "Change credentials",
        "changecredentials-invalidsubpage": "$1 is not a valid credential type.",
        "changecredentials-success": "Your credentials have been changed.",
        "removecredentials" : "Remove credentials",
-       "removecredentials-submit": "Remove",
-       "removecredentials-submit-cancel": "Cancel",
+       "removecredentials-submit": "Remove credentials",
        "removecredentials-invalidsubpage": "$1 is not a valid credential type.",
        "removecredentials-success": "Your credentials have been removed.",
        "credentialsform-provider": "Credentials type:",
index 7277348..ed52141 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.",
        "trackingcategories-msg": "Kategorio pri kontrolado",
        "trackingcategories-name": "Nomo de mesaĝo",
        "trackingcategories-desc": "Kriterio por inkluzivi kategorion",
+       "restricted-displaytitle-ignored": "Paĝoj kun malatentaj vidigaj titoloj",
+       "restricted-displaytitle-ignored-desc": "La paĝo enhavas ignoritan <code><nowiki>{{DISPLAYTITLE}}</nowiki></code> ĉar ĝi ne ekvivalentas la efektivan titolon de la paĝo.",
        "noindex-category-desc": "La paĝo ne estas indeksata de robotoj ĉar ĝi enhavas la magian vorton <code><nowiki>__NOINDEX__</nowiki></code> kaj estas en nomspaco, kie la flago estas permesita.",
        "index-category-desc": "La paĝo enhavas <code><nowiki>__INDEX__</nowiki></code> (kaj estas en nomspaco, kie la flago estas permesita), do ĝi estas indeksata de robotoj, kvankam normale ĝi ne estus.",
        "post-expand-template-inclusion-category-desc": "La paĝo post etendo de ĉiuj ŝablonoj estas pli granda ol <code>$wgMaxArticleSize</code>, do kelkaj ŝablonoj ne estis etenditaj.",
        "rollbacklinkcount": "nuligi $1 {{PLURAL:$1|redakton|redaktojn}}",
        "rollbacklinkcount-morethan": "nuligi pli ol $1 {{PLURAL:$1|redakton|redaktojn}}",
        "rollbackfailed": "Malfaro malsukcesis",
+       "rollback-missingparam": "Mankas neprajn parametrojn de peto.",
        "cantrollback": "Ne povas restarigi antaŭan redakton; la redaktinto lasta estas la sola aŭtoro de la paĝo.",
        "alreadyrolled": "Ne povas restarigi la lastan redakton de [[:$1]] de la [[User:$2|$2]] ([[User talk:$2|diskuto]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]);\npro tio, ke oni intertempe redaktis aŭ restarigis la paĝon.\nLa lasta redaktinto estis [[User:$3|$3]] ([[User talk:$3|diskuto]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "editcomment": "La resumo de la redakto estis: <em>$1</em>.",
        "revertpage": "Malfaris redaktojn de [[Special:Contributions/$2|$2]] ([[User talk:$2|diskuto]]) al la lasta versio de [[User:$1|$1]]",
        "revertpage-nouser": "Restarigis redaktojn de (salutnomo forigita) al lasta revizio de {{GENDER:$1|[[User:$1|$1]]}}",
        "rollback-success": "Restaris redaktojn de $1; ŝanĝis al lasta versio de $2.",
+       "rollback-success-notify": "Malfaritis redaktojn far $1;\nŝanĝis al la lasta reviziaĵo far $2. [$3 Prezenti ŝanĝojn]",
        "sessionfailure-title": "Seanco malsukcesis",
        "sessionfailure": "Ŝajnas, ke estas problemo kun via ensalutado;\nĈi ago estis nuligita por malhelpi fiensalutadon.\nBonvolu alklaki la reirbutonon kaj reŝargi la paĝon el kiu vi venas, kaj provu denove.",
        "changecontentmodel": "Ŝanĝi la enhavomodelon de paĝo",
        "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 dosieraj ligoj",
        "whatlinkshere-filters": "Filtriloj",
        "whatlinkshere-submit": "Ek",
        "autoblockid": "Aŭtomata forbaro #$1",
        "unblock": "Malforbari uzanton",
        "blockip": "Forbari {{GENDER:$1|uzanton}}",
        "blockip-legend": "Forbari uzanton",
-       "blockiptext": "Per jena formularo vi povas forpreni de ajna nomo aŭ IP-adreso la rajton skribi en la vikio. Oni faru tion ''nur'' por eviti vandalismon, kaj sekvante la [[{{MediaWiki:Policy-url}}|regulojn pri forbarado]]. Klarigu la precizan kialon malsupre (ekzemple, citu paĝojn, kiuj estis vandaligitaj).",
+       "blockiptext": "Uzu la sube formularon por forbari skribpermison de specifa uzantnomo aŭ IP-adreso. Tiu endus ''nur'' por eviti vandalismon, kaj laŭe la [[{{MediaWiki:Policy-url}}|politiko]].\nKlarigu la precizan kialon sube (ekzemple, citu paĝojn, kiuj estis vandaligitaj).\nVi povas forbari IP-adresan intervalon per la  [https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing CIDR]a sintakso; la plej ampleksa intervalo estas /$1 por IPv4 kaj /$2 por IPv6.",
        "ipaddressorusername": "IP-adreso aŭ salutnomo:",
        "ipbexpiry": "Blokdaŭro",
        "ipbreason": "Kialo:",
        "confirm-watch-top": "Ĉu aldoni tiun ĉi paĝon al via atentaro?",
        "confirm-unwatch-button": "Ek!",
        "confirm-unwatch-top": "Ĉu forigi tiun ĉi paĝon el via atentaro?",
+       "confirm-rollback-button": "Bone",
+       "confirm-rollback-top": "Malfaru redaktojn al ĉi tiu paĝo?",
        "quotation-marks": "„$1“",
        "imgmultipageprev": "← antaŭa paĝo",
        "imgmultipagenext": "sekva paĝo →",
        "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.",
        "feedback-useragent": "Klienta aplikaĵo:",
        "searchsuggest-search": "Serĉi",
        "searchsuggest-containing": "enhavas...",
+       "api-error-autoblocked": "Via IPa adreso estis blokita aŭtomate, ĉar ĝi estis uzita far forbara uzanto.",
        "api-error-badaccess-groups": "Vi ne havas permeson alŝuti dosierojn al tiu ĉi vikio.",
        "api-error-badtoken": "Interna eraro: fuŝaĵo.",
+       "api-error-blocked": "Vi estis blokita pri redakto.",
        "api-error-copyuploaddisabled": "Alŝuto per URL-adreso estas malebligata en tiu ĉi servilo.",
-       "api-error-duplicate": "Jam estas {{PLURAL:$1|alia dosiero|pluraj aliaj dosieroj}} de sama enhavo en la retejo.",
+       "api-error-duplicate": "Jam estas {{PLURAL:$1|alia dosiero|pluraj aliaj dosieroj}} en la retejo kun la sama enhavo.",
        "api-error-duplicate-archive": "Jam estis {{PLURAL:$1|alia dosiero|pluraj aliaj dosieroj}} de sama enhavo en la retejo, sed {{PLURAL:$1|ĝi estis forigita|ili estis forigitaj}}.",
        "api-error-empty-file": "La dosiero kiun vi sendis estis malplena.",
        "api-error-emptypage": "Kreo de novaj malplenaj paĝoj ne estas permesita.",
        "api-error-nomodule": "Interna eraro: ne troveblas alŝuta helpilaro.",
        "api-error-ok-but-empty": "Interna eraro: nenia respondo de la servilo.",
        "api-error-overwrite": "Anstataŭigo de ekzistanta dosiero ne permesatas.",
+       "api-error-ratelimited": "Vi provas alŝuti pli da dosieroj dum mallonga periodo ol ĉi tiu vikio permesas.\nBonvolu provi denove en kelkaj minutoj.",
        "api-error-stashfailed": "Interna eraro: la servilo malsukcesis stoki provizoran dosieron.",
        "api-error-publishfailed": "Interna eraro: Servilo malsukcesis eldoni provizoran dosieron.",
        "api-error-stasherror": "Eraro okazis dum alŝutado de la dosiero al dosierujo.",
        "api-error-unknownerror": "Nekonata eraro: \"$1\"",
        "api-error-uploaddisabled": "Alŝutato estas malebligata en tiu ĉi vikio.",
        "api-error-verification-error": "Tiu ĉi dosiero eble estas difektita, aŭ havas la malĝustan dosieran finaĵon.",
+       "api-error-was-deleted": "Dosiero kun ĉi tiu nomo estis antaŭe alŝutita kaj sekvente forigita.",
        "duration-seconds": "$1 {{PLURAL:$1|sekundo|sekundoj}}",
        "duration-minutes": "$1 {{PLURAL:$1|minuto|minutoj}}",
        "duration-hours": "$1 {{PLURAL:$1|horo|horoj}}",
        "expand_templates_preview": "Antaŭrigardo",
        "expand_templates_preview_fail_html": "<em>Ĉar {{SITENAME}} ebligas enmeton de kruda HTML kaj sesiaj datumoj estis perditaj, antaŭvido estas kaŝita kiel protekto kontraŭ Ĝavoskriptaj atakoj.</em>\n\n<strong>Se tio estis legitima provo antaŭvidi, bonvolu reprovi.</strong>\nSe tio daŭre ne funkcias, provu [[Special:UserLogout|elsaluti]] kaj ree ensaluti.",
        "expand_templates_preview_fail_html_anon": "<em>Ĉar {{SITENAME}} ebligas enmeton de kruda HTML kaj vi ne estas ensalutinta, antaŭvido estas kaŝita kiel protekto kontraŭ Ĝavoskriptaj atakoj.</em>\n\n<strong>Se tio estis legitima provo antaŭvidi, bonvolu [[Special:UserLogin|ensaluti]] kaj reprovi.</strong>",
-       "pagelanguage": "Elektilo de lingvo de paĝo",
+       "expand_templates_input_missing": "Vi nepras provizi almenaŭ iom da eniga teksto.",
+       "pagelanguage": "Ŝanĝi paĝan lingvon",
        "pagelang-name": "Paĝo",
        "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.",
+       "logentry-pagelang-pagelang": "$1 {{GENDER:$2|ŝanĝis}} paĝan lingvon pri $3 el $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.",
        "default-skin-not-found-no-skins": "Ups! La defaŭlta etoso por via vikio, difinita en <code>$wgDefaultSkin</code> kiel <code>$1</code> ne estas disponebla.\n\nVi havas neniun instalitan etson.\n\n; Se vi ĵus instalis aŭ promocii MediaWiki:\n: Vi probable instalis de git aŭ rekte de fontokodo per alia metodo. Tio estas antaŭspozata. 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 eosojn 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. Vidu [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manlibro:Agordado de etosoj] por informoj kiel ŝalti etosojn kaj elekti la defaŭltan.",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (ŝalta)",
        "mediastatistics": "Statistikoj pri dosieroj",
        "mediastatistics-summary": "Statistiko pri tipoj de alŝutitaj dosieroj. Tio ĉi inkludas nur aktualajn versiojn de dosiero. Malnovaj aŭ forigitaj versioj de dosieroj estas ekskluditaj.",
        "mediastatistics-nbytes": "{{PLURAL:$1|$1 bitoko|$1 bitokoj}} ($2; $3%)",
+       "mediastatistics-allbytes": "Totala dosiera grandeco por ĉiuj dosieroj: {{PLURALO:$1|$1 okumo|$1 okumoj}} ($2).",
        "mediastatistics-table-mimetype": "MIME-tipo",
        "mediastatistics-table-extensions": "Eblaj dosier-sufiksoj",
        "mediastatistics-table-count": "Nombro de dosieroj",
        "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",
+       "sessionprovider-nocookies": "Kuketojn eble maluzpermisas. Certigu ke vi uzpermisas kuketojn kaj pravu denove.",
        "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-managetags": "Tipo de administrada ago pri etikedo:",
+       "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-contentmodel-change": "Ŝanĝo de enhavomodelon",
+       "log-action-filter-contentmodel-new": "Kreo de paĝo kun ne-norma enhavomodelo",
+       "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-import-upload": "Importaĵo per XMLa alŝuto",
+       "log-action-filter-managetags-create": "Etikeda kreo",
+       "log-action-filter-managetags-delete": "Etikeda forviŝigado",
+       "log-action-filter-managetags-activate": "Etikeda ekebligado",
+       "log-action-filter-managetags-deactivate": "Etikeda malekebligado",
+       "log-action-filter-move-move": "Alinomi sen anstataŭigi alidirektojn",
+       "log-action-filter-newusers-create2": "Kreo de registrita uzanton",
+       "log-action-filter-newusers-autocreate": "Aŭtomata kreo",
+       "log-action-filter-newusers-byemail": "Kreo kun pasvorto sendita per retpoŝto",
+       "log-action-filter-patrol-patrol": "Malaŭtomata patrolo",
+       "log-action-filter-patrol-autopatrol": "Aŭtomata patrolo",
+       "log-action-filter-protect-protect": "Protekto",
+       "log-action-filter-protect-modify": "Modifo de la protekto",
        "log-action-filter-protect-unprotect": "Malprotektado",
+       "log-action-filter-rights-rights": "Malaŭtomata ŝanĝo",
+       "log-action-filter-rights-autopromote": "Aŭtomata ŝanĝo",
        "log-action-filter-upload-upload": "Novalŝuta",
-       "log-action-filter-upload-overwrite": "Realŝuta"
+       "log-action-filter-upload-overwrite": "Realŝuta",
+       "authmanager-authplugin-setpass-bad-domain": "Malvalida domajno.",
+       "authmanager-autocreate-noperm": "Aŭtomata kreo de konto ne estas permesita.",
+       "authmanager-autocreate-exception": "Aŭtomata kreo de konto estas provizore malfunkciigita pro antaŭaj eraroj.",
+       "authmanager-userdoesnotexist": "Uzanto-konto \"$1\" ne estas registrita.",
+       "authmanager-username-help": "Salutnomo por aŭtentikado.",
+       "authmanager-email-help": "Retpoŝtadreso",
+       "authmanager-realname-label": "Vera nomo",
+       "authmanager-realname-help": "Vera nomo de la uzanto",
+       "changecredentials-submit": "Ŝanĝi",
+       "removecredentials-submit": "Forigi",
+       "linkaccounts": "Ligi kontojn",
+       "linkaccounts-submit": "Ligi kontojn"
 }
index 7fe4263..2fa867d 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)",
        "createacct-email-ph": "Escribe tu dirección de correo electrónico",
        "createacct-another-email-ph": "Escribe la dirección de correo electrónico",
        "createaccountmail": "Utilizar una contraseña aleatoria temporal y enviarla a la dirección de correo electrónico especificada",
+       "createaccountmail-help": "Puede usarse para crear una cuenta para otra persona sin revelar la contraseña.",
        "createacct-realname": "Nombre real (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>",
        "createacct-another-realname-tip": "El nombre real es opcional.\nSi lo proporcionas, se usará para dar atribución al trabajo del usuario.",
        "pt-login": "Acceder",
        "pt-login-button": "Acceder",
+       "pt-login-continue-button": "Continuar inicio de sesión",
        "pt-createaccount": "Crear una cuenta",
        "pt-userlogout": "Salir",
        "php-mail-error-unknown": "Error desconocido en la función mail() de PHP.",
        "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-emailsent-capture2": "{{PLURAL:$1|El e-mail de restablecimiento de contraseña ha sido enviado|Los e-mails de restablecimiento de contraseña han sido enviados}}. {{PLURAL:$1|El nombre de usuario y la contraseña se muestra a continuación|La lista de nombres de usuarios y contraseñas se muestra a continuación}}.",
+       "passwordreset-emailerror-capture2": "No fue posible mandar un correo electrónico {{Gender:$2|al usuario|a la usuaria}}: $1 {{PLURAL:$3|El nombre de usuario y la contraseña|La lista de nombres de usuarios y contraseñas}} se muestra a continuación.",
+       "passwordreset-invalideamil": "Dirección de correo electrónico no válida.",
+       "passwordreset-nodata": "No se ha proporcionado ni un nombre de usuario ni una dirección de correo electrónico",
        "changeemail": "Cambiar o eliminar la dirección de correo electrónico",
        "changeemail-header": "Completa este formulario para cambiar tu dirección de correo electrónico. Si quieres eliminar la asociación de cualquier dirección de correo electrónico con tu cuenta, deja en blanco la nueva dirección de correo electrónico cuando envíes el formulario.",
        "changeemail-passwordrequired": "Tendrás que escribir tu contraseña para confirmar este cambio.",
        "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",
        "trackingcategories-msg": "Categoría de seguimiento",
        "trackingcategories-name": "Nombre del mensaje",
        "trackingcategories-desc": "Criterios de inclusión de categoría",
+       "restricted-displaytitle-ignored-desc": "Esta página tiene una plantilla <code><nowiki>{{DISPLAYTITLE}}</nowiki></code> ignorada porque no es equivalente al título verdadero de la página.",
        "noindex-category-desc": "La página contiene la palabra mágica <code><nowiki>__NOINDEX__</nowiki></code> (y está en un espacio de nombres donde la función está activada); y por ello los robots no la indizan.",
        "index-category-desc": "La página contiene la palabra mágica <code><nowiki>__INDEX__</nowiki></code> (y está en un espacio de nombres donde la función está activada); y por ello los robots la indizarán.",
        "post-expand-template-inclusion-category-desc": "Después de expandir todas las plantillas, el tamaño de la página es más grande que <code>$wgMaxArticleSize</code>, así que algunas plantillas no se expandieron.",
        "revertpage": "Revertidos los cambios de [[Special:Contributions/$2|$2]] ([[User talk:$2|disc.]]) a la última edición de [[User:$1|$1]]",
        "revertpage-nouser": "Revertidas las ediciones hechas por un usuario oculto a la última revisión hecha por {{GENDER:$1|[[User:$1|$1]]}}",
        "rollback-success": "Revertidas las ediciones de $1; recuperada la última versión de $2.",
+       "rollback-success-notify": "Revertidas las ediciones de $1 hasta la última revisión de $2. [$3 Ver cambios]",
        "sessionfailure-title": "Error de sesión",
        "sessionfailure": "Parece que hay un problema con tu sesión;\nesta acción ha sido cancelada como medida de precaución contra secuestros de sesión.\nPor favor, pulsa «Atrás», recarga la página de la que viniste e inténtalo de nuevo.",
        "changecontentmodel": "Cambiar el modelo de contenido de una página",
        "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",
        "confirm-watch-top": "¿Añadir esta página a tu lista de seguimiento?",
        "confirm-unwatch-button": "Aceptar",
        "confirm-unwatch-top": "¿Quitar esta página de tu lista de seguimiento?",
+       "confirm-rollback-button": "Aceptar",
+       "confirm-rollback-top": "¿Revertir las ediciones a esta página?",
        "comma-separator": ",&#32;",
        "percent": "$1 %",
        "quotation-marks": "«$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-authn-autocreate-failed": "Falló la creación automática de una cuenta local: $1",
+       "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-authplugin-setpass-bad-domain": "Dominio inválido.",
+       "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-title": "No está permitido",
+       "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",
+       "cannotauth-not-allowed": "No tienes permiso para usar esta página.",
+       "changecredentials": "Cambiar las credenciales",
+       "changecredentials-submit": "Cambiar credenciales",
+       "changecredentials-success": "Tus credenciales han sido cambiadas.",
+       "removecredentials": "Eliminar credenciales",
+       "removecredentials-submit": "Eliminar credenciales",
+       "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 02ddf8f..5c38e89 100644 (file)
        "viewsource": "Vaata lähteteksti",
        "viewsource-title": "Lehekülje $1 lähteteksti vaatamine",
        "actionthrottled": "Toiming nurjus",
-       "actionthrottledtext": "Väärtarvituse vastase meetmena pole sul lühikse aja jooksul seda toimingut liiga palju kordi lubatud sooritada. Sa oled lühikse aja jooskul seda toimingut liiga palju kordi sooritanud.\nPalun proovi mõne minuti pärast uuesti.",
+       "actionthrottledtext": "Väärtarvituse vastase meetmena pole sul lubatud lühikese aja jooksul seda toimingut liiga palju kordi sooritada. Oled piirangu ületanud. Palun proovi mõne aja pärast uuesti.",
        "protectedpagetext": "See lehekülg on lukustatud, et ei tehtaks muudatusi ega sooritataks muid toiminguid.",
        "viewsourcetext": "Saad vaadata ja kopeerida selle lehekülje lähteteksti.",
        "viewyourtext": "Saad vaadata ja kopeerida sellel leheküljel tehtud <strong>enda muudatuste</strong> lähteteksti.",
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..44498b8 100644 (file)
@@ -52,7 +52,8 @@
                        "Arian Ar",
                        "Ms96",
                        "Freshman404",
-                       "Hamisun"
+                       "Hamisun",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "خط کشیدن زیر پیوندها:",
        "rev-suppressed-unhide-diff": "یکی از نسخه‌های این تفاوت '''فرونشانی شده‌است'''.\nممکن است جزئیاتی در [{{fullurl:{{#Special:Log}}/suppress|page=سیاههٔ فرونشانی{{FULLPAGENAMEE}}}}] موجود باشد.\nشما کماکان می‌توانید در صورت تمایل [$1 این تفاوت را ببینید].",
        "rev-deleted-diff-view": "یکی از نسخه‌های این تفاوت '''حذف شده‌است'''.\nشما می‌توانید این تفاوت را ببینید؛ ممکن است جزئیاتی در [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} سیاههٔ حذف] موجود باشد.",
        "rev-suppressed-diff-view": "یکی از نسخه‌های این تفاوت '''فرونشانی شده‌است'''.\nشما می‌توانید این تفاوت را ببینید؛ ممکن است جزئیاتی در [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} سیاههٔ فرونشانی] موجود باشد.",
-       "rev-delundel": "نمایش/نهفتن",
+       "rev-delundel": "تغییر پیدایی",
        "rev-showdeleted": "نمایش",
        "revisiondelete": "حذف/احیای نسخه‌ها",
        "revdelete-nooldid-title": "نسخهٔ هدف نامجاز",
        "revertpage": "ویرایش [[Special:Contributions/$2|$2]] ([[User talk:$2|بحث]]) به آخرین تغییری که [[User:$1|$1]] انجام داده بود واگردانده شد",
        "revertpage-nouser": "ویرایش‌های انجام‌شده توسط (نام کاربری حذف شده) به آخرین ویرایش [[User:$1|$1]] واگردانی شد.",
        "rollback-success": "ویرایش‌های $1 واگردانی شد؛\nصفحه به آخرین ویرایش $2 برگردانده شد.",
+       "rollback-success-notify": "ویرایش‌های توسط $1 واگردانی شد؛\nبه آخرین نسخه توسط $2 بازگردانی شد. [$3 نمایش تغییرات]",
        "sessionfailure-title": "خطای نشست کاربری",
        "sessionfailure": "به نظر می‌رسد مشکلی در مورد نشست کاربری شما وجود دارد؛\nعمل درخواست شده در اقدامی پیشگیرانه در برابر ربوده‌شدن اطلاعات نشست کاربری، لغو شد.\nلطفاً دکمهٔ «بازگشت» را در مرورگر خود بفشارید و صفحه‌ای که از آن به اینجا رسیده‌اید را دوباره فراخوانی کنید، سپس مجدداً سعی کنید.",
        "changecontentmodel": "ویرایش نمونه محتوای یک صفحه",
        "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": "برو",
        "confirm-watch-top": "این صفحه به فهرست پی‌گیری‌های شما افزوده شود؟",
        "confirm-unwatch-button": "تأیید",
        "confirm-unwatch-top": "این صفحه از فهرست پی‌گیری‌های شما حذف شود؟",
+       "confirm-rollback-button": "باشد",
+       "confirm-rollback-top": "خنثی‌سازی ویرایش‌های این صفحه؟",
        "semicolon-separator": "؛&#32;",
        "comma-separator": "،&#32;",
        "percent": "$1٪",
index 7c6a371..fd1ca9f 100644 (file)
@@ -49,7 +49,9 @@
                        "Pyscowicz",
                        "Olimar",
                        "Mikahama",
-                       "01miki10"
+                       "01miki10",
+                       "Matma Rex",
+                       "BiscuitMan"
                ]
        },
        "tog-underline": "Linkkien alleviivaus:",
        "noname": "Et ole määritellyt kelvollista käyttäjänimeä.",
        "loginsuccesstitle": "Olet kirjautunut sisään",
        "loginsuccess": "'''Olet kirjautunut sivustolle {{SITENAME}} käyttäjänä $1.'''",
-       "nosuchuser": "Käyttäjää ”$1” ei ole olemassa. Nimet ovat kirjainkoosta riippuvaisia. Tarkista kirjoititko nimen oikein, tai [[Special:CreateAccount|luo uusi käyttäjätunnus]].",
+       "nosuchuser": "Käyttäjää \"$1\" ei ole olemassa.\nNimet ovat kirjainkoosta riippuvaisia. \nTarkista kirjoititko nimen oikein, tai [[Special:CreateAccount|luo uusi käyttäjätunnus]].",
        "nosuchusershort": "Käyttäjää nimeltä ”$1” ei ole. Kirjoititko nimen oikein?",
        "nouserspecified": "Käyttäjätunnusta ei ole määritelty.",
        "login-userblocked": "Tämä käyttäjä on estetty. Kirjautuminen ei ole sallittua.",
        "createacct-another-realname-tip": "Vapaaehtoinen.\nNimesi näytetään käyttäjätunnuksesi sijasta sivun tekijäluettelossa.",
        "pt-login": "Kirjaudu sisään",
        "pt-login-button": "Kirjaudu sisään",
+       "pt-login-continue-button": "Jatka kirjautumista",
        "pt-createaccount": "Luo tunnus",
        "pt-userlogout": "Kirjaudu ulos",
        "php-mail-error-unknown": "Tuntematon virhe PHP:n mail()-funktiossa",
        "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",
        "log-action-filter-suppress-block": "Käyttäjätunnuksen häivyttäminen estämällä se",
        "log-action-filter-suppress-reblock": "Käyttäjätunnuksen häivyttäminen uudella estolla",
        "log-action-filter-upload-upload": "Uusi tallennus",
-       "log-action-filter-upload-overwrite": "Päälletallennus"
+       "log-action-filter-upload-overwrite": "Päälletallennus",
+       "authmanager-provider-temporarypassword": "Väliaikainen salasana",
+       "authprovider-resetpass-skip-label": "Ohita"
 }
index 416ed94..92c1031 100644 (file)
                        "Lemondoge",
                        "Jdforrester",
                        "Yasten",
-                       "Psychoslave"
+                       "Psychoslave",
+                       "Trial",
+                       "Matma Rex",
+                       "Dcausse"
                ]
        },
        "tog-underline": "Soulignement des liens :",
        "category-empty": "<em>Cette catégorie ne contient actuellement aucune page ni fichier multimédia.</em>",
        "hidden-categories": "{{PLURAL:$1|Catégorie cachée|Catégories cachées}}",
        "hidden-category-category": "Catégories cachées",
-       "category-subcat-count": "Cette catégorie {{PLURAL:$2|0=ne comprend aucune sous-catégorie|1=comprend seulement la sous-catégorie ci-dessous|comprend les $2 sous-catégories, dont {{PLURAL:$1|0=aucune|1=celle|les $1}} ci-dessous}}.",
+       "category-subcat-count": "Cette catégorie {{PLURAL:$2|0=ne comprend aucune sous-catégorie|1=comprend seulement la sous-catégorie ci-dessous|comprend $2 sous-catégories, dont {{PLURAL:$1|0=aucune|1=celle|les $1}} ci-dessous}}.",
        "category-subcat-count-limited": "Cette catégorie comprend {{PLURAL:$1|la sous-catégorie|les $1 sous-catégories}} ci-dessous.",
        "category-article-count": "Cette catégorie {{PLURAL:$2|0=ne comprend aucune page|1=comprend seulement la page ci-dessous|comprend $2 pages, dont {{PLURAL:$1|0=aucune|1=celle|les $1}} ci-dessous}}.",
        "category-article-count-limited": "{{PLURAL:$1|0=Aucune page ne figure|1=La page suivante figure|Les $1 pages suivantes figurent}} dans la présente catégorie.",
        "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 qu'aucun fournisseur n’a été configuré ?",
+       "passwordreset-invalideamil": "Adresse de messagerie non valide",
+       "passwordreset-nodata": "Ni nom d’utilisateur ni adresse de messagerie n’ont été fournis",
        "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].",
        "trackingcategories-msg": "Catégorie de suivi",
        "trackingcategories-name": "Nom du message",
        "trackingcategories-desc": "Critère d’inclusion de la catégorie",
+       "restricted-displaytitle-ignored": "Pages avec des titres d'affichage ignorés",
+       "restricted-displaytitle-ignored-desc": "La page a un <code><nowiki>{{DISPLAYTITLE}}</nowiki></code> ignoré parce qu'il n'est pas équivalent au titre actuel de la page.",
        "noindex-category-desc": "La page contient <code><nowiki>__NOINDEX__</nowiki></code> et est dans un espace de noms où ce marquage est autorisé ; elle ne sera donc pas indexée par les robots.",
        "index-category-desc": "La page contient <code><nowiki>__INDEX__</nowiki></code> et est dans un espace de noms où ce marquage est autorisé ; elle sera donc indexée par les robots alors qu’elle ne l’aurait pas été normalement.",
        "post-expand-template-inclusion-category-desc": "La taille de la page dépasse <code>$wgMaxArticleSize</code> après le développement de tous ses modèles ; certains n’ont donc pas été développés.",
        "rollbacklinkcount": "révoquer $1 {{PLURAL:$1|modification|modifications}}",
        "rollbacklinkcount-morethan": "révoquer plus de $1 {{PLURAL:$1|modification|modifications}}",
        "rollbackfailed": "La révocation a échoué",
+       "rollback-missingparam": "Paramètres nécessaires à la demande manquants.",
        "cantrollback": "Impossible de révoquer la modification ;\nle dernier contributeur est le seul auteur de cette page.",
        "alreadyrolled": "Impossible de révoquer la dernière modification de la page « [[:$1]] » effectuée par [[User:$2|$2]] ([[User talk:$2|Discuter]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) ;\nquelqu'un d'autre a déjà modifié ou révoqué la page.\n\nLa dernière modification de la page a été effectuée par [[User:$3|$3]] ([[User talk:$3|Discuter]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "editcomment": "Le résumé de la modification était : <em>$1</em>.",
        "revertpage": "Révocation des modifications de [[Special:Contributions/$2|$2]] ([[User talk:$2|discussion]]) vers la dernière version de [[User:$1|$1]]",
        "revertpage-nouser": "Révocation des modifications par un utilisateur masqué à la dernière version par {{GENDER:$1|[[User:$1|$1]]}}",
        "rollback-success": "Révocation des modifications effectuées par $1 ;\nrétablissement de la dernière version par $2.",
+       "rollback-success-notify": "Modifications annulées par $1 ;\nretour à la dernière révision par $2. [$3 Voir les changements]",
        "sessionfailure-title": "Erreur de session",
        "sessionfailure": "Votre session de connexion semble avoir des problèmes ;\ncette action a été annulée en prévention d'un piratage de session.\nVeuillez cliquer sur « Précédent », rechargez la page d'où vous venez, puis réessayez.",
        "changecontentmodel": "Modifier le modèle de contenu d’une page",
        "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 liens",
+       "whatlinkshere-hideimages": "$1 les liens vers le fichier",
        "whatlinkshere-filters": "Filtres",
        "whatlinkshere-submit": "Lister",
        "autoblockid": "Blocage automatique #$1",
        "confirm-watch-top": "Ajouter cette page à votre liste de suivi ?",
        "confirm-unwatch-button": "Valider",
        "confirm-unwatch-top": "Supprimer cette page de votre liste de suivi ?",
+       "confirm-rollback-button": "OK",
+       "confirm-rollback-top": "Révoquer les modifications de cette page ?",
        "semicolon-separator": "&nbsp;;&#32;",
        "colon-separator": "&nbsp;:&#32;",
        "percent": "$1&#160;%",
        "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 les informations d’identification",
+       "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 les informations d'identification",
+       "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 d8f5d4d..af01970 100644 (file)
        "noname": "Cha do thagh thu ainm-cleachdaiche dligheach.",
        "loginsuccesstitle": "Rinn thu logadh a-steach",
        "loginsuccess": "<strong>Rinn thu logadh a-steach air {{SITENAME}} mar \"$1\".</strong>",
-       "nosuchuser": "Chan eil cleachdaiche ann air a bheil \"$1\".\nTha ainmean chleachdaichean mothaichail do litrichean mòra 's beaga.\nThoir sùil air an litreachadh no [[Special:CreateAccount|cruthaich cunntas ùr]].",
+       "nosuchuser": "Chan eil cleachdaiche ann air a bheil \"$1\".\nTha ainmean chleachdaichean mothachail do litrichean mòra 's beaga.\nThoir sùil air an litreachadh no [[Special:CreateAccount|cruthaich cunntas ùr]].",
        "nosuchusershort": "Chan eil cleachdaiche ann leis an ainm \"$1\".\nCuir sùil air an litreachadh.",
        "nouserspecified": "Tha agad ri ainm-cleachdaiche a chur ann.",
        "login-userblocked": "Chaidh an cleachdaiche seo a chasgadh. Chan eil logadh a-steach ceadaichte dhaibh.",
        "accmailtext": "Chaidh facal-faire a chruthachadh air thuaiream airson [[User talk:$1|$1]] 's a chur gu $2.\n\nGabhaidh am facal-faire airson a' chunntais ùir seo atharrachadh air an fo <em>[[Special:ChangePassword|atharraich facal-faire]]</em> às dèidh dhan chleachdaiche logadh a-steach.",
        "newarticle": "(Ùr)",
        "newarticletext": "Lean thu ri ceangal gu duilleag nach eil ann fhathast.\nCuir teacs sa bhogsa gu h-ìosal gus an duilleag seo a chruthachadh (seall air [$1 duilleag na cobharach] airson barrachd fiosrachaidh).\nMura robh dùil agad ris an duilleag seo a ruigsinn, briog air a' phutan <strong>air ais</strong> 'nad bhrabhsair.",
-       "anontalkpagetext": "----\n<em>Seo an duilleag deasbaireachd aig cleachdaiche gun urra nach do chruthaich cunntas fhathast no nach eil 'ga chleachdadh.</em>\nFeumaidh sinn an àireamh IP aca a chleachdadh air sgàth sin.\nFaodadh grunn chleachdaichean seòladh IP mar a chleachdadh còmhla.\nMas e cleachdaiche gun urra a tha annad 's ma tha thu dhen bheachd nach eil na beachdan seo a' buntainn riut, nach [[Special:CreateAccount|clàraich thu]] no nach dèan thu [[Special:UserLogin|logadh a-steach]] gus bùrach mar seo a sheachnadh san àm ri teachd?",
+       "anontalkpagetext": "----\n<em>Seo an duilleag deasbaireachd aig cleachdaiche gun urra nach do chruthaich cunntas fhathast no nach eil 'ga chleachdadh.</em>\nFeumaidh sinn àireamh an t-seòlaidh IP aca a chleachdadh air sgàth sin.\nFaodadh grunn chleachdaichean seòladh IP mar sin a chleachdadh còmhla.\nMas e cleachdaiche gun urra a tha annad 's ma tha thu dhen bheachd nach eil na beachdan seo a' buntainn riut, nach [[Special:CreateAccount|clàraich thu]] no nach dèan thu [[Special:UserLogin|logadh a-steach]] gus bùrach mar seo a sheachnadh san àm ri teachd?",
        "noarticletext": "Chan eil teacsa sam bith anns an duilleag seo an-dràsta.\n'S urrainn dhut [[Special:Search/{{PAGENAME}}|an tiotal seo a lorg]] ann an duilleagan eile,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} na logaichean co-cheangailte a rannsachadh],\nno [{{fullurl:{{FULLPAGENAME}}|action=edit}} an duilleag seo a chruthachadh]</span>.",
        "noarticletext-nopermission": "Chan eil teacsa sam bith san duilleag seo an-dràsta.\n'S urrainn dhut [[Special:Search/{{PAGENAME}}|tiotal na duilleige seo a lorg]] ann an duilleagan eile, no <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} na logaichean co-cheangailte a rannsachadh]</span> ach chan eil cead agad an duilleag seo a chruthachadh.",
        "missing-revision": "Chan eil mùthadh #$1 na duilleige \"{{FULLPAGENAME}}\" ann.\n\nMar is trice, tachraidh seo ma leanas tu ceangal san eachdraidh a tha fìor aosta 's a tha a' dol gu duilleag a chaidh a sguabadh às.\nGheibh thu mion-fhiosrachadh ann an [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} loga nan duilleagan a chaidh a sguabadh às].",
        "right-override-export-depth": "Cead gus duilleagan às-phortadh, a' gabhail a-seach duilleagan ceangailte suas ri doimhneachd de 5",
        "right-sendemail": "Cead gus puist-d a chur gu cleachdaichean eile",
        "right-passwordreset": "Cead gus puist-d ath-shuidheachadh nam facal-faire a shealltainn",
-       "right-managechangetags": "Cruthaich is toir air falbh [[Special:Tags|tagaichean]] on stòr-dàta",
+       "right-managechangetags": "Cruthaich is gnìomhaich no neo-ghnìomhaich [[Special:Tags|tagaichean]]",
        "newuserlogpage": "Loga cruthachadh nan cleachdaichean",
        "newuserlogpagetext": "Seo loga nan cleachdaichean a chaidh a chruthachadh.",
        "rightslog": "Loga ceadan a' chleachdaiche",
        "action-viewmyprivateinfo": "seall am fiosrachadh prìobhaideach agad",
        "action-editmyprivateinfo": "deasaich am fiosrachadh prìobhaideach agad",
        "action-editcontentmodel": "deasaich modail susbaint duilleige",
-       "action-managechangetags": "cruthaich is thoir air falbh tagaichean on stòr-dàta",
+       "action-managechangetags": "cruthaich is gnìomhaich no neo-ghnìomhaich tagaichean",
        "nchanges": "$1 {{PLURAL:$1|mhùthadh|mhùthadh|mùthaidhean|mùthadh}}",
        "enhancedrc-since-last-visit": "$1 on tadhal mu dheireadh",
        "enhancedrc-history": "eachdraidh",
        "rcshowhidemine-hide": "Falaich",
        "rclinks": "Seall {{PLURAL:$1|an $1 mhùthadh|an $1 mhùthadh|na $1 mùthaidhean|am $1 mùthadh}} mu dheireadh thairis air {{PLURAL:$2|an $2 latha|an $2 latha|na $2 làithean|am $2 latha}} mu dheireadh<br />$3",
        "diff": "diofar",
-       "hist": "eachd",
+       "hist": "eachdr",
        "hide": "Falaich",
        "show": "Seall",
        "minoreditletter": "b",
        "emailccsubject": "Lethbhreac dhen teachdaireachd agad gu $1: $2",
        "emailsent": "Post-d air a chur",
        "emailsenttext": "Chaidh an teachdaireachd puist-d agad a chur.",
-       "emailuserfooter": "Chaidh am post-d seo a chur o $1 gu $2 leis an fheart \"cuir post-d gu cleachdaiche\" air {{SITENAME}}.",
+       "emailuserfooter": "Chaidh am post-d seo a chur o $1 gu $2 leis an fheart \"{{int:emailuser}}\" air {{SITENAME}}.",
        "usermessage-summary": "A' fàgail teachdaireachd an t-siostaim.",
        "usermessage-editor": "Teachdaire an t-siostaim",
        "usermessage-template": "MediaWiki:UserMessage",
        "watchlistanontext": "Log a-steach gus nithean air a' chlàr-fhaire agad a shealltainn no a dheasachadh.",
        "watchnologin": "Chan eil thu air logadh a-steach",
        "addwatch": "Cuir air a' chlàr-fhaire",
-       "addedwatchtext": "Chaidh an duilleag \"[[:$1]]\" a chur ris a' [[Special:Watchlist|chlàr-fhaire]] agad.\nNochdaidh mùthaidhean a nithear air an duilleag seo 's air an duilleag deasbaireachd a tha co-cheangailte ris an-seo san àm ri teachd.",
+       "addedwatchtext": "Chaidh \"[[:$1]]\" agus duilleag na deasbaireachd aige a chur ris a' [[Special:Watchlist|chlàr-fhaire]] agad.",
        "addedwatchtext-short": "Chaidh an duilleag \"$1\" a chur ris a' chlàr-fhaire agad.",
        "removewatch": "Thoir air falbh on chlàr-fhaire",
-       "removedwatchtext": "Chaidh an duilleag \"[[:$1]]\" a thoirt air falbh on [[Special:Watchlist|chlàr-fhaire]] agad.",
+       "removedwatchtext": "Chaidh \"[[:$1]]\" agus duilleag na deasbaireachd aige a thoirt air falbh on [[Special:Watchlist|chlàr-fhaire]] agad.",
        "removedwatchtext-short": "Chaidh an duilleag \"$1\" a thoirt ait falbh on chlàr-fhaire agad.",
        "watch": "Cum sùil air",
        "watchthispage": "Cum sùil air an duilleag seo",
        "deletepage": "Sguab às duilleag",
        "confirm": "Daingnich",
        "excontent": "stuth a bh' ann: '$1'",
-       "excontentauthor": "b' e: \"$1\" an t-susbaint (is \"[[Special:Contributions/$2|$2]]\" an aon deasaiche)",
+       "excontentauthor": "b' e: \"$1\" an t-susbaint agus \"[[Special:Contributions/$2|$2]]\" ([[User talk:$2|talk]]) an aon deasaiche",
        "exbeforeblank": "an t-susbaint mus deach a bànachadh: \"$1\"",
        "delete-confirm": "Sguab às \"$1\"",
        "delete-legend": "Sguab às",
        "delete-toobig": "Tha eachdraidh deasachaidh mòr aig an duilleag seo sa bheil barrachd air $1 {{PLURAL:$1|mhùthadh|mhùthadh|mùthaidhean|mùthadh}}.\nChaidh sguabadh às nan duilleagan dhen leithid a chuingeachadh ach na dèid cron a dhèanamh air {{SITENAME}} le mearachd.",
        "delete-warning-toobig": "Tha eachdraidh deasachaidh mòr aig an duilleag seo sa bheil barrachd air $1 {{PLURAL:$1|mhùthadh|mhùthadh|mùthaidhean|mùthadh}}.\nMa sguabas tu às dhi, dh'fhaoidte gun dèan thu cron air na gnìomhan stòr-dàta aig {{SITENAME}}; mar sin, thoir an aire.",
        "deleteprotected": "Chan urrainn dhut an duilleag seo a sguabadh às on a chaidh a dìon.",
-       "deleting-backlinks-warning": "'''Rabhadh:''' Tha [[Special:WhatLinksHere/{{FULLPAGENAME}}|duilleag eile]] a' ceangal ris an duilleag a tha thu airson sguabadh às no 'ga gabhail a-steach 'na h-iomradh.",
+       "deleting-backlinks-warning": "<strong>Rabhadh:</strong> Tha [[Special:WhatLinksHere/{{FULLPAGENAME}}|duilleag eile]] a' ceangal ris an duilleag a tha thu airson sguabadh às no 'ga gabhail a-steach 'na h-iomradh.",
        "rollback": "Roilig atharraichean air ais",
        "rollbacklink": "roilig air ais",
        "rollbacklinkcount": "roilig $1 {{PLURAL:$1|deasachadh|dheasachadh|deasachaidhean|deasachadh}} air ais",
        "protect-locked-blocked": "Chan urrainn dhut ìre an dìon atharrachadh rè bacaidh.\nSeo na roghainnean aig an duilleag <strong>$1</strong>:",
        "protect-locked-dblock": "Chan urrainn dhut ìre an dìon atharrachadh on a tha an stòr-dàta glaiste an-dràsta.\nSeo na roghainnean aig an duilleag <strong>$1</strong>:",
        "protect-locked-access": "Chan eil cead aig a' chunntas agad an ìre dìon de dhuilleag atharrachadh.\nSeo roghainnean làithreach na duilleige <strong>$1</strong>:",
-       "protect-cascadeon": "Tha an duilleag seo fo dhìon an-dràsta a chionn 's gu bheil e air a ghabhail a-steach {{PLURAL:$1|$1 duilleag|$1 dhuilleag|$1 duilleagan|$1 duilleag}} a leanas aig a bheil dìon o bhith mar eas air.\n'S urrainn dhut ìre dìon na duilleige seo atharrachadh ach cha bhi buaidh air an dìon o bhith mar eas.",
+       "protect-cascadeon": "Tha an duilleag seo fo dhìon an-dràsta a chionn 's gu bheil i air a tar-ghabhail {{PLURAL:$1|san duilleag|sna duilleagan}} a leanas aig a bheil dìon o bhith mar eas air.\n'S urrainn dhut ìre dìon na duilleige seo atharrachadh ach cha bhi buaidh air an dìon o bhith mar eas.",
        "protect-default": "Ceadaich a h-uile cleachdaiche",
        "protect-fallback": "Na ceadaich ach do chleachdaichean aig a bheil cead \"$1\"",
        "protect-level-autoconfirmed": "Na ceadaich ach cleachdaichean a chaidh an dearbhadh gu fèin-obrachail",
        "undeletepagetext": "Chaidh {{PLURAL:$1|an $1 duilleag|an $1 dhuilleag|na $1 duilleagan|am $1 duilleag}} a sguabadh às ach tha {{PLURAL:$1|i|iad}} san tasglann fhathast 's gabhaidh {{PLURAL:$1|a h-aiseag|an aiseag}}.\nDh'fhaoidte gun dèid an tasglann a ghlanadh gu cunbhalach.",
        "undelete-fieldset-title": "Aisig mùthaidhean",
        "undeleteextrahelp": "Gus eachdraidh shlàn na duilleige aiseag, fàg gach bogsa bàn 's briog air <strong><em>{{int:undeletebtn}}</em></strong>.\nGus cuid dheth aiseag, cuir cromag sna bogsaichean airson nam mùthaidhean a tha thu airson aiseag 's briog air <strong><em>{{int:undeletebtn}}</em></strong>.",
-       "undeleterevisions": "Chaidh {{PLURAL:$1|$1 mhùthadh|$1 mhùthadh|$1 mùthaidhean|$1 mùthadh}} a chur san tasg-lann",
+       "undeleterevisions": "Chaidh {{PLURAL:$1|$1 mhùthadh|$1 mhùthadh|$1 mùthaidhean|$1 mùthadh}} a sguabadh às",
        "undeletehistory": "Ma dh'aisigeas tu an duilleag, thèid gach mùthadh aiseag dhan eachdraidh.\nMa chaidh duilleag air a bheil an aon ainm a chruthachadh às dèidh an sguabaidh às, nochdaidh na mùthaidhean air an aiseag san eachdraidh roimhpe.",
        "undeleterevdel": "Cha dèid an sguabadh às a neo-dhèanamh ma sguabadh seo às pàirt de mhùthadh na duilleige no an fhaidhle as ùire.\nMas e seo na thachradh, feumaidh tu a' chromag a thoirt far a' mhùthaidh as ùire a chaidh a sguabadh às no gun a bhith 'ga fhalach tuilleadh.",
        "undeletehistorynoadmin": "Chaidh an duilleag seo a sguabadh às.\nChì thu adhbhar an sguabaidh às sa ghearr-chunntas gu h-ìosal cho math ri fiosrachadh mu na chleachdaichean a dheasaich an duilleag seo mus deach a sguabadh às.\nChan fhaic ach rianairean an teacsa fhèin aig na mùthaidhean air an sguabadh às.",
        "whatlinkshere-next": "{{PLURAL:$1|an ath $1|an ath $1|na ath $1|an ath $1}}",
        "whatlinkshere-links": "← ceanglaichean",
        "whatlinkshere-hideredirs": "$1 ath-sheòlaidhean",
-       "whatlinkshere-hidetrans": "$1 transclusions",
+       "whatlinkshere-hidetrans": "$1 tar-ghabhalaichean",
        "whatlinkshere-hidelinks": "$1 ceanglaichean",
-       "whatlinkshere-hideimages": "$1 ceanglaichean nam faidhlichean",
+       "whatlinkshere-hideimages": "$1 ceanglaichean fhaidhlichean",
        "whatlinkshere-filters": "Criathairean",
        "autoblockid": "Fèin-bhacadh $1",
        "block": "Bac an cleachdaiche",
        "unblock": "Neo-bhac an cleachdaiche",
        "blockip": "Bac an cleachdaiche",
        "blockip-legend": "Bac an cleachdaiche",
-       "blockiptext": "Cleachd am foirm gu h-ìosal gus seòladh IP no cleachdaiche sònraichte a bhacadh o sgrìobhadh.\nNa dèan seo ach gus dìon o bhandalachd agus a-rèir [[{{MediaWiki:Policy-url}}|a' phoileasaidh]].\nLìon an t-adhbhar sònraichte gu h-ìosal (mar eisimpleir le iomradh air na duilleagan le bhandalachd orra).",
+       "blockiptext": "Cleachd am foirm gu h-ìosal gus seòladh IP no cleachdaiche sònraichte a bhacadh o sgrìobhadh.\nNa dèan seo ach gus dìon o bhandalachd agus a-rèir [[{{MediaWiki:Policy-url}}|a' phoileasaidh]].\nLìon an t-adhbhar sònraichte gu h-ìosal (mar eisimpleir le iomradh air na duilleagan le bhandalachd orra).\n'S urrainn dhut rainsean dhe sheòlaidhean IP a bhacadh le co-chàradh [https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing CIDR]; is /$1 an rainse as motha a tha ceadaichte airson IPv4 agus /$2 airson IPv6.",
        "ipaddressorusername": "Seòladh IP no ainm-cleachdaiche:",
        "ipbexpiry": "Falbhaidh an ùine air:",
        "ipbreason": "Adhbhar:",
        "lockedbyandtime": "(le $1 $2 $3)",
        "move-page": "Gluais $1",
        "move-page-legend": "Gluais duilleag",
-       "movepagetext": "Ma chleachdas tu am foirm gu h-ìosal, cuiridh tu ainm ùr air 's gluaisidh tu a h-eachdraidh gu lèir dhan ainm ùr.\nBidh an seann tiotal 'na ath-sheòladh dhan tiotal ùr an uairsin.\n'S urrainn dhut ath-sheòladh sam bith a tha a' dol dhan tiotal tùsail ùrachadh leis fhèin.\nMura dèan thu sin, dèan cinnteach gun cuir thu sùil air eagal 's gum bi [[Special:DoubleRedirects|ath-sheòlaidhean dùbailte]] no [[Special:BrokenRedirects|briste]] ann.\n'S ann ort-sa a tha an t-uallach airson dèanamh cinntach gu bheil na ceanglaichean a' dol dha na h-àitichean ceart.\n\nThoir an aire <strong>nach dèid</strong> an duilleag a ghluasad ma tha duilleag air an tiotal ùr mu thràth ach ma bhios e falamh no 'na ath-sheòladh 's mur eil eachdraidh deasachaidh ann.\n'S ciall dha seo gun urrainn dhut ainm duilleige a thilleadh dhan ainm a bha air roimhe ma rinn thu mearachd agus nach urrainn dhut sgrìobhadh thairis air duilleag a tha ann.\n\n<strong>Rabhadh!</strong>\nFaodaidh seo a bhith 'na atharrachadh mòr ris nach bi dùil air duilleag air a bheil fèill mhòr;\ndèan cinnteach gu bheil thu a' tuigsinn dè a' bhuaidh a bhios agad mus dèid thu air adhart.",
-       "movepagetext-noredirectfixer": "Ma chleachdas tu am foirm gu h-ìosal, cuiridh tu ainm ùr air 's gluaisidh tu a h-eachdraidh gu lèir dhan ainm ùr.\nBidh an seann tiotal 'na ath-stiùireadh dhan tiotal ùr an uairsin.\nDearbhaich nach bi ath-sheòlaidhean [[Special:DoubleRedirects|dùbailte]] no [[Special:BrokenRedirects|briste]] ann.\n'S ann ort-sa a tha an t-uallach airson dèanamh cinnteach gu bheil na ceanglaichean a' dol dha na h-àitichean a bu chòir.\n\nThoir an aire <strong>nach dèid</strong> an duilleag a ghluasad ma tha duilleag air an tiotal ùr mu thràth ach ma bhios e falamh no 'na ath-sheòladh 's mur eil eachdraidh deasachaidh ann.\n'S ciall dha seo gur urrainn dhut ainm duilleige a thilleadh dhan ainm a bha air roimhe ma rinn thu mearachd agus nach urrainn dhut sgrìobhadh thairis air duilleag a tha ann.\n\n<strong>Rabhadh!</strong>\nFaodaidh seo a bhith 'na atharrachadh mòr ris nach bi dùil air duilleag air a bheil fèill mhòr;\ndèan cinnteach gu bheil thu a' tuigsinn dè a' bhuaidh a bhios agad mus dèid thu air adhart.",
-       "movepagetalktext": "Thèid an duilleag deasbaireachd a tha co-cheangailte ris a ghluasad 'na cois <strong>ach:</strong>\n*Ma tha duilleag deasbaireachd nach eil falamh aig an ainm ùr mu thràth, no\n*Ma bheir thu air falbh a' chromag on bhogsa gu h-ìosal\n\nMa thachras seo, feumaidh to an duilleag a ghluasad no cho-aonachadh a làimh, ma tha sin fa-near dhut.",
+       "movepagetext": "Ma chleachdas tu am foirm gu h-ìosal, cuiridh tu ainm ùr air 's gluaisidh tu a h-eachdraidh gu lèir dhan ainm ùr.\nBidh an seann tiotal 'na ath-sheòladh dhan tiotal ùr an uairsin.\n'S urrainn dhut ath-sheòladh sam bith a tha a' dol dhan tiotal tùsail ùrachadh leis fhèin.\nMura dèan thu sin, dèan cinnteach gun cuir thu sùil air eagal 's gum bi [[Special:DoubleRedirects|ath-sheòlaidhean dùbailte]] no [[Special:BrokenRedirects|briste]] ann.\n'S ann ort-sa a tha an t-uallach airson dèanamh cinntach gu bheil na ceanglaichean a' dol dha na h-àitichean ceart.\n\nThoir an aire <strong>nach dèid</strong> an duilleag a ghluasad ma tha duilleag air an tiotal ùr mu thràth ach ma bhios e falamh no 'na ath-sheòladh 's mur eil eachdraidh deasachaidh ann.\n'S ciall dha seo gun urrainn dhut ainm duilleige a thilleadh dhan ainm a bha air roimhe ma rinn thu mearachd agus nach urrainn dhut sgrìobhadh thairis air duilleag a tha ann.\n\n<strong>An aire:</strong>\nFaodaidh seo a bhith 'na atharrachadh mòr ris nach bi dùil air duilleag air a bheil fèill mhòr;\ndèan cinnteach gu bheil thu a' tuigsinn dè a' bhuaidh a bhios agad mus dèid thu air adhart.",
+       "movepagetext-noredirectfixer": "Ma chleachdas tu am foirm gu h-ìosal, cuiridh tu ainm ùr air 's gluaisidh tu a h-eachdraidh gu lèir dhan ainm ùr.\nBidh an seann tiotal 'na ath-stiùireadh dhan tiotal ùr an uairsin.\nDearbhaich nach bi ath-sheòlaidhean [[Special:DoubleRedirects|dùbailte]] no [[Special:BrokenRedirects|briste]] ann.\n'S ann ort-sa a tha an t-uallach airson dèanamh cinnteach gu bheil na ceanglaichean a' dol dha na h-àitichean a bu chòir.\n\nThoir an aire <strong>nach dèid</strong> an duilleag a ghluasad ma tha duilleag air an tiotal ùr mu thràth ach ma bhios e falamh no 'na ath-sheòladh 's mur eil eachdraidh deasachaidh ann.\n'S ciall dha seo gur urrainn dhut ainm duilleige a thilleadh dhan ainm a bha air roimhe ma rinn thu mearachd agus nach urrainn dhut sgrìobhadh thairis air duilleag a tha ann.\n\n<strong>An aire:</strong>\nFaodaidh seo a bhith 'na atharrachadh mòr ris nach bi dùil air duilleag air a bheil fèill mhòr;\ndèan cinnteach gu bheil thu a' tuigsinn dè a' bhuaidh a bhios agad mus dèid thu air adhart.",
+       "movepagetalktext": "Ma chuireas tu cromag sa bhogsa seo, thèid duilleag na deasbaireachd a tha co-cheangailte ris a ghluasad dhan tiotal ùr gu fèin-obrachail ach ma tha duilleag na deasbaireachd nach eil falamh ann a shiud mar-thà.\n\nMa thachras seo, feumaidh tu an duilleag a ghluasad no cho-aonachadh a làimh ma tha sin fa-near dhut.",
        "moveuserpage-warning": "<strong>Rabhadh:</strong> Tha thu airson duilleag cleachdaiche a ghluasad. Thoir an aire nach dèid ach an duilleag a ghluasad 's <em>gur ann nach dèid</em> ainm ùr a thoirt air a' chleachdaiche.",
        "movecategorypage-warning": "<strong>Rabhadh:</strong> Tha thu airson duilleag roinn-seòrsa a ghluasad. Thoir an aire nach dèid ach an duilleag a ghluasad 's <em>gur ann nach dèid</em> gach duilleag a tha san t-seann roinn-seòrsa a chur ris an roinn-seòrsa ùr.",
        "movenologintext": "Feumaidh tu a bhith 'nad bhall clàraichte 's air [[Special:UserLogin|logadh a-steach]] mus gluais thu duilleag.",
        "cant-move-to-user-page": "Chan eil cead agad duilleag a ghluasad gu duilleag cleachdaiche (ach gu fo-dhuilleag cleachdaiche).",
        "cant-move-category-page": "Chan eil cead agad duilleagan roinn-seòrsa a ghluasad.",
        "cant-move-to-category-page": "Chan eil cead agad duilleag a ghluasad gu duilleag roinn-seòrsa.",
-       "newtitle": "Dhan tiotal ùr:",
+       "newtitle": "An tiotal ùr:",
        "move-watch": "Cum sùil air an duilleag thùsail agus an duilleag thairgaideach",
        "movepagebtn": "Gluais duilleag",
        "pagemovedsub": "Shoirbhich leat leis a' ghluasad",
        "movenosubpage": "Chan eil fo-dhuilleag aig an duilleag seo.",
        "movereason": "Adhbhar:",
        "revertmove": "till",
-       "delete_and_move_text": "== Tha sguabadh às a dhìth ==\nTha an duilleag-uidhe \"[[:$1]]\" ann mar-thà.\nA bheil thu airson a sguabadh às ach am bidh rum airson a' ghluasaid ann?",
+       "delete_and_move_text": "Tha an duilleag-uidhe \"[[:$1]]\" ann mar-thà.\nA bheil thu airson a sguabadh às ach am bidh rum airson a' ghluasaid ann?",
        "delete_and_move_confirm": "Siuthad, sguab às an duilleag",
        "delete_and_move_reason": "Chaidh a sguabadh às gus rum a airson a' ghluasaid o \"[[$1]]\" a chruthachadh",
        "selfmove": "Tha tiotalan an tùis a' chinn-uidhe co-ionnann;\nchan urrainn dhut duilleag a ghluasad dhan ionad aice fhèin.",
        "move-leave-redirect": "Fàg ath-stiùireadh ann",
        "protectedpagemovewarning": "<strong>Rabhadh: Chaidh an duilleag seo a dhìon 's chan urrainn ach dhan fheadhainn aig a bheil ùghdarras rianaire a ghluasad.</strong>\nChì thu an clàr mu dheireadh san loga mar fhiosrachadh dhut gu h-ìosal:",
        "semiprotectedpagemovewarning": "<strong>An aire:</strong> Chaidh an duilleag seo a dhìon 's chan fhaod ach cleachdaichean clàraichte a ghluasad.\nSeo an rud mu dheireadh san loga mar fhiosrachadh dhut:",
-       "move-over-sharedrepo": "== Tha am faidhle ann ==\nTha [[:$1]] ann an ionad-tasgaidh co-roinnte. Thèid tar-àithneadh air an fhaidhle cho-roinnte ma ghluaiseas tu faidhle gun tiotal seo.",
+       "move-over-sharedrepo": "Tha [[:$1]] ann an ionad-tasgaidh co-roinnte. Thèid tar-àithneadh air an fhaidhle cho-roinnte ma ghluaiseas tu faidhle gun tiotal seo.",
        "file-exists-sharedrepo": "Tha ainm an fhaidhle a thagh thu 'ga chleachdadh ann an ionad-tasgaidh co-roinnte mar-thà.\nFeuch an tagh thu ainm eile.",
        "export": "Às-phortaich duilleagan",
        "exporttext": "'S urrainn dhut teacsa is eachdraidh an deasachaidh aig duilleag no duilleagan sònraichte às-phortachadh le XML timcheall air.\nGabhaidh seo ion-phortachadh gu uicidh eile a chleachdas MediaWiki air an [[Special:Import|duilleag ion-phortachaidh]].\n\nGus duilleagan às-phortachadh, cuir a-steach na tiotalan sa bhogsa-teacsa gu h-ìosal, gach tiotal air loidhne fa leth, agus tagh a bheil thu ag iarraidh am mùthadh làithreach cho math ri seann mhùthaidhean le loidhnichean eachdraidh nan duilleagan no a bheil thu ag iarraidh am mùthadh làithreach le fiosrachadh mun deasachadh mu dheireadh.\n\nMa chuir thu an roghainn eile romhad, 's urrainn dhut ceangal a chleachdadh cuideachd, mar eisimpleir [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] airson na duilleige \"[[{{MediaWiki:Mainpage}}]]\".",
        "thumbnail_image-missing": "Tha faidhle a dhìth a-rèit coltais: $1",
        "thumbnail_image-failure-limit": "Chaidh feuchainn cus tursan ($1 no a bharrachd) o chionn goirid gus an dealbhag seo a reandaradh. Feuch ris a-rithist uaireigin eile.",
        "import": "Ion-phortaich duilleagan",
-       "importinterwiki": "Ion-phortachadh tar-uicidh",
-       "import-interwiki-text": "Tagh uicidh 's tiotal na duilleige airson ion-phortachadh.\nThèid cinn-là nam mùthaidhean 's ainmean nan deasaichean a ghlèidheadh.\nThèid gach gnìomh ion-phortachadh tar-uicidh a chur ris an [[Special:Log/import|loga ion-phortachaidh]].",
+       "importinterwiki": "Ion-phortachadh o uicidh eile",
+       "import-interwiki-text": "Tagh uicidh 's tiotal na duilleige airson ion-phortachadh.\nThèid cinn-là nam mùthaidhean 's ainmean nan deasaichean a ghlèidheadh.\nThèid gach ion-phortachadh o uicidh eile a chur ris an [[Special:Log/import|loga ion-phortachaidh]].",
        "import-interwiki-sourcewiki": "An uicidh thùsail:",
        "import-interwiki-sourcepage": "An duilleag thùsail:",
        "import-interwiki-history": "Dèan lethbhreac de dh'eachdraidh nam mùthaidhean slàna airson na duilleige seo",
        "importcantopen": "Cha deach leinn am faidhle ion-phortachaidh fhosgladh.",
        "importbadinterwiki": "Droch cheangal eadar-uicodh",
        "importsuccess": "Tha an t-ion-phortachadh coileanta!",
-       "importnosources": "Cha deach tùs ion-phortachadh tar-uicidh a mhìneachadh agus tha luchdadh suas dìreach nan eachdraidhean à comas.",
+       "importnosources": "Cha deach uicidh gus ion-phortadh uaipe a shònrachadh agus tha luchdadh suas dìreach nan eachdraidhean à comas.",
        "importnofile": "Cha deach faidhle ion-phortachaidh a luchdadh suas.",
        "importuploaderrorsize": "Dh'fhàillig le luchdadh suas an fhaidhle ion-phortachaidh.\nTha am faidhle nas motha na tha ceadaichte.",
        "importuploaderrorpartial": "Dh'fhàillig le luchdadh suas an fhaidhle ion-phortachaidh.\nCha deach ach pàirt dhen fhaidhle a luchdadh suas.",
        "import-nonewrevisions": "Cha deach mùthadh ion-phortachadh (bha iad uile ann roimhe no chaidh an leigeil seachad ri linn mhearachdan).",
        "xml-error-string": "$1 air loidhne $2, colbh $3 (baidht $4): $5",
        "import-upload": "Luchdaich suas dàta XML",
-       "import-token-mismatch": "Chaidh dàta an t-seisein air chall.\nFeuch ris a-rithist.",
+       "import-token-mismatch": "Dh'fhaoidte gun deach do logadh a-mach. <strong>Dearbhaich gu bheil thu air do chlàradh a-steach fhathast agus feuch ris a-rithist</strong>.\nMur obraich e fhathast, feuch [[Special:UserLogout|clàradh a-mach]] is a-steach a-rithist agus dearbhaich gun ceadaich am brabhsair agad briosgaidean on bhrabhsair seo.",
        "import-invalid-interwiki": "Cha ghabh ion-phortachadh in uicidh a shònraich thu.",
        "import-error-edit": "Cha deach an duilleag \"$1\" ion-phortachadh o nach fhaod thu a deasachadh.",
        "import-error-create": "Cha deach an duilleag \"$1\" ion-phortachadh o nach fhaod thu a cruthachadh.",
        "tooltip-feed-rss": "Inbhir RSS airson na duilleige seo",
        "tooltip-feed-atom": "Inbhir Atom airson na duilleige seo",
        "tooltip-t-contributions": "Seall liosta na h-obrach a rinn {{GENDER:$1|an cleachdaiche}} seo",
-       "tooltip-t-emailuser": "Cuir post-dealain dhan chleachdaiche seo",
+       "tooltip-t-emailuser": "Cuir post-dealain dhan {{GENDER:$1|chleachdaiche seo}}",
        "tooltip-t-upload": "Luchdaich suas faidhle",
        "tooltip-t-specialpages": "Liosta de gach duilleag shònraichte",
        "tooltip-t-print": "Tionndadh dhen duilleag a ghabhas a chlò-bhualadh",
        "watchlistedit-raw-done": "Chaidh an clàr-faire agad ùrachadh.",
        "watchlistedit-raw-added": "Chaidh $1 {{PLURAL:$1|tiotal|thiotal|tiotalan|tiotal}} a chur ris:",
        "watchlistedit-raw-removed": "Chaidh $1 {{PLURAL:$1|tiotal|thiotal|tiotalan|tiotal}} a thoirt air falbh:",
-       "watchlistedit-clear-title": "Clàr-faire air a ghlanadh",
+       "watchlistedit-clear-title": "Glan an clàr-faire",
        "watchlistedit-clear-legend": "Glan an clàr-faire",
        "watchlistedit-clear-explain": "Thèid a h-uile tiotal a thoirt far a' chlàr-fhaire agad",
        "watchlistedit-clear-titles": "Tiotalan:",
        "version-entrypoints-header-url": "URL",
        "version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgArticlePath Slighe artaigil]",
        "version-entrypoints-scriptpath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgScriptPath slighe sgriobt]",
-       "redirect": "Ath-stiùireadh le faidhle, cleachdaiche, duilleag no ID a' mhùthaidh",
-       "redirect-summary": "Nì an duilleag shònraichte seo ath-stiùireadh gu faidhle (le ainm faidhle), duilleag (le ID a' mhùthaidh no ID na duilleige) no duilleag cleachdaiche (le àireamh ID a' chleachdaiche). Seo mar a chleachdas tu e: [[{{#Special:Redirect}}/file/Ball-eisimpleir.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]] no [[{{#Special:Redirect}}/user/101]].",
+       "redirect": "Ath-stiùireadh le faidhle, cleachdaiche, duilleag, mhùthadh no ID loga",
+       "redirect-summary": "Nì an duilleag shònraichte seo ath-stiùireadh gu faidhle (le ainm faidhle), duilleag (le ID a' mhùthaidh no ID na duilleige) no duilleag cleachdaiche (le àireamh ID a' chleachdaiche) no innteart an loga (le ID an loga). Seo mar a chleachdas tu e: [[{{#Special:Redirect}}/file/Ball-eisimpleir.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], [[{{#Special:Redirect}}/user/101]] no [[{{#Special:Redirect}}/logid/186]].",
        "redirect-submit": "Siuthad",
        "redirect-lookup": "Rannsaich:",
        "redirect-value": "Luach:",
        "compare-revision-not-exists": "Chan eil am mùthadh a shònraich thu ann.",
        "dberr-problems": "Duilich! Tha trioblaid teicnigeach aig an làrach seo.",
        "dberr-again": "Feitheamh mionaid no dhà 's ath-luchdaich i.",
-       "dberr-info": "(Chan obraich an conaltradh ri frithealaiche an stòir-dhàta: $1)",
-       "dberr-info-hidden": "(Chan obraich an conaltradh ri frithealaiche an stòir-dhàta)",
+       "dberr-info": "(Chan urrainn dhuinn an stòr-dàta inntrigeadh: $1)",
+       "dberr-info-hidden": "(Chan urrainn duinn an stòr-dàta inntrigeadh)",
        "dberr-usegoogle": "Feuch lorg le Google san eadar-àm.",
        "dberr-outofdate": "Thoir an aire nach eil an clàr acasan air an t-susbaint againn cho ùr sa ghabhas ma dh'fhaoidte.",
        "dberr-cachederror": "Seo lethbhreac dhen duilleag a dh'iarr thu on tasgadan 's chan eil e cho ùr 's a ghabhas, ma dh'fhaoidte.",
        "api-error-badaccess-groups": "Chan eil cead agad gus faidhlichean a luchdadh suas dhan uicidh seo.",
        "api-error-badtoken": "Mearachd taobh a-staigh: Droch thòcan.",
        "api-error-copyuploaddisabled": "Tha luchdadh suas le URL à comas air an fhrithealaiche seo.",
-       "api-error-duplicate": "Tha {{PLURAL:$1|faidhle eile|are faidhlichean eile}} air an làrach seo mar-thà sa bheil an aon susbaint.",
+       "api-error-duplicate": "Tha {{PLURAL:$1|faidhle eile|faidhlichean eile}} air an làrach seo mar-thà sa bheil an aon susbaint.",
        "api-error-duplicate-archive": "Tha {{PLURAL:$1|faidhle eile|faidhlichean eile}} air an làrach seo mar-thà sa bheil an aon susbaint ach chaidh {{PLURAL:$1|a sguabadh|an sguabadh}} às.",
        "api-error-empty-file": "Tha am faidhle a chuir thu a-null falamh.",
        "api-error-emptypage": "Chan fhaodar duilleagan falamh ùra a chruthachadh.",
        "expand_templates_generate_xml": "Seall craobh parsaidh an XML",
        "expand_templates_generate_rawhtml": "Seall bun-tùs an HTML",
        "expand_templates_preview": "Ro-sheall",
-       "pagelanguage": "Roghnaichear cànan nan duilleag",
+       "pagelanguage": "Atharraich cànan na duilleige",
        "pagelang-name": "Duilleag",
        "pagelang-language": "Cànan",
        "pagelang-use-default": "Cleachd an cànan tùsail",
        "action-pagelang": "atharraich cànan nan duilleagan",
        "log-name-pagelang": "Loga air atharrachadh nan cànan",
        "log-description-pagelang": "Seo loga dhe na h-atharraichean air cànanan nan duilleagan.",
-       "logentry-pagelang-pagelang": "Dh'atharraich $1 cànan nan duilleagan airson $3 o $4 gu $5.",
+       "logentry-pagelang-pagelang": "{{GENDER:$2|Dh'atharraich}} $1 an cànan aig $3 o $4 gu $5",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (an comas)",
        "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 (<strong>à comas</strong>)",
        "mediastatistics": "Stadastaireachd nam meadhanan",
index 0fda562..05a34f5 100644 (file)
@@ -40,7 +40,7 @@
        "tog-watchdefault": "Engadir as páxinas e os ficheiros que edite á miña lista de vixilancia",
        "tog-watchmoves": "Engadir as páxinas e os ficheiros que mova á miña lista de vixilancia",
        "tog-watchdeletion": "Engadir as páxinas e os ficheiros que borre á miña lista de vixilancia",
-       "tog-watchuploads": "Engadir os novos ficheiros que subín á miña lista de vixilancia",
+       "tog-watchuploads": "Engadir os ficheiros novos que suba á miña lista de vixilancia",
        "tog-watchrollback": "Engadir as páxinas nas que realice unha reversión á miña lista de vixilancia",
        "tog-minordefault": "Marcar todas as edicións como pequenas por defecto",
        "tog-previewontop": "Mostrar a vista previa antes da caixa de edición",
@@ -58,7 +58,7 @@
        "tog-watchlisthidebots": "Agochar as edicións dos bots na lista de vixilancia",
        "tog-watchlisthideminor": "Agochar as edicións pequenas na lista de vixilancia",
        "tog-watchlisthideliu": "Agochar as edicións dos usuarios rexistrados na lista de vixilancia",
-       "tog-watchlistreloadautomatically": "Recargar a lista de vixilancia automaticamente cando se produce un cambio nun filtro (require JavaScript)",
+       "tog-watchlistreloadautomatically": "Recargar a lista de vixilancia automaticamente cando se produza un cambio nun filtro (necesítase JavaScript)",
        "tog-watchlisthideanons": "Agochar as edicións dos usuarios anónimos na lista de vixilancia",
        "tog-watchlisthidepatrolled": "Agochar as edicións patrulladas na lista de vixilancia",
        "tog-watchlisthidecategorization": "Agochar a categorización das páxinas",
        "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-nocaller": "Cómpre proporcionar un chamador",
+       "passwordreset-nosuchcaller": "O chamador non existe: $1",
+       "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.",
        "changeemail-password": "O seu contrasinal en {{SITENAME}}:",
        "changeemail-submit": "Cambiar o correo electrónico",
        "changeemail-throttled": "Fixo demasiados intentos de acceder ao sistema.\nPor favor, agarde $1 antes de probar outra vez.",
-       "changeemail-nochange": "Por favor, indique unha nova dirección de correo diferente.",
+       "changeemail-nochange": "Por favor, indique un enderezo de correo novo diferente.",
        "resettokens": "Restablecer os pases",
        "resettokens-text": "Aquí pode restablecer os pases que permiten acceder a certos datos privados asociados á súa conta.\n\nDebería facelo se os compartiu accidentalmente con alguén ou se a súa conta foi comprometida.",
        "resettokens-no-tokens": "Non hai ningún pase que restablecer.",
        "minoredit": "Esta é unha edición pequena",
        "watchthis": "Vixiar esta páxina",
        "savearticle": "Gardar a páxina",
-       "publishpage": "Publicar páxina",
+       "publishpage": "Publicar páxina",
        "preview": "Vista previa",
        "showpreview": "Mostrar a vista previa",
        "showdiff": "Mostrar os cambios",
        "missingcommentheader": "<strong>Aviso:</strong> Non escribiu ningún texto no asunto deste comentario.\nSe preme sobre \"{{int:savearticle}}\", a súa edición gardarase sen el.",
        "summary-preview": "Vista previa do resumo:",
        "subject-preview": "Vista previa do asunto:",
-       "previewerrortext": "Houbo un erro ó tentar previsualizar os cambios.",
+       "previewerrortext": "Produciuse un erro ao intentar previsualizar os cambios.",
        "blockedtitle": "O usuario está bloqueado",
        "blockedtext": "'''O seu nome de usuario ou enderezo IP foi bloqueado.'''\n\nO bloqueo foi realizado por $1.\nA razón que deu foi ''$2''.\n\n* Inicio do bloqueo: $8\n* Caducidade do bloqueo: $6\n* Pretendeuse bloquear: $7\n\nPode contactar con $1 ou con calquera outro [[{{MediaWiki:Grouppage-sysop}}|administrador]] para discutir este bloqueo.\nNon pode empregar a característica \"Enviar un correo electrónico a este usuario\" a non ser que dispoña dun enderezo electrónico válido rexistrado nas súas [[Special:Preferences|preferencias de usuario]] e que o seu uso non fose bloqueado.\nO seu enderezo IP actual é $3 e o ID do bloqueo é #$5.\nPor favor, inclúa eses datos nas consultas que faga.",
        "autoblockedtext": "O seu enderezo IP foi bloqueado automaticamente porque foi empregado por outro usuario que foi bloqueado por $1.\nA razón que deu foi a seguinte:\n\n:''$2''\n\n* Inicio do bloqueo: $8\n* Caducidade do bloqueo: $6\n* Pretendeuse bloquear: $7\n\nPode contactar con $1 ou con calquera outro [[{{MediaWiki:Grouppage-sysop}}|administrador]] para discutir este bloqueo.\n\nTeña en conta que non pode empregar a característica \"Enviar un correo electrónico a este usuario\" a non ser que dispoña dun enderezo electrónico válido rexistrado nas súas [[Special:Preferences|preferencias de usuario]] e e que o seu uso non fose bloqueado.\n\nO seu enderezo IP actual é $3 e o ID do bloqueo é #$5.\nPor favor, inclúa eses datos nas consultas que faga.",
        "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.",
        "trackingcategories-msg": "Categoría de seguimento",
        "trackingcategories-name": "Nome da mensaxe",
        "trackingcategories-desc": "Criterio de inclusión da categoría",
+       "restricted-displaytitle-ignored": "Páxinas co título que se mostra ignorado",
+       "restricted-displaytitle-ignored-desc": "Esta páxina ten un <code><nowiki>{{DISPLAYTITLE}}</nowiki></code> ignorado porque non é equivalente ao título real da páxina.",
        "noindex-category-desc": "A páxina non está indexada polos bots porque contén a palabra máxica <code><nowiki>__NOINDEX__</nowiki></code> e está nun espazo de nomes no que esa marca está permitida.",
        "index-category-desc": "A páxina contén a palabra máxica <code><nowiki>__INDEX__</nowiki></code> (e está nun espazo de nomes no que esa marca está permitida) e, polo tanto, será indexada polos bots cando non debera selo normalmente.",
        "post-expand-template-inclusion-category-desc": "O tamaño da páxina é maior que <code>$wgMaxArticleSize</code> despois de expandir todos os modelos; algúns modelos non se expandiron.",
        "rollbacklinkcount": "reverter $1 {{PLURAL:$1|edición|edicións}}",
        "rollbacklinkcount-morethan": "reverter máis de $1 {{PLURAL:$1|edición|edicións}}",
        "rollbackfailed": "Houbo un erro ao reverter as edicións",
+       "rollback-missingparam": "Faltan parámetros obrigatorios na solicitude.",
        "cantrollback": "Non se pode desfacer a edición; o último colaborador é o único autor desta páxina.",
        "alreadyrolled": "Non se pode desfacer a edición en \"[[:$1]]\" feita por [[User:$2|$2]] ([[User talk:$2|conversa]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]); alguén máis editou ou desfixo os cambios desta páxina.\n\nA última edición fíxoa [[User:$3|$3]] ([[User talk:$3|conversa]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "editcomment": "O resumo de edición foi: <em>$1</em>.",
        "revertpage": "Desfixéronse as edicións de [[Special:Contributions/$2|$2]] ([[User talk:$2|conversa]]); cambiado á última versión feita por [[User:$1|$1]]",
        "revertpage-nouser": "Desfixéronse as edicións dun usuario agochado; cambiado á última versión feita por {{GENDER:$1|[[User:$1|$1]]}}",
        "rollback-success": "Desfixéronse as edicións de $1;\nvolveuse á última edición, feita por $2.",
+       "rollback-success-notify": "Modificacións anuladas por $1; restaurado á última revisión de $2. [$3 Mostrar os cambios]",
        "sessionfailure-title": "Erro de sesión",
        "sessionfailure": "Parece que hai un problema co rexistro da súa sesión;\nesta acción cancelouse como precaución fronte ao secuestro de sesións.\nPrema no botón \"atrás\", volva cargar a páxina da que proviña e inténteo de novo.",
        "changecontentmodel": "Cambiar o modelo do contido dunha páxina",
        "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 as redireccións",
+       "whatlinkshere-hidetrans": "$1 as inclusións",
+       "whatlinkshere-hidelinks": "$1 as ligazóns",
+       "whatlinkshere-hideimages": "$1 ligazóns ao ficheiro",
        "whatlinkshere-filters": "Filtros",
        "whatlinkshere-submit": "Ir",
        "autoblockid": "Bloqueo automático nº$1",
        "tooltip-pt-anonuserpage": "A páxina de usuario do enderezo IP desde o que está a editar",
        "tooltip-pt-mytalk": "A súa páxina de conversa",
        "tooltip-pt-anontalk": "Conversa acerca de edicións feitas desde este enderezo IP",
-       "tooltip-pt-preferences": "As súas preferencias",
+       "tooltip-pt-preferences": "{{GENDER:|As súas}} preferencias",
        "tooltip-pt-watchlist": "A lista de páxinas cuxas modificacións está a seguir",
        "tooltip-pt-mycontris": "Lista das súas contribucións",
        "tooltip-pt-anoncontribs": "Unha lista de modificacións feitas desde esta dirección IP",
        "confirm-watch-top": "Quere engadir esta páxina á lista de vixilancia?",
        "confirm-unwatch-button": "Aceptar",
        "confirm-unwatch-top": "Quere eliminar esta páxina da lista de vixilancia?",
+       "confirm-rollback-button": "Aceptar",
+       "confirm-rollback-top": "Reverter as edicións desta páxina?",
        "colon-separator": ":&#32;",
        "quotation-marks": "\"$1\"",
        "imgmultipageprev": "← páxina anterior",
        "timezone-local": "Local",
        "duplicate-defaultsort": "<strong>Aviso:</strong> A clave de ordenación por defecto \"$2\" anula a clave de ordenación anterior por defecto \"$1\".",
        "duplicate-displaytitle": "'''Aviso:''' O título mostrado \"$2\" anula o título anterior \"$1\".",
+       "restricted-displaytitle": "<strong>Atención:</strong> O título mostrado \"$1\" ignorouse porque non é equivalente ao título real da páxina.",
        "invalid-indicator-name": "<strong>Erro:</strong> O atributo <code>name</code> dos indicadores do estado da páxina non pode estar baleiro.",
        "version": "Versión",
        "version-extensions": "Extensións instaladas",
        "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-not-in-progress": "O proceso de autenticación non está en progreso ou perdéronse os datos da sesión. Empece de novo desde o principio.",
+       "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-no-local-user-link": "As credenciais proporcionadas son válidas, pero non están asociadas a ningún usuario deste wiki. Acceda dun xeito diferente ou cree un usuario novo e terá unha opción para vincular as súas credenciais anteriores a aquela conta.",
+       "authmanager-authn-autocreate-failed": "A creación automatica dunha conta local fallou: $1",
+       "authmanager-change-not-supported": "As credenciais proporcionadas non se poden modificar, xa que ninguén as utilizará.",
+       "authmanager-create-disabled": "A creación de contas está desactivada.",
+       "authmanager-create-from-login": "Para crear a súa conta, complete os campos a continuación.",
+       "authmanager-create-not-in-progress": "O proceso de creación da conta non está en progreso ou perdéronse os datos da sesión. Empece de novo desde o principio.",
+       "authmanager-create-no-primary": "As credenciais subministradas non poden usarse para a creación da conta.",
+       "authmanager-link-no-primary": "As credenciais subministradas non poden usarse para a ligazón da conta.",
+       "authmanager-link-not-in-progress": "A vinculación da conta non está en progreso ou perdéronse os datos da sesión. Empece de novo desde o principio.",
+       "authmanager-authplugin-setpass-failed-title": "Fallou o cambio do contrasinal",
+       "authmanager-authplugin-setpass-failed-message": "O complemento de autenticación denegou o cambio de contrasinal.",
+       "authmanager-authplugin-create-fail": "O complemento de autenticación denegou a creación da conta.",
+       "authmanager-authplugin-setpass-denied": "O complemento de autenticación non permite o cambio de contrasinais.",
+       "authmanager-authplugin-setpass-bad-domain": "Dominio non válido.",
+       "authmanager-autocreate-noperm": "A creación automatica de contas non está permitida.",
+       "authmanager-autocreate-exception": "A creación automatica de contas foi desactivada temporalmente debido a erros previos.",
+       "authmanager-userdoesnotexist": "O usuario \"$1\" non está rexistrado.",
+       "authmanager-userlogin-remembermypassword-help": "Indique se o contrasinal debe lembrarse máis alá da duración da sesión.",
+       "authmanager-username-help": "Nome de usuario para autenticación.",
+       "authmanager-password-help": "Contrasinal para autenticación.",
+       "authmanager-domain-help": "Dominio para autenticación externa.",
+       "authmanager-retype-help": "O contrasinal de novo para confirmar.",
+       "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-password": "Autenticación baseada en contrasinal",
+       "authmanager-provider-password-domain": "Autenticación por contrasinal e dominio",
+       "authmanager-provider-temporarypassword": "Contrasinal temporal",
+       "authprovider-confirmlink-message": "En función dos seus últimos accesos, as seguintes contas poden vincularse coa súa conta no wiki. A vinculación permite acceder a través desas contas. Seleccione aquelas que queira vincular.",
+       "authprovider-confirmlink-request-label": "Contas que deben ser ligadas",
+       "authprovider-confirmlink-success-line": "$1: ligado correctamente.",
+       "authprovider-confirmlink-failed": "A ligazón das contas non foi correctamente: $1",
+       "authprovider-confirmlink-ok-help": "Continuar despois de mostrar as mensaxes de erro na vinculación.",
+       "authprovider-resetpass-skip-label": "Omitir",
+       "authprovider-resetpass-skip-help": "Saltar a reinicialización do contrasinal.",
+       "authform-nosession-login": "A autenticación foi correcta, pero o seu navegador non pode \"lembrar\" ter iniciado sesión.\n\n$1",
+       "authform-nosession-signup": "A conta foi creada, pero o seu navegador non \"lembra\" ter iniciado sesión.\n\n$1",
+       "authform-newtoken": "Identificador perdido. $1",
+       "authform-notoken": "Identificador perdido",
+       "authform-wrongtoken": "Identificador incorrecto",
+       "specialpage-securitylevel-not-allowed-title": "Non permitido",
+       "specialpage-securitylevel-not-allowed": "Sentímolo, non ten permitido usar esta páxina porque a súa identidade non puido verificarse.",
+       "authpage-cannot-login": "Imposible comezar a conexión.",
+       "authpage-cannot-login-continue": "Imposible continuar a conexión. O máis probable é que a súa sesión teña expirado.",
+       "authpage-cannot-create": "Non se pode iniciar a creación da conta.",
+       "authpage-cannot-create-continue": "Imposible continua a creación da conta. A súa sesión semella ter expirado.",
+       "authpage-cannot-link": "Imposible comezar a vinculación da conta.",
+       "authpage-cannot-link-continue": "Imposible continuar coa vinculación da conta. Semella que a súa sesión expirou.",
+       "cannotauth-not-allowed-title": "Permiso rexeitado",
+       "cannotauth-not-allowed": "Non ten permiso para usar esta páxina",
+       "changecredentials": "Cambiar as credenciais",
+       "changecredentials-submit": "Cambiar credenciais",
+       "changecredentials-invalidsubpage": "$1 non é un tipo de información de identificación válido.",
+       "changecredentials-success": "As súas credenciais foron cambiadas.",
+       "removecredentials": "Eliminar credenciais",
+       "removecredentials-submit": "Eliminar credenciais",
+       "removecredentials-invalidsubpage": "$1 non é un tipo de información de identificación válido.",
+       "removecredentials-success": "As súas credenciais foron eliminadas.",
+       "credentialsform-provider": "Tipo de información de identificación:",
+       "credentialsform-account": "Nome da conta:",
+       "cannotlink-no-provider-title": "Non hai contas vinculables",
+       "cannotlink-no-provider": "Non hai contas vinculables.",
+       "linkaccounts": "Vincular contas",
+       "linkaccounts-success-text": "A conta foi vinculada.",
+       "linkaccounts-submit": "Vincular contas",
+       "unlinkaccounts": "Desvincular contas",
+       "unlinkaccounts-success": "A conta foi desvinculada."
 }
index d81df3d..44c0b66 100644 (file)
        "exif-orientation-1": "सामान्य",
        "namespacesall": "सगळें",
        "monthsall": "सगळे",
+       "confirm-rollback-button": "बरें",
+       "confirm-rollback-top": "ह्या पाना वयलें संपादन आशिल्ले तशें करात?",
        "watchlisttools-view": "प्रस्तूत बदल पळयात.",
        "watchlisttools-edit": "सादुरवळेरी पळय आनी संपादीत करात",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|उलयात]])",
index a56f74a..65dfc1a 100644 (file)
        "whatlinkshere-prev": "{{PLURAL:$1|adlem|adlem $1}}",
        "whatlinkshere-next": "{{PLURAL:$1|fuddlem|fuddlim $1}}",
        "whatlinkshere-links": "← zoddnio",
-       "whatlinkshere-hideredirs": "$1 punornirdexon",
-       "whatlinkshere-hidetrans": "$1 durasth-somaves",
+       "whatlinkshere-hideredirs": "$1 punornirdexonam",
+       "whatlinkshere-hidetrans": "$1 durasth-somaveso",
        "whatlinkshere-hidelinks": "$1 zoddnio",
        "whatlinkshere-hideimages": "Failinchim zoddpam $1",
        "whatlinkshere-filters": "Challnio",
        "exif-orientation-1": "Samanya",
        "namespacesall": "sogllem",
        "monthsall": "sogllem",
+       "confirm-rollback-button": "Borem",
+       "confirm-rollback-top": "Hea pana voile somadon asle toxe porot kor?",
        "watchlisttools-view": "Sombondhi bodlopam polloi",
        "watchlisttools-edit": "Sadurvolleri polloi ani sudar",
        "watchlisttools-raw": "Sadurvollerichi mull-an bodol kor",
diff --git a/languages/i18n/gor.json b/languages/i18n/gor.json
new file mode 100644 (file)
index 0000000..b14e01a
--- /dev/null
@@ -0,0 +1,749 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Ilham",
+                       "Lukman Tomayahu",
+                       "Marwan Mohamad",
+                       "Matma Rex",
+                       "NoiX180",
+                       "Zhoelyakin"
+               ]
+       },
+       "tog-underline": "Garisiyi totibawa pranala",
+       "tog-hideminor": "Wanto'a u iluba ngo'idi to'u bohu",
+       "tog-hidepatrolled": "Wanto'a u iluba patroli to'u bohu",
+       "tog-newpageshidepatrolled": "Wanto'a halaamani patroli lonto daputari halaamani bohu",
+       "tog-hidecategorization": "Wanto'a tayadu halaamani",
+       "tog-extendwatchlist": "Duhengi daputari he'awasiyalo u mopobilohu nga'amila ulo ubawa, dila bo ubohu",
+       "tog-usenewrc": "Popotayade u iluba to bibilohu lu'ubawa baharu wawu daputari he awasiyalo berdasarkan halaamani",
+       "tog-numberheadings": "Otomatis modulade nomoro",
+       "tog-showtoolbar": "Mopobilohe pilakasi ponguba",
+       "tog-editondblclick": "Monguba halaamani mo klik po'oluwo",
+       "tog-editsectiononrightclick": "Popohunawa monguba tayadu wolo mengeklik olowala to judul lo tayadu",
+       "tog-watchcreations": "Duhengi halamani u pilohutu'u wawu berkas u diletohu'u ode daputari he awasiya'u",
+       "tog-watchdefault": "Duhengi halamani wawu berkas u iluba'u ode daputari he awasiya'u",
+       "tog-watchmoves": "Duhengi halamani wawu berkas u pilinda'u ode daputari he awasiya'u",
+       "tog-watchdeletion": "Duhengi halamani wawu berkas u yilulutu'u ode daputari he awasiya'u",
+       "tog-watchuploads": "Duhengi berkas bohu u diletohu'u to daputari he'awasiyalo",
+       "tog-watchrollback": "Duhengi halamani u pilohuwalingu'u ode daputari he awasiya'u",
+       "tog-minordefault": "Tandai nga'amila odelo iluba keke'ingo secara baku",
+       "tog-previewontop": "Popobilohe po'olo to'udiipo dosi monguba",
+       "tog-previewonfirst": "Popobilohe po'olo to'u monguba bohuliyo",
+       "tog-enotifwatchlistpages": "Lawoli wa'u surel wonu halamani tuwawu u awasiya'u lo'ubawa",
+       "tog-enotifusertalkpages": "Lawoli wa'u surel wonu halaamani tombilu'u lo'ubawa",
+       "tog-enotifminoredits": "Lawoli surel olo wa'u to'u lo'ubawa ngo'idi halaamani wawu berkas",
+       "tog-enotifrevealaddr": "Popobilohe alamati lo surel ola'u to surel lopo'ota",
+       "tog-shownumberswatching": "Popobilohe jumula lo ta he'awasiyalo",
+       "tog-oldsig": "Pali lo ulu'u masatiya",
+       "tog-fancysig": "Popopasiya pali lo'ulu'u odelo tuladuwiki (diyalu tuwawu pranala otomatis)",
+       "tog-uselivepreview": "Popohunawa mopobilohu langsung",
+       "tog-forceeditsummary": "Popo'eelawa wa'u wonu dosi monguba diipo otuwa",
+       "tog-watchlisthideown": "Wantoa u iluba'u to daputari lo he'awasiyalo",
+       "tog-watchlisthidebots": "Wanto'a u iluba lo bot to daputari lo he'awasiyalo",
+       "tog-watchlisthideminor": "Wanto'a u iluba ngo'idi to daputari lo he'awasiyalo",
+       "tog-watchlisthideliu": "Wanto'a u iluba pengguna maso log to daputari he awasiyalo",
+       "tog-watchlistreloadautomatically": "Muwatiya ulangi daputari he awasiyalo secara otomatis timi'idu saringan lo'ubawa (JavaScript paraluwolo)",
+       "tog-watchlisthideanons": "Wanto'a u iluba lo pengguna anonim monto daputari he awasiyalo",
+       "tog-watchlisthidepatrolled": "Wanto'a u iluba patroli monto daputari he'awasiyalo",
+       "tog-watchlisthidecategorization": "Wanto'a kategori halaman",
+       "tog-ccmeonemails": "Lawoli wa'u wami lo surel u yilawou to tawu",
+       "tog-diffonly": "Ja popobilohe tuwango halaman iluba u bebedawa",
+       "tog-showhiddencats": "Popobilehe kategori u hewanto'a",
+       "tog-norollbackdiff": "Japopobilohe u beda yilapato pilopohalingo",
+       "tog-useeditwarning": "Popo'ingatiya wa'u wonu molola halaman he'ubalo wonu dipo tilahu",
+       "tog-prefershttps": "Layito momake koneksi amaani wonu mo maso log",
+       "underline-always": "Layito",
+       "underline-never": "Dila ta",
+       "underline-default": "Alipo meyalo browser dudelo",
+       "editfont-style": "Ubawa area gaya lo tuladu",
+       "editfont-default": "Browser dudelo",
+       "editfont-monospace": "Tuladu Monospaced",
+       "editfont-sansserif": "Tuladu San-serif",
+       "editfont-serif": "Tuladu Serif",
+       "sunday": "Ahadi",
+       "monday": "Isinini",
+       "tuesday": "Salaasa",
+       "wednesday": "Araba'a",
+       "thursday": "Hamisi",
+       "friday": "Juma'ati",
+       "saturday": "Sahutu",
+       "sun": "Aha",
+       "mon": "Isi",
+       "tue": "Sal",
+       "wed": "Ara",
+       "thu": "Ham",
+       "fri": "Jum",
+       "sat": "Sah",
+       "january": "Januwari",
+       "february": "Peburuari",
+       "march": "Maret",
+       "april": "April",
+       "may_long": "Mei",
+       "june": "Juni",
+       "july": "Juli",
+       "august": "Agustus",
+       "september": "September",
+       "october": "Oktober",
+       "november": "Nopember",
+       "december": "Desember",
+       "january-gen": "Januwari",
+       "february-gen": "Peburuwari",
+       "march-gen": "Maret",
+       "april-gen": "April",
+       "may-gen": "Meyi",
+       "june-gen": "Juni",
+       "july-gen": "Juli",
+       "august-gen": "Agustus",
+       "september-gen": "September",
+       "october-gen": "Oktober",
+       "november-gen": "Nopember",
+       "december-gen": "Desember",
+       "jan": "Jan",
+       "feb": "Peb",
+       "mar": "Mar",
+       "apr": "Apr",
+       "may": "Mei",
+       "jun": "Jun",
+       "jul": "Jul",
+       "aug": "Agt",
+       "sep": "Sep",
+       "oct": "Okt",
+       "nov": "Nop",
+       "dec": "Des",
+       "january-date": "$1 Yanuari",
+       "february-date": "$1 Peburuari",
+       "march-date": "$1 Maret",
+       "april-date": "$1 April",
+       "may-date": "$1 Mei",
+       "june-date": "$1 Yuni",
+       "july-date": "$1 Yuli",
+       "august-date": "$1 Agustus",
+       "september-date": "$1 September",
+       "october-date": "$1 Oktober",
+       "november-date": "$1 Nopember",
+       "december-date": "$1 Desember",
+       "period-am": "AM",
+       "period-pm": "PM",
+       "pagecategories": "{{PLURAL:$1|Tayadu}}",
+       "category_header": "Halaman to delomo kategori \"$1\"",
+       "subcategories": "Subkategori",
+       "category-media-header": "Media to delomo kategori \"$1\"",
+       "category-empty": "<em>Kategori botiye ja o halaman meyalo media.<em>",
+       "hidden-categories": "{{PLURAL:$1|Tayadu wanto-wanto'o}}",
+       "hidden-category-category": "Kategori u wanto-wanto'o",
+       "category-subcat-count": "{{PLURAL:$2|Kategori boti woluwo subkategori|Kategori boti woluwo {{PLURAL:$1|subkategori|$1 subkategori}} lonto nga'amila $2.}}",
+       "category-subcat-count-limited": "Kategori boti woluwo {{PLURAL:$1|subkategori|$1 subkategori}}",
+       "category-article-count": "{{PLURAL:$2|Kategori botiye o tuwango halaman.|Woluwo {{PLURAL:$|$1 halaman}} to delomo kategori, lonto $2 nga'amila.}}",
+       "category-article-count-limited": "Kategori boti woluwo {{PLURAL:$1|halaman|$1 halaman}} to delomo kategori",
+       "category-file-count": "{{PLURAL:$2|To kategori boti woluwo berkas {{PLURAL:$1|berkas|$1 berkas}} to delomo kategori, lonto nga'amila $2}}",
+       "category-file-count-limited": "Woluwo {{PLURAL:$1|berkas|S1 berkas}} to delomo kategori.",
+       "listingcontinuesabbrev": "wumb",
+       "index-category": "Halaman to indeks",
+       "noindex-category": "Haalaman dila to indeks",
+       "broken-file-category": "Halaamani wolo pranala berkas ma lorusa",
+       "about": "Tomimbihu",
+       "article": "Tuwango halaman",
+       "newwindow": "hu'owa to janela bohu",
+       "cancel": "Batali",
+       "moredotdotdot": "Uweewo",
+       "morenotlisted": "Daputari boti dipo ganapu",
+       "mypage": "Halaamani",
+       "mytalk": "Lo'iya",
+       "anontalk": "Bisala",
+       "navigation": "Navigasi",
+       "and": "&#32;wawu",
+       "qbfind": "Lolohe",
+       "qbbrowse": "Momilohu",
+       "qbedit": "Monguba",
+       "qbpageoptions": "Halaman botiya",
+       "qbmyoptions": "Halamani'u",
+       "faq": "FAQ",
+       "faqpage": "Project:FAQ",
+       "actions": "Huhutu",
+       "namespaces": "Huwali lo tanggulo",
+       "variants": "Varian",
+       "navigation-heading": "Menu navigasi",
+       "errorpagetitle": "Lotaalawa",
+       "returnto": "Mohuwalingo ode $1",
+       "tagline": "Lonto {{SITENAME}}",
+       "help": "Wubodu",
+       "search": "Lolohe",
+       "searchbutton": "Lolohe",
+       "go": "Ntali",
+       "searcharticle": "Ntali",
+       "history": "Riwayati lo halaman",
+       "history_short": "Riwayati",
+       "updatedmarker": "iluba to'u nila'o'u pulitiyo",
+       "printableversion": "Persi cetak",
+       "permalink": "Wumbuta kakali",
+       "print": "Cetaki",
+       "view": "Bilohi",
+       "view-foreign": "Bilohi to $1",
+       "edit": "Momoli'o",
+       "edit-local": "Ubawa deskripsi lokal",
+       "create": "Mohutu",
+       "create-local": "Duhengi deskripsi lokal",
+       "editthispage": "Ubawa halaamani boti",
+       "create-this-page": "Pohutuwa halaamani boti",
+       "delete": "Luluta",
+       "deletethispage": "Luluta halaamani boti",
+       "undeletethispage": "Bataliya moluluto",
+       "undelete_short": "Batali moluluto {{PLURAL:$1|tuwawu uba|$1 ubawa}}",
+       "viewdeleted_short": "Bilohi {{PLURAL:$1|tuwawu yiluluto uba|$1 yiluluto ubawa}}",
+       "protect": "Dahawa",
+       "protect_change": "gantiyi",
+       "protectthispage": "Dahawa halaman boti",
+       "unprotect": "dudaha ubaalo",
+       "unprotectthispage": "ubawa dudaha halaman botiye",
+       "newpage": "Halaman bohu",
+       "talkpage": "Bisalayi halaman boti",
+       "talkpagelinktext": "lo'iya",
+       "specialpage": "Halaman uda'a",
+       "personaltools": "Pilaakasi lo hihilawo",
+       "articlepage": "Bilohi tuango halaman",
+       "talk": "Biisalawa",
+       "views": "Bibilohu",
+       "toolbox": "Pilaakasi",
+       "userpage": "Bilohi halaman pengguna",
+       "projectpage": "Bilohi halaman proyek",
+       "imagepage": "Bilohi halaman berkas",
+       "mediawikipage": "Bilohi halaman tahuli",
+       "templatepage": "Bilohi halaman templat",
+       "viewhelppage": "Bilohi halaman wubodu",
+       "categorypage": "Bilohi kategori halaman",
+       "viewtalkpage": "Bilohi u bilisala",
+       "otherlanguages": "To bahasa uweewo",
+       "redirectedfrom": "Pilobale lonto $1",
+       "redirectpagesub": "Halaman pilobaleyalo",
+       "redirectto": "Mobale ode",
+       "lastmodifiedat": "Halaman botiye biloli'o pulitiyo $1, $2.",
+       "viewcount": "Halaman botiye ma hilu'o {{PLURAL:$1|$1 kali}}.<br />",
+       "protectedpage": "Halaman udaha-daha",
+       "jumpto": "Lumanti'a ode",
+       "jumptonavigation": "Navigasi",
+       "jumptosearch": "lolohe",
+       "view-pool-error": "Ma'apu, server onggo sibuk sa'ati boti.\nNgohuntuwa pengguna mocoba momilehe halaman boti.\nWulatipo ngope'e to'u yi'o dipo mocoba momilehe halaman boti pooli.\n\n\n$1",
+       "generic-pool-error": "Ma'apu, server onggo sibuk sa'ati boti.\nNgohuntuwa pengguna mocoba momilohe halaman boti.\nWulatipo ngope'e to'u  yi'u dipo mocoba momilehe halaman boti pooli.",
+       "pool-timeout": "Mohile wakutu mohulata u'unti",
+       "pool-queuefull": "Tahe'ambuwa hepohulata polu-polu",
+       "pool-errorunknown": "Tilala u ja'otawa",
+       "pool-servererror": "Ta hemorekeni pool botiye diya'a: $1",
+       "poolcounter-usage-error": "Tilala lopohuna:$1",
+       "aboutsite": "Tomimbihu {{SITENAME}}",
+       "aboutpage": "Proyek:Tomimbihu",
+       "copyright": "Tuwango woluwo sadi-sadia odelo to tibawa $1",
+       "copyrightpage": "{{ns:project}}:Haku lohutu",
+       "currentevents": "U yilowali baharu",
+       "currentevents-url": "Project:U yilowali baharu",
+       "disclaimers": "Momaahu",
+       "disclaimerpage": "Project:Momaahu umum",
+       "edithelp": "Wubodu momoli'o",
+       "helppage-top-gethelp": "Tuulungi",
+       "mainpage": "Halaman Bungaliyo",
+       "mainpage-description": "Halaman bungaliyo",
+       "policy-url": "Project:Kebijakan",
+       "portal": "Buubu'a leembo'a",
+       "portal-url": "Project:Buubu'a lembo'a",
+       "privacy": "Tinepo privasi",
+       "privacypage": "Project:Tinepo privasi",
+       "badaccess": "Tilala haku momu'o",
+       "badaccess-group0": "Yi'o diya o iijini mohutu kalaja u hepohilemu",
+       "badaccess-groups": "Huhutu hepohilemu bilatasiyaliyo to pengguna {{PLURAL:$2|lembo'a}}$1.",
+       "versionrequired": "Paralu MediaWiki persi $1",
+       "versionrequiredtext": "MediaWiki versi $1 paraluwolo wonu mopohuna lo halaman botiye.\nBilohi [[Special:Version|halaman versi]]",
+       "ok": "OK",
+       "retrievedfrom": "Yilotapu lonto \"$1\"",
+       "youhavenewmessages": "{{PLURAL:$3|woluwo ulemu}} $1 ($2)",
+       "youhavenewmessagesfromusers": "{{PURAL:$4|woluwo ulemu}} $1 lonto {{PLURAL:$3|pengguna uwewo|$3 pengguna}} ($2)",
+       "youhavenewmessagesmanyusers": "Wolumo ulemu $1 lonto pengguna uwewo ($2)",
+       "newmessageslinkplural": "{{PLURAL:$1|tuwawu tahuli bohu|999=tahuli bohu}}",
+       "newmessagesdifflinkplural": "{{PLURAL:$1|iluba|999=u iluba}} pulitiyo",
+       "youhavenewmessagesmulti": "Yio lootapu tahuli bohu to $1",
+       "editsection": "boli'a",
+       "editold": "boli'a",
+       "viewsourceold": "Bilohi bungoliyo",
+       "editlink": "boli'a",
+       "viewsourcelink": "Bilohi bungoliyo",
+       "editsectionhint": "Momoli'o tayadu:$1",
+       "toc": "Tuwango",
+       "showtoc": "popobilehe",
+       "hidetoc": "wanto'a",
+       "collapsible-collapse": "Lolohubu",
+       "collapsible-expand": "Duhengi",
+       "confirmable-confirm": "Delo {{GENDER:$1|yi'o}} yakini?",
+       "confirmable-yes": "Jo",
+       "confirmable-no": "De'e",
+       "thisisdeleted": "Bilohi meyalo pohuwalinga $1",
+       "viewdeleted": "Bilohi $1",
+       "restorelink": "{{PLURAL:$1|tuwawu yiluluto ubawa}}",
+       "feedlinks": "Paalo",
+       "feed-invalid": "Hihile tayadu paalo dila banari.",
+       "feed-unavailable": "Paalo sindikasi diyaluwo",
+       "site-rss-feed": "Palo $1 RSS",
+       "site-atom-feed": "Paalo $1 Atom",
+       "page-rss-feed": "Paalo $1 RSS",
+       "page-atom-feed": "Paalo $1 Atom",
+       "red-link-title": "$1 (halaman diila sadi-sadia)",
+       "sort-descending": "Urutiya detibawa",
+       "sort-ascending": "Urutiya deyitaato",
+       "nstab-main": "Halaman",
+       "nstab-user": "Pengguna",
+       "nstab-media": "Halaman media",
+       "nstab-special": "Halaman spesial",
+       "nstab-project": "Halaman poroyek",
+       "nstab-image": "Berkas",
+       "nstab-mediawiki": "Tahuli",
+       "nstab-template": "Templat",
+       "nstab-help": "Halaman tulungi",
+       "nstab-category": "Kategori",
+       "mainpage-nstab": "Halamani bungaliyo",
+       "nosuchaction": "Diya'a huhutu boyito",
+       "nosuchactiontext": "Huhutu u hepohile lo URL ja valid.\nYi'o lotalawa lopomaso lo URL, meyalo lodudu'a pranala u ja banari.\nUtiye olo kira-kira tuwotiyo woluwo bug to pilaakasi u hepomake {{SITENAME}}",
+       "nosuchspecialpage": "Diya'a halaman istimewa boyito",
+       "nospecialpagetext": "<molotolo>Yi'o hemohile halaman istimewa u ja sah.<molotolo>\n\nDaputari halaman istimewa mowali bilehela to [[Special:SpecialPages| {{int:specialpages}}]]",
+       "error": "Lotaalawa",
+       "databaseerror": "Lotaalawa tuwango data",
+       "databaseerror-text": "Ma tilala tuwawu basis kueri.\nUtiya kira-kira tuwotiyo woluwo bug to pilaakasi moluluhi'o.",
+       "databaseerror-textcl": "Ma tilala tuwawu basis kueri.",
+       "databaseerror-query": "Kueri $1",
+       "databaseerror-function": "Huna: $1",
+       "databaseerror-error": "Lotaalawa: $1",
+       "laggedslavemode": "<strong>Warning:</strong> Halaman kira ja o tuwanga lo'ubawa bohu",
+       "readonly": "Basis data unti-unti",
+       "enterlockreason": "Masowa alasani longunti wawu omoluwa u'unti hu'oolo",
+       "missingarticle-rev": "(iluba#1:$1)",
+       "missingarticle-diff": "(Beda:$1,$2)",
+       "readonly_lag": "Basis data ma iluntiya otomatis to'u basis data sekunder hemosinkronisasi wolo basis data utama",
+       "nonwrite-api-promise-error": "Lunggongo HTTP 'Promise-Non-Write-API-Action' ma yilawo dabo hihile pilohutu ode modul loluladu API.",
+       "internalerror": "Tilala todelomiyo",
+       "internalerror_info": "Tilala todelomiyo:$1",
+       "internalerror-fatal-exception": "Ja wayitiyo fatal mengetik \"$1\"",
+       "filecopyerror": "Jamowali mohemi tuwango \"$1\" de \"$2\"",
+       "filerenameerror": "Jamowali moganti tanggulo tuwango \"$1\" de \"$2\"",
+       "filedeleteerror": "Jamowali moluluta tuwango \"$1\"",
+       "directorycreateerror": "Jamowali mohutu direktori \"$1\"",
+       "directoryreadonlyerror": "Direktori \"$1\" bo pobaca.",
+       "directorynotreadableerror": "Direktori \"$1\" jamowali pobaca.",
+       "filenotfound": "Jamotapu tuwango \"$1\"",
+       "unexpected": "Nilai ja o'aata: \"$1\"=\"$2\".",
+       "formerror": "Tilala: Ja mowali molawo formulir",
+       "badarticleerror": "Huhutu boti ja mowali pohutuwola to halaman boti.",
+       "cannotdelete": "Halaman meyalo berkas \"$1\" jamowali lulutolo.\nKira-kira ma yiluluto tawu weewo.",
+       "cannotdelete-title": "Ja mowali moluluta halaman \"$1\"",
+       "delete-hook-aborted": "Moluluto bilatali lo kokayito.\nDiyaalu kataraangani.",
+       "no-null-revision": "Ja mowali mohutu revisi noolo bohu lo halaman \"$1\"",
+       "badtitle": "Judul moleeto",
+       "badtitletext": "Judul halaman pilohile ja sah, ja otuwa, meyalo judul wolota lo bahasa meyalo wolota lo wiki u tilala lo humbuto.\nUtiye kira otuwa tuwawu meyalo limbata watade u ja mowali pomake to judul.",
+       "title-invalid-empty": "Judul halaman pilohile ja otuwa meyalo bo otuwa tuwawu huwali lo tanggulo.",
+       "title-invalid-utf8": "Judul halaman pilohile otuwa ayita UTF-8 u ja sah.",
+       "title-invalid-interwiki": "Judul otuwa wumbuta wolota lo wiki u ja mowali pomake to judul.",
+       "title-invalid-talk-namespace": "Judul situs pilohile letalu ode halaman posilitawa u diya'a.",
+       "title-invalid-characters": "Judul halaman pilohile otuwa watade ja sah: $1.",
+       "title-invalid-too-long": "Judul halaman u pilohile ma tilalalebe haya'iyo. Ja mowali limbata $1 {{PLURAL:$1|bita}} momake kode UTF-8.",
+       "title-invalid-leading-colon": "Judul halaman u pilohile tilumula lo tuwoto titik duluwo u ja sah.",
+       "querypage-no-updates": "Hemopobohu lo data to halaman botiye donggo pilateyaliyo. Data u woluwo masatiya ja muatiyolo.",
+       "viewsource": "Bilohi bungoliyo",
+       "viewsource-title": "Bilohi bungoliyo $1",
+       "actionthrottled": "Huhutu babaatasi",
+       "protectedpagetext": "Halaman botiye ma iluntiya alihu diya'a ta momoli'o meyalo huhutu uweewo.",
+       "viewsourcetext": "Yi'o mowali momilohu wawu mohemi monto bungoliyo lo halaman botiye.",
+       "viewyourtext": "Yi'o mowali momilohu wawu mohemi bungo monto  <strong>biloli'umu</strong> to halaman botiye.",
+       "namespaceprotected": "Yi'o ja o haku momoli'a halaman botiye to <strong>$1</strong> huwali tanggulo.",
+       "mycustomcssprotected": "Yi'o ja o iijini monguba halaman CSS boti.",
+       "mycustomjsprotected": "Yi'o ja o iijini monguba halaman JavaScript boti.",
+       "myprivateinfoprotected": "Yi'o ja o iijini monguba informasi pribadi olemu.",
+       "mypreferencesprotected": "Yi'o ja o iijini monguba preferensi olemu.",
+       "ns-specialprotected": "Halaman spesial ja mowali ubaalo.",
+       "titleprotected": "Judul botiya daha-daya monto ta mohutu oleh [[User:$1|$1]].\nAlasani u yilohiliyo de'uwito <em>$2</em>.",
+       "invalidtitle-knownnamespace": "Judul u ja sah wolo huwali tanggulo \"$2\" wawu teks \"$3\"",
+       "exception-nologin": "Diipo tilumuwoto log",
+       "exception-nologin-text": "Toduwolo tumuwoto log alihu mowali mokalaja to halaman botiye meyalo huhutu botiye.",
+       "exception-nologin-text-manual": "Toduwolo tumuwoto alihu mowali mohutu halaman meyalo huhutu uweewo.",
+       "virus-badscanner": "Tilala konfigurasi: pemindai virus ja iloonuhe: ''$1''",
+       "virus-scanfailed": "Pemindaian ja lowali (kode $1)",
+       "virus-unknownscanner": "antivirus ja'otaawa",
+       "cannotlogoutnow-title": "Ja mowali lumuwalo masatiya",
+       "cannotlogoutnow-text": "Lumuwalo log ja mowali to'u mopohuna $1.",
+       "welcomeuser": "Toduwoolo, $1!",
+       "welcomecreation-msg": "Akun olemu ma pilohutu. Ja lipata mongaturu konfigurasi [[Special:Preferences|preferensi {{SITENAME}}]] olemu.",
+       "yourname": "Ta ohu'uwo tanggulo",
+       "userlogin-yourname": "Ta ohu'uwo tanggulo",
+       "userlogin-yourname-ph": "Tuwota ta ohu'uwo lo tanggulo",
+       "createacct-another-username-ph": "Tuwota ta ohu'uwo lo tanggulo",
+       "yourpassword": "Tahe u'unti",
+       "userlogin-yourpassword": "Tahe u'unti",
+       "userlogin-yourpassword-ph": "Tuwota tahe u'unti",
+       "createacct-yourpassword-ph": "Tuwota tahe u'unti",
+       "yourpasswordagain": "Ulangiya tahe u'unti",
+       "createacct-yourpasswordagain": "Konfirmasi tahe u'unti",
+       "createacct-yourpasswordagain-ph": "Tuwota pooli tahe u'unti",
+       "remembermypassword": "Eelayi tahe u'unti'u to komputer botiye (to delomo $1 {{PLURAL:$1|huyi}})",
+       "userlogin-remembermypassword": "Hulima'o wa'u tuwo-tuwoto",
+       "userlogin-signwithsecure": "Popohunawa server aamani",
+       "cannotloginnow-title": "Ja mowali tumuwoto log sa'ati botiya",
+       "cannotloginnow-text": "Tumuwoto log ja mowali to'umopohuna $1.",
+       "yourdomainname": "Domain Ulemu:",
+       "password-change-forbidden": "Ja mowali momoli'a tahe u'unti to wiki botiye.",
+       "login": "Tumuwoto log",
+       "login-security": "Po'opatata tita yi'o",
+       "nav-login-createaccount": "Tumuwoto log / mohutu akun",
+       "userlogin": "Tumuwoto log / mohutu akun",
+       "userloginnocreate": "Tumuwoto log",
+       "logout": "Lumuwalo log",
+       "userlogout": "Lumuwalo log",
+       "notloggedin": "Diipo tilumuwoto log",
+       "userlogin-noaccount": "Diipo o akun",
+       "userlogin-joinproject": "Motiwayito {{SITENAME}}",
+       "nologin": "Diipo o akun? $1",
+       "nologinlink": "Mohutu akun bohu",
+       "createaccount": "Mohutu akun",
+       "gotaccount": "Ma yilohutu akun? $1",
+       "gotaccountlink": "Tumuwoto log",
+       "userlogin-resetlink": "Ilolipata detail habari tumuwotumu?",
+       "userlogin-resetpassword-link": "Ilolipata tahe u'unti?",
+       "userlogin-helplink2": "Wubodu tumuwoto log",
+       "userlogin-loggedin": "Yi'o ma tilumuwoto odelo {{GENDER:$1|$1}}\nPopohunawa formulir formulir to tibawa botiye odelo pengguna uweewo.",
+       "userlogin-reauth": "Yi'o musti tumuwota pooli u mopopatato yi'o odelo {{GENDER:$1|$1}}",
+       "userlogin-createanother": "Mohutu akun uweewo",
+       "createacct-emailrequired": "Alaamati surel",
+       "createacct-emailoptional": "Alamat tuladu email (paralu tuwangalo)",
+       "createacct-email-ph": "Tuwanga alamat tuladu email",
+       "createacct-another-email-ph": "Tuwanga alamat tuladu email",
+       "createaccountmail": "Popohunawa tahu u'unti ja kakali wawu lawola ode tuladu elektronik u pilohile",
+       "createacct-realname": "Tanggula banari (tulawoto)",
+       "createaccountreason": "Alaasani",
+       "createacct-reason": "Alaasani",
+       "createacct-reason-ph": "Longola Y'io mohutu akun uweewo.",
+       "createacct-reason-help": "Tahuli u pilopobilohu to delomo log mohutu akun",
+       "createacct-submit": "Mohutu akun bohu",
+       "createacct-another-submit": "Mohutu akun",
+       "createacct-continue-submit": "Turusi mohutu akun",
+       "createacct-another-continue-submit": "Turusi mohutu akun",
+       "createacct-benefit-heading": "{{SITEMAP}} pilohutu lotawu odelo yi'o",
+       "createacct-benefit-body1": "{{PLURAL:$1|momoli'o}}",
+       "createacct-benefit-body2": "{{PLURAL:$1|halaman}}",
+       "createacct-benefit-body3": "{{PLURAL:$1|kontributor}}pulitiyo",
+       "badretype": "Tahe u'unti pilopotuwoto tilala.",
+       "usernameinprogress": "Mohutu akun wolo tanggula botiye donggo na'o-na'o. Wulatipo ngope'e.",
+       "userexists": "Ta ohu'uwo lo tanggulo pilopotuwoto ma pilomake lo tawu. Toduwolo molulawota tanggula uweewo.",
+       "loginerror": "Lotaalawa tilumuwato log",
+       "createacct-error": "Lotaalawa lohutu akun",
+       "createaccounterror": "Diya mowali mohutu akun: $1",
+       "nocookiesnew": "Akun pengguna ma pilohutu, dabo Yi'o diipo tilumuwoto. {{SITENAME}} popohunawa kuki log pengguna.\nToduwolo mopo'aktif wawu tumuwota pooli wolo tanggulu ta ohu'uwo wawu tahe u'unti.",
+       "noname": "Tanggulo ta ohu'uwo u pilopotuwotumu ja sah.",
+       "loginsuccesstitle": "Ma tilumuwoto",
+       "loginsuccess": "<strong>Yi'o ma tilumuwoto to {{SITENAME}} odelo \"$1\".</strong>",
+       "nosuchuser": "Diya'a ta ohu'uwo wolo tanggula \"$1\".\nTanggulo ta ohu'uwo mopohiihede hurupu kiki'o wawu damango hurupu. Parakisayi po'olo eja'an meyalo [[Special:CreateAccount|mohutu akun bohu]].",
+       "nosuchusershort": "Diya'a ta ohu'uwo wolo tanggula \"$1\".\nParakisayi eja'an olemu.",
+       "nouserspecified": "Yi'o musti mopotuwoto tanggulo ta ohu'uwo.",
+       "login-userblocked": "Ta ohu'uwo botiye diblokir. Ja mowali tumuwoto.",
+       "wrongpassword": "Tahe u'unti tilala. \nToduwoolo mocoba pe'eentapo.",
+       "wrongpasswordempty": "Yi'o diipo lopotuwoto tahe u'unti.\nToduwoolo mocoba pe'eentapo.",
+       "passwordtooshort": "Tahu u'unti musti mohelu {{PLURAL:$1|1 karakterter|$1 karakter}}.",
+       "passwordtoolong": "Tahe u'unti ja mowali limbata to {{PLURAL:$1|1 karakter|$1 karakter}}.",
+       "passwordtoopopular": "Tahe u'unti biasa u ja mowali pomake. Toduwoolo molulawota u ngopohiya.",
+       "password-name-match": "Tahe u'unti musti hihihede monto tanggulo ta ohu'uwo.",
+       "password-login-forbidden": "Tanggulo ta ohu'uwo wau tahe u'unti botiye ja mowali pomake.",
+       "mailmypassword": "Popobohuwa tahe u'unti",
+       "passwordremindertitle": "Taahe u'unti ja kakali monto {{SITENAME}}",
+       "passwordremindertext": "Tawu ngota (meyalo Yi'o, lonto alamat IP $1) mohile tahe u'unti bohu {{SITENAME}} ($4). Tahe u'unti ja kakali lo ta ohu'uwo \"$2\" ma pilohutu wawu ma pilopowali \"$3\". \nWonu Yi'o ta lohile utiye, Yi'o paralu tumuwoto log wawu molulawota tahe u'unti bohu masatiya. Tahe u'unti ja kakali ma mololante to delomo wakutu {{PLURAL:$5|ngohuyi|$5 huyi}}.\n\nWonu Yi'o morasa ja lohile tahe u'unti bohu, meyalo ma lo eela tahe u'unti wawu debo mopphuna leeto, pelehiyama'o tahuli botiya wawu debo mopohuna tahe u'unti muloolo.",
+       "noemail": "Diya'a alamat tuladu elektronik u tula-tulade to ta ohu'uwo botiye \"$1\".",
+       "noemailcreate": "Yi'o musti moposadiya alamat tuladu elektronik u sah.",
+       "passwordsent": "Tahe u'unti bohu ma yilawo ode alamat tuladu elektronik u to daputari lo \"$1\".\nToduwoolo tumuwoto wonu ma lololimo tulade boyito.",
+       "blocked-mailpassword": "Alamat IP olemu ma diblokir monto u momoli'o. Modaha u mopotalawa, Yi'o diipo mowali mopobohu lo tahe u'unti moli alamat IP botiye.",
+       "eauthentsent": "Tuladu elektronik u pokonfirmasi ma yilawo ode alamat lo tuladu. To'udiipo tuladu elektronik uweewo lawololo ode akun botiye, Yi'o musti modudu'a potunu to delomo tuladu boyito, u mokonformasi tutu liyo tutu alamat boyito banari ulemu.",
+       "throttled-mailpassword": "Tahe u'unti bohu ma yilawo to delomo {{PLURAL:$1|$1 jam}}botiye.\nModaha ta mopotalawa, bo tuwawu tahe u'unti u lawololo timi'idu {{PLURAL:$1|jam|$1 jam}}.",
+       "mailerror": "Tilala lo lawo tuladu elektronik:$1",
+       "emailauthenticated": "Alamat tuladu elektronikmu ma dikonfirmasi to $3, $2.",
+       "emailnotauthenticated": "Alamat tuldu elektronikmu diipo dikonformasi.\nWonu diipo dikonfirmasi, Yi'o dila ta mololimo tulade elektronik monto fitur botiya.",
+       "noemailprefs": "Yi'o musti mopomasu alamat surel to preferensimu alihu mowali mopohuna lo fitur-fitur botiye.",
+       "emailconfirmlink": "Konfirmasi alamat surel olemu",
+       "invalidemailaddress": "Alamat surel botiye ja mowali tolimolo sababu tatalawa format.\nHarapuwolo mopotuwoto alamat surel wolo format u banari meyalo lawodima'o uwito.",
+       "cannotchangeemail": "Alamat surel akun botiye ja mowali boli'ola to wiki botiya.",
+       "emaildisabled": "Situs botiye ja mowali molawo surel.",
+       "accountcreated": "Akun ma pilohutu",
+       "accountcreatedtext": "Akun ta ohu'uwo lo [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|lo'iya]]) ma pilohutu.",
+       "createaccount-title": "Ma yilohutu akun lo {{SITENAME}}",
+       "createaccount-text": "Tawu ngota ma lohutu akun lopohuna alamat surel olemu {{SITENAME}} ($4) wolo tanggulo \"$2\" wawu tahe u'unti \"$3\". Yi'o musti tumuwoto wawu momoli'a tahe u'unti masatiya.\n\nPelehiya ma'o tahuli wonu akun botiye pilohutu sababu u tilala.",
+       "login-throttled": "Yi'o ma tilala lebe he mocoba tumuwoto log.\nToduwoolo mohuato $1 to'udiipo mocoba pooli.",
+       "login-abort-generic": "Yi'o ja lowali tilumuwoto - Pilopobatali",
+       "loginlanguagelabel": "Bahasa: $1",
+       "pt-login": "Tumuwoto log",
+       "pt-login-button": "Tumuwoto log",
+       "pt-createaccount": "Mohutu akun",
+       "pt-userlogout": "Lumuwalo log",
+       "botpasswords-label-create": "Mohutu",
+       "botpasswords-label-update": "Mopobohu",
+       "botpasswords-label-cancel": "Bataliya",
+       "botpasswords-label-delete": "Luluta",
+       "passwordreset": "Ubawa tahe u'unti",
+       "bold_sample": "Teks botiye ma cetakiyolo mohulodu",
+       "bold_tip": "Teks mohulodu",
+       "italic_sample": "Teks botiye ma cetakiyolo yinti-yintili",
+       "italic_tip": "Teks yinti-yintili",
+       "link_sample": "Judul wumbuta",
+       "link_tip": "Wumbuta to delomiyo",
+       "extlink_sample": "http://www.example.com judul wumbuta",
+       "extlink_tip": "Wumbuta to diluwari (eelayi awalan http://)",
+       "headline_sample": "Judul teks",
+       "headline_tip": "Lenggota 2 Judul",
+       "nowiki_sample": "Tuwota teks u ja format teeye",
+       "nowiki_tip": "Pelehiya moformat wiki",
+       "image_tip": "Dembinga berkas",
+       "media_tip": "Wumbuta lo berkas",
+       "sig_tip": "Pali lo ulu'umu wawu tuwoto wakutu",
+       "hr_tip": "Garisi bula-bulawahu",
+       "summary": "Limbu'o",
+       "minoredit": "Utiye biloli'o ngo'idi",
+       "watchthis": "Dahayi halaman botiye",
+       "savearticle": "Tahuwa halaman",
+       "showpreview": "Bilohi pratayang",
+       "showdiff": "Popobilohe u loboli'a",
+       "anoneditwarning": "<strong>Mopo'eela:</strong> Yi'o diipo tilumuwo. Alamat IP olemu ma ontonga lo tawu daata wonu yi'o momoli'o. Wonu Yi'o <strong>[$1 tumuwoto log]</strong> meyalo <strong>[$2 mohutu akun]</strong>, u biloli'umu madiatribusikan ode tanggulumu, wolo huna uweewoliyo.",
+       "loginreqlink": "tumuwoto log",
+       "newarticletext": "Yi'o lodudu'a wumbuta ode halaman diya'a. \nWonu mohutu halaman botiye, ketik tuwango halaman to kotak to tibawa botiye (bilohi [$1 halaman wubodu] ode habari wumbutiyo). \nWonu Yi'o ja sangaja tilumuwota ode halaman botiye, kutiya tombol <strong>mohuwalingo</strong>.",
+       "noarticletext": "Sa'ati botiye diya'a teks to halaman botiye.\nYi'o mowali [[Special:Search/{{PAGENAME}}|mololohu  judul halaman botiye]] to halaman-halaman uweewo, <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} mololohu log a'ayita], meyalo [{{fullurl:{{FULLPAGENAME}}|action=edit}} mohutu halaman botiye]</span>.",
+       "noarticletext-nopermission": "!Sa'ati botiye diya'a teks to halaman boptiye.\nYi'o mowali [[Special:Search/{{PAGENAME}}|mololohu judul halaman botiye]] to halaman-halaman uweewo, meyalo <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} mololohu log a'ayita]</span>, dabo Yi'o ja o ijin mohutu halaman botiye.",
+       "editing": "Momoli'o $1",
+       "creating": "Mohutu $1",
+       "editingsection": "Momoli'o $1 (tayadu)",
+       "templatesused": "{{PLURAL:$1|Template}} pilopohuna to halaman botiye:",
+       "template-protected": "(he dahalo)",
+       "template-semiprotected": "(dahalo-ngowa)",
+       "hiddencategories": "Halaman botiye woluwo anggota {{PLURAL:$1|1 kategori wanto-wanto'o $1}}:",
+       "permissionserrorstext-withaction": "Yi'o ja haku akses $2, sababu {{PLURAL:$1|alasani}} botiya:",
+       "moveddeleted-notice": "Halaman botiye ma yiluluto.\nSebagai referensi, botiya log piloluluta wawu piloheyiya halaman botiye.",
+       "viewpagelogs": "Bilohi log lo halaman botiye",
+       "currentrev-asof": "Biloli'o pulitiyo to $1",
+       "revisionasof": "Biloli'o to $1",
+       "revision-info": "Biloli'o per $1 oleh {{GENDER:$6|$2}}$7",
+       "previousrevision": "Biloli'o yilaluma'o",
+       "nextrevision": "Biloli'o lapatiyoma'o →",
+       "currentrevisionlink": "Biloli'o pulitiyo",
+       "cur": "mst",
+       "last": "diipo",
+       "rev-delundel": "popobilohe/wanto'a",
+       "history-title": "Riwayati lo'u loboli'a lonto \"$1\"",
+       "difference-title": "$1 hihede revisi",
+       "lineno": "Baarisi $1:",
+       "editundo": "pohuwalinga",
+       "diff-multi-sameuser": "({{PLURAL:$1|$1 revisi wolota}} pilohutu lo tawu ngota ja pilopobilohu)",
+       "searchresults": "U yilotapu",
+       "searchresults-title": "U yilotapu lololohe \"$1\"",
+       "prevn": "{{PLURAL:$1|$1}} to'udiipo",
+       "nextn": "{{PLURAL:$1|$1}} lapatiyoma'o",
+       "nextn-title": "$1 {{PLURAL:$1|hasili}}lapatiyoma'o",
+       "shown-title": "Popobilohe $1 {{PLURAL:$1|haasili}} per halaman",
+       "viewprevnext": "Bilohi ($1 {{int:pipe-separator}} $2) ($3)",
+       "searchmenu-new": "<strong>mohutu halaman \"[[:$1]]\" to wiki botiya! {{PLURAL:$2|0=Bilohi halaman u yilotapu yilolohumu.|Bilohi hasili u yilotapu to'u yilolohu}}",
+       "searchprofile-articles": "Tuwango halaman",
+       "searchprofile-images": "Multimedia",
+       "searchprofile-everything": "Nga'amila",
+       "searchprofile-advanced": "Wumbuto",
+       "searchprofile-articles-tooltip": "Mololohu to $1",
+       "searchprofile-images-tooltip": "Mololohe berkas",
+       "searchprofile-everything-tooltip": "Mololohe nga'amila tuwango situs (wolo halaman polo'iyalo)",
+       "searchprofile-advanced-tooltip": "Mololohu to huwali lo tanggulo biasa",
+       "search-result-size": "$1 ({{PLURAL:$2|1 tahe|$2 tahe}})",
+       "search-redirect": "(mopobale $1)",
+       "search-section": "(tayadu) $1",
+       "search-suggest": "Patujumu yito:$1",
+       "searchall": "nga'amila",
+       "search-showingresults": "{{PLURAL:$4|hASIL <strong>$1</strong> of <strong>$3</strong>|Hasil <strong>$1 - $2</strong> lonto <strong>$3</strong>}}",
+       "search-nonefound": "Diya'a hasili mohumayawa lo kriteria",
+       "mypreferences": "Preperensi",
+       "right-writeapi": "Mopohuna API moluladu",
+       "newuserlogpage": "Log ta ohu'uwo bohu",
+       "enhancedrc-history": "riwayati",
+       "recentchanges": "Boheli loboli'a mola",
+       "recentchanges-legend": "Tulawotolo boheli loboli'a mola",
+       "recentchanges-summary": "Mololohe u yilo'ubawa bohu to halaman wiki botiye.",
+       "recentchanges-label-newpage": "Momoli'a utiye mohutu halaman bohu",
+       "recentchanges-label-minor": "Utiye biloli'o ngo'idi",
+       "recentchanges-label-bot": "Lomoli'a utiye kilaraja lo bot",
+       "recentchanges-label-unpatrolled": "U biloli'a botiye diipo pilatroli",
+       "recentchanges-label-plusminus": "Loboli'o tu'udu halaman boti to delomo bita",
+       "recentchanges-legend-heading": "<strong>Keterangan:</strong>",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (bilohi olo [[Special:NewPages|list of new pages]])",
+       "rclistfrom": "Popobilohe u loboli'a lonto $2, $3",
+       "rcshowhideminor": "$1 biloli'o ngo'idi",
+       "rcshowhideminor-show": "Popobilohe",
+       "rcshowhideminor-hide": "Wanto'a",
+       "rcshowhidebots": "$1 bot",
+       "rcshowhidebots-show": "Popobilohe",
+       "rcshowhidebots-hide": "Wanto'a",
+       "rcshowhideliu": "$1 ta ohu'uwo to daputari",
+       "rcshowhideliu-hide": "Wanto'a",
+       "rcshowhideanons": "$1 biloli'o lo tawu weewo",
+       "rcshowhideanons-show": "Popobilohe",
+       "rcshowhideanons-hide": "Wanto'a",
+       "rcshowhidemine": "$1 biloli'u'u",
+       "rcshowhidemine-show": "Popobilohe",
+       "rcshowhidemine-hide": "Wanto'a",
+       "rclinks": "Popobilohe $1 u yilo'boli'a pulitiyo to delomo $2 dulahu pulitiyo<br />$3",
+       "diff": "ngopohiya",
+       "hist": "riwayati",
+       "hide": "Wanto'a",
+       "show": "Popobilohe",
+       "minoreditletter": "k",
+       "newpageletter": "B",
+       "boteditletter": "b",
+       "rc-change-size-new": "$1 {{PLURAL:$1|bita}} lapato biloli'o",
+       "recentchangeslinked": "Loboli'a wayitiyo",
+       "recentchangeslinked-toolbox": "Loboli'o wayitiyo",
+       "recentchangeslinked-title": "Loboli'a a'aayita wolo $1",
+       "recentchangeslinked-summary": "Utiye daputari lo'ubawa to halaman a'ayita wolo halaman tuwawu (meyalo tayadu to kategori tuwawu)\nHalaman to [[Special:Watchlist|he'awasiyamu]] ontonga <strong>cetakiya mohulodu</strong>.",
+       "recentchangeslinked-page": "Tanggulo halaman:",
+       "recentchangeslinked-to": "Poppobilohe loboli'a to halaman wayitiyo wolo halaman hepoposadiyalo",
+       "upload": "Detohe berkas",
+       "filedesc": "Limbu'o",
+       "license-header": "Tayadu lisensi",
+       "imgfile": "berkas",
+       "file-anchor-link": "Berkas",
+       "filehist": "Riwaayati lo berkas",
+       "filehist-help": "Klik to tanggal/wakutu momilohe berkas to saa'ati botiye.",
+       "filehist-current": "baharu",
+       "filehist-datetime": "Tanggal/Wakutu",
+       "filehist-thumb": "Kiki'o",
+       "filehist-thumbtext": "u kiki'o versi lo $1",
+       "filehist-user": "Ta ohu'uwo",
+       "filehist-dimensions": "Dimensi",
+       "filehist-comment": "Lo'iya",
+       "imagelinks": "Berkas u pilopohuna",
+       "linkstoimage": "{{PLURAL:$1|halaman lapatiyoma'o}} o wumbuta ode berkas botiye:",
+       "nolinkstoimage": "Diya'a halaman u owumbuta ode berkas botiye",
+       "sharedupload-desc-here": "Berkas botiye lonto $1 wawu hepohunaliyo to poroyek uweewo.\nDeskripsi lonto [$2 halaman deskripsiliyo] woluwo to tibawa botiya.",
+       "upload-disallowed-here": "Yi'o diila mowali modeehe berkas botiye",
+       "randompage": "Halaman totonula",
+       "nbytes": "$1 {{PLURAL:$1|bita}}",
+       "nmembers": "$1 {{PLURAL:$1|tuwango}}",
+       "newpages": "Halaman bohu",
+       "pager-older-n": "{{PLURAL:$1|$1 mohihewo}}",
+       "booksources": "Bungo buku",
+       "booksources-search-legend": "Lolohe to bungo lo buku",
+       "booksources-search": "Lolohe",
+       "log": "Log",
+       "allarticles": "Nga'amila halaman",
+       "allpagessubmit": "Ntali",
+       "categories": "Kategori",
+       "mywatchlist": "Daputari he'awasiyalo",
+       "watch": "Dahayi",
+       "dellogpage": "Log loluluto",
+       "rollbacklink": "wuwalinga",
+       "rollbacklinkcount": "pohuwalinga $1 {{PLURAL:$1|biloli'o}}",
+       "protectlogpage": "Log mopo'aamani",
+       "namespace": "Huwali lo tanggulo",
+       "invert": "Pohuwalinga tilulawoto",
+       "tooltip-invert": "Centang kotak botiye u mopowanto'o halaman yiloboli'a to delomo huwali lo tanggulo tilulawoto (wawu huwali lo tanggulo a'ayita wanu dicentang)",
+       "namespace_association": "Huwali lo tanggulo a'aayita",
+       "tooltip-namespace_association": "Centang halaman botiye u mopowayito huwali lo tanggulo lo'iyawa meyalo subjek u a'ayita wolo huwali lo tanggulo u tilulawoto.",
+       "blanknamespace": "Bungaliyo",
+       "contributions": "Kontribusi {{GENDER:$1|Ta ohu'uwo}}",
+       "mycontris": "Kontribusi",
+       "anoncontribs": "Kontribusi",
+       "month": "Lonto hulalo (wawu to'udiipo)",
+       "year": "Lonto taawunu (wawu to'udiipo)",
+       "whatlinkshere": "Wumbuta",
+       "whatlinkshere-title": "Halaman botiye o wumbuta ode \"$1\"",
+       "whatlinkshere-page": "Halaman",
+       "linkshere": "Halaman botiye woluwo wumbuta ode <strong>[[:$1]]<strong>:",
+       "isredirect": "halaman pilobaleyalo",
+       "istemplate": "tranklusi",
+       "isimage": "wumbuta lo berkas",
+       "whatlinkshere-prev": "{{PLURAL:$1|to'udiipo $1}}",
+       "whatlinkshere-next": "{{PLURAL:$1|lapatiyo $1}}",
+       "whatlinkshere-links": "← wumbuta",
+       "whatlinkshere-hideredirs": "$1 mopobale",
+       "whatlinkshere-hidetrans": "$1 tansklusi",
+       "whatlinkshere-hidelinks": "$1 wumbuta",
+       "whatlinkshere-filters": "U'ayahu",
+       "blocklink": "tangguwalo",
+       "contribslink": "kontrib",
+       "movelogpage": "Log piloheyiya",
+       "export": "Ekspor halaman",
+       "thumbnail-more": "Po'odamanga",
+       "tooltip-pt-userpage": "Halaman {{GENDER:|Yi'o ta ohu'uwo}}",
+       "tooltip-pt-mytalk": "Halaman {{GENDER:|posilitamu}}",
+       "tooltip-pt-preferences": "Preferensi{{GENDER:|Yi'o}}",
+       "tooltip-pt-watchlist": "Daputari halaman u he'awasiyalo",
+       "tooltip-pt-mycontris": "Daputari kontribusi {{GENDER:|Yi'o}}",
+       "tooltip-pt-login": "Yi'o popoyingowaliyo tumuwoto log, openu utiye ja wajibu",
+       "tooltip-pt-logout": "Lumuwalo log",
+       "tooltip-pt-createaccount": "Yi'o popoyingowaliyo mohutu akun wawu tumuwoto log; openu utiye ja wajibu",
+       "tooltip-ca-talk": "Tombilu tomimbihu tuwango halaman",
+       "tooltip-ca-edit": "Boli'a halaman botiye",
+       "tooltip-ca-addsection": "Mulai tayade bohu",
+       "tooltip-ca-viewsource": "Halaman botiye daha-daha. Yi'o bo mowali momilohe bungo",
+       "tooltip-ca-history": "Biloli'o pulitiyo to halaman botiye",
+       "tooltip-ca-move": "Heyiya halaman botiye",
+       "tooltip-ca-watch": "Popoduhengama'o halaman botiye to daputari he'awasiyalo",
+       "tooltip-search": "Lolohe {{SITENAME}}",
+       "tooltip-search-go": "Lolohe halaman tuwawu wolo tanggula delo odiye wonu woluwo",
+       "tooltip-search-fulltext": "Lolohe halaman o tulade odiye",
+       "tooltip-p-logo": "Bilohi halaman bungaliyo",
+       "tooltip-n-mainpage": "Bilohi halaman bungaliyo",
+       "tooltip-n-mainpage-description": "Bilohi halaman bungaliyo",
+       "tooltip-n-portal": "Tomimbihu poroyek, wolo u mowali pohutuwomu, to'utonu mololohe u tuwawu",
+       "tooltip-n-currentevents": "Lolohe habari tomimbihu u yilowali baharu",
+       "tooltip-n-recentchanges": "Daputari boheli loboli'a mola to delomo wiki botiye",
+       "tooltip-n-randompage": "Popobilohe totonula halaman",
+       "tooltip-n-help": "Taambati pololohela wubodu",
+       "tooltip-t-whatlinkshere": "Daputari nga'amila halaman wiki owumbuta ode halaman botiye",
+       "tooltip-t-recentchangeslinked": "Boheli loboli'a mola to halaman owumbuta ode halaman botiye",
+       "tooltip-feed-atom": "Paalo atom ode halaman botiya",
+       "tooltip-t-contributions": "Daputari kontribusi {{GENDER:$1|ta ohu'uwo botiye}}",
+       "tooltip-t-upload": "Detohe berkas-berkas",
+       "tooltip-t-specialpages": "Daputari nga'amila halaman spesial",
+       "tooltip-t-print": "Persi ciletaki halaman botiye",
+       "tooltip-t-permalink": "Wumbuta kakali u mopo'opiyohe halaman botiye",
+       "tooltip-ca-nstab-main": "Bilohi tuwango halaman",
+       "tooltip-ca-nstab-user": "Bilohi halaman pengguna",
+       "tooltip-ca-nstab-special": "Utiye halaman istimewa, wawu ja mowali boli'olo",
+       "tooltip-ca-nstab-project": "Bilohi halaman poroyek",
+       "tooltip-ca-nstab-image": "Bilohi berkas lo halaman",
+       "tooltip-ca-nstab-template": "Bilohi template",
+       "tooltip-ca-nstab-category": "Bilohi kategori halaman",
+       "tooltip-save": "Tahuwa u biloli'umu",
+       "tooltip-preview": "Bilohipo u biloli'umu. Popopasiya utiye to'u diipo molahu.",
+       "tooltip-diff": "Bilohi u loboli'o pilohutumu",
+       "tooltip-rollback": "\"Wuwalingo\" lopobatali u pilo'opiyohu to halaman botiye ode kontributor pulitiyo pe'enta lo klik.",
+       "tooltip-undo": "\"wuwalingo\" lopobatali u biloli'a botiye wawu lomu'o kotak momoli'o wolo mode pratayang. Alasani mowali duhengalo to kotak limbu-limbu'o.",
+       "tooltip-summary": "Tuwota tulade limbu-limbu'o",
+       "simpleantispam-label": "Momarakisa anti-spam.\n<strong>kekeya</strong> tuwangalo!",
+       "pageinfo-toolboxlink": "Halaman habari",
+       "previousdiff": "← Biloli'o to'udiipo",
+       "nextdiff": "Biloli'o lapatiyoma'o →",
+       "file-info-size": "$1 x $2 piksel, tu'udu berkas:$3, MIME tipe: $4",
+       "file-nohires": "Diya'a resolusi damango",
+       "svg-long-desc": "Berkas SGV, nominal $1 x $2 piksel, damango berkas:$3",
+       "show-big-image": "Berkas asli",
+       "show-big-image-preview": "Tu'udu lo'u diipo mopobilohu: $1",
+       "show-big-image-other": "{{PLURAL:$2|resolusi}} uweewo:$1",
+       "show-big-image-size": "$1 x $2 piksel",
+       "metadata": "Metadata",
+       "metadata-help": "Berkas botiya otuwa habari duhengiyo u kira lonto kamera digital meyalo pemindai u pilokalaja meyalo mendigitalisasi berkas.\nWonu berkas botiye ma yiloboli'a, katarangani u woluwo kira ja mopopatato dudutu lo habari lo teekeni u ma yiloboli'a botiye.",
+       "metadata-fields": "Tanggalo metadata lo gambari to tahuli ma popotuwotolo to bibilohu halaman gambari to'u tabel metadata po'okiki'olo.\nData uweewo ma wanto'olo odelo dudelo.\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": "Orientasi",
+       "exif-xresolution": "Resolusi bula-bulawahu",
+       "exif-yresolution": "Resolusi bula-bulalingo",
+       "exif-datetime": "Tanggal wawu wakutu lomoli'o berkas",
+       "exif-make": "Pabiriki lo kamera",
+       "exif-model": "Model lo kamera",
+       "exif-software": "Pilakasi moluluhi'o",
+       "exif-exifversion": "Versi exif",
+       "exif-colorspace": "Ruang lo laku",
+       "exif-datetimeoriginal": "Tanggal wawu wakutu pilohutuwa data",
+       "exif-datetimedigitized": "Tanggal wawu wakutu digitalisassi",
+       "exif-orientation-1": "Normal",
+       "namespacesall": "nga'amila",
+       "monthsall": "nga'amila",
+       "signature": "[[{{ns:user}}:$1|$2]]\n([[{{ns:user_talk}}:$1|bisala]])",
+       "specialpages": "Halaman Spesial",
+       "tag-filter": "[[Special:Tags|Tag]]filter:",
+       "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Tag}}]]: $2)",
+       "logentry-delete-delete": "$1 {{GENDER:$2|moluluto}}halaman $3",
+       "logentry-move-move": "$1 {{GENDER:$2|moheyi}} halaman $3 ode $4",
+       "logentry-newusers-create": "Ta ohu'uwo akun $1 {{GENDER:$2|mohutu}}",
+       "logentry-upload-upload": "$1 {{GENDER:$2|mengunggah}} $3",
+       "searchsuggest-search": "Lolohe"
+}
index 2e12a73..e4444d9 100644 (file)
        "versionrequired": "મીડીયાવિકિનું $1 સંસ્કરણ જરૂરી",
        "versionrequiredtext": "આ પાનાના વપરાશ માટે મીડિયાવિકિનું $1 સંસ્કરણ જરૂરી.\n\nજુઓ [[Special:Version|સંસ્કરણ પાનું]].",
        "ok": "મંજૂર",
-       "retrievedfrom": "\"$1\"થી લીધેલું",
+       "retrievedfrom": "\"$1\" થી મેળવેલ",
        "youhavenewmessages": "{{PLURAL:$3|તમારી પાસે}} $1 ($2).",
        "youhavenewmessagesfromusers": "આપને માટે {{PLURAL:$3|અન્ય સભ્ય|$3 અન્ય સભ્યો}} તરફથી $1 છે. ($2).",
        "youhavenewmessagesmanyusers": "આપને માટે ઘણાં સભ્યો તરફથી $1 છે ($2).",
        "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..38051bd 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": "הצגת תצוגה מקדימה בעריכה הראשונה",
        "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 ×\9c×\9eשת×\9eש×\99×\9d ×\90×\97רים",
-       "tog-diffonly": "×\91×\99×\98×\95×\9c ×\94צ×\92ת ×ª×\95×\9b×\9f ×\94×\93×£ ×\9eת×\97ת ×\9c×\94ש×\95×\95×\90ת הגרסאות",
+       "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ת}} ×\9c×\9eשת×\9eשים",
+       "tog-diffonly": "×\9c×\90 ×\9c×\94צ×\99×\92 ×\90ת ×ª×\95×\9b×\9f ×\94×\93×£ ×\9eת×\97ת ×\9c×\94×\91×\93×\9c×\99×\9d ×\91×\99×\9f הגרסאות",
        "tog-showhiddencats": "הצגת קטגוריות מוסתרות",
        "tog-norollbackdiff": "לא להציג את ההבדלים בין הגרסאות לאחר ביצוע שחזור",
        "tog-useeditwarning": "הצגת אזהרה בעת עזיבת דף עריכה עם שינויים שטרם נשמרו",
        "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)",
        "navigation": "ניווט",
        "and": "&#32;וגם",
        "qbfind": "חיפוש",
-       "qbbrowse": "×\93פ×\93×\95×£",
+       "qbbrowse": "× ×\99×\95×\95×\98",
        "qbedit": "עריכה",
        "qbpageoptions": "אפשרויות דף",
        "qbmyoptions": "האפשרויות שלי",
        "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": "הזנה:",
        "filenotfound": "הקובץ \"$1\" לא נמצא.",
        "unexpected": "ערך לא צפוי: \"$1\"=\"$2\"",
        "formerror": "שגיאה: לא ניתן היה לשלוח את הטופס.",
-       "badarticleerror": "×\9c×\90 × ×\99ת×\9f ×\9c×\91צע ×¤×¢×\95×\9c×\94 ×\96×\95 בדף זה.",
+       "badarticleerror": "×\9c×\90 × ×\99ת×\9f ×\9c×\91צע ×\90ת ×\94פע×\95×\9c×\94 ×\94×\96×\90ת בדף זה.",
        "cannotdelete": "לא ניתן היה למחוק את הדף או הקובץ \"$1\".\nייתכן שהוא כבר נמחק על־ידי משתמש אחר.",
        "cannotdelete-title": "לא ניתן למחוק את הדף \"$1\"",
        "delete-hook-aborted": "המחיקה הופסקה על־ידי מבנה Hook.\nלא ניתן הסבר.",
        "protectedpagetext": "דף זה מוגן כדי למנוע עריכה ופעולות אחרות.",
        "viewsourcetext": "באפשרותכם לצפות בטקסט המקור של הדף ולהעתיקו.",
        "viewyourtext": "באפשרותך לצפות בטקסט המקור של <strong>העריכות שלך</strong> בדף הזה ולהעתיקו.",
-       "protectedinterface": "×\93×£ ×\96×\94 ×\94×\95×\90 ×\90×\97×\93 ×\9eס×\93רת ×\93פ×\99×\9d ×\94×\9eספק×\99×\9d ×\94×\95×\93×¢×\95ת ×\9eער×\9bת ×\9cת×\95×\9b× ×\94 ×\91×\90תר ×\95×\99ק×\99 ×\96×\94, ×\95×\9e×\95×\92×\9f ×\9b×\93×\99 ×\9c×\9e× ×\95×¢ ×\94ש×\97ת×\95ת.\n×\9b×\93×\99 ×\9c×\94×\95ס×\99×£ ×\90×\95 ×\9cשנ×\95ת ×ª×¨×\92×\95×\9e×\99×\9d ×\91×\9b×\9c ×\90תר×\99 ×\94×\95×\95×\99ק×\99, ×\90× ×\90 ×\94שת×\9eש×\95 ב־[//translatewiki.net/ translatewiki.net], פרויקט התרגום של מדיה־ויקי.",
-       "editinginterface": "<strong>אזהרה:</strong> הדף שאתם עורכים הוא אחד הדפים המספקים הודעות מערכת לתוכנה.\nשינויים בדף זה ישפיעו על תצוגת ממשק המשתמש של משתמשים אחרים באתר ויקי זה.",
-       "translateinterface": "כדי להוסיף או לשנות תרגומים עבור כל אתרי הוויקי, יש להשתמש ב־[//translatewiki.net/ translatewiki.net], פרויקט התרגום של מדיה־ויקי.",
+       "protectedinterface": "×\93×£ ×\96×\94 ×\94×\95×\90 ×\90×\97×\93 ×\9eס×\93רת ×\93פ×\99×\9d ×\94×\9eספק×\99×\9d ×\94×\95×\93×¢×\95ת ×\9eער×\9bת ×\9cת×\95×\9b× ×\94 ×©×\9eפע×\99×\9c×\94 ×\90ת {{SITENAME}}, ×\95×\94×\95×\90 ×\9e×\95×\92×\9f ×\9b×\93×\99 ×\9c×\9e× ×\95×¢ ×\94ש×\97ת×\95ת.\n×\9b×\93×\99 ×\9c×\94×\95ס×\99×£ ×\90×\95 ×\9cשנ×\95ת ×ª×¨×\92×\95×\9e×\99×\9d ×©×\9c ×\94×\95×\93×¢×\95ת ×\9eער×\9bת ×¢×\91×\95ר ×\9b×\9c ×\90תר×\99 ×\94×\95×\95×\99ק×\99, ×\99ש ×\9c×\94שת×\9eש ב־[//translatewiki.net/ translatewiki.net], פרויקט התרגום של מדיה־ויקי.",
+       "editinginterface": "<strong>אזהרה:</strong> הדף ש{{GENDER:|אתה עורך|את עורכת|אתם עורכים}} הוא אחד הדפים המספקים הודעות מערכת לתוכנה שמפעילה את {{SITENAME}}.\nשינויים בדף הזה ישפיעו על תצוגת ממשק המשתמש של משתמשים אחרים באתר.",
+       "translateinterface": "×\9b×\93×\99 ×\9c×\94×\95ס×\99×£ ×\90×\95 ×\9cשנ×\95ת ×ª×¨×\92×\95×\9e×\99×\9d ×©×\9c ×\94×\95×\93×¢×\95ת ×\9eער×\9bת ×¢×\91×\95ר ×\9b×\9c ×\90תר×\99 ×\94×\95×\95×\99ק×\99, ×\99ש ×\9c×\94שת×\9eש ×\91Ö¾[//translatewiki.net/ translatewiki.net], ×¤×¨×\95×\99ק×\98 ×\94תר×\92×\95×\9d ×©×\9c ×\9e×\93×\99×\94Ö¾×\95×\99ק×\99.",
        "cascadeprotected": "דף זה מוגן מעריכה כי הוא מוכלל {{PLURAL:$1|בדף הבא, שמופעלת עליו|בדפים הבאים, שמופעלת עליהם}} הגנה מדורגת:\n$2",
        "namespaceprotected": "אין לך הרשאה לערוך דפים במרחב השם <strong>$1</strong>.",
        "customcssprotected": "אינך מורשה לערוך דף CSS זה כיוון שהוא כולל הגדרות אישיות של משתמש אחר.",
        "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|דף|דפים}}",
        "badretype": "הסיסמאות שהזנת אינן מתאימות.",
        "usernameinprogress": "יצירת חשבון עבור שם המשתמש הזה כבר התחילה.\nנא להמתין.",
        "userexists": "שם המשתמש שבחרתם כבר נמצא בשימוש.\nאנא בחרו שם אחר.",
-       "loginerror": "ש×\92×\99×\90×\94 ×\91×\9b× ×\99ס×\94 ×\9c×\90תר",
+       "loginerror": "ש×\92×\99×\90×\94 ×\91×\9b× ×\99ס×\94 ×\9c×\97ש×\91×\95×\9f",
        "createacct-error": "שגיאה ביצירת חשבון",
        "createaccounterror": "לא ניתן היה ליצור את החשבון: $1",
-       "nocookiesnew": "חשבון המשתמש שלכם נוצר, אך לא נכנסתם כמשתמשים רשומים.\nכדי להכניס משתמשים למערכת עושה {{SITENAME}} שימוש בעוגיות.\nבדפדפן שלכם העוגיות מבוטלות.\nאנא הפעילו אותן מחדש, ולאחר מכן תוכלו להיכנס למערכת עם שם המשתמש והסיסמה החדשים שלכם.",
-       "nocookieslogin": "{{SITENAME}} משתמש בעוגיות כדי להכניס משתמשים למערכת.\nבדפדפן שלכם העוגיות מבוטלות.\nאנא הפעילו אותן מחדש ונסו שוב.",
-       "nocookiesfornew": "חשבון המשתמש לא נוצר, כיוון שלא יכולנו לוודא את מקורו.\nודאו שהעוגיות מופעלות בדפדפן שלכם, העלו מחדש דף זה ונסו שוב.",
-       "noname": "לא הכנסת שם משתמש תקין",
+       "nocookiesnew": "החשבון שלך נוצר, אבל לא נכנסת לחשבון.\n{{SITENAME}} עושה שימוש בעוגיות (cookies) כדי להכניס משתמשים למערכת.\nבדפדפן שלך העוגיות מבוטלות.\nיש להפעיל אותן, ורק לאחר מכן להיכנס לחשבון עם שם המשתמש והסיסמה שלך.",
+       "nocookieslogin": "{{SITENAME}} עושה שימוש בעוגיות (cookies) כדי להכניס משתמשים למערכת.\nבדפדפן שלך העוגיות מבוטלות.\nיש להפעיל אותן ולאחר מכן לנסות שוב.",
+       "nocookiesfornew": "חשבון המשתמש לא נוצר, משום שלא יכולנו לאמת את המקור שלו.\nנא לוודא שהעוגיות (cookies) בדפדפן שלך מופעלות, ורק לאחר מכן לטעון מחדש את הדף הזה ולנסות שוב.",
+       "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": "×\94ס×\99ס×\9e×\94 ×©×\94ק×\9c×\93ת×\9d ×©×\92×\95×\99×\94.\n×\90× ×\90 × ×¡×\95 שוב.",
-       "wrongpasswordempty": "×\94ס×\99ס×\9e×\94 ×©×\94ק×\9c×\93ת×\9d ×¨×\99ק×\94.\n×\90× ×\90 × ×¡×\95 שוב.",
+       "wrongpassword": "×\94ס×\99ס×\9e×\94 ×©×\94×\96נת ×©×\92×\95×\99×\94.\n× ×\90 ×\9cנס×\95ת שוב.",
+       "wrongpasswordempty": "×\94ס×\99ס×\9e×\94 ×©×\94×\96נת ×¨×\99ק×\94.\n× ×\90 ×\9cנס×\95ת שוב.",
        "passwordtooshort": "סיסמאות חייבות להיות באורך {{PLURAL:$1|תו אחד|$1 תווים}} לפחות.",
        "passwordtoolong": "סיסמאות אינן יכולות להיות ארוכות {{PLURAL:$1|מתו אחד|מ־$1 תווים}}.",
        "passwordtoopopular": "לא ניתן להשתמש בסיסמאות נפוצות. יש לבחור סיסמה ייחודית יותר.",
        "login-migrated-generic": "חשבון המשתמש שלך הועבר, ושם המשתמש שלך כבר לא קיים באתר ויקי זה.",
        "loginlanguagelabel": "שפה: $1",
        "suspicious-userlogout": "בקשתך לצאת מהחשבון נדחתה כיוון שנראה שהיא נשלחה על־ידי דפדפן שבור או שרת פרוקסי עם זיכרון מטמון.",
-       "createacct-another-realname-tip": "×\94ש×\9d ×\94×\90×\9e×\99ת×\99 ×\94×\95×\90 ×\90×\95פצ×\99×\95× ×\90×\9c×\99.\n×\90×\9d ×ª×\91×\97ר×\95 ×\9cספק×\95, ×\94×\95×\90 ×\99ש×\9eש ×\9c×\99×\99×\97×\95ס ×¢×\91×\95×\93ת ×\94×\9eשת×\9eש ×\90×\9c×\99×\95.",
+       "createacct-another-realname-tip": "×\9c×\90 ×\97×\95×\91×\94 ×\9c×\9e×\9c×\90 ×\90ת ×\94ש×\9d ×\94×\90×\9e×\99ת×\99.\n×\90×\9d ×¡×\95פק, ×\94×\95×\90 ×¢×©×\95×\99 ×\9cש×\9eש ×\9b×\93×\99 ×\9c×\99×\99×\97ס ×\9c×\9a ×\90ת ×¢×\91×\95×\93ת×\9a.",
        "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": "יש להקליד את הסיסמה שלך כדי לאשר את השינוי.",
        "accmailtitle": "הסיסמה נשלחה",
        "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|היכנסו לחשבון]] כדי להימנע מבלבול עתידי עם משתמשים אנונימיים נוספים.",
+       "newarticletext": "{{GENDER:|הגעת|הגעת|הגעתם}} לדף שעדיין אינו קיים.\nכדי ליצור את הדף הזה, {{GENDER:|התחל|התחילי|התחילו}} להקליד בתיבת הטקסט שלמטה ({{GENDER:|ראה|ראי|ראו}} את [$1 דף העזרה] למידע נוסף).\nאם {{GENDER:|הגעת|הגעת|הגעתם}} לכאן בטעות, {{GENDER:|לחץ|לחצי|לחצו}} על כפתור ה<strong>חזרה</strong> (Back) בדפדפן {{GENDER:|שלך|שלך|שלכם}}.",
+       "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}}}} יומן המחיקות].",
-       "userpage-userdoesnotexist": "×\97ש×\91×\95×\9f ×\94×\9eשת×\9eש \"$1\" ×\90×\99× ×\95 ×¨×©×\95×\9d.\n×\90× ×\90 ×\91Ö´×\93ק×\95 ×\90×\9d ×\91רצ×\95× ×\9b×\9d ליצור/לערוך את הדף הזה.",
+       "missing-revision": "גרסה #$1 של הדף \"{{FULLPAGENAME}}\" אינה קיימת.\n\nזה נגרם בדרך־כלל עקב לחיצה על קישור ישן לגרסה של דף שנמחק.\nאפשר למצוא פרטים ב[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} יומן המחיקות].",
+       "userpage-userdoesnotexist": "×\97ש×\91×\95×\9f ×\94×\9eשת×\9eש \"$1\" ×\90×\99× ×\95 ×¨×©×\95×\9d.\n× ×\90 ×\9c×\91×\93×\95ק ×\90×\9d ×\91רצ×\95× ×\9a ליצור/לערוך את הדף הזה.",
        "userpage-userdoesnotexist-view": "חשבון המשתמש \"$1\" אינו רשום.",
        "blocked-notice-logextract": "{{GENDER:$1|המשתמש הזה חסום|המשתמשת הזו חסומה}} כרגע.\nהפעולה האחרונה ביומן החסימות מוצגת להלן:",
        "clearyourcache": "<strong>הערה:</strong> לאחר השמירה, ייתכן שיהיה צורך לנקות את זיכרון המטמון (cache) של הדפדפן כדי להבחין בשינויים.\n* <strong>פיירפוקס / ספארי:</strong> להחזיק את המקש <em>Shift</em> בעת לחיצה על <strong>טעינה מחדש</strong> (Reload), או ללחוץ על צירוף המקשים <em>Ctrl-F5</em> או <em>Ctrl-R</em> (במחשב מק: <em dir=\"ltr\">⌘-R</em>)\n* <strong>גוגל כרום:</strong> ללחוץ על צירוף המקשים <em>Ctrl-Shift-R</em> (במחשב מק: <em dir=\"ltr\">⌘-Shift-R</em>)\n* <strong>אינטרנט אקספלורר:</strong> ללחוץ ולהחזיק את המקש <em>Ctrl</em> בעת לחיצה על <strong>רענן</strong> (Refresh), או ללחוץ על צירוף המקשים <em>Ctrl-F5</em>\n* <strong>אופרה:</strong> לפתוח <em>תפריט ← הגדרות</em> (במחשב מק <em>Opera ← העדפות</em>) ואז ללחוץ על <em>פרטיות ואבטחה ← מחק היסטוריית גלישה ← Cached images and files</em>.",
        "userinvalidcssjstitle": "'''אזהרה:''' העיצוב \"$1\" אינו קיים.\nדפי .css ו־.js מותאמים אישית משתמשים בכותרת עם אותיות קטנות – למשל, {{ns:user}}:דוגמה/vector.css ולא {{ns:user}}:דוגמה/Vector.css.",
        "updated": "(מעודכן)",
        "note": "'''הערה:'''",
-       "previewnote": "<strong>זִכרו שזו רק תצוגה מקדימה.</strong>\nהשינויים שלכם עדיין לא נשמרו!",
+       "previewnote": "<strong>{{GENDER:|זכור|זִכרי|זִכרו}} שזו רק תצוגה מקדימה.</strong>\nהשינויים {{GENDER:|שלך|שלך|שלכם}} עדיין לא נשמרו!",
        "continue-editing": "מעבר לאזור העריכה",
        "previewconflict": "תצוגה מקדימה זו מציגה כיצד ייראה הטקסט בחלון העריכה העליון, אם תבחרו לשמור אותו.",
        "session_fail_preview": "מצטערים! לא ניתן לבצע את עריכתכם עקב אובדן מידע הכניסה.\n\nייתכן שנותקתם מהחשבון. <strong>אנא ודאו שאתם עדיין מחוברים לחשבון ונסו שוב.</strong>\nאם זה עדיין לא עובד, נסו [[Special:UserLogout|לצאת מהחשבון]] ולהיכנס אליו שנית, וודאו שהדפדפן שלכם מאפשר קבלת עוגיות מאתר זה.",
        "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 (פסקה חדשה)",
+       "edit_form_incomplete": "<strong>חלקים מסוימים מטופס העריכה לא הגיעו לשרת; אנא {{GENDER:|בדוק|בִדקי|בִדקו}} שהעריכה לא נפגעה ו{{GENDER:|נסה|נסי|נסו}} שוב.</strong>",
+       "editing": "עריכת הדף \"$1\"",
+       "creating": "יצירת הדף \"$1\"",
+       "editingsection": "עריכת הדף \"$1\" (פסקה)",
+       "editingcomment": "עריכת הדף \"$1\" (פסקה חדשה)",
        "editconflict": "התנגשות עריכה: $1",
        "explainconflict": "משתמש אחר שינה את הדף מאז שהתחלתם לערוך אותו.\nחלון העריכה העליון מציג את הטקסט בדף כפי שהוא כרגע.\nהשינויים שלכם מוצגים בחלון העריכה התחתון.\nעליכם למזג את השינויים שלכם לתוך הטקסט הקיים.\n<strong>רק</strong> הטקסט בחלון העריכה העליון יישמר כשתלחצו על \"{{int:savearticle}}\".",
        "yourtext": "הטקסט שלך",
        "content-failed-to-parse": "פענוח $2 כתוכן מסוג $1 נכשל: $3",
        "invalid-content-data": "מידע שגוי על התוכן",
        "content-not-allowed-here": "תוכן מסוג \"$1\" אינו מותר בדף [[$2]]",
-       "editwarning-warning": "×¢×\96×\99×\91ת ×\93×£ ×\96×\94 ×¢×©×\95×\99×\94 ×\9c×\92ר×\95×\9d ×\9c×\90×\95×\91×\93×\9f ×\9b×\9c ×\94ש×\99× ×\95×\99×\99×\9d ×©×\91×\99צעת×\9d.\n×\90×\9d ×\90ת×\9d ×\9e×\97×\95×\91ר×\99×\9d ×\9c×\97ש×\91×\95×\9f, ×ª×\95×\9b×\9c×\95 ×\9c×\91×\98×\9c ×\90×\96×\94ר×\94 ×\96×\95 ×\91×\97×\9cק \"{{int:prefs-editing}}\" ×©×\91×\94×¢×\93פ×\95ת ×©×\9c×\9b×\9d.",
+       "editwarning-warning": "×¢×\96×\99×\91ת ×\94×\93×£ ×\94×\96×\94 ×¢×\9c×\95×\9c×\94 ×\9c×\92ר×\95×\9d ×\9c×\9a ×\9c×\90×\91×\93 ×\90ת ×\9b×\9c ×\94ש×\99× ×\95×\99×\99×\9d ×©×\91×\99צעת. ×\90×\9d ×\99ש ×\9c×\9a ×\97ש×\91×\95×\9f ×\91×\90תר, ×\91×\90פשר×\95ת×\9a ×\9c×\91×\98×\9c ×\90ת ×\94×\90×\96×\94ר×\94 ×\94×\96×\90ת ×\91×\97×\9cק \"{{int:prefs-editing}}\" ×©×\91×\94×¢×\93פ×\95ת ×©×\9c×\9a.",
        "editpage-notsupportedcontentformat-title": "סוג התוכן אינו נתמך",
        "editpage-notsupportedcontentformat-text": "תוכן מסוג $1 אינו נתמך על־ידי מודל התוכן $2.",
        "content-model-wikitext": "קוד ויקי",
        "parser-unstrip-loop-warning": "נמצאה לולאה בפריסה",
        "parser-unstrip-recursion-limit": "עומק הרקורסיה של הפריסה עבר את המגבלה ($1)",
        "converter-manual-rule-error": "התגלתה שגיאה בכלל המרת שפה ידני",
-       "undo-success": "ניתן לבטל את העריכה.\nאנא בִּדקו את השוואת הגרסאות למטה כדי לוודא שזה אכן מה שאתם רוצים לעשות, ואז שִׁמרו את השינויים למטה כדי לסיים את ביטול העריכה.",
+       "undo-success": "ניתן לבטל את העריכה.\nאנא {{GENDER:|בדוק|בִדקי|בִדקו}} את השוואת הגרסאות שלהלן כדי לוודא שזה אכן מה ש{{GENDER:|אתה רוצה|את רוצה|אתם רוצים}} לעשות, ולאחר מכן {{GENDER:|שמור|שִמרי|שִמרו}} את השינויים למטה כדי לסיים את ביטול העריכה.",
        "undo-failure": "לא ניתן היה לבטל את העריכה עקב התנגשות עם עריכות מאוחרות יותר.",
        "undo-norev": "לא ניתן היה לבטל את העריכה כי היא אינה קיימת או כי היא נמחקה.",
        "undo-nochange": "נראה שהעריכה כבר בוטלה.",
        "history-feed-item-nocomment": "$1 ב־$2",
        "history-feed-empty": "הדף המבוקש לא נמצא.\nייתכן שהוא נמחק, או ששמו שונה.\nבאפשרותך לנסות [[Special:Search|לחפש]] דפים רלוונטיים חדשים.",
        "history-edit-tags": "עריכת התגיות של הגרסאות שנבחרו",
-       "rev-deleted-comment": "(תקציר העריכה הוסר)",
-       "rev-deleted-user": "(שם המשתמש הוסר)",
-       "rev-deleted-event": "(פר×\98×\99×\9d ×\9e×\94×\99×\95×\9e×\9f ×\94×\95סר×\95)",
-       "rev-deleted-user-contribs": "[שם המשתמש או כתובת ה־IP הוסרו – העריכה הוסתרה מדף התרומות]",
-       "rev-deleted-text-permission": "×\92רסת ×\94×\93×£ ×\94×\96×\90ת <strong>× ×\9e×\97ק×\94</strong>.\n× ×\99ת×\9f ×\9c×\9eצ×\95×\90 ×¤×¨×\98×\99×\9d ×¢×\9c ×\9b×\9a ב[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} יומן המחיקות].",
-       "rev-suppressed-text-permission": "×\92רסת ×\94×\93×£ ×\94×\96×\90ת <strong>×\94×\95×¢×\9c×\9e×\94</strong>.\n× ×\99ת×\9f ×\9c×\9eצ×\95×\90 ×¤×¨×\98×\99×\9d ×¢×\9c ×\9b×\9a ב[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} יומן ההעלמות].",
-       "rev-deleted-text-unhide": "×\92רסת ×\94×\93×£ ×\94×\96×\90ת <strong>× ×\9e×\97ק×\94</strong>.\n× ×\99ת×\9f ×\9c×\9eצ×\95×\90 ×¤×¨×\98×\99×\9d ×¢×\9c ×\9b×\9a ×\91[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ×\99×\95×\9e×\9f ×\94×\9e×\97×\99ק×\95ת].\n×\90ת×\9d ×¢×\93×\99×\99×\9f ×\99×\9b×\95×\9c×\99×\9d [$1 ×\9cצפ×\95ת ×\91×\92רס×\94 ×\94×\96×\90ת] ×\90×\9d ×\91רצ×\95× ×\9b×\9d להמשיך.",
-       "rev-suppressed-text-unhide": "×\92רסת ×\94×\93×£ ×\94×\96×\90ת <strong>×\94×\95×¢×\9c×\9e×\94</strong>.\n× ×\99ת×\9f ×\9c×\9eצ×\95×\90 ×¤×¨×\98×\99×\9d ×¢×\9c ×\9b×\9a ×\91[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} ×\99×\95×\9e×\9f ×\94×\94×¢×\9c×\9e×\95ת].\n×\90ת×\9d ×¢×\93×\99×\99×\9f ×\99×\9b×\95×\9c×\99×\9d [$1 ×\9cצפ×\95ת ×\91×\92רס×\94 ×\94×\96×\90ת] ×\90×\9d ×\91רצ×\95× ×\9b×\9d להמשיך.",
-       "rev-deleted-text-view": "×\92רסת ×\94×\93×£ ×\94×\96×\90ת <strong>× ×\9e×\97ק×\94</strong>.\n×\90ת×\9d ×\99×\9b×\95×\9c×\99×\9d ×\9cצפ×\95ת ×\91×\94; × ×\99ת×\9f ×\9c×\9eצ×\95×\90 ×¤×¨×\98×\99×\9d ×¢×\9c ×\9b×\9a ב[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} יומן המחיקות].",
-       "rev-suppressed-text-view": "×\92רסת ×\94×\93×£ ×\94×\96×\90ת <strong>×\94×\95×¢×\9c×\9e×\94</strong>.\n×\90ת×\9d ×\99×\9b×\95×\9c×\99×\9d ×\9cצפ×\95ת ×\91×\94; × ×\99ת×\9f ×\9c×\9eצ×\95×\90 ×¤×¨×\98×\99×\9d ×¢×\9c ×\9b×\9a ב[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} יומן ההעלמות].",
-       "rev-deleted-no-diff": "×\90×\99× ×\9b×\9d ×\99×\9b×\95×\9c×\99×\9d ×\9cצפ×\95ת ×\91×\94×\91×\93×\9c×\99×\9d ×\91×\99×\9f ×\94×\92רס×\90×\95ת ×©×¦×\99×\99נת×\9d ×\9eש×\95×\9d ×©×\90×\97ת ×\9e×\94×\9f '''× ×\9e×\97ק×\94'''.\n× ×\99ת×\9f ×\9c×\9eצ×\95×\90 ×¤×¨×\98×\99×\9d ×¢×\9c ×\9b×\9a ב[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} יומן המחיקות].",
-       "rev-suppressed-no-diff": "×\90×\99× ×\9b×\9d ×\99×\9b×\95×\9c×\99×\9d ×\9cצפ×\95ת ×\91×\94×\91×\93×\9c×\99×\9d ×\91×\99×\9f ×\94×\92רס×\90×\95ת ×©×¦×\99×\99נת×\9d ×\9eש×\95×\9d ×©×\90×\97ת ×\9e×\94×\9f '''× ×\9e×\97ק×\94'''.",
-       "rev-deleted-unhide-diff": "אחת מהגרסאות שביקשתם להשוות '''נמחקה'''.\nניתן למצוא פרטים על כך ב[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} יומן המחיקות].\nאתם עדיין יכולים [$1 לצפות בהבדלים בין הגרסאות] אם ברצונכם להמשיך.",
-       "rev-suppressed-unhide-diff": "אחת מהגרסאות שביקשתם להשוות <strong>הועלמה</strong>.\nניתן למצוא פרטים על כך ב[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} יומן ההעלמות].\nאתם עדיין יכולים [$1 לצפות בהבדלים בין הגרסאות] אם ברצונכם להמשיך.",
-       "rev-deleted-diff-view": "אחת מהגרסאות שביקשתם להשוות '''נמחקה'''.\nאתם עדיין יכולים לצפות בהבדלים בין הגרסאות; ניתן למצוא פרטים על כך ב[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} יומן המחיקות].",
-       "rev-suppressed-diff-view": "אחת מהגרסאות שביקשתם להשוות <strong>הועלמה</strong>.\nאתם יכולים לצפות בהבדלים בין הגרסאות; ניתן למצוא פרטים על כך ב[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} יומן ההעלמות].",
+       "rev-deleted-comment": "(תקצ×\99ר ×\94ער×\99×\9b×\94 ×\94×\95סתר)",
+       "rev-deleted-user": "(ש×\9d ×\94×\9eשת×\9eש ×\94×\95סתר)",
+       "rev-deleted-event": "(פע×\95×\9cת ×\94×\99×\95×\9e×\9f ×\94×\95סתר×\94)",
+       "rev-deleted-user-contribs": "[ש×\9d ×\94×\9eשת×\9eש ×\90×\95 ×\9bת×\95×\91ת ×\94Ö¾IP ×\94×\95סתר×\95 â\80\93 ×\94ער×\99×\9b×\94 ×\94×\95סתר×\94 ×\9e×\93×£ ×\94תר×\95×\9e×\95ת]",
+       "rev-deleted-text-permission": "×\92רס×\94 ×\96×\95 ×©×\9c ×\94×\93×£ <strong>×\94×\95סתר×\94</strong>.\n× ×\99ת×\9f ×\9c×\9eצ×\95×\90 ×¤×¨×\98×\99×\9d ב[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} יומן המחיקות].",
+       "rev-suppressed-text-permission": "×\92רס×\94 ×\96×\95 ×©×\9c ×\94×\93×£ <strong>×\94×\95×¢×\9c×\9e×\94</strong>.\n× ×\99ת×\9f ×\9c×\9eצ×\95×\90 ×¤×¨×\98×\99×\9d ב[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} יומן ההעלמות].",
+       "rev-deleted-text-unhide": "×\92רס×\94 ×\96×\95 ×©×\9c ×\94×\93×£ <strong>×\94×\95סתר×\94</strong>.\n× ×\99ת×\9f ×\9c×\9eצ×\95×\90 ×¤×¨×\98×\99×\9d ×\91[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ×\99×\95×\9e×\9f ×\94×\9e×\97×\99ק×\95ת].\n×¢×\93×\99×\99×\9f ×\91×\90פשר×\95ת×\9a [$1 ×\9cצפ×\95ת ×\91×\92רס×\94 ×\94×\96×\90ת] ×\90×\9d ×\91רצ×\95× ×\9a להמשיך.",
+       "rev-suppressed-text-unhide": "×\92רס×\94 ×\96×\95 ×©×\9c ×\94×\93×£ <strong>×\94×\95×¢×\9c×\9e×\94</strong>.\n× ×\99ת×\9f ×\9c×\9eצ×\95×\90 ×¤×¨×\98×\99×\9d ×\91[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} ×\99×\95×\9e×\9f ×\94×\94×¢×\9c×\9e×\95ת].\n×¢×\93×\99×\99×\9f ×\91×\90פשר×\95ת×\9a [$1 ×\9cצפ×\95ת ×\91×\92רס×\94 ×\94×\96×\90ת] ×\90×\9d ×\91רצ×\95× ×\9a להמשיך.",
+       "rev-deleted-text-view": "×\92רס×\94 ×\96×\95 ×©×\9c ×\94×\93×£ <strong>×\94×\95סתר×\94</strong>.\n×¢×\93×\99×\99×\9f ×\91×\90פשר×\95ת×\9a ×\9cצפ×\95ת ×\91×\94; × ×\99ת×\9f ×\9c×\9eצ×\95×\90 ×¤×¨×\98×\99×\9d ב[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} יומן המחיקות].",
+       "rev-suppressed-text-view": "×\92רס×\94 ×\96×\95 ×©×\9c ×\94×\93×£ <strong>×\94×\95×¢×\9c×\9e×\94</strong>.\n×¢×\93×\99×\99×\9f ×\91×\90פשר×\95ת×\9a ×\9cצפ×\95ת ×\91×\94; × ×\99ת×\9f ×\9c×\9eצ×\95×\90 ×¤×¨×\98×\99×\9d ב[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} יומן ההעלמות].",
+       "rev-deleted-no-diff": "×\90×\99×\9f ×\91×\90פשר×\95ת×\9a ×\9cצפ×\95ת ×\91×\94×\91×\93×\9c×\99×\9d ×\91×\99×\9f ×\94×\92רס×\90×\95ת ×\94×\90×\9c×\94 ×\9eש×\95×\9d ×©×\90×\97ת ×\9e×\94×\9f <strong>×\94×\95סתר×\94</strong>.\n× ×\99ת×\9f ×\9c×\9eצ×\95×\90 ×¤×¨×\98×\99×\9d ב[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} יומן המחיקות].",
+       "rev-suppressed-no-diff": "×\90×\99×\9f ×\91×\90פשר×\95ת×\9a ×\9cצפ×\95ת ×\91×\94×\91×\93×\9c×\99×\9d ×\91×\99×\9f ×\94×\92רס×\90×\95ת ×\94×\90×\9c×\94 ×\9eש×\95×\9d ×©×\90×\97ת ×\9e×\94×\9f <strong>×\94×\95×¢×\9c×\9e×\94</strong>.",
+       "rev-deleted-unhide-diff": "אחת מהגרסאות שביקשת להשוות <strong>הוסתרה</strong>.\nניתן למצוא פרטים ב[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} יומן המחיקות].\nעדיין באפשרותך [$1 לצפות בהבדלים בין הגרסאות] אם ברצונך להמשיך.",
+       "rev-suppressed-unhide-diff": "אחת מהגרסאות שביקשת להשוות <strong>הועלמה</strong>.\nניתן למצוא פרטים ב[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} יומן ההעלמות].\nעדיין באפשרותך [$1 לצפות בהבדלים בין הגרסאות] אם ברצונך להמשיך.",
+       "rev-deleted-diff-view": "אחת מהגרסאות שביקשת להשוות <strong>הוסתרה</strong>.\nעדיין באפשרותך לצפות בהבדלים בין הגרסאות; ניתן למצוא פרטים ב[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} יומן המחיקות].",
+       "rev-suppressed-diff-view": "אחת מהגרסאות שביקשת להשוות <strong>הועלמה</strong>.\nעדיין באפשרותך לצפות בהבדלים בין הגרסאות; ניתן למצוא פרטים ב[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} יומן ההעלמות].",
        "rev-delundel": "שינוי מצב התצוגה",
        "rev-showdeleted": "הצגה",
        "revisiondelete": "מחיקה ושחזור של גרסאות",
-       "revdelete-nooldid-title": "×\92רסת ×\9e×\98ר×\94 ×\91×\9cת×\99 תקינה",
-       "revdelete-nooldid-text": "×\90×\95 שלא ציינת שום גרסה שהפעולה תבוצע עליה, או שהגרסה שציינת אינה קיימת, או שניסית להסתיר את הגרסה הנוכחית.",
-       "revdelete-no-file": "×\94ק×\95×\91×¥ ×©×¦×\99×\99נת אינו קיים.",
-       "revdelete-show-file-confirm": "×\94×\90×\9d ×\90ת×\9d ×\91×\98×\95×\97×\99×\9d ×©×\91רצ×\95× ×\9b×\9d ×\9cצפ×\95ת ×\91×\92רס×\94 ×\94×\9e×\97×\95ק×\94 ×©×\9c ×\94ק×\95×\91×¥ \"<nowiki>$1</nowiki>\" ×\9eת×\90ר×\99×\9a $3, $2?",
+       "revdelete-nooldid-title": "×\92רסת ×\94×\99×¢×\93 ×\90×\99× ×\94 תקינה",
+       "revdelete-nooldid-text": "×\99×\99ת×\9b×\9f שלא ציינת שום גרסה שהפעולה תבוצע עליה, או שהגרסה שציינת אינה קיימת, או שניסית להסתיר את הגרסה הנוכחית.",
+       "revdelete-no-file": "×\94ק×\95×\91×¥ ×©×¦×\95×\99×\9f אינו קיים.",
+       "revdelete-show-file-confirm": "×\94×\90×\9d ×\91רצ×\95× ×\9a ×\9cצפ×\95ת ×\91×\92רס×\94 ×\9e×\97×\95ק×\94 ×©×\9c ×\94ק×\95×\91×¥ \"<nowiki>$1</nowiki>\" ×\9eÖ¾$3, $2?",
        "revdelete-show-file-submit": "כן",
-       "revdelete-selected-text": "{{PLURAL:$1|הגרסה שנבחרה|הגרסאות שנבחרו}} מתוך [[:$2]]:",
+       "revdelete-selected-text": "{{PLURAL:$1|הגרסה שנבחרה|הגרסאות שנבחרו}} מתוך הדף [[:$2]]:",
        "revdelete-selected-file": "{{PLURAL:$1|גרסת הקובץ שנבחרה|גרסאות הקובץ שנבחרו}} מתוך [[:$2]]:",
        "logdelete-selected": "{{PLURAL:$1|פעולת היומן שנבחרה|פעולות היומן שנבחרו}}:",
-       "revdelete-text-text": "×\92רס×\90×\95ת ×©× ×\9e×\97ק×\95 ×¢×\93×\99×\99×\9f ×ª×\95פענ×\94 ×\91×\94×\99ס×\98×\95ר×\99×\99ת ×\94×\93×£, ×\90×\9a ×\97×\9cק×\99×\9d ×\9e×\94ת×\95×\9b×\9f ×©×\9c×\94×\9f ×\9c×\90 ×\99×\94×\99×\95 ×\96×\9e×\99× ×\99×\9d לציבור.",
-       "revdelete-text-file": "×\92רס×\90×\95ת ×§×\91צ×\99×\9d ×©× ×\9e×\97ק×\95 ×¢×\93×\99×\99×\9f ×ª×\95פענ×\94 ×\91×\94×\99ס×\98×\95ר×\99×\99ת ×\94ק×\95×\91×¥, ×\90×\9a ×\97×\9cק×\99×\9d ×\9e×\94ת×\95×\9b×\9f ×©×\9c×\94×\9f ×\9c×\90 ×\99×\94×\99×\95 ×\96×\9e×\99× ×\99×\9d לציבור.",
-       "logdelete-text": "פע×\95×\9c×\95ת ×\99×\95×\9e×\9f ×©× ×\9e×\97ק×\95 ×¢×\93×\99×\99×\9f ×ª×\95פענ×\94 ×\91×\93פ×\99 ×\94×\99×\95×\9e× ×\99×\9d, ×\90×\9a ×\97×\9cק×\99×\9d ×\9e×\94ת×\95×\9b×\9f ×©×\9c×\94×\9f ×\9c×\90 ×\99×\94×\99×\95 ×\96×\9e×\99× ×\99×\9d לציבור.",
-       "revdelete-text-others": "×\9eפע×\99×\9c×\99 ×\9eער×\9bת ×\90×\97ר×\99×\9d ×¢×\93×\99×\99×\9f ×\99×\95×\9b×\9c×\95 ×\9c×\92שת ×\9cת×\95×\9b×\9f ×\94נסתר ×\9b×\93×\99 לשחזר אותו, אלא אם כן תוגדרנה הגבלות נוספות.",
+       "revdelete-text-text": "×\92רס×\90×\95ת ×©×\94×\95סתר×\95 ×¢×\93×\99×\99×\9f ×\99×\95פ×\99×¢×\95 ×\91×\94×\99ס×\98×\95ר×\99×\99ת ×\94×\93×£, ×\90×\91×\9c ×\94ת×\95×\9b×\9f ×©×\9c×\94×\9f ×\9c×\90 ×\99×\94×\99×\94 ×\96×\9e×\99×\9f לציבור.",
+       "revdelete-text-file": "×\92רס×\90×\95ת ×§×\91צ×\99×\9d ×©×\94×\95סתר×\95 ×¢×\93×\99×\99×\9f ×\99×\95פ×\99×¢×\95 ×\91×\94×\99ס×\98×\95ר×\99×\99ת ×\94ק×\95×\91×¥, ×\90×\91×\9c ×\94ת×\95×\9b×\9f ×©×\9c×\94×\9f ×\9c×\90 ×\99×\94×\99×\94 ×\96×\9e×\99×\9f לציבור.",
+       "logdelete-text": "פע×\95×\9c×\95ת ×\99×\95×\9e×\9f ×©×\94×\95סתר×\95 ×¢×\93×\99×\99×\9f ×\99×\95פ×\99×¢×\95 ×\91×\93פ×\99 ×\94×\99×\95×\9e× ×\99×\9d, ×\90×\91×\9c ×\94ת×\95×\9b×\9f ×©×\9c×\94×\9f ×\9c×\90 ×\99×\94×\99×\94 ×\96×\9e×\99×\9f לציבור.",
+       "revdelete-text-others": "×\9eפע×\99×\9c×\99 ×\9eער×\9bת ×\90×\97ר×\99×\9d ×¢×\93×\99×\99×\9f ×\99×\95×\9b×\9c×\95 ×\9c×\92שת ×\9cת×\95×\9b×\9f ×\94×\9e×\95סתר ×\95×\90×£ לשחזר אותו, אלא אם כן תוגדרנה הגבלות נוספות.",
        "revdelete-confirm": "אנא אשרו שזה אכן מה שאתם מתכוונים לעשות, שאתם מבינים את התוצאות של מעשה כזה, ושהמעשה מבוצע בהתאם ל[[{{MediaWiki:Policy-url}}|נוהלי האתר]].",
-       "revdelete-suppress-text": "יש להשתמש בהעלמה '''אך ורק''' במקרים הבאים:\n* מידע שעלול להיות לשון הרע\n* חשיפת מידע אישי\n*: <em>כתובות בתים ומספרי טלפון, מספרי זהות, וכו'</em>",
+       "revdelete-suppress-text": "יש להשתמש בהעלמה <strong>אך ורק</strong> במקרים הבאים:\n* מידע שעלול להיות לשון הרע\n* חשיפת מידע אישי\n*: <em>כתובות בתים ומספרי טלפון, מספרי זהות, וכו'</em>",
        "revdelete-legend": "הגדרת הגבלות התצוגה",
-       "revdelete-hide-text": "תוכן הגרסה",
+       "revdelete-hide-text": "×\94סתרת ×ª×\95×\9b×\9f ×\94×\92רס×\94",
        "revdelete-hide-image": "הסתרת תוכן הקובץ",
-       "revdelete-hide-name": "×\94סתרת ×\93×£ ×\94×\99×¢×\93 ×\95×\94פר×\9e×\98ר×\99×\9d",
-       "revdelete-hide-comment": "תקציר העריכה",
-       "revdelete-hide-user": "שם המשתמש או כתובת ה־IP של העורך",
-       "revdelete-hide-restricted": "×\94×¢×\9c×\9eת ×\94×\9e×\99×\93×¢ ×\92×\9d ×\9e×\9eפע×\99×\9c×\99 ×\94×\9eער×\9bת",
+       "revdelete-hide-name": "הסתרת היעד והפרמטרים",
+       "revdelete-hide-comment": "×\94סתרת ×ª×§×¦×\99ר ×\94ער×\99×\9b×\94",
+       "revdelete-hide-user": "×\94סתרת ×©×\9d ×\94×\9eשת×\9eש ×\90×\95 ×\9bת×\95×\91ת ×\94Ö¾IP ×©×\9c ×\94×¢×\95ר×\9a",
+       "revdelete-hide-restricted": "העלמת המידע גם ממפעילי מערכת",
        "revdelete-radio-same": "(ללא שינוי)",
-       "revdelete-radio-set": "×\9e×\95סתר",
-       "revdelete-radio-unset": "×\92×\9c×\95×\99",
-       "revdelete-suppress": "×\94×¢×\9c×\9eת ×\94×\9e×\99×\93×¢ ×\92×\9d ×\9e×\9eפע×\99×\9c×\99 ×\94×\9eער×\9bת",
+       "revdelete-radio-set": "×\9b×\9f",
+       "revdelete-radio-unset": "×\9c×\90",
+       "revdelete-suppress": "העלמת המידע גם ממפעילי מערכת",
        "revdelete-unsuppress": "הסרת הגבלות בגרסאות המשוחזרות",
        "revdelete-log": "סיבה:",
        "revdelete-submit": "ביצוע על {{PLURAL:$1|הגרסה שנבחרה|הגרסאות שנבחרו}}",
        "logdelete-success": "מצב התצוגה של פעולת היומן שוּנה.",
        "logdelete-failure": "לא ניתן היה לשנות את מצב התצוגה של היומן:\n$1",
        "revdel-restore": "שינוי מצב התצוגה",
-       "pagehist": "היסטוריית הדף",
+       "pagehist": "×\94×\99ס×\98×\95ר×\99×\99ת ×\94×\92רס×\90×\95ת ×©×\9c ×\94×\93×£",
        "deletedhist": "הגרסאות המחוקות",
-       "revdelete-hide-current": "שגיאה בהסתרת הפריט מתאריך $2, $1: זו הגרסה הנוכחית.\nלא ניתן להסתיר אותה.",
-       "revdelete-show-no-access": "שגיאה בהצגת הפריט מתאריך $2, $1: פריט זה סומן כ\"מוגבל\".\nאין לך גישה אליו.",
-       "revdelete-modify-no-access": "שגיאה בשינוי הפריט מתאריך $2, $1: פריט זה סומן כ\"מוגבל\".\nאין לכם גישה אליו.",
+       "revdelete-hide-current": "שגיאה בהסתרת הפריט מ־$2, $1: זו הגרסה הנוכחית.\nלא ניתן להסתיר אותה.",
+       "revdelete-show-no-access": "שגיאה בהצגת הפריט מ־$2, $1: פריט זה סומן כ\"מוגבל\".\nאין לך גישה אליו.",
+       "revdelete-modify-no-access": "שגיאה בשינוי הפריט מ־$2, $1: פריט זה סומן כ\"מוגבל\".\nאין לך גישה אליו.",
        "revdelete-modify-missing": "שגיאה בשינוי פריט מספר $1: הוא אינו נמצא בבסיס הנתונים!",
        "revdelete-no-change": "<strong>אזהרה:</strong> לפריט מ־$2, $1 כבר היו הגדרות התצוגה שביקשת.",
-       "revdelete-concurrent-change": "שגיאה בשינוי הפריט מתאריך $2, $1: נראה שמצבו שונה על־ידי מישהו אחר בזמן שאתם ניסיתם לשנות אותו.\nאנא בדקו ביומנים.",
-       "revdelete-only-restricted": "שגיאה בהסתרת הפריט מתאריך $2, $1: אין באפשרותך להעלים פריטים ממפעילי המערכת מבלי לבחור גם באחת מאפשרויות הנראוּת האחרות.",
+       "revdelete-concurrent-change": "שגיאה בשינוי הפריט מ־$2, $1: נראה שמצב התצוגה שלו כבר שוּנה על־ידי מישהו אחר בזמן שניסית לשנות אותו.\nבאפשרותך למצוא פרטים ביומנים.",
+       "revdelete-only-restricted": "שגיאה בהסתרת הפריט מ־$2, $1: לא ניתן להעלים פריטים ממפעילי מערכת מבלי לבחור גם באחת מהאפשרויות האחרות.",
        "revdelete-reason-dropdown": "* סיבות מחיקה נפוצות\n** הפרת זכויות יוצרים\n** תקציר עריכה או מידע אישי לא הולמים\n** שם משתמש לא הולם\n** מידע שעלול להיות לשון הרע",
        "revdelete-otherreason": "סיבה אחרת/נוספת:",
        "revdelete-reasonotherlist": "סיבה אחרת",
-       "revdelete-edit-reasonlist": "ער×\99×\9bת ×¡×\99×\91×\95ת ×\94×\9e×\97×\99קה",
+       "revdelete-edit-reasonlist": "ער×\99×\9bת ×¡×\99×\91×\95ת ×\94×\94סתרה",
        "revdelete-offender": "מחבר הגרסה:",
        "suppressionlog": "יומן העלמות",
        "suppressionlogtext": "להלן רשימת המחיקות והחסימות הכוללות תוכן המוסתר ממפעילי המערכת.\nראו את [[Special:BlockList|רשימת החסומים]] לרשימת החסימות הפעילות כעת.",
        "mergehistory-no-destination": "דף היעד $1 אינו קיים.",
        "mergehistory-invalid-source": "דף המקור חייב להיות בעל כותרת תקינה.",
        "mergehistory-invalid-destination": "דף היעד חייב להיות בעל כותרת תקינה.",
-       "mergehistory-autocomment": "הדף [[:$1]] מוזג לתוך [[:$2]]",
-       "mergehistory-comment": "הדף [[:$1]] מוזג לתוך [[:$2]]: $3",
+       "mergehistory-autocomment": "הדף [[:$1]] מוזג לתוך הדף [[:$2]]",
+       "mergehistory-comment": "הדף [[:$1]] מוזג לתוך הדף [[:$2]]: $3",
        "mergehistory-same-destination": "דפי המקור והיעד זהים",
        "mergehistory-reason": "סיבה:",
        "mergelog": "יומן מיזוגים",
        "diff-multi-sameuser": "({{PLURAL:$1|גרסת ביניים אחת|$1 גרסאות ביניים}} של אותו משתמש {{PLURAL:$1|אינה מוצגת|אינן מוצגות}})",
        "diff-multi-otherusers": "({{PLURAL:$1|גרסת ביניים אחת|$1 גרסאות ביניים}} של {{PLURAL:$2|משתמש אחר אחד|$2 משתמשים}} {{PLURAL:$1|אינה מוצגת|אינן מוצגות}})",
        "diff-multi-manyusers": "({{PLURAL:$1|גרסת ביניים אחת|$1 גרסאות ביניים}} של יותר {{PLURAL:$2|ממשתמש אחד|מ־$2 משתמשים}} {{PLURAL:$1|אינה מוצגת|אינן מוצגות}})",
-       "difference-missing-revision": "{{PLURAL:$2|×\92רס×\94 ×\90×\97ת|$2 ×\92רס×\90×\95ת}} ×©×\9c ×\94×\94×\91×\93×\9c ×\94×\96×\94 ×\91×\99×\9f ×©×ª×\99 ×\92רס×\90×\95ת ($1) {{PLURAL:$2|×\9c×\90 × ×\9eצ×\90×\94\9c×\90 × ×\9eצ×\90×\95}}.\n\n×\96×\94 × ×\92ר×\9d ×\91×\93ר×\9a ×\9b×\9c×\9c ×¢×\9cÖ¾×\99×\93×\99 ×\9c×\97×\99צ×\94 ×¢×\9c ×§×\99ש×\95ר ×\99ש×\9f ×\9c×\94×\91×\93×\9c בין גרסאות של דף שנמחק.\nאפשר למצוא פרטים ב[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} יומן המחיקות].",
+       "difference-missing-revision": "{{PLURAL:$2|×\92רס×\94 ×\90×\97ת|$2 ×\92רס×\90×\95ת}} ×\9eת×\95×\9a ×\94×\92רס×\90×\95ת ×©×\91×\99קשת ×\9c×\94ש×\95×\95ת ($1) {{PLURAL:$2|×\9c×\90 × ×\9eצ×\90×\94\9c×\90 × ×\9eצ×\90×\95}}.\n\n×\96×\94 × ×\92ר×\9d ×\91×\93ר×\9aÖ¾×\9b×\9c×\9c ×¢×§×\91 ×\9c×\97×\99צ×\94 ×¢×\9c ×§×\99ש×\95ר ×\99ש×\9f ×\9c×\94×\91×\93×\9c×\99×\9d בין גרסאות של דף שנמחק.\nאפשר למצוא פרטים ב[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} יומן המחיקות].",
        "searchresults": "תוצאות החיפוש",
        "searchresults-title": "תוצאות החיפוש \"$1\"",
        "titlematches": "כותרות דפים תואמות",
        "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-watchlist-days": "מספר הימים שמוצגים ברשימת המעקב:",
        "prefs-watchlist-days-max": "לכל היותר {{PLURAL:$1|יום אחד|יומיים|$1 ימים}}",
        "prefs-watchlist-edits": "המספר המרבי של העריכות שמוצגות ברשימת המעקב המורחבת:",
-       "prefs-watchlist-edits-max": "לכל היותר: 1000",
+       "prefs-watchlist-edits-max": "לכל היותר: 1,000",
        "prefs-watchlist-token": "אסימון לרשימת המעקב:",
        "prefs-misc": "שונות",
        "prefs-resetpass": "שינוי סיסמה",
        "recentchangesdays-max": "לכל היותר {{PLURAL:$1|יום אחד|יומיים|$1 ימים}}",
        "recentchangescount": "מספר העריכות שמוצגות כברירת מחדל:",
        "prefs-help-recentchangescount": "ההעדפה הזאת כוללת את דף השינויים האחרונים, דפי היסטוריית גרסאות ויומנים.",
-       "prefs-help-watchlist-token2": "×\96×\94×\95 ×\94×\9eפת×\97 ×\94ס×\95×\93×\99 ×\9c×\94×\96× ×\94 ×©×\9c ×¨×©×\99×\9eת ×\94×\9eעק×\91 ×©×\9c×\9a.\n×\9b×\9c ×\9e×\99 ×©×\99×\95×\93×¢ ×\90×\95ת×\95 ×\99×\95×\9b×\9c ×\9cקר×\95×\90 ×\90ת ×¨×©×\99×\9eת ×\94×\9eעק×\91 ×©×\9c×\9a, ×\9c×\9b×\9f ×\90×\99×\9f ×\9cשתף ×\90×\95ת×\95.\n[[Special:ResetTokens|×\90×\9d ×\99ש ×\91×\9b×\9a ×¦×\95ר×\9a, ×\90פשר ×\9c×\90פס ×\90×\95ת×\95 ×\9b×\90ן]].",
+       "prefs-help-watchlist-token2": "×\96×\94×\95 ×\94×\9eפת×\97 ×\94ס×\95×\93×\99 ×\9c×\94×\96× ×\94 ×©×\9c ×¨×©×\99×\9eת ×\94×\9eעק×\91 ×©×\9c×\9a.\n×\9b×\9c ×\9e×\99 ×©×\99×\95×\93×¢ ×\90×\95ת×\95 ×\99×\9b×\95×\9c ×\9cקר×\95×\90 ×\90ת ×¨×©×\99×\9eת ×\94×\9eעק×\91 ×©×\9c×\9a, ×\9c×\9b×\9f ×\90×\99×\9f ×\9cשתף ×\90×\95ת×\95.\n×\91×\9eקר×\94 ×\94צ×\95ר×\9a, ×\90פשר [[Special:ResetTokens|×\9c×\90פס ×\90ת ×\94×\90ס×\99×\9e×\95ן]].",
        "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 ×\9cש×\9c×\95×\97 ×\9c×\99 ×\93×\95×\90ר ×\90×\9cק×\98ר×\95× ×\99",
        "prefs-searchoptions": "חיפוש",
        "prefs-namespaces": "מרחבי שם",
-       "default": "ברירת מחדל",
+       "default": "×\91ר×\99רת ×\94×\9e×\97×\93×\9c",
        "prefs-files": "קבצים",
        "prefs-custom-css": "קובץ CSS מותאם אישית",
        "prefs-custom-js": "קובץ JavaScript מותאם אישית",
        "gender-unknown": "באזכורים שלך בממשק, המערכת תשתמש במידת האפשר בלשון שאינה תלוית־מגדר",
        "gender-male": "הוא עורך דפים בוויקי",
        "gender-female": "היא עורכת דפים בוויקי",
-       "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×¢ זה כדי לפנות אליך/אלייך ולציין את שם המשתמש שלך במין הדקדוקי הנכון.\nהמידע יהיה ציבורי.",
+       "prefs-help-gender": "×\9c×\90 ×\97×\95×\91×\94 ×\9c×\9e×\9c×\90 ×\94×¢×\93פ×\94 ×\96×\95.\n×\94×\9eער×\9bת ×\9eשת×\9eשת ×\91×\9e×\99×\93×¢ ×\94זה כדי לפנות אליך/אלייך ולציין את שם המשתמש שלך במין הדקדוקי הנכון.\nהמידע יהיה ציבורי.",
        "email": "דוא\"ל",
-       "prefs-help-realname": "×\90×\99×\9f ×\97×\95×\91×\94 ×\9c×\9e×\9c×\90 ×\90ת ×\94ש×\9d ×\94×\90×\9e×\99ת×\99.\n×\94ש×\9d ×\94×\90×\9e×\99ת×\99 עשוי לשמש כדי לייחס לך את עבודתך.",
+       "prefs-help-realname": "×\9c×\90 ×\97×\95×\91×\94 ×\9c×\9e×\9c×\90 ×\90ת ×\94ש×\9d ×\94×\90×\9e×\99ת×\99.\n×\90×\9d ×¡×\95פק, ×\94×\95×\90 עשוי לשמש כדי לייחס לך את עבודתך.",
        "prefs-help-email": "כתובת דואר אלקטרוני היא אופציונלית, אבל היא חיונית לאיפוס הסיסמה במקרה ש{{GENDER:|תשכח|תשכחי}} אותה.",
-       "prefs-help-email-others": "×\91×\90פשר×\95ת×\9a ×\92×\9d ×\9c×\91×\97×\95ר ×\9c×\90פשר ×\9c×\90×\97ר×\99×\9d ×\9c×\99צ×\95ר ×\90×\99ת×\9a ×§×©×¨ ×\91×\90×\9eצע×\95ת ×\93×\95×\90\"×\9c ×\93ר×\9a ×§×\99ש×\95ר ×\91×\93×£ ×\94×\9eשת×\9eש ×\90×\95 ×\91×\93×£ ×\94ש×\99×\97×\94 ×©×\9c×\9a.\n×\9bת×\95×\91ת ×\94×\93×\95×\90\"×\9c ×©×\9c×\9a ×\9c×\90 ×ª×\99×\97שף ×\9bש×\9eשת×\9eש×\99×\9d ×\90×\97רים ייצרו איתך קשר.",
+       "prefs-help-email-others": "×\91×\90פשר×\95ת×\9a ×\92×\9d ×\9c×\91×\97×\95ר ×\9c×\90פשר ×\9c×\9eשת×\9eש×\99×\9d ×\9c×\99צ×\95ר ×\90×\99ת×\9a ×§×©×¨ ×\91×\90×\9eצע×\95ת ×\93×\95×\90\"×\9c ×\93ר×\9a ×§×\99ש×\95ר ×\91×\93×£ ×\94×\9eשת×\9eש ×\90×\95 ×\91×\93×£ ×\94ש×\99×\97×\94 ×©×\9c×\9a.\n×\9bת×\95×\91ת ×\94×\93×\95×\90\"×\9c ×©×\9c×\9a ×\9c×\90 ×ª×\99×\97שף ×\9bש×\9eשת×\9eשים ייצרו איתך קשר.",
        "prefs-help-email-required": "כתובת דואר אלקטרוני נדרשת לכתיבה באתר.",
        "prefs-info": "מידע בסיסי",
        "prefs-i18n": "בינאום",
        "prefs-help-prefershttps": "העדפה זו תיכנס לתוקף בכניסה הבאה לחשבון.",
        "prefswarning-warning": "ביצעת שינויים בהעדפות שלך, והם עדיין לא נשמרו.\nעזיבת דף זה ללא לחיצה על \"$1\" תגרום לכך שההעדפות שלך לא יעודכנו.",
        "prefs-tabs-navigation-hint": "טיפ: ניתן להשתמש במקשי החצים הימני והשמאלי כדי לנווט בין הלשוניות ברשימת הלשוניות.",
-       "userrights": "ניהול הרשאות משתמש",
+       "userrights": "ניהול הרשאות {{GENDER:{{BASEPAGENAME}}|משתמש|משתמשת}}",
        "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": "קבוצה:",
        "right-reupload-shared": "דריסה מקומית של קבצים מאתר קובצי המדיה המשותף",
        "right-upload_by_url": "העלאת קובץ מכתובת אינטרנט",
        "right-purge": "רענון זיכרון המטמון של האתר ללא מעבר לדף אישור",
-       "right-autoconfirmed": "עק×\99פת הגבלת קצב העריכות המבוססת על כתובת IP",
-       "right-bot": "×\98×\99פ×\95×\9c ×\91עריכות כאוטומטיות",
+       "right-autoconfirmed": "עק×\99פ×\94 ×©×\9c הגבלת קצב העריכות המבוססת על כתובת IP",
+       "right-bot": "×\94ת×\99×\99×\97ס×\95ת ×\9cעריכות כאוטומטיות",
        "right-nominornewtalk": "ביטול שליחת התראה על הודעה חדשה למשתמש בעת עריכה משנית בדף שיחתו",
        "right-apihighlimits": "שימוש ב־API עם פחות הגבלות",
        "right-writeapi": "שימוש ב־API לשינוי דפים",
        "right-delete": "מחיקת דפים",
-       "right-bigdelete": "×\9e×\97×\99קת ×\93פ×\99×\9d ×¢×\9d ×\94×\99ס×\98×\95ר×\99×\99ת ×\93×£ ×\90ר×\95×\9b×\94",
-       "right-deletelogentry": "×\9e×\97×\99קת ×\95ש×\97×\96×\95ר ×¤×¢×\95×\9c×\95ת ×\9eס×\95×\99×\9e×\95ת ×\91יומן",
-       "right-deleterevision": "×\9e×\97×\99קת ×\95ש×\97×\96×\95ר ×\92רס×\90×\95ת ×\9eס×\95×\99×\9e×\95ת ×©×\9c דפים",
-       "right-deletedhistory": "צפ×\99×\99×\94 ×\91×\92רס×\90×\95ת ×\9e×\97×\95ק×\95ת ללא הטקסט השייך להן",
-       "right-deletedtext": "צפ×\99×\99×\94 ×\91×\98קס×\98 ×\9e×\97×\95ק ×\95×\91×\94×\91×\93×\9c×\99×\9d ×\91×\99×\9f ×\92רס×\90×\95ת ×\9e×\97×\95ק×\95ת",
+       "right-bigdelete": "×\9e×\97×\99קת ×\93פ×\99×\9d ×\94×\9e×\9b×\99×\9c×\99×\9d ×\9b×\9e×\95ת ×\92×\93×\95×\9c×\94 ×©×\9c ×¢×¨×\99×\9b×\95ת ×\91×\94×\99ס×\98×\95ר×\99×\99ת ×\94×\92רס×\90×\95ת",
+       "right-deletelogentry": "×\9e×\97×\99ק×\94 ×\95ש×\97×\96×\95ר ×©×\9c ×¤×¢×\95×\9c×\95ת יומן",
+       "right-deleterevision": "×\9e×\97×\99ק×\94 ×\95ש×\97×\96×\95ר ×©×\9c ×\92רס×\90×\95ת ×\91דפים",
+       "right-deletedhistory": "צפ×\99×\99×\94 ×\91פר×\98×\99×\9d ×©×\9c ×\92רס×\90×\95ת ×\9e×\97×\95ק×\95ת, ללא הטקסט השייך להן",
+       "right-deletedtext": "צפ×\99×\99×\94 ×\91ת×\95×\9b×\9f ×©× ×\9e×\97ק ×\95×\91×\94×\91×\93×\9c×\99×\9d ×\91×\99×\9f ×\92רס×\90×\95ת ×©× ×\9e×\97ק×\95",
        "right-browsearchive": "חיפוש דפים מחוקים",
        "right-undelete": "שחזור דף מחוק",
        "right-suppressrevision": "הצגה, הסתרה וביטול הסתרה של גרסאות מסוימות של דפים מכל המשתמשים",
        "right-viewsuppressed": "הצגת גרסאות שמוסתרות מכל המשתמשים",
        "right-suppressionlog": "צפייה ביומנים פרטיים",
        "right-block": "חסימת משתמשים אחרים מעריכה",
-       "right-blockemail": "חסימת משתמש משליחת דואר אלקטרוני",
+       "right-blockemail": "חסימת משתמשים משליחת דואר אלקטרוני",
        "right-hideuser": "חסימת שם משתמש תוך הסתרתו מהציבור",
        "right-ipblock-exempt": "עקיפת חסימות של כתובת IP, חסימות אוטומטיות וחסימות טווח",
        "right-unblockself": "שחרור חסימה של המשתמש עצמו",
        "right-import": "ייבוא דפים מאתרי ויקי אחרים",
        "right-importupload": "ייבוא דפים באמצעות העלאת קובץ",
        "right-patrol": "סימון עריכות של אחרים כבדוקות",
-       "right-autopatrol": "ס×\99×\9e×\95×\9f ×\90×\95×\98×\95×\9e×\98×\99 ×©×\9c ×¢×¨×\99×\9b×\95ת ×©×\9c ×\94×\9eשת×\9eש כבדוקות",
+       "right-autopatrol": "ס×\99×\9e×\95×\9f ×\90×\95×\98×\95×\9e×\98×\99 ×©×\9c ×¢×¨×\99×\9b×\95ת ×\94×\9eשת×\9eש ×¢×¦×\9e×\95 כבדוקות",
        "right-patrolmarks": "הבחנה בין עריכות שנבדקו לעריכות שטרם נבדקו בדף השינויים האחרונים",
        "right-unwatchedpages": "הצגת רשימה של דפים שאינם במעקב",
        "right-mergehistory": "מיזוג היסטוריית גרסאות של דפים",
        "right-passwordreset": "צפייה בדואר אלקטרוני של איפוס סיסמה",
        "right-managechangetags": "יצירה, הפעלה וביטול של [[Special:Tags|תגיות]]",
        "right-applychangetags": "החלת [[Special:Tags|תגיות]] יחד עם שינויים",
-       "right-changetags": "×\94×\95ספת ×\95×\94סר×\94 ×©×\9c [[Special:Tags|ת×\92×\99×\95ת]] ×\9b×\9cש×\94×\9f ×\9c×\92רס×\90×\95ת ×\9eס×\95×\99×\9eות ולרשומות יומן",
+       "right-changetags": "×\94×\95ספ×\94 ×\95×\94סר×\94 ×©×\9c [[Special:Tags|ת×\92×\99×\95ת]] ×\9c×\92רס×\90ות ולרשומות יומן",
        "right-deletechangetags": "מחיקת [[Special:Tags|תגיות]] מבסיס הנתונים",
        "grant-generic": "חבילת ההרשאות \"$1\"",
        "grant-group-page-interaction": "אינטראקציה עם דפים",
        "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": "מיון לפי תאריך היצירה",
+       "listusers-creationsort": "מיון לפי תאריך היצירה של החשבון",
        "listusers-desc": "מיון בסדר יורד",
        "usereditcount": "{{PLURAL:$1|עריכה אחת|$1 עריכות}}",
        "usercreated": "{{GENDER:$3|נוצר|נוצרה}} ב־$2, $1",
        "booksources-text": "להלן רשימת קישורים לאתרים אחרים המוכרים ספרים חדשים ויד־שנייה, ושבהם עשוי להיות מידע נוסף לגבי ספרים שאתם מחפשים:",
        "booksources-invalid-isbn": "המסת\"ב שניתן כנראה אינו תקין; אנא בדקו אם ביצעתם טעויות בהעתקה מהמידע המקורי.",
        "specialloguserlabel": "בוצעו על־ידי המשתמש:",
-       "speciallogtitlelabel": "×\99×¢×\93 (×\9b×\95תרת ×\90×\95 {{ns:user}}:ש×\9d עבור משתמש):",
+       "speciallogtitlelabel": "×\99×¢×\93 (ש×\9d ×\94×\93×£, ×\90×\95 \"{{ns:user}}:ש×\9d\" עבור משתמש):",
        "log": "יומנים",
        "logeventslist-submit": "הצגה",
        "all-logs-page": "כל היומנים הציבוריים",
        "trackingcategories-msg": "קטגוריית מעקב",
        "trackingcategories-name": "שם ההודעה",
        "trackingcategories-desc": "הקריטריון להכללה בקטגוריה",
+       "restricted-displaytitle-ignored": "דפים שכותרת התצוגה שלהם אינה מופעלת",
+       "restricted-displaytitle-ignored-desc": "בדף הזה מוגדרת כותרת תצוגה (<code><nowiki>{{DISPLAYTITLE}}</nowiki></code>) שאינה מופעלת, כי היא אינה תואמת לכותרת האמיתית של הדף.",
        "noindex-category-desc": "הדף אינו מאונדקס על‏‏־ידי רובוטים כיוון שהוא כולל את מילת הקסם <code><nowiki>__NOINDEX__</nowiki></code> והוא במרחב שם שבו דגל כזה מותר לשימוש.",
        "index-category-desc": "הדף כולל את מילת הקסם <code><nowiki>__INDEX__</nowiki></code> (והוא במרחב שם שבו דגל כזה מותר לשימוש), ולכן הוא מאונדקס על‏‏֫־ידי רובוטים אף שכברירת מחדל הוא לא היה מאונדקס על ידם.",
        "post-expand-template-inclusion-category-desc": "גודל הדף גדול מ‏‏־<code>$wgMaxArticleSize</code> לאחר הרחבת כל התבניות, ולכן כמה תבניות לא הורחבו.",
        "trackingcategories-disabled": "הקטגוריה מבוטלת",
        "mailnologin": "אין כתובת לשליחה",
        "mailnologintext": "יש [[Special:UserLogin|להיכנס לחשבון]] ולהגדיר כתובת דואר אלקטרוני תקינה ב[[Special:Preferences|העדפות המשתמש]] כדי לשלוח דואר אלקטרוני למשתמשים אחרים.",
-       "emailuser": "שליחת דואר אלקטרוני למשתמש זה",
-       "emailuser-title-target": "שליחת דוא\"ל {{GENDER:$1|למשתמש זה|למשתמשת זו}}",
-       "emailuser-title-notarget": "שליחת דוא\"ל למשתמש",
-       "emailpagetext": "× ×\99ת×\9f ×\9c×\94שת×\9eש ×\91×\98×\95פס ×\9b×\93×\99 ×\9cש×\9c×\95×\97 ×\94×\95×\93עת ×\93×\95×\90ר ×\90×\9cק×\98ר×\95× ×\99 {{GENDER:$1|×\9c×\9eשת×\9eש ×\96×\94\9c×\9eשת×\9eשת ×\96×\95}}.\n×\9bת×\95×\91ת ×\94×\93×\95×\90ר ×\94×\90×\9cק×\98ר×\95× ×\99 ×©×\9bת×\91ת ב[[Special:Preferences|העדפות המשתמש שלך]] תופיע ככתובת שההודעה נשלחה ממנה, כדי לאפשר תגובה ישירה.",
-       "defemailsubject": "דוא\"ל מ{{grammar:תחילית|{{SITENAME}}}} מהמשתמש \"$1\"",
+       "emailuser": "שליחת דוא\"ל ל{{GENDER:{{BASEPAGENAME}}|משתמש|משתמשת}}",
+       "emailuser-title-target": "שליחת דואר אלקטרוני {{GENDER:$1|למשתמש זה|למשתמשת זו}}",
+       "emailuser-title-notarget": "שליחת דואר אלקטרוני למשתמש",
+       "emailpagetext": "× ×\99ת×\9f ×\9c×\94שת×\9eש ×\91×\98×\95פס ×©×\9c×\94×\9c×\9f ×\9b×\93×\99 ×\9cש×\9c×\95×\97 ×\94×\95×\93עת ×\93×\95×\90ר ×\90×\9cק×\98ר×\95× ×\99 {{GENDER:$1|×\9c×\9eשת×\9eש ×\96×\94\9c×\9eשת×\9eשת ×\96×\95}}.\n×\9bת×\95×\91ת ×\94×\93×\95×\90ר ×\94×\90×\9cק×\98ר×\95× ×\99 ×©×\94×\96× ת ב[[Special:Preferences|העדפות המשתמש שלך]] תופיע ככתובת שההודעה נשלחה ממנה, כדי לאפשר תגובה ישירה.",
+       "defemailsubject": "דוא\"ל מ{{GRAMMAR:תחילית|{{SITENAME}}}} מה{{GENDER:$1|משתמש|משתמשת}} \"$1\"",
        "usermaildisabled": "שליחת דוא\"ל למשתמשים מבוטלת",
        "usermaildisabledtext": "אינכם מורשים לשלוח דואר אלקטרוני למשתמשים אחרים באתר זה",
        "noemailtitle": "אין כתובת דואר אלקטרוני",
        "emailtarget": "יש להקליד את שם המשתמש של הנמען",
        "emailusername": "שם משתמש:",
        "emailusernamesubmit": "שליחה",
-       "email-legend": "ש×\9c×\99×\97ת ×\93×\95×\90ר ×\90×\9cק×\98ר×\95× ×\99 ×\9c×\9eשת×\9eש ×\90×\97ר ×©×\9c {{SITENAME}}",
+       "email-legend": "ש×\9c×\99×\97ת ×\93×\95×\90ר ×\90×\9cק×\98ר×\95× ×\99 ×\9c×\9eשת×\9eש ×\91{{GRAMMAR:ת×\97×\99×\9c×\99ת|{{SITENAME}}}}",
        "emailfrom": "מאת:",
        "emailto": "אל:",
        "emailsubject": "נושא:",
        "emailmessage": "הודעה:",
        "emailsend": "שליחה",
-       "emailccme": "× ×\90 ×\9cש×\9c×\95×\97 ×\9c×\99 ×\91×\93×\95×\90ר ×\90×\9cק×\98ר×\95× ×\99 ×\94עתק ×©×\9c ×\94×\95×\93עתי.",
+       "emailccme": "שִ×\9c×\97×\95 ×\9c×\99 ×\94עתק ×©×\9c ×\94×\94×\95×\93×¢×\94 ×©×\9cי.",
        "emailccsubject": "העתק של הודעתך למשתמש $1: $2",
        "emailsent": "הדואר נשלח",
        "emailsenttext": "הודעת הדואר האלקטרוני שלך נשלחה.",
        "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": "עריכות משניות",
        "exbeforeblank": "התוכן לפני שרוקן היה: \"$1\"",
        "delete-confirm": "מחיקת הדף \"$1\"",
        "delete-legend": "מחיקה",
-       "historywarning": "<strong>אזהרה:</strong> לדף שאתם עומדים למחוק יש היסטוריית שינויים של {{PLURAL:$1|גרסה אחת|$1 גרסאות}}:",
+       "historywarning": "<strong>אזהרה:</strong> לדף ש{{GENDER:|אתה עומד|את עומדת|אתם עומדים}} למחוק יש היסטוריית שינויים של {{PLURAL:$1|גרסה אחת|$1 גרסאות}}:",
        "historyaction-submit": "הצגה",
        "confirmdeletetext": "אתם עומדים למחוק דף יחד עם כל ההיסטוריה שלו.\n\nאנא אשרו שזה אכן מה שאתם מתכוונים לעשות, שאתם מבינים את התוצאות של מעשה כזה, ושהמעשה מבוצע בהתאם ל[[{{MediaWiki:Policy-url}}|נוהלי האתר]].",
        "actioncomplete": "הפעולה בוצעה",
        "delete-toobig": "דף זה כולל מעל {{PLURAL:$1|גרסה אחת|$1 גרסאות}} בהיסטוריית העריכות שלו. מחיקת דפים כאלה הוגבלה כדי למנוע פגיעה בביצועי האתר.",
        "delete-warning-toobig": "דף זה כולל מעל {{PLURAL:$1|גרסה אחת|$1 גרסאות}} בהיסטוריית העריכות שלו. מחיקה שלו עלולה להפריע לפעולות בבסיס הנתונים; אנא שקלו שנית את המחיקה.",
        "deleteprotected": "אין באפשרותך למחוק את הדף כי הוא מוגן.",
-       "deleting-backlinks-warning": "<strong>אזהרה:</strong> [[Special:WhatLinksHere/{{FULLPAGENAME}}|דפים אחרים]] מקשרים לדף שאתם עומדים למחוק או מכלילים אותו.",
+       "deleting-backlinks-warning": "<strong>אזהרה:</strong> [[Special:WhatLinksHere/{{FULLPAGENAME}}|דפים אחרים]] מקשרים לדף ש{{GENDER:|אתה עומד|את עומדת|אתם עומדים}} למחוק או מכלילים אותו.",
        "rollback": "שחזור עריכות",
        "rollbacklink": "שחזור",
        "rollbacklinkcount": "שחזור {{PLURAL:$1|עריכה אחת|$1 עריכות}}",
        "rollbacklinkcount-morethan": "שחזור יותר מ{{PLURAL:$1|עריכה אחת|־$1 עריכות}}",
        "rollbackfailed": "השחזור נכשל",
+       "rollback-missingparam": "חסרים פרמטרים נדרשים להגשת הבקשה.",
        "cantrollback": "לא ניתן לשחזר את העריכה;\nהתורם האחרון הוא היחיד שכתב בדף זה.",
        "alreadyrolled": "לא ניתן לשחזר את העריכה של [[User:$2|$2]] ([[User talk:$2|שיחה]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) בדף [[:$1]]; הדף כבר נערך או שוחזר.\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": "שוחזר מעריכות של $1 לעריכה האחרונה של $2",
+       "rollback-success-notify": "שוחזר מעריכות של $1 לעריכה האחרונה של $2. [$3 הצגת שינויים]",
        "sessionfailure-title": "בעיה בחיבור",
        "sessionfailure": "נראה שיש בעיה בחיבורכם לאתר;\nפעולתכם בוטלה כאמצעי זהירות נגד התחזות לתקשורת ממחשבכם.\nאנא חזרו לדף הקודם, העלו אותו מחדש ונסו שוב.",
        "changecontentmodel": "שינוי מודל התוכן של דף",
        "changecontentmodel-legend": "שינוי מודל התוכן",
-       "changecontentmodel-title-label": "×\9b×\95תרת הדף",
+       "changecontentmodel-title-label": "ש×\9d הדף",
        "changecontentmodel-model-label": "מודל התוכן החדש",
        "changecontentmodel-reason-label": "סיבה:",
        "changecontentmodel-submit": "שינוי",
        "changecontentmodel-success-title": "מודל התוכן שוּנה",
-       "changecontentmodel-success-text": "מודל התוכן של [[:$1]] שוּנה.",
+       "changecontentmodel-success-text": "מודל התוכן של הדף [[:$1]] שוּנה.",
        "changecontentmodel-cannot-convert": "לא ניתן להמיר את התוכן של [[:$1]] לסוג $2.",
        "changecontentmodel-nodirectediting": "מודל התוכן $1 אינו תומך בעריכה ישירה",
        "changecontentmodel-emptymodels-title": "לא קיים מודל תוכן מתאים",
        "protect-fallback": "רק משתמשים בעלי הרשאת \"$1\" מורשים",
        "protect-level-autoconfirmed": "רק משתמשים ותיקים מורשים",
        "protect-level-sysop": "רק מפעילי מערכת מורשים",
-       "protect-summary-cascade": "מדורג",
+       "protect-summary-cascade": "מדורגת",
        "protect-expiring": "פוקעת ב{{GRAMMAR:תחילית|$1}} (UTC)",
        "protect-expiring-local": "פוקעת ב{{GRAMMAR:תחילית|$1}}",
        "protect-expiry-indefinite": "בלתי מוגבלת בזמן",
        "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": "עד החודש:",
        "sp-contributions-blocked-notice": "{{GENDER:$1|המשתמש הזה חסום|המשתמשת הזו חסומה}} כרגע.\nהפעולה האחרונה ביומן החסימות מוצגת להלן:",
        "sp-contributions-blocked-notice-anon": "כתובת IP זו חסומה כרגע.\nהפעולה האחרונה ביומן החסימות מוצגת להלן:",
        "sp-contributions-search": "חיפוש תרומות",
-       "sp-contributions-username": "ש×\9d ×\9eשת×\9eש ×\90×\95 ×\9bת×\95×\91ת IP:",
+       "sp-contributions-username": "×\9bת×\95×\91ת IP ×\90×\95 ×©×\9d ×\9eשת×\9eש:",
        "sp-contributions-toponly": "הצגת עריכות שהן הגרסאות האחרונות בלבד",
        "sp-contributions-newonly": "הצגת עריכות שהן יצירות של דפים בלבד",
        "sp-contributions-submit": "חיפוש",
        "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",
        "badipaddress": "משתמש או כתובת IP שגויים.",
        "blockipsuccesssub": "החסימה הושלמה בהצלחה",
        "blockipsuccesstext": "{{GENDER:$1|המשתמש|המשתמשת}} [[Special:Contributions/$1|$1]] {{GENDER:$1|נחסם|נחסמה}}.\n\nראו את [[Special:BlockList|רשימת החסומים]] כדי לצפות בחסימות.",
-       "ipb-blockingself": "אתם עומדים לחסום את עצמכם! האם אתם בטוחים שברצונכם לעשות זאת?",
-       "ipb-confirmhideuser": "אתם עומדים לחסום משתמש עם האפשרות \"הסתרת משתמש\". זה יעלים את שם המשתמש בכל הרשימות ופעולות היומן. האם אתם בטוחים שברצונכם לעשות זאת?",
-       "ipb-confirmaction": "אם אתם באמת בטוחים שברצונכם לעשות זאת, אנא סמנו את השדה \"{{int:ipb-confirm}}\" שבתחתית.",
+       "ipb-blockingself": "{{GENDER:|אתה עומד|את עומדת|אתם עומדים}} לחסום את {{GENDER:|עצמך|עצמך|עצמכם}}! האם {{GENDER:|אתה בטוח שאתה רוצה|את בטוחה שאת רוצה|אתם בטוחים שאתם רוצים}} לעשות את זה?",
+       "ipb-confirmhideuser": "{{GENDER:|אתה עומד|את עומדת|אתם עומדים}} לחסום משתמש עם האפשרות \"הסתרת משתמש\". זה יעלים את שם המשתמש בכל הרשימות ופעולות היומן. האם {{GENDER:|אתה בטוח שברצונך|את בטוחה שברצונך|אתם בטוחים שברצונכם}} לעשות את זה?",
+       "ipb-confirmaction": "אם {{GENDER:|אתה בטוח שברצונך|את בטוחה שברצונך|אתם בטוחים שברצונכם}} לעשות זאת, אנא {{GENDER:|סמן|סמני|סמנו}} את השדה \"{{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\"",
        "blocklogpage": "יומן חסימות",
-       "blocklog-showlog": "משתמש זה נחסם בעבר.\nיומן החסימות מוצג להלן:",
-       "blocklog-showsuppresslog": "משתמש זה נחסם והוסתר בעבר.\nיומן ההעלמות מוצג להלן:",
+       "blocklog-showlog": "{{GENDER:$1|משתמש זה נחסם|משתמשת זו נחסמה}} בעבר.\nיומן החסימות מוצג להלן:",
+       "blocklog-showsuppresslog": "{{GENDER:$1|משתמש זה נחסם והוסתר|משתמשת זו נחסמה והוסתרה}} בעבר.\nיומן ההעלמות מוצג להלן:",
        "blocklogentry": "חסם את [[$1]] למשך $2 $3",
        "reblock-logentry": "שינה את הגדרות החסימה של [[$1]] עם זמן פקיעה של $2 $3",
        "blocklogtext": "זהו יומן פעולות החסימה והשחרור של משתמשים.\nכתובות IP שנחסמו אוטומטית אינן מופיעות.\nראו גם את [[Special:BlockList|רשימת החסומים]] לרשימה של החרמות וחסימות פעילות כעת.",
        "block-log-flags-noautoblock": "חסימה אוטומטית מבוטלת",
        "block-log-flags-noemail": "שליחת דוא\"ל נחסמה",
        "block-log-flags-nousertalk": "עריכת דף השיחה האישי נחסמה",
-       "block-log-flags-angry-autoblock": "×\97ס×\99×\9e×\94 ×\90×\95×\98×\95×\9e×\98×\99ת ×\9eש×\95×\9b×\9c×\9cת מופעלת",
+       "block-log-flags-angry-autoblock": "×\97ס×\99×\9e×\94 ×\90×\95×\98×\95×\9e×\98×\99ת ×\9eתק×\93×\9eת מופעלת",
        "block-log-flags-hiddenname": "שם המשתמש הוסתר",
        "range_block_disabled": "האפשרות לחסום טווח כתובות אינה פעילה.",
        "ipb_expiry_invalid": "זמן פקיעת החסימה אינו תקין.",
        "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 לא נמצאה. ייתכן שהיא כבר שוחררה.",
        "lockedbyandtime": "(על־ידי $1 ב־$3, $2)",
        "move-page": "העברת הדף \"$1\"",
        "move-page-legend": "העברת דף",
-       "movepagetext": "שימוש בטופס שלהלן ישנה את שמו של דף, ויעביר את כל ההיסטוריה שלו לשם חדש.\nהשם הישן יהפוך לדף הפניה אל הדף עם השם החדש.\nבאפשרותכם לעדכן אוטומטית דפי הפניה לכותרת המקורית.\nאם תבחרו לא לעשות זאת, אנא ודאו שאין [[Special:DoubleRedirects|הפניות כפולות]] או [[Special:BrokenRedirects|שבורות]].\nאתם אחראים לוודא שכל הקישורים ימשיכו להצביע למקום שאליו הם אמורים להצביע.\n\nשימו לב: הדף <strong>לא</strong> יועבר אם כבר יש דף תחת השם החדש, אלא אם הדף השני הוא הפניה ואין לו היסטוריית עריכות קודמות.\nפירוש הדבר שאפשר לשנות חזרה את שמו של דף לשם המקורי אם נעשתה טעות, ושלא ניתן לדרוס דף קיים.\n\n<strong>לתשומת לבכם:</strong>\nשינוי זה עשוי להיות שינוי דרסטי ובלתי צפוי לדף פופולרי;\nאנא ודאו שאתם מבינים את השלכות המעשה לפני שאתם ממשיכים.",
-       "movepagetext-noredirectfixer": "שימוש בטופס שלהלן ישנה את שמו של דף, ויעביר את כל ההיסטוריה שלו לשם חדש.\nהשם הישן יהפוך לדף הפניה אל הדף עם השם החדש.\nאנא ודאו שאין [[Special:DoubleRedirects|הפניות כפולות]] או [[Special:BrokenRedirects|שבורות]].\nאתם אחראים לוודא שכל הקישורים ימשיכו להצביע למקום שאליו הם אמורים להצביע.\n\nשימו לב: הדף <strong>לא</strong> יועבר אם כבר יש דף תחת השם החדש, אלא אם הדף הזה הוא הפניה ואין לו היסטוריית עריכות קודמות.\nפירוש הדבר שאפשר לשנות חזרה את שמו של דף לשם המקורי אם נעשתה טעות, ושלא ניתן לדרוס דף קיים.\n\n<strong>לתשומת לבכם:</strong>\nשינוי זה עשוי להיות שינוי דרסטי ובלתי צפוי לדף פופולרי;\nאנא ודאו שאתם מבינים את השלכות המעשה לפני שאתם ממשיכים.",
+       "movepagetext": "{{GENDER:|השתמש|השתמשי|השתמשו}} בטופס שלהן כדי לשנות את השם של הדף הזה, ולהעביר את כל היסטוריית העריכות שלו לשם החדש.\nהשם הישן יהפוך לדף הפניה אל השם החדש.\n{{GENDER:|באפשרותך|באפשרותך|באפשרותכם}} לעדכן באופן אוטומטי דפי הפניה שכרגע מפנים לשם הנוכחי של הדף.\nאם {{GENDER:|תבחר|תבחרי|תבחרו}} לא לעשות זאת, אנא {{GENDER:|ודא|ודאי|ודאו}} לאחר ההעברה שאין [[Special:DoubleRedirects|הפניות כפולות]] או [[Special:BrokenRedirects|הפניות שבורות]].\nב{{GENDER:|אחריותך|אחריותך|אחריותכם}} לוודא שכל הקישורים ימשיכו לקשר למקומות שאליהם הם אמורים לקשר.\n\n{{GENDER:|שים|שימי|שימו}} לב שהדף <strong>לא</strong> יועבר אם כבר יש דף תחת השם החדש ש{{GENDER:|תבחר|תבחרי|תבחרו}}, אלא אם כן הדף עם השם החדש הוא הפניה ואין לו עריכות קודמות.\nזה אומר ש{{GENDER:|תוכל|תוכלי|תוכלו}} להחזיר את הדף לשם המקורי במקרה שתיעשה טעות, אבל לא ניתן \"לדרוס\" דף קיים.\n\n<strong>לתשומת {{GENDER:|לבך|לבך|לבכם}}:</strong>\nהעברה זו עלולה להיות שינוי דרסטי ומהותי לדף פופולרי;\nאנא {{GENDER:|ודא שאתה מבין|ודאי שאת מבינה|ודאו שאתם מבינים}} את התוצאות של הפעולה הזאת לפני ביצוע ההעברה.",
+       "movepagetext-noredirectfixer": "{{GENDER:|השתמש|השתמשי|השתמשו}} בטופס שלהן כדי לשנות את השם של הדף הזה, ולהעביר את כל היסטוריית העריכות שלו לשם החדש.\nהשם הישן יהפוך לדף הפניה אל השם החדש.\nאנא {{GENDER:|ודא|ודאי|ודאו}} לאחר ההעברה שאין [[Special:DoubleRedirects|הפניות כפולות]] או [[Special:BrokenRedirects|הפניות שבורות]].\nב{{GENDER:|אחריותך|אחריותך|אחריותכם}} לוודא שכל הקישורים ימשיכו לקשר למקומות שאליהם הם אמורים לקשר.\n\n{{GENDER:|שים|שימי|שימו}} לב שהדף <strong>לא</strong> יועבר אם כבר יש דף תחת השם החדש ש{{GENDER:|תבחר|תבחרי|תבחרו}}, אלא אם כן הדף עם השם החדש הוא הפניה ואין לו עריכות קודמות.\nזה אומר ש{{GENDER:|תוכל|תוכלי|תוכלו}} להחזיר את הדף לשם המקורי במקרה שתיעשה טעות, אבל לא ניתן \"לדרוס\" דף קיים.\n\n<strong>לתשומת {{GENDER:|לבך|לבך|לבכם}}:</strong>\nהעברה זו עלולה להיות שינוי דרסטי ומהותי לדף פופולרי;\nאנא {{GENDER:|ודא שאתה מבין|ודאי שאת מבינה|ודאו שאתם מבינים}} את התוצאות של הפעולה הזאת לפני ביצוע ההעברה.",
        "movepagetalktext": "אם התיבה הזאת מסומנת, דף השיחה של דף זה יועבר אוטומטית לכותרת החדשה, אלא אם קיים שם דף שיחה שאינו ריק.\n\nבמקרה הזה, תצטרכו להעביר או לשלב את הדפים באופן ידני, אם תרצו.",
        "moveuserpage-warning": "'''אזהרה:''' אתם עומדים להעביר דף משתמש. שימו לב שרק הדף יועבר וששם המשתמש '''לא''' ישתנה.",
        "movecategorypage-warning": "<strong>אזהרה:</strong> אתם עומדים להעביר דף קטגוריה. שימו לב שרק הדף יועבר ושכל הדפים בקטגוריה הישנה <strong>לא</strong> יסווגו לקטגוריה החדשה.",
        "tooltip-pt-userpage": "דף {{GENDER:|המשתמש|המשתמשת}} שלך",
        "tooltip-pt-anonuserpage": "דף המשתמש של משתמש אנונימי זה",
        "tooltip-pt-mytalk": "דף השיחה שלך",
-       "tooltip-pt-anontalk": "ש×\99×\97×\94 ×¢×\9c ×ª×¨×\95×\9e×\95ת ×\94×\9eשת×\9eש ×\94×\90× ×\95× ×\99×\9e×\99",
+       "tooltip-pt-anontalk": "×\93×\99×\95×\9f ×¢×\9c ×\94ער×\99×\9b×\95ת ×©× ×¢×©×\95 ×\9e×\9b×\95ת×\91ת ×\94Ö¾IP ×\94×\96×\90ת",
        "tooltip-pt-preferences": "ההעדפות שלך",
        "tooltip-pt-watchlist": "רשימת הדפים ש{{GENDER:|אתה עוקב|את עוקבת}} אחרי השינויים בהם",
        "tooltip-pt-mycontris": "רשימת התרומות שלך",
        "tooltip-pt-anoncontribs": "רשימת העריכות שנעשו מכתובת ה־IP הזאת",
-       "tooltip-pt-login": "מומלץ להיכנס לחשבון; עם זאת, אין חובה לעשות זאת",
+       "tooltip-pt-login": "מומלץ להיכנס לחשבון, אבל לא חובה לעשות זאת",
        "tooltip-pt-logout": "יציאה מהחשבון",
-       "tooltip-pt-createaccount": "מומלץ ליצור חשבון ולהיכנס אליו; עם זאת, אין חובה לעשות זאת",
+       "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": "×\94×¢×\91רת דף זה",
-       "tooltip-ca-watch": "הוספת דף זה לרשימת המעקב",
-       "tooltip-ca-unwatch": "הסרת דף זה מרשימת המעקב",
+       "tooltip-ca-move": "ש×\99× ×\95×\99 ×\94ש×\9d ×©×\9c דף זה",
+       "tooltip-ca-watch": "הוספת דף זה לרשימת המעקב שלך",
+       "tooltip-ca-unwatch": "הסרת דף זה מרשימת המעקב שלך",
        "tooltip-search": "חיפוש ב{{grammar:תחילית|{{SITENAME}}}}",
        "tooltip-search-go": "מעבר לדף בשם הזה בדיוק, אם הוא קיים",
        "tooltip-search-fulltext": "חיפוש טקסט זה בדפים",
        "tooltip-t-recentchangeslinked": "השינויים האחרונים שבוצעו בדפים המקושרים מדף זה",
        "tooltip-feed-rss": "הזנת RSS עבור דף זה",
        "tooltip-feed-atom": "הזנת Atom עבור דף זה",
-       "tooltip-t-contributions": "{{GENDER:$1|תרומותיו של משתמש זה|תרומותיה של משתמשת זו}}",
+       "tooltip-t-contributions": "רשימת העריכות שנעשו על־ידי {{GENDER:$1|משתמש זה|משתמשת זו}}",
        "tooltip-t-emailuser": "שליחת דואר אלקטרוני {{GENDER:$1|למשתמש זה|למשתמשת זו}}",
        "tooltip-t-info": "מידע נוסף על דף זה",
        "tooltip-t-upload": "העלאת קבצים",
        "tooltip-publish": "פרסום השינויים שלך",
        "tooltip-preview": "תצוגה מקדימה של השינויים שלך. נא להשתמש באפשרות זו לפני השמירה.",
        "tooltip-diff": "הצגת השינויים שביצעת בטקסט",
-       "tooltip-compareselectedversions": "צפ×\99×\99×\94 ×\91×\94ש×\95×\95×\90ת ×©×ª×\99 ×\92רס×\90×\95ת ×©×\9c ×\93×£ ×\96×\94",
+       "tooltip-compareselectedversions": "×\94צ×\92ת ×\94×\94×\91×\93×\9c×\99×\9d ×\91×\99×\9f ×©×ª×\99 ×\94×\92רס×\90×\95ת ×©× ×\91×\97ר×\95",
        "tooltip-watch": "הוספת דף זה לרשימת המעקב שלך",
        "tooltip-watchlistedit-normal-submit": "הסרת הדפים",
        "tooltip-watchlistedit-raw-submit": "עדכון רשימת המעקב",
        "tooltip-rollback": "שחזור בלחיצה אחת של העריכה או העריכות של התורם האחרון לדף זה",
        "tooltip-undo": "פתיחת חלון העריכה במצב תצוגה מקדימה כדי לשחזר את העריכה, תוך אפשרות להוספת סיבה בתקציר העריכה",
        "tooltip-preferences-save": "שמירת ההעדפות",
-       "tooltip-summary": "×\9c×\94×\9bנסת ×ª×§×¦×\99ר ×§×¦×¨",
+       "tooltip-summary": "ת×\99×\90×\95ר ×§×¦×¨ ×©×\9c ×\94ש×\99× ×\95×\99×\99×\9d ×©×\91×\99צעת",
        "common.css": "/* הסגנונות הנכתבים כאן ישפיעו על כל העיצובים */",
        "print.css": "/* הסגנונות הנכתבים כאן ישפיעו על הפלט בהדפסה בלבד */",
-       "noscript.css": "/* הסגנונות הנכתבים כאן ישפיעו על משתמשים עם JavaScript מבוטל */",
+       "noscript.css": "/* הסגנונות הנכתבים כאן ישפיעו על משתמשים עם ג'אווה-סקריפט מבוטל */",
        "group-autoconfirmed.css": "/* הסגנונות הנכתבים כאן ישפיעו על משתמשים ותיקים בלבד */",
        "group-user.css": "/* הסגנונות הנכתבים כאן ישפיעו על משתמשים רשומים בלבד */",
        "group-bot.css": "/* הסגנונות הנכתבים כאן ישפיעו על בוטים בלבד */",
        "group-sysop.css": "/* הסגנונות הנכתבים כאן ישפיעו על מפעילי מערכת בלבד */",
        "group-bureaucrat.css": "/* הסגנונות הנכתבים כאן ישפיעו על ביורוקרטים בלבד */",
-       "common.js": "/* ×\9b×\9c ×¡×§×¨×\99פ×\98 JavaScript ×©× ×\9bת×\91 ×\9b×\90×\9f ×\99ר×\95×¥ ×¢×\91×\95ר ×\9b×\9c ×\94×\9eשת×\9eש×\99×\9d ×\91×\9b×\9c ×\98×¢×\99נת ×¢×\9e×\95×\93 */",
-       "group-autoconfirmed.js": "/* ×\9b×\9c ×¡×§×¨×\99פ×\98 JavaScript ×©× ×\9bת×\91 ×\9b×\90×\9f ×\99ר×\95×¥ עבור משתמשים ותיקים בלבד */",
-       "group-user.js": "/* ×\9b×\9c ×¡×§×¨×\99פ×\98 JavaScript ×©× ×\9bת×\91 ×\9b×\90×\9f ×\99ר×\95×¥ עבור משתמשים רשומים בלבד */",
-       "group-bot.js": "/* ×\9b×\9c ×¡×§×¨×\99פ×\98 JavaScript ×©× ×\9bת×\91 ×\9b×\90×\9f ×\99ר×\95×¥ עבור בוטים בלבד */",
-       "group-sysop.js": "/* ×\9b×\9c ×¡×§×¨×\99פ×\98 JavaScript ×©× ×\9bת×\91 ×\9b×\90×\9f ×\99ר×\95×¥ עבור מפעילי מערכת בלבד */",
-       "group-bureaucrat.js": "/* ×\9b×\9c ×¡×§×¨×\99פ×\98 JavaScript ×©× ×\9bת×\91 ×\9b×\90×\9f ×\99ר×\95×¥ עבור ביורוקרטים בלבד */",
+       "common.js": "/* ×\9b×\9c ×\94סקר×\99פ×\98×\99×\9d ×©× ×\9bת×\91×\99×\9d ×\9b×\90×\9f ×\99×\99×\98×¢× ×\95 ×¢×\91×\95ר ×\9b×\9c ×\94×\9eשת×\9eש×\99×\9d ×\91×\9b×\9c ×\98×¢×\99נת ×¢×\9e×\95×\93. */",
+       "group-autoconfirmed.js": "/* ×\9b×\9c ×\94סקר×\99פ×\98×\99×\9d ×\94× ×\9bת×\91×\99×\9d ×\9b×\90×\9f ×\99×\99×\98×¢× ×\95 עבור משתמשים ותיקים בלבד */",
+       "group-user.js": "/* ×\9b×\9c ×\94סקר×\99פ×\98×\99×\9d ×\94× ×\9bת×\91×\99×\9d ×\9b×\90×\9f ×\99×\99×\98×¢× ×\95 עבור משתמשים רשומים בלבד */",
+       "group-bot.js": "/* ×\9b×\9c ×\94סקר×\99פ×\98×\99×\9d ×\94× ×\9bת×\91×\99×\9d ×\9b×\90×\9f ×\99×\99×\98×¢× ×\95 עבור בוטים בלבד */",
+       "group-sysop.js": "/* ×\9b×\9c ×\94סקר×\99פ×\98×\99×\9d ×\94× ×\9bת×\91×\99×\9d ×\9b×\90×\9f ×\99×\99×\98×¢× ×\95 עבור מפעילי מערכת בלבד */",
+       "group-bureaucrat.js": "/* ×\9b×\9c ×\94סקר×\99פ×\98×\99×\9d ×\94× ×\9bת×\91×\99×\9d ×\9b×\90×\9f ×\99×\99×\98×¢× ×\95 עבור ביורוקרטים בלבד */",
        "anonymous": "{{PLURAL:$1|משתמש אנונימי|משתמשים אנונימיים}} של {{SITENAME}}",
        "siteuser": "משתמש {{SITENAME}} $1",
        "anonuser": "משתמש אנונימי של {{SITENAME}} $1",
        "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 יומן שינויים בדוקים",
        "log-show-hide-tag": "$1 יומן תגיות",
-       "deletedrevision": "×\9e×\97ק ×\92רס×\94 ×\99שנ×\94 $1",
+       "deletedrevision": "×\9e×\97×\99קת ×\92רס×\94 ×\99שנ×\94 ($1)",
        "filedeleteerror-short": "שגיאה במחיקת הקובץ: $1",
        "filedeleteerror-long": "שגיאות שאירעו בעת מחיקת הקובץ:\n\n$1",
        "filedelete-missing": "מחיקת הקובץ \"$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": "להסיר דף זה מרשימת המעקב שלך?",
+       "confirm-unwatch-top": "להסיר את הדף הזה מרשימת המעקב שלך?",
+       "confirm-rollback-button": "אישור",
+       "confirm-rollback-top": "לשחזור את השינויים לדף הזה?",
        "quotation-marks": "\"$1\"",
        "imgmultipageprev": "→ לדף הקודם",
        "imgmultipagenext": "לדף הבא ←",
        "autoredircomment": "הפניה לדף [[$1]]",
        "autosumm-new": "יצירת דף עם התוכן \"$1\"",
        "autosumm-newblank": "יצירת דף ריק",
-       "size-bytes": "{{PLURAL:$1|בייט אחד|$1 בייט}}",
+       "size-bytes": "{{PLURAL:$1|בייט אחד|$1 בייטים}}",
        "size-kilobytes": "$1 קילו־בייט",
        "size-megabytes": "$1 מגה־בייט",
        "size-gigabytes": "$1 ג'יגה־בייט",
        "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": "חורדאד",
        "tags-edit-success": "השינויים הוחלו.",
        "tags-edit-failure": "החלת השינויים נכשלה:\n$1",
        "tags-edit-nooldid-title": "גרסת היעד אינה תקינה",
-       "tags-edit-nooldid-text": "×\90×\95 שלא ציינת שום גרסה שהפעולה תבוצע עליה, או שהגרסה שציינת אינה קיימת.",
+       "tags-edit-nooldid-text": "×\99×\99ת×\9b×\9f שלא ציינת שום גרסה שהפעולה תבוצע עליה, או שהגרסה שציינת אינה קיימת.",
        "tags-edit-none-selected": "יש לבחור לפחות תגית אחת להוספה או להסרה.",
        "comparepages": "השוואת דפים",
        "compare-page1": "דף 1",
        "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": "אחר",
        "logentry-block-reblock": "$1 {{GENDER:$2|שינה|שינתה}} את הגדרות החסימה של {{GENDER:$4|$3}} עם זמן פקיעה של $5 $6",
        "logentry-suppress-block": "$1 {{GENDER:$2|חסם|חסמה}} את {{GENDER:$4|$3}} עם זמן פקיעה של $5 $6",
        "logentry-suppress-reblock": "$1 {{GENDER:$2|שינה|שינתה}} את הגדרות החסימה של {{GENDER:$4|$3}} עם זמן פקיעה של $5 $6",
-       "logentry-import-upload": "$1 {{GENDER:$2|ייבא|ייבאה}} את $3 באמצעות העלאת קובץ",
+       "logentry-import-upload": "$1 {{GENDER:$2|ייבא|ייבאה}} את הדף $3 באמצעות העלאת קובץ",
        "logentry-import-upload-details": "$1 {{GENDER:$2|ייבא|ייבאה}} את $3 באמצעות העלאת קובץ ({{PLURAL:$4|גרסה אחת|$4 גרסאות}})",
-       "logentry-import-interwiki": "$1 {{GENDER:$2|ייבא|ייבאה}} את $3 מאתר ויקי אחר",
-       "logentry-import-interwiki-details": "$1 {{GENDER:$2|ייבא|ייבאה}} את $3 מ־$5&rlm; ({{PLURAL:$4|גרסה אחת|$4 גרסאות}})",
-       "logentry-merge-merge": "$1 {{GENDER:$2|מיזג|מיזגה}} את $3 לתוך $4 (גרסאות עד $5)",
+       "logentry-import-interwiki": "$1 {{GENDER:$2|ייבא|ייבאה}} את הדף $3 מאתר ויקי אחר",
+       "logentry-import-interwiki-details": "$1 {{GENDER:$2|ייבא|ייבאה}} את הדף $3 מ־$5&rlm; ({{PLURAL:$4|גרסה אחת|$4 גרסאות}})",
+       "logentry-merge-merge": "$1 {{GENDER:$2|מיזג|מיזגה}} את הדף $3 לתוך הדף $4 (גרסאות עד $5)",
        "logentry-move-move": "$1 {{GENDER:$2|העביר|העבירה}} את הדף $3 לשם $4",
        "logentry-move-move-noredirect": "$1 {{GENDER:$2|העביר|העבירה}} את הדף $3 לשם $4 בלי להשאיר הפניה",
        "logentry-move-move_redir": "$1 {{GENDER:$2|העביר|העבירה}} את הדף $3 לשם $4 תוך דריסת הפניה",
        "sessionprovider-nocookies": "ייתכן שאפשרות השימוש בעוגיות כבויה. יש לוודא שאפשרות השימוש בעוגיות מופעלת ולהתחיל מחדש.",
        "randomrootpage": "דף שורש אקראי",
        "log-action-filter-block": "סוג החסימות:",
-       "log-action-filter-contentmodel": "סוג השינויים במודל תוכן:",
+       "log-action-filter-contentmodel": "ס×\95×\92 ×\94ש×\99× ×\95×\99×\99×\9d ×\91×\9e×\95×\93×\9c ×\94ת×\95×\9b×\9f:",
        "log-action-filter-delete": "סוג המחיקות:",
        "log-action-filter-import": "סוג פעולות הייבוא:",
-       "log-action-filter-managetags": "ס×\95×\92 ×¤×¢×\95×\9c×\95ת × ×\99×\94×\95×\9c ×\94תגיות:",
+       "log-action-filter-managetags": "ס×\95×\92 ×\94ש×\99× ×\95×\99×\99×\9d ×\91תגיות:",
        "log-action-filter-move": "סוג ההעברות:",
-       "log-action-filter-newusers": "ס×\95×\92 ×\99צ×\99ר×\95ת ×\94×\97ש×\91×\95×\9f:",
-       "log-action-filter-patrol": "ס×\95×\92 ×\94ש×\99× ×\95×\99×\99×\9d ×\94בדוקים:",
+       "log-action-filter-newusers": "ס×\95×\92 ×¤×¢×\95×\9c×\95ת ×\94×\94רש×\9e×\94:",
+       "log-action-filter-patrol": "ס×\95×\92 ×\94ס×\99×\9e×\95× ×\99×\9d ×©×\9c ×\94ש×\99× ×\95×\99×\99×\9d ×\9bבדוקים:",
        "log-action-filter-protect": "סוג ההגנות:",
-       "log-action-filter-rights": "ס×\95×\92 ×©×\99× ×\95×\99×\99 ×\94×\94רש×\90×\94",
+       "log-action-filter-rights": "ס×\95×\92 ×©×\99× ×\95×\99×\99 ×\94×\94רש×\90×\95ת:",
        "log-action-filter-suppress": "סוג ההעלמות",
        "log-action-filter-upload": "סוג ההעלאות:",
        "log-action-filter-all": "הכול",
        "log-action-filter-block-block": "חסימות",
-       "log-action-filter-block-reblock": "שינויי חסימה",
-       "log-action-filter-block-unblock": "שחרורי חסימה",
-       "log-action-filter-contentmodel-change": "ש×\99× ×\95×\99×\99×\9d ×\91×\9e×\95×\93×\9c ×ª×\95×\9b×\9f",
-       "log-action-filter-contentmodel-new": "×\99צ×\99ר×\95ת ×\93פ×\99×\9d ×¢×\9d ×\9e×\95×\93×\9c ×ª×\95×\9b×\9f ×\9c×\90־ס×\98× ×\93ר×\98×\99",
-       "log-action-filter-delete-delete": "×\9e×\97×\99קת דפים",
-       "log-action-filter-delete-restore": "שחזור דפים מחוקים",
-       "log-action-filter-delete-event": "×\9e×\97×\99קת פעולות יומן",
-       "log-action-filter-delete-revision": "×\9e×\97×\99קת גרסאות",
-       "log-action-filter-import-interwiki": "פע×\95×\9c×\95ת ×\99×\99×\91×\95×\90 מאתרי ויקי אחרים",
-       "log-action-filter-import-upload": "פע×\95×\9c×\95ת ×\99×\99×\91×\95×\90 ×¢×\9cÖ¾×\99×\93×\99 העלאת XML",
+       "log-action-filter-block-reblock": "שינויים של חסימות",
+       "log-action-filter-block-unblock": "שחרורים של חסימות",
+       "log-action-filter-contentmodel-change": "ש×\99× ×\95×\99×\99×\9d ×\91×\9e×\95×\93×\9c ×\94ת×\95×\9b×\9f ×©×\9c ×\93פ×\99×\9d ×§×\99×\99×\9e×\99×\9d",
+       "log-action-filter-contentmodel-new": "×\99צ×\99ר×\95ת ×©×\9c ×\93פ×\99×\9d ×¢×\9d ×\9e×\95×\93×\9c ×ª×\95×\9b×\9f ×©×\95× ×\94 ×\9e×\91ר×\99רת ×\94×\9e×\97×\93×\9c",
+       "log-action-filter-delete-delete": "×\9e×\97×\99ק×\95ת ×©×\9c דפים",
+       "log-action-filter-delete-restore": "שחזורים של דפים מחוקים",
+       "log-action-filter-delete-event": "×\9e×\97×\99ק×\95ת ×©×\9c פעולות יומן",
+       "log-action-filter-delete-revision": "×\9e×\97×\99ק×\95ת ×©×\9c גרסאות",
+       "log-action-filter-import-interwiki": "×\99×\99×\91×\95×\90 ×\93פ×\99×\9d מאתרי ויקי אחרים",
+       "log-action-filter-import-upload": "×\99×\99×\91×\95×\90 ×\93פ×\99×\9d ×\91×\90×\9eצע×\95ת העלאת XML",
        "log-action-filter-managetags-create": "יצירות של תגיות",
        "log-action-filter-managetags-delete": "מחיקות של תגיות",
        "log-action-filter-managetags-activate": "הפעלות של תגיות",
        "log-action-filter-managetags-deactivate": "ביטול הפעלות של תגיות",
        "log-action-filter-move-move": "העברות ללא דריסת הפניות",
        "log-action-filter-move-move_redir": "העברות עם דריסת הפניות",
-       "log-action-filter-newusers-create": "×\99צ×\99רות על־ידי משתמשים אנונימיים",
-       "log-action-filter-newusers-create2": "יצירות על־ידי משתמשים רשומים",
-       "log-action-filter-newusers-autocreate": "יצירות אוטומטיות",
-       "log-action-filter-newusers-byemail": "יצירות עם סיסמה שנשלחה בדוא\"ל",
-       "log-action-filter-patrol-patrol": "ס×\99×\9e×\95× ×\99×\99×\9d ×\99×\93× ×\99×\99×\9d ×\9b×\91×\93×\95ק",
-       "log-action-filter-patrol-autopatrol": "סימונים אוטומטיים כבדוק",
-       "log-action-filter-protect-protect": "הגנות",
-       "log-action-filter-protect-modify": "שינויי הגנה",
-       "log-action-filter-protect-unprotect": "×\94סר×\95ת ×\94×\92× ×\94",
-       "log-action-filter-protect-move_prot": "×\94×¢×\91ר×\95ת ×©×\9c ×\94×\92× ×\94",
+       "log-action-filter-newusers-create": "×\94רש×\9eות על־ידי משתמשים אנונימיים",
+       "log-action-filter-newusers-create2": "×\99צ×\99ר×\95ת ×©×\9c ×\97ש×\91×\95× ×\95ת ×¢×\9cÖ¾×\99×\93×\99 ×\9eשת×\9eש×\99×\9d ×¨×©×\95×\9e×\99×\9d",
+       "log-action-filter-newusers-autocreate": "יצירות אוטומטיות של חשבונות",
+       "log-action-filter-newusers-byemail": "×\99צ×\99ר×\95ת ×©×\9c ×\97ש×\91×\95× ×\95ת ×¢×\9d ×¡×\99ס×\9e×\94 ×©× ×©×\9c×\97×\94 ×\91×\93×\95×\90\"×\9c",
+       "log-action-filter-patrol-patrol": "ס×\99×\9e×\95× ×\99×\9d ×\99×\93× ×\99×\99×\9d",
+       "log-action-filter-patrol-autopatrol": "סימונים אוטומטיים",
+       "log-action-filter-protect-protect": "×\94פע×\9c×\95ת ×©×\9c ×\94×\92× ×\95ת",
+       "log-action-filter-protect-modify": "שינויים של הגנות",
+       "log-action-filter-protect-unprotect": "×\94סר×\95ת ×©×\9c ×\94×\92× ×\95ת",
+       "log-action-filter-protect-move_prot": "×\94×¢×\91ר×\95ת ×©×\9c ×\94×\92× ×\95ת",
        "log-action-filter-rights-rights": "שינויים ידניים",
        "log-action-filter-rights-autopromote": "שינויים אוטומטיים",
        "log-action-filter-suppress-event": "העלמות של פעולות יומן",
        "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-invalidsubpage": "$1 אינו סוג אישור תקין.",
+       "changecredentials-success": "האישורים שלך שונו.",
+       "removecredentials": "הסרת האישורים",
+       "removecredentials-submit": "הסרת האישורים",
+       "removecredentials-invalidsubpage": "$1 אינו סוג אישור תקין.",
+       "removecredentials-success": "האישורים שלך הוסרו.",
+       "credentialsform-provider": "סוג האישורים:",
+       "credentialsform-account": "שם החשבון:",
+       "cannotlink-no-provider-title": "אין חשבונות שניתן לקשר",
+       "cannotlink-no-provider": "אין חשבונות שניתן לקשר.",
+       "linkaccounts": "קישור חשבונות",
+       "linkaccounts-success-text": "החשבון קושר.",
+       "linkaccounts-submit": "קישור החשבונות",
+       "unlinkaccounts": "ביטול הקישור של החשבונות",
+       "unlinkaccounts-success": "קישור החשבון בוטל."
 }
index 8d8024f..4d5b625 100644 (file)
@@ -91,6 +91,7 @@
        "tog-watchdefault": "मेरे द्वारा सम्पादित पृष्ठों और फ़ाइलों को मेरी ध्यानसूची में जोड़ें",
        "tog-watchmoves": "मेरे द्वारा स्थानांतरित पृष्ठों एवं फ़ाइलों को मेरी ध्यानसूची में जोड़ें",
        "tog-watchdeletion": "मेरे द्वारा हटाए गए पृष्ठों एवं फ़ाइलों को मेरी ध्यानसूची में जोड़ें",
+       "tog-watchuploads": "मेरे नए फ़ाइलों को मेरे ध्यानसूची में डालें।",
        "tog-watchrollback": "मेरे द्वारा प्रत्यापन्न (रोलबैक) किये हुये पृष्ठों को मेरी ध्यानसूची में जोड़ें।",
        "tog-minordefault": "मेरे सभी सम्पादनों को छोटे बदलाव के रूप में चिह्नित करें",
        "tog-previewontop": "सम्पादन सन्दूक से पहले झलक दिखायें",
        "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|पृष्ठ}}",
        "noname": "आपने वैध सदस्यनाम नहीं दिया है।",
        "loginsuccesstitle": "प्रवेश हुआ",
        "loginsuccess": "'''आप {{SITENAME}} में \"$1\" सदस्यनाम से लॉग इन हो {{GENDER:$1|चुके|चुकी|चुके}} हैं।'''",
-       "nosuchuser": "\"$1\" नाम का कोई सदस्य नहीं है।\nसदस्यनाम में लघु और दीर्घ अक्षरों से फ़र्क पड़ता है।\nअपनी वर्तनी जाँचें, या [[Special:CreateAccount|नया खाता खोलें]]।",
+       "nosuchuser": "यहाँ \"$1\" नाम का कोई सदस्य नहीं है।\nसदस्यनाम में लघु और दीर्घ अक्षरों से फ़र्क पड़ता है।\nअपनी वर्तनी जाँचें, या [[Special:CreateAccount|नया खाता खोलें]]।",
        "nosuchusershort": "\"$1\" नाम का कोई सदस्य नहीं है।\nकृपया अपनी दी हुई वर्तनी जाँचें।",
        "nouserspecified": "सदस्यनाम देना अनिवार्य है।",
        "login-userblocked": "यह सदस्य प्रतिबन्धित है। सत्रारम्भ की अनुमति नहीं है।",
        "createacct-another-realname-tip": "असली नाम देना आवश्यक नहीं है।\nयदि आप प्रदान करते हैं तो इसका प्रयोग सदस्य के योगदानों के लिये उनको श्रेय (attribution) देने के लिये किया जायेगा।",
        "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|सदस्य}} को भेजना असफल रहा।\nत्रुटि: $1",
+       "passwordreset-emailerror-capture2": "{{GENDER:$2|सदस्य}} को ईमेल भेजना विफल : $1 {{PLURAL:$3|सदस्य नाम और पासवर्ड|सदस्य नाम और पासवर्ड की सूची}} नीचे दिया गया है।",
+       "passwordreset-invalideamil": "अवैध ईमेल पता",
        "changeemail": "ई-मेल पता परिवर्तित करें",
        "changeemail-header": "अपना ईमेल पता परिवर्तन हेतु इसे पूरा करें। यदि आप अपना वर्तमान ईमेल पता हटाना चाहते हैं, तो इसे खाली छोड़ दें और इसे भेजें।",
        "changeemail-passwordrequired": "आपको इस परिवर्तन हेतु पासवर्ड (कूटशब्द) डालना होगा।",
        "minoredit": "यह एक छोटा बदलाव है",
        "watchthis": "इस पृष्ठ को ध्यानसूची में डालें",
        "savearticle": "पृष्ठ सहेजें",
+       "publishpage": "पृष्ठ प्रकाशित करें",
        "preview": "झलक",
        "showpreview": "झलक दिखाएँ",
        "showdiff": "बदलाव दिखाएँ",
        "accmailtext": "[[User talk:$1|$1]] के लिए एक यंत्र जनित कूटशब्द $2 को भेज दिया गया है। लॉगिन करने के बाद इसे '''[[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}}|इस शीर्षक की खोज]] कर सकते हैं,\nया <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} संबंधित लॉग खोज सकते हैं]</span>, परन्तु आपको यह पृष्ठ बनाने की अनुमति नहीं है।",
        "missing-revision": "\"{{FULLPAGENAME}}\" पृष्ठ का अवतरण #$1 मौजूद नहीं है।\n\nआम तौर पर यह एक हटाए गए पृष्ठ के पुराने लिंक पर क्लिक करने से होता है।\nअधिक जानकारी के लिए आप [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} हटाने का लॉग] देख सकते हैं।",
        "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 ने  $3 पृष्ठ का {{GENDER:$2|निर्माण}} किया बिना मूल सामग्री प्रारूप के \"$5\"",
        "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": "इस पृष्ठ के चुने हुए अवतरणों में अन्तर देखें।",
        "confirmemail_body_set": "किसी ने, शायद आपने ही, आई॰पी पते $1 से,\n{{SITENAME}} पर \"$2\" सदस्य खाते का ई-मेल पता यह ईमेल पता निर्दिष्ट किया है।\n\nइस बात की पुष्टि करने के लिए कि यह सदस्य खाता आपका ही है,\nऔर {{SITENAME}} पर ईमेल सुविधाएँ शुरू करने के लिए निम्न लिंक अपने ब्राउज़र में खोलें:\n\n$3\n\nयदि यह सदस्य खाता आपका नहीं है, ई-मेल पुष्टि रद्द करने के लिए निम्न लिंक पर जाएँ:\n\n$5\n\nयह पुष्टिकरण लिंक $6 को $7 के बाद काम नहीं करेंगे।",
        "confirmemail_invalidated": "इ-मेल एड्रेस प्रमाणिकरण रद्द कर दिया गया हैं",
        "invalidateemail": "इ-मेल प्रमाणिकरण रद्द करें",
+       "notificationemail_subject_changed": "{{SITENAME}} पंजीकृत ईमेल खाता बदला गया।",
+       "notificationemail_subject_removed": "{{SITENAME}} पंजीकृत ईमेल खाता हटाया गया।",
        "scarytranscludedisabled": "[आंतरविकि ट्रान्स्क्लुडिंग बंद हैं]",
        "scarytranscludefailed": "[$1 के लिये साँचा मँगा नहीं पाए]",
        "scarytranscludefailed-httpstatus": "[$1 के लिये साँचा मँगा नहीं पाए, त्रुटि: HTTP $2]",
        "confirm-watch-top": "इस पृष्ठ को अपने ध्यानसूची में जोड़ें?",
        "confirm-unwatch-button": "ठीक है",
        "confirm-unwatch-top": "यह पृष्ठ अपने ध्यानसूचीसे हटाएं?",
+       "confirm-rollback-button": "ठीक है",
+       "confirm-rollback-top": "इस पृष्ठ के सम्पादन पूर्ववत करें?",
        "semicolon-separator": ";",
        "quotation-marks": "\"$1\"",
        "imgmultipageprev": "← पिछला पृष्ठ",
        "watchlistedit-raw-done": "आपकी ध्यानसूची अपडेट कर दी गई हैं",
        "watchlistedit-raw-added": "{{PLURAL:$1|1शीर्षक|$1 शीर्षक}} बढा दिये:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|1शीर्षक|$1 शीर्षक}} हटा दिये:",
-       "watchlistedit-clear-title": "धà¥\8dयानसà¥\82à¤\9aà¥\80 à¤\96ालà¥\80 à¤\95à¥\80",
+       "watchlistedit-clear-title": "धà¥\8dयानसà¥\82à¤\9aà¥\80 à¤\96ालà¥\80 à¤\95रà¥\87à¤\82",
        "watchlistedit-clear-legend": "ध्यानसूची खाली करें",
        "watchlistedit-clear-explain": "आपकी ध्यानसूची से सभी पृष्ठ हटा दिये जायेंगे",
        "watchlistedit-clear-titles": "खिताब:",
        "timezone-local": "स्थानीय",
        "duplicate-defaultsort": "'''Warning:''' पुरानी मूल क्रमांकन कुंजी \"$1\" के बजाय अब मूल क्रमांकन कुंजी \"$2\" होगी।",
        "duplicate-displaytitle": "<strong>चेतावनी:</strong> शीर्षक दिखाएँ \"$2\" पूर्व दिखाए गए शीर्षक \"$1\" पर छा रहा है।",
+       "restricted-displaytitle": "<strong>चेतावनी :</strong> प्रदर्शित शीर्षक \"$1\" को नजरअंदाज किया गया है, क्योंकि यह वास्तविक शीर्षक से मिलता नहीं है।",
        "invalid-indicator-name": "<strong>त्रुटि:</strong> पृष्ठ स्थिति सांकेतक <code>नाम</code> गुण खाली नहीं रहना चाहिए।",
        "version": "रूपान्तर",
        "version-extensions": "इन्स्टॉल की हुई एक्स्टेंशन",
        "version-libraries-license": "अनुज्ञापत्र",
        "version-libraries-description": "विवरण",
        "version-libraries-authors": "लेखक",
-       "redirect": "à¤\85नà¥\81पà¥\8dरà¥\87षित à¤\95रà¥\87à¤\82 à¤«à¤¼à¤¾à¤\87ल, à¤\89पयà¥\8bà¤\97à¤\95रà¥\8dता, à¤¯à¤¾ à¤¸à¤\82शà¥\8bधन à¤ªà¤¹à¤\9aान à¤\95à¥\87 à¤\86धार à¤ªà¤°",
+       "redirect": "फ़ाà¤\87ल, à¤¸à¤¦à¤¸à¥\8dय, à¤ªà¥\83षà¥\8dठ, à¤\85वतरण à¤¯à¤¾ à¤²à¥\89à¤\97 à¤\86à¤\88डà¥\80 à¤¦à¥\8dवारा à¤\85नà¥\81पà¥\8dरà¥\87षित",
        "redirect-summary": "यह विशेष पृष्ठ फ़ाइलनाम प्रदान करने पर फ़ाइल नाम को, पृष्ठ आइ॰दी अथवा अवतरण आइ॰दी देने पर पृष्ठ को, और सदस्य आइ॰दी देने पर सदस्य पृष्ठ को पुनर्प्रेषित करता है। उदाहरण: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], या [[{{#Special:Redirect}}/user/101]]।",
        "redirect-submit": "जायें",
        "redirect-lookup": "ढूँढें:",
        "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": "कारण:",
        "feedback-useragent": "सदस्य कर्ता:",
        "searchsuggest-search": "खोज",
        "searchsuggest-containing": "...से युक्त",
+       "api-error-autoblocked": "आपका आईपी पता अपने आप अवरोधित हो गया, क्योंकि यह किसी अवरोधित सदस्य द्वारा उपयोग किया गया था।",
        "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-create": "अज्ञात सदस्य द्वारा निर्मित",
+       "log-action-filter-newusers-create2": "पंजीकृत सदस्य द्वारा निर्मित",
+       "log-action-filter-newusers-autocreate": "स्वतः निर्मित",
+       "log-action-filter-newusers-byemail": "पासवर्ड ईमेल द्वारा भेजा गया के साथ निर्मित",
        "log-action-filter-patrol-patrol": "अपने से परीक्षण",
        "log-action-filter-patrol-autopatrol": "स्वतः पुनरीक्षण",
        "log-action-filter-protect-protect": "सुरक्षा",
        "log-action-filter-protect-modify": "सुरक्षा परिवर्तन",
        "log-action-filter-protect-unprotect": "असुरक्षा",
+       "log-action-filter-protect-move_prot": "सुरक्षा स्थानांतरण",
+       "log-action-filter-rights-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-authplugin-setpass-bad-domain": "अमान्य जालस्थल।",
+       "authmanager-autocreate-noperm": "स्वचालित खाता निर्माण की अनुमति नहीं है।",
+       "authmanager-autocreate-exception": "स्वचालित खाता निर्माण को पहले के कुछ त्रुटियों के कारण कुछ समय के लिए निष्क्रिय किया गया है।",
+       "authmanager-userdoesnotexist": "सदस्य खाता \"$1\" पंजीकृत नहीं है।",
+       "authmanager-email-label": "ईमेल",
+       "authmanager-email-help": "ईमेल पता",
+       "authmanager-realname-label": "वास्तविक नाम",
+       "authmanager-realname-help": "सदस्य का वास्तविक नाम",
+       "authmanager-provider-temporarypassword": "अस्थाई पासवर्ड",
+       "authprovider-confirmlink-request-label": "खाते जो जोड़ने हैं।",
+       "authprovider-confirmlink-success-line": "$1 : सफलतापूर्वक जुड़ा।",
+       "authprovider-confirmlink-failed": "खाता जोड़ने का काम पूरी तरह से नहीं हो पाया : $1",
+       "authprovider-resetpass-skip-label": "छोड़ें",
+       "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-invalidsubpage": "$1 सही परिचय प्रकार नहीं है।",
+       "changecredentials-success": "आपका परिचय बदला गया।",
+       "removecredentials": "परिचय निकालें",
+       "removecredentials-submit": "परिचय निकालें",
+       "removecredentials-invalidsubpage": "$1 सही परिचय प्रकार नहीं है।",
+       "removecredentials-success": "आपका परिचय निकाल दिया गया है।",
+       "credentialsform-provider": "परिचय प्रकार :",
+       "credentialsform-account": "खाते का नाम:",
+       "cannotlink-no-provider-title": "कोई जुड़ा खाता नहीं है।",
+       "cannotlink-no-provider": "कोई जुड़ा खाता नहीं है।",
+       "linkaccounts": "खाता जोड़ें",
+       "linkaccounts-success-text": "खाता जुड़ गया।",
+       "linkaccounts-submit": "खाता जोड़ें",
+       "unlinkaccounts": "खाता अलग करें",
+       "unlinkaccounts-success": "खाता अलग हो गया।"
 }
index 209dd30..c3435bb 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",
        "showdiff": "Prikaži promjene",
        "blankarticle": "<strong>Upozorenje:</strong> Stvorili ste stranicu koja je prazna.\nAko iznova pritisnete na \"{{int:savearticle}}\", stranica će biti stvorena bez ikakvog sadržaja.",
        "anoneditwarning": "<strong>Upozorenje:</strong> niste prijavljeni. Ako napravite uređivanje, Vaša IP adresa će biti javno vidljiva. Ako se <strong>[$1 prijavite]</strong> ili <strong>[$2 stvorite račun]</strong>, Vaša uređivanja će biti pridružena suradničkom imenu, zajedno s ostalim pogodnostima.",
-       "anonpreviewwarning": "''Niste prijavljeni. Spremanjem će Vaše IP adrese ostati zabilježene u starim izmjenama ove stranice.''",
+       "anonpreviewwarning": "<em>Niste prijavljeni. Spremanjem izmjena Vaša će IP adresa ostati zabilježena u povijesti uređivanja ove stranice.</em>",
        "missingsummary": "'''Podsjetnik:''' Niste unijeli sažetak promjena. Ako ponovno kliknete na \"Sačuvaj stranicu\", Vaše će promjene biti snimljene bez sažetka.",
        "selfredirect": "<strong>Upozorenje:</strong> Stvarate preusmjeravanje na isti članak.\nMožda ste izabrali pogrješnu odredišnu stranicu za preusmjeravanje ili uređujete pogrješnu stranicu.\nAko pritisnete na \"{{int:savearticle}}\" još jednom, preusmjeravanje će svejedno biti stvoreno.",
        "missingcommenttext": "Molim unesite sažetak.",
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..ba2330f 100644 (file)
        "recentchangeslinked-page": "Lap neve:",
        "recentchangeslinked-to": "Inkább az erre linkelő lapok változtatásait mutasd",
        "recentchanges-page-added-to-category": "[[:$1]] hozzáadva a kategóriához",
-       "recentchanges-page-added-to-category-bundled": "[[:$1]] és [[Special:WhatLinksHere/$1|{{PLURAL:$2|egy oldal|$2 oldal}}]] hozzáadva a kategóriához",
+       "recentchanges-page-added-to-category-bundled": "[[:$1]] hozzáadva a kategóriához, [[Special:WhatLinksHere/$1|ez a lap be van illesztve más lapokra]]",
        "recentchanges-page-removed-from-category": "[[:$1]] eltávolítva a kategóriából",
        "recentchanges-page-removed-from-category-bundled": "[[:$1]] és {{PLURAL:$2|egy oldal|$2 oldal}} eltávolítva a kategóriából",
        "upload": "Fájl feltöltése",
        "confirmemail_success": "Az e-mail címed megerősítve. Most már beléphetsz a wikibe.",
        "confirmemail_loggedin": "E-mail címed megerősítve.",
        "confirmemail_subject": "{{SITENAME}} e-mail cím megerősítés",
-       "confirmemail_body": "Valaki, valószínűleg te, ezzel az e-mail címmel regisztrált\n„$2” néven a(z) {{SITENAME}} wikin, a(z) $1 IP-címről.\n\nAnnak érdekében, hogy megerősítsd, ez az azonosító valóban hozzád tartozik,\nés hogy aktiváld az e-mail címedet, nyisd meg az alábbi linket a böngésződben:\n\n$3\n\nHa ez *nem* te vagy, kattints erre a linkre az\ne-mail cím megerősíthetőségének visszavonásához:\n\n$5\n\nA megerősítésre szánt kód felhasználhatósági idejének lejárata: $4.",
+       "confirmemail_body": "Valaki, valószínűleg te, ezzel az e-mail-címmel regisztrált\n„$2” néven a(z) {{SITENAME}} wikin, a(z) $1 IP-címről.\n\nAnnak érdekében, hogy megerősítsd, ez az azonosító valóban hozzád tartozik,\nés aktiváld az e-mail-címedet, nyisd meg az alábbi linket a böngésződben:\n\n$3\n\nHa ez *nem* te vagy, kattints erre a linkre az\ne-mail-cím megerősíthetőségének visszavonásához:\n\n$5\n\nA megerősítésre szánt kód felhasználhatósági idejének lejárata: $4.",
        "confirmemail_body_changed": "Valaki (vélhetően te, a(z) $1 IP-címről) megváltoztatta a(z) „$2” felhasználói fiók email címét a {{SITENAME}} wikin erre a címre.\n\nAnnak érdekében, hogy megerősítsd, ez az azonosító valóban hozzád tartozik,\nés hogy újra aktiváld az e-mail címedet, nyisd meg az alábbi linket a böngésződben:\n\n$3\n\nHa ez *nem* te vagy, kattints erre a linkre az\ne-mail cím megerősíthetőségének visszavonásához:\n\n$5\n\nA megerősítésre szánt kód felhasználhatósági idejének lejárata: $4.",
        "confirmemail_body_set": "Valaki, valószínűleg te, ezt az email címet adta meg\n„$2” nevű {{SITENAME}}-fiókjához a következő IP-címről: $1.\n\nHa meg szeretnéd erősíteni, hogy a fiók valóban hozzád tartozik, így aktiválva a(z) {{SITENAME}} e-mailes funkcióit, nyisd meg az alábbi linket a böngésződben:\n\n$3\n\nHa a fiók *nem* hozzád tartozik, kövesd az alábbi linket a\nmegerősítés visszavonásához:\n\n$5\n\nEz a megerősítő e-mail $4-ig érvényes.",
        "confirmemail_invalidated": "E-mail-cím megerősíthetősége visszavonva",
        "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..b11d245 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].",
        "trackingcategories-msg": "Categoria de sequimento",
        "trackingcategories-name": "Nomine del message",
        "trackingcategories-desc": "Criterios pro inclusion in categoria",
+       "restricted-displaytitle-ignored": "Paginas con titulos a monstrar ignorate",
+       "restricted-displaytitle-ignored-desc": "Le pagina ha un <code><nowiki>{{DISPLAYTITLE}}</nowiki></code> ignorate perque illo non es equivalente al titulo real del pagina.",
        "noindex-category-desc": "Iste pagina es excludite del indice perque illo contine le marca <code><nowiki>__NOINDEX__</nowiki></code> e es in un spatio de nomines ubi le uso de iste marca es permittite.",
        "index-category-desc": "Iste pagina contine le marca <code><nowiki>__INDEX__</nowiki></code> (e es in un spatio de nomines ubi le uso de iste marca es permittite), e dunque es includite in le indice mesmo si illo normalmente non lo esserea.",
        "post-expand-template-inclusion-category-desc": "Le dimension del pagina es plus grande de <code>$wgMaxArticleSize</code> post le expansion de tote le patronos, dunque alcun patronos non ha essite expandite.",
        "rollbacklinkcount": "revocar $1 {{PLURAL:$1|modification|modificationes}}",
        "rollbacklinkcount-morethan": "revocar plus de $1 {{PLURAL:$1|modification|modificationes}}",
        "rollbackfailed": "Revocation fallite",
+       "rollback-missingparam": "Manca parametros obligatori in le requesta.",
        "cantrollback": "Impossibile revocar le modification;\nle ultime contributor es le sol autor de iste pagina.",
        "alreadyrolled": "Non pote revocar le ultime modification de [[:$1]] per [[User:$2|$2]] ([[User talk:$2|discussion]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]);\nun altere persona ha ja modificate o revocate le pagina.\n\nLe ultime modification esseva facite per [[User:$3|$3]] ([[User talk:$3|discussion]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "editcomment": "Le summario del modification esseva: <em>$1</em>.",
        "revertpage": "Reverteva modificationes per [[Special:Contributions/$2|$2]] ([[User talk:$2|Discussion]]) al ultime version per [[User:$1|$1]]",
        "revertpage-nouser": "Reverteva modificationes per un usator celate al ultime version per {{GENDER:$1|[[User:$1|$1]]}}",
        "rollback-success": "Revocava modificationes per $1;\nretornava al version per $2.",
+       "rollback-success-notify": "Modificationes de $1 revertite;\nultime version de $2 restaurate. [$3 Monstrar cambiamentos]",
        "sessionfailure-title": "Error de session",
        "sessionfailure": "Il pare haber un problema con tu session de conto;\niste action ha essite cancellate como precaution contra le sequestramento de sessiones.\nPer favor preme \"retro\" e recarga le pagina de ubi tu ha venite, postea reprova.",
        "changecontentmodel": "Cambiar le modello de contento de un pagina",
        "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",
        "confirm-watch-top": "Adder iste pagina a tu observatorio?",
        "confirm-unwatch-button": "OK",
        "confirm-unwatch-top": "Remover iste pagina de tu observatorio?",
+       "confirm-rollback-top": "Reverter le modificationes a iste pagina?",
        "quotation-marks": "“$1”",
        "imgmultipageprev": "← precedente pagina",
        "imgmultipagenext": "sequente pagina →",
        "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 credentiales",
+       "changecredentials-invalidsubpage": "$1 non es un typo de credential valide.",
+       "changecredentials-success": "Tu credentiales ha essite cambiate.",
+       "removecredentials": "Remover credentiales",
+       "removecredentials-submit": "Remover credentiales",
+       "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..197899c 100644 (file)
@@ -45,7 +45,9 @@
                        "WongKentir",
                        "Rachmat.Wahidi",
                        "Arief",
-                       "Nemo bis"
+                       "Nemo bis",
+                       "Mbrt",
+                       "Beeyan"
                ]
        },
        "tog-underline": "Garis bawahi pranala:",
@@ -81,7 +83,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-emailsent-capture2": "Pemulihan kata sandi {{PLURAL:$1|surel|surel}} telah dikirim. {{PLURAL:$1|Nama pengguna dan kata sandi|Daftar nama pengguna dan kata sandi}} ditampilkan di bawah.",
+       "passwordreset-emailerror-capture2": "Pengiriman surel kepada {{GENDER:$2|pengguna}} gagal: $1 {{PLURAL:$3|Nama pengguna dan kata sandi|Daftar nama pengguna dan kata sandi}} ditampilkan di bawah.",
+       "passwordreset-nocaller": "Pemanggil harus diberikan",
+       "passwordreset-nosuchcaller": "Pemanggil tidak ada: $1",
+       "passwordreset-ignored": "Pemulihan kata sandi tidak tertangani. Mungkin penyedia tidak diatur?",
+       "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.",
        "userpage-userdoesnotexist": "Akun pengguna \"<nowiki>$1</nowiki>\" tidak terdaftar.",
        "userpage-userdoesnotexist-view": "Pengguna \"$1\" tidak terdaftar.",
        "blocked-notice-logextract": "Pengguna ini sedang diblokir.\nEntri log pemblokiran terakhir tersedia di bawah ini sebagai rujukan:",
-       "clearyourcache": "'''Catatan:''' Setelah menyimpan, Anda mungkin harus memintas isi singgahan peramban Anda untuk melihat perubahan.\n* '''Firefox / Safari:''' Tahan ''Shift'' sambil mengeklik ''Reload'', atau tekan ''Ctrl-F5'' atau ''Ctrl-R'' (''⌘-R'' di Mac)\n* '''Google Chrome:''' Tekan ''Ctrl-Shift-R'' (''⌘-Shift-R'' di Mac)\n* '''Internet Explorer:''' Tahan ''Ctrl'' sambl mengeklik ''Refresh'', atau tekan ''Ctrl-F5''\n* '''Opera:''' Buka <em> Menu → Settings</em> (<em>Opera → Preferences</em>Privacy & Security  → Clear browsing data  → Cached images and files</em>.",
+       "clearyourcache": "<strong>Catatan:</strong>Setelah disimpan, Anda mungkin perlu melewati tembolok peramban web untuk melihat perubahan.\n* <strong>Firefox/Safari:</strong> Tahan <em>Shift</em> ketika diklik <em>Reload</em>, atau tekan <em>Ctrl-F5</em> atau <em>Ctrl-R</em> (<em>⌘-R</em> di Mac)\n* <strong>Google Chrome:</strong> Tekan <em>Ctrl-Shift-R</em> (<em>⌘-Shift-R</em> di Mac)\n* <strong>Internet Explorer:</strong> Tekan <em>Ctrl</em> ketika diklik <em>Refresh</em>, atau tekan <em>Ctrl-F5</em>\n* <strong>Opera:</strong> Pergi ke <em>Menu → Settings </em> (<em>Opera → Preferences</em> di Mac) lalu ke <em>Privacy & security → Clear browsing data → Cached images and files</em>.",
        "usercssyoucanpreview": "'''Tips:''' Gunakan tombol \"{{int:showpreview}}\" untuk menguji CSS baru Anda sebelum menyimpannya.",
        "userjsyoucanpreview": "'''Tips:''' Gunakan tombol \"{{int:showpreview}}\" untuk menguji JS baru Anda sebelum menyimpannya.",
        "usercsspreview": "'''Ingatlah bahwa Anda sedang menampilkan pratayang dari CSS Anda.\nPratayang ini belum disimpan!'''",
        "right-override-export-depth": "Ekspor halaman termasuk halaman-halaman terkait hingga kedalaman 5",
        "right-sendemail": "Mengirim surel ke pengguna lain",
        "right-passwordreset": "Lihat surel pengaturulangan kata sandi",
-       "right-managechangetags": "Membuat dan menghapus [[Special:Tags|tag]] dari basis data",
+       "right-managechangetags": "Buat dan matikan [[Special:Tags|tag]]",
        "right-applychangetags": "Terapkan [[Special:Tags|tags]] bersamaan dengan perubahan pengguna",
+       "right-changetags": "Tambah dan hapus [[Special:Tags|tag]] arbitrari pada revisi masing-masing dan entri log",
+       "right-deletechangetags": "Hapus [[Special:Tags|tag]] dari basisdata",
        "grant-generic": "\"$1\" bundel hak akses",
        "grant-group-page-interaction": "Berinteraksi dengan halaman",
        "grant-group-file-interaction": "Berinteraksi dengan media",
        "action-viewmyprivateinfo": "lihat informasi pribadi Anda",
        "action-editmyprivateinfo": "sunting informasi pribadi Anda",
        "action-editcontentmodel": "mengedit model konten sebuah halaman",
-       "action-managechangetags": "Membuat dan menghapus tag dari basis data",
+       "action-managechangetags": "buat dan matikan tag",
        "action-applychangetags": "terapkan tag bersamaan dengan perubahan Anda",
        "action-changetags": "menambah dan menghapus tag semaunya pada revisi individu dan entri log",
+       "action-deletechangetags": "hapus tag dari basis data",
        "nchanges": "$1 {{PLURAL:$1|perubahan|perubahan}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|sejak kunjungan terakhir}}",
        "enhancedrc-history": "riwayat",
        "recentchangeslinked-page": "Nama halaman:",
        "recentchangeslinked-to": "Perlihatkan perubahan dari halaman-halaman yang terhubung dengan halaman yang disajikan",
        "recentchanges-page-added-to-category": "[[:$1]] ditambahkan pada kategori",
-       "recentchanges-page-added-to-category-bundled": "[[:$1]] dan [[Special:WhatLinksHere/$1|{{PLURAL:$2|satu halaman|$2 halaman-halaman}}]] lagi halaman ditambahkan pada kategori",
+       "recentchanges-page-added-to-category-bundled": "[[:$1]] ditambahkan ke dalam kategori, [[Special:WhatLinksHere/$1|halaman ini dimasukkan bersama-sama halaman lain]]",
        "recentchanges-page-removed-from-category": "[[:$1]] dihapus dari kategori",
-       "recentchanges-page-removed-from-category-bundled": "[[:$1]] dan {{PLURAL:$2|satu halaman|$2 halaman-halaman}} lagi halaman dihapus dari kategori",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]] dihapus dari kategori, [[Special:WhatLinksHere/$1|halaman ini dimasukkan bersama halaman lain]]",
        "autochange-username": "Perubahan otomatis MediaWiki",
        "upload": "Pengunggahan berkas",
        "uploadbtn": "Muatkan berkas",
        "uploaded-event-handler-on-svg": "Penetapan atribut <i>event-handler</i> $1=\"$2\" tidak diizinkan dalam berkas SVG.",
        "uploaded-href-attribute-svg": "Atribut href pada berkas SVG hanya dibolehkan untuk ditautkan ke target http:// atau https://, ditemukan <code>&lt;$1 $2=\"$3\"&gt;</code>.",
        "uploaded-href-unsafe-target-svg": "Menemukan href ke data tidak aman: URI menarget <code>&lt;$1 $2=\"$3\"&gt;</code> dalam berkas SVG yang diunggah.",
+       "uploaded-animate-svg": "Ditemukan tag \"animasi\" yang mungkin dapat mengubah href, menggunakan atribut \"from\" <code>&lt;$1 $2=\"$3\"&gt;</code> dalam berkas SVG yang diunggah.",
        "uploaded-setting-event-handler-svg": "Penyetelan atribut event-handler diblokir, menemukan <code>&lt;$1 $2=\"$3\"&gt;</code> dalam berkas SVG yang diunggah.",
+       "uploaded-setting-href-svg": "Menggunakan tag \"set\" untuk menambahkan atribut \"href\" ke elemen utama diblokir.",
        "uploadscriptednamespace": "Berkas SVG ini memuat ruang nama ilegal \"$1\"",
        "uploadinvalidxml": "XML dalam berkas yang diunggah tidak bisa diuraikan.",
        "uploadvirus": "Berkas tersebut mengandung virus! Rincian: $1",
        "upload-too-many-redirects": "URL mengandung terlalu banyak pengalihan",
        "upload-http-error": "Kesalahan HTTP terjadi: $1",
        "upload-copy-upload-invalid-domain": "Unggahan salinan tidak tersedia dari domain ini.",
+       "upload-foreign-cant-upload": "Wiki ini tidak diatur untuk mengunggah berkas ke gudang penyimpangan asing.",
        "upload-dialog-title": "Unggah berkas",
        "upload-dialog-button-cancel": "Batalkan",
        "upload-dialog-button-done": "Selesai",
        "upload-form-label-own-work": "Ini adalah karya saya sendiri",
        "upload-form-label-infoform-categories": "Kategori",
        "upload-form-label-infoform-date": "Tanggal",
+       "upload-form-label-own-work-message-generic-local": "Saya menyatakan bahwa saya mengunggah berkas ini dengan mengikuti syarat layanan dan aturan lisensi di {{SITENAME}}.",
+       "upload-form-label-not-own-work-message-generic-local": "Jika Anda tidak dapat mengunggah berkas ini di bawah kebijakan {{SITENAME}}, silakan tutup dialog ini dan cobalah metode lainnya.",
+       "upload-form-label-not-own-work-local-generic-local": "Anda mungkin ingin mencoba [[Special:Upload|halaman pengunggahan baku]].",
+       "upload-form-label-own-work-message-generic-foreign": "Saya mengerti bahwa saya mengunggah berkas ini ke gudang berkas bersama. Saya menyatakan bahwa saya telah menyetujui syarat layanan dan kebijakan lisensi di sana.",
+       "upload-form-label-not-own-work-message-generic-foreign": "Jika Anda tidak dapat mengunggah berkas ini di bawah kebijakan di gudang penyimpanan bersama, silakan tutup dialog ini dan cobalah metode lainnya.",
+       "upload-form-label-not-own-work-local-generic-foreign": "Anda juga mungkin ingin mencoba menggunakan  [[Special:Upload|halaman pengunggahan di {{SITENAME}}]], jika situs tersebut mengizinkan pengunggahan berkas ini menurut kebijakan di situs tersebut.",
        "backend-fail-stream": "Tidak bisa mengalikan berkas $1.",
        "backend-fail-backup": "Tidak dapat mencadangkan berkas $1.",
        "backend-fail-notexists": "Berkas $1 tidak ada.",
        "apisandbox": "Bak pasir API",
        "apisandbox-jsonly": "JavaScript dibutuhkan untuk menggunakan kotak pasir API.",
        "apisandbox-api-disabled": "API dinonaktifkan pada situs ini.",
-       "apisandbox-intro": "Gunakan halaman ini untuk bereksperimen dengan '''API layanan web MediaWiki'''.\nLihat [//www.mediawiki.org/wiki/API:Main_page dokumentasi API] untuk perincian lanjut penggunaan API. Contoh: [//www.mediawiki.org/wiki/API#A_simple_example dapatkan konten Halaman Utama]. Pilih sebuah tindakan untuk melihat contoh lain.\n\nPerhatikan bahwa, meskipun ini adalah bak pasir, tindakan yang Anda lakukan pada halaman ini mungkin dapat mengubah wiki.",
+       "apisandbox-intro": "Gunakan halaman ini untuk bereksperimen dengan <strong>API layanan web MediaWiki</strong>.\nLihat [[mw:API:Main page|dokumentasi API]] untuk perincian lanjut penggunaan API. Contoh: [//www.mediawiki.org/wiki/API#A_simple_example dapatkan konten Halaman Utama]. Pilih sebuah tindakan untuk melihat contoh lain.\n\nPerhatikan bahwa, meskipun ini adalah bak pasir, tindakan yang Anda lakukan pada halaman ini mungkin dapat mengubah wiki.",
        "apisandbox-fullscreen": "Kembangkan panel",
        "apisandbox-fullscreen-tooltip": "Kembangkan panel kotak pasir untuk mengisi jendela peramban.",
        "apisandbox-unfullscreen": "Tampilkan halaman",
        "listgrouprights-namespaceprotection-namespace": "Ruang nama",
        "listgrouprights-namespaceprotection-restrictedto": "Hak yang mengizinkan pengguna untuk menyunting",
        "listgrants": "Izin",
+       "listgrants-summary": "Berikut ini adalah daftar hak dengan akses terkait kepada hak penggunanya. Pengguna dapat mengizinkan aplikasi untuk menggunakan akun mereka, namun dengan izin terbatas berdasarkan hak yang diberikan oleh pengguna. Aplikasi yang berjalan yang mewakili seorang pengguna tidak dapat menggunakan hak yang tidak dimiliki oleh pengguna tersebut.\nMungkin nanti terdapat [[{{MediaWiki:Listgrouprights-helppage}}|informasi tambahan]] mengenai hak-hak individual.",
        "listgrants-grant": "Izin",
        "listgrants-rights": "Hak",
        "trackingcategories": "Kategori pelacak",
        "trackingcategories-msg": "Kategori pelacak",
        "trackingcategories-name": "Nama pesan",
        "trackingcategories-desc": "Kriteria inklusi kategori",
+       "restricted-displaytitle-ignored": "Halaman-halaman dengan pengabaian tampilan judul",
+       "restricted-displaytitle-ignored-desc": "Halaman ini memiliki pengabaian <code><nowiki>{{DISPLAYTITLE}}</nowiki></code> karena tidak sesuai dengan judul halaman aslinya.",
        "noindex-category-desc": "Halaman tidak diindeks oleh robot karena ini mempunyai kata khusus <code><nowiki>__NOINDEX__</nowiki></code> padanya dan berada dalam ruang nama yang mengizinkan penanda itu.",
        "index-category-desc": "Halaman ini memiliki <code><nowiki>__INDEX__</nowiki></code> di atasnya (dan dalam ruang nama yang mana bendera yang diperbolehkan), dan karenanya diindeks oleh robot di mana itu biasanya tidak akan.",
        "post-expand-template-inclusion-category-desc": "Ukuran laman lebih besar dari <code>$wgMaxArticleSize</code> setelah memperluas semua templat, sehingga beberapa templat tidak diperluas.",
        "rollbacklinkcount": "kembalikan $1 {{PLURAL:$1|suntingan}}",
        "rollbacklinkcount-morethan": "kembalikan lebih dari $1 {{PLURAL:$1|suntingan|suntingan}}",
        "rollbackfailed": "Pengembalian gagal dilakukan",
+       "rollback-missingparam": "Parameter dibutuhkan ketika diminta tidak tersedia.",
        "cantrollback": "Tidak dapat membatalkan suntingan;\nkontributor terakhir adalah satu-satunya penulis halaman ini.",
        "alreadyrolled": "Tidak dapat melakukan pengembalian ke revisi terakhir [[:$1]] oleh [[User:$2|$2]] ([[User talk:$2|bicara]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]);\npengguna lain telah menyunting atau melakukan pengembalian terhadap halaman ini.\n\nSuntingan terakhir dilakukan oleh [[User:$3|$3]] ([[User talk:$3|bicara]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "editcomment": "Komentar penyuntingan adalah: <em>$1</em>.",
        "revertpage": "←Suntingan [[Special:Contributions/$2|$2]] ([[User talk:$2|bicara]]) dibatalkan ke versi terakhir oleh [[User:$1|$1]]",
        "revertpage-nouser": "Mengembalikan suntingan oleh (nama pengguna dihapus) ke suntingan terakhir oleh [[User:$1|$1]]",
        "rollback-success": "Pembatalan suntingan oleh $1; dibatalkan ke versi terakhir oleh $2.",
+       "rollback-success-notify": "Mengembalikan suntingan oleh $1; rubah kembali untuk revisi terakhir oleh $2. [$3 Lihat perubahan]",
        "sessionfailure-title": "Kegagalan sesi",
        "sessionfailure": "Sepertinya ada masalah dengan sesi log Anda; log Anda telah dibatalkan untuk mencegah pembajakan. Silakan tekan tombol \"kembali\" dan muat kembali halaman sebelum Anda masuk, lalu coba lagi.",
        "changecontentmodel": "Ubah model isi sebuah halaman",
        "changecontentmodel-success-text": "Jenis konten [[:$1]] telah diubah",
        "changecontentmodel-cannot-convert": "Isi pada [[:$1]] tidak dapat ditukar kepada jenis $2.",
        "changecontentmodel-nodirectediting": "Model isi $1 tidak mendukung suntingan langsung",
+       "changecontentmodel-emptymodels-title": "Tidak tersedia model konten",
+       "changecontentmodel-emptymodels-text": "Konten dalam [[:$1]] tidak dapat diubah ke dalam jenis lain.",
        "log-name-contentmodel": "Log perubahan model konten",
        "log-description-contentmodel": "Peristiwa terkait model konten sebuah halaman",
+       "logentry-contentmodel-new": "$1 {{GENDER:$2|membuat}} halaman $3 menggunakan model konten tak baku \"$5\"",
        "logentry-contentmodel-change": "$1 {{GENDER:$2|mengubah}} model konten halaman $3 dari \"$4\" ke \"$5\"",
        "logentry-contentmodel-change-revertlink": "batalkan",
        "logentry-contentmodel-change-revert": "batalkan",
        "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",
        "confirmemail_body_set": "Seseorang, mungkin Anda, dari alamat IP $1,\ntelah mengubah surel dari akun \"$2\" pada alamat ini di {{SITENAME}}.\n\nUntuk mengonfirmasi bahwa akun ini adalah milik Anda sekaligus mengaktifkan\nkembali fitur surel pada {{SITENAME}}, ikuti pranala berikut pada browser Anda:\n\n$3\n\nJika akun ini *bukan* milik Anda, ikuti pranala berikut\nuntuk membatalkan konfirmasi alamat surel:\n\n$5\n\nKode konfirmasi ini akan kedaluwarsa pada $4.",
        "confirmemail_invalidated": "Konfirmasi alamat surel dibatalkan",
        "invalidateemail": "Batalkan konfirmasi surel",
+       "notificationemail_subject_changed": "Alamat surel terdaftar {{SITENAME}} telah diganti",
+       "notificationemail_subject_removed": "Alamat surel terdaftar {{SITENAME}} telah dihapus",
+       "notificationemail_body_changed": "Seseorang, mungkin Anda, dari alamat IP $1,\ntelah mengganti alamat surel akun \"$2\" menjadi \"$3\" di {{SITENAME}}",
+       "notificationemail_body_removed": "Seseorang, mungkin Anda, dari alamat IP $1,\ntelah menghapus alamat surel akun \"$2\" di {{SITENAME}}.",
        "scarytranscludedisabled": "[Transklusi interwiki dimatikan]",
        "scarytranscludefailed": "[Pengambilan templat $1 gagal]",
        "scarytranscludefailed-httpstatus": "[Pengambilan templat $1 gagal: HTTP $2]",
        "confirm-watch-top": "Tambahkan halaman ini ke daftar pantauan Anda?",
        "confirm-unwatch-button": "OK",
        "confirm-unwatch-top": "Hapus halaman ini dari daftar pantauan Anda?",
+       "confirm-rollback-button": "OK",
+       "confirm-rollback-top": "Kembalikan suntingan ke halaman ini?",
        "semicolon-separator": ";&#32;",
        "comma-separator": ",&#32;",
        "colon-separator": ":&#32;",
        "timezone-local": "Lokal",
        "duplicate-defaultsort": "Peringatan: Kunci pengurutan baku \"$2\" mengabaikan kunci pengurutan baku \"$1\" sebelumnya.",
        "duplicate-displaytitle": "<strong>Peringatan:</strong> Menampilkan judul \"$2\" menimpa judul tampilan \"$1\" sebelumnya.",
+       "restricted-displaytitle": "<strong>Perhatian:</strong> Tampilan judul \"$1\" diabaikan karena tidak sesuai dengan judul halaman asli.",
        "invalid-indicator-name": "'''Galat:''' Atribut ''nama'' indikator status halaman tidak boleh kosong.",
        "version": "Versi",
        "version-extensions": "Ekstensi terinstal",
        "tags-create-invalid-chars": "Nama tag tidak boleh mengandung koma (<code>,</code>) atau garis miring (<code>/</code>).",
        "tags-create-invalid-title-chars": "Nama tag tidak boleh mengandung karakter yang tidak bisa digunakan dalam judul halaman.",
        "tags-create-already-exists": "Tag \"$1\" sudah ada.",
+       "tags-create-warnings-above": "{{PLURAL:$2|Peringatan|Peringatan}} berikut ditemukan ketika mencoba membuat tag \"$1\":",
        "tags-create-warnings-below": "Apakah Anda ingin melanjutkan pembuatan tanda ini?",
+       "tags-delete-title": "Hapus tag",
+       "tags-delete-explanation-initial": "Anda akan menghapus tag \"$1\" dari basisdata.",
        "tags-delete-reason": "Alasan:",
        "tags-activate-reason": "Alasan:",
        "tags-activate-submit": "Aktifkan",
        "logentry-protect-move_prot": "$1 {{GENDER:$2|memindahkan}} setelan perlindungan dari $4 ke $3",
        "logentry-protect-protect": "$1 {{GENDER:$2|melindungi}} $3 $4",
        "logentry-protect-modify": "$1 {{GENDER:$2|mengubah}} tingkat perlindungan untuk $3 $4",
-       "logentry-rights-rights": "$1 {{GENDER:$2|mengubah}} keanggotaan grup $3 dari $4 menjadi $5",
+       "logentry-rights-rights": "$1 {{GENDER:$2|mengubah}} keanggotaan grup {{GENDER:$6|$3}} dari $4 ke $5",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|mengubah}} keanggotaan grup $3",
        "logentry-rights-autopromote": "$1 secara otomatis {{GENDER:$2|dipromosikan}} dari $4 menjadi $5",
        "logentry-upload-upload": "$1 {{GENDER:$2|mengunggah}} $3",
        "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.",
        "expand_templates_generate_xml": "Tampilkan pohon parser XML",
        "expand_templates_generate_rawhtml": "Tampilkan HTML mentah",
        "expand_templates_preview": "Pratayang",
+       "expand_templates_input_missing": "Anda perlu memasukkan paling sedikit beberapa teks masukan.",
        "pagelanguage": "Ubah bahasa halaman",
        "pagelang-name": "Halaman",
        "pagelang-language": "Bahasa",
        "pagelang-use-default": "Gunakan bahasa baku",
        "pagelang-select-lang": "Pilih bahasa",
+       "pagelang-submit": "Kirim",
        "right-pagelang": "Ubah bahasa halaman",
        "action-pagelang": "mengubah bahasa halaman",
        "log-name-pagelang": "Log perubahan bahasa",
        "mediastatistics-header-drawing": "Gambar vektor",
        "mediastatistics-header-audio": "Audio",
        "mediastatistics-header-video": "Video",
+       "mediastatistics-header-multimedia": "Media kaya",
        "mediastatistics-header-office": "Aplikasi Office",
        "mediastatistics-header-text": "Tekstual",
        "mediastatistics-header-executable": "Program",
        "mediastatistics-header-archive": "Format terkompresi",
+       "mediastatistics-header-total": "Semua berkas",
+       "json-warn-trailing-comma": "$1 {{PLURAL:$1|koma|koma}} pengekor telah digugurkan dari JSON",
+       "json-error-unknown": "Ada masalah dengan JSON. Kesalahan: $1",
        "json-error-depth": "Kedalaman tumpukan maksimal telah terlewati",
+       "json-error-state-mismatch": "JSON tidak sah atau cacat",
+       "json-error-ctrl-char": "Kesalahan aksara kontrol, mungkin salah dikodkan",
        "json-error-syntax": "Kesalahan sintaks",
+       "json-error-utf8": "Aksara UTF-8 cacat, mungkin salah dikodkan",
+       "json-error-recursion": "Setidaknya satu atau lebih referensi rekursif untuk dikodkan di dalam nilai tersebut",
+       "json-error-inf-or-nan": "Setidaknya satu nilai NAN atau INF untuk dikodkan di dalam nilai tersebut",
+       "json-error-unsupported-type": "Sebuah nilai dari tipe yang tidak dapat dikodkan diberikan",
+       "headline-anchor-title": "Pranala ke bagian ini",
        "special-characters-group-latin": "Latin",
        "special-characters-group-latinextended": "Ekstensi Latin",
        "special-characters-group-ipa": "IPA",
        "special-characters-group-symbols": "Simbol",
        "special-characters-group-greek": "Yunani",
+       "special-characters-group-greekextended": "Latin tambahan",
        "special-characters-group-cyrillic": "Sirilik",
        "special-characters-group-arabic": "Arab",
        "special-characters-group-arabicextended": "Arab tambahan",
        "special-characters-title-endash": "en dash",
        "special-characters-title-emdash": "em dash",
        "special-characters-title-minus": "tanda kurang",
+       "mw-widgets-dateinput-no-date": "Tanggal tidak ada yang terpilih",
        "mw-widgets-dateinput-placeholder-day": "TTTT-BB-HH",
        "mw-widgets-dateinput-placeholder-month": "TTTT-BB",
+       "mw-widgets-titleinput-description-new-page": "halaman belum ada",
+       "mw-widgets-titleinput-description-redirect": "mengalihkan ke $1",
        "api-error-blacklisted": "Pilih judul lain yang deskriptif",
+       "sessionmanager-tie": "Tidak dapat menggabungkan banyak jenis otentikasi permintaan: $1.",
+       "sessionprovider-generic": "sesi $1",
+       "sessionprovider-mediawiki-session-cookiesessionprovider": "sesi berdasarkan kuki",
+       "sessionprovider-nocookies": "Kuki mungkin dimatikan. Pastikan Anda telah mengaktifkan kuki dan coba mulai kembali.",
        "randomrootpage": "Halaman dasar sembarang",
        "log-action-filter-block": "Jenis pemblokiran:",
+       "log-action-filter-contentmodel": "Jenis modifikasi modelkonten:",
+       "log-action-filter-delete": "Jenis penghapusan:",
+       "log-action-filter-import": "Jenis impor:",
+       "log-action-filter-managetags": "Jenis tindakan manajemen tag:",
+       "log-action-filter-move": "Jenis pemindahan:",
+       "log-action-filter-newusers": "Jenis pembuatan akun:",
+       "log-action-filter-patrol": "Jenis patroli:",
+       "log-action-filter-protect": "Jenis perlindungan:",
+       "log-action-filter-rights": "Jenis penggantian hak",
+       "log-action-filter-suppress": "Jenis penyembunyian",
+       "log-action-filter-upload": "Jenis pengunggahan:",
        "log-action-filter-all": "Semua",
        "log-action-filter-block-block": "Blokir",
-       "log-action-filter-suppress-block": "Perahasiaan pengguna menurut pemblokiran"
+       "log-action-filter-block-reblock": "Modifikasi blokir",
+       "log-action-filter-block-unblock": "Batalkan pemblokiran",
+       "log-action-filter-contentmodel-change": "Ubah Modelkonten",
+       "log-action-filter-contentmodel-new": "Pembuatan halaman dengan Modelkonten yang tak baku",
+       "log-action-filter-delete-delete": "Penghapusan halaman",
+       "log-action-filter-delete-restore": "Pembatalan penghapusan halaman",
+       "log-action-filter-delete-event": "Log penghapusan",
+       "log-action-filter-delete-revision": "Penghapusan revisi",
+       "log-action-filter-import-interwiki": "Impor transwiki",
+       "log-action-filter-import-upload": "Impor dengan unggahan XML",
+       "log-action-filter-managetags-create": "Pembuatan tag",
+       "log-action-filter-managetags-delete": "Penghapusan tag",
+       "log-action-filter-managetags-activate": "Pengaktifan tag",
+       "log-action-filter-managetags-deactivate": "Penonaktifan tag",
+       "log-action-filter-move-move": "Pindahkan tanpa menimpa pengalihan",
+       "log-action-filter-move-move_redir": "Pindahkan dengan menimpa pengalihan",
+       "log-action-filter-newusers-create": "Pembuatan oleh pengguna anonim",
+       "log-action-filter-newusers-create2": "Pembuatan oleh pengguna terdaftar",
+       "log-action-filter-newusers-autocreate": "Pembuatan otomatis",
+       "log-action-filter-newusers-byemail": "Pembuatan dengan kata sandi yang dikirimkan melalui surel",
+       "log-action-filter-patrol-patrol": "Patroli manual",
+       "log-action-filter-patrol-autopatrol": "Patroli otomatis",
+       "log-action-filter-protect-protect": "Perlindungan",
+       "log-action-filter-protect-modify": "Modifikasi perlindungan",
+       "log-action-filter-protect-unprotect": "Pembatalan perlindungan",
+       "log-action-filter-protect-move_prot": "Pemindahan perlindungan",
+       "log-action-filter-rights-rights": "Penggantian manual",
+       "log-action-filter-rights-autopromote": "Penggantian otomatis",
+       "log-action-filter-suppress-event": "Log penyembunyian",
+       "log-action-filter-suppress-revision": "Penyembunyian revisi",
+       "log-action-filter-suppress-delete": "Penyembunyian halaman",
+       "log-action-filter-suppress-block": "Perahasiaan pengguna menurut pemblokiran",
+       "log-action-filter-suppress-reblock": "Penyembunyian oleh pengguna menurut pemblokiran",
+       "log-action-filter-upload-upload": "Unggahan baru",
+       "log-action-filter-upload-overwrite": "Unggah kembali",
+       "authmanager-authn-not-in-progress": "Otentikasi tidak dilanjutkan atau data sesi telah hilang. Ulang kembali dari awal.",
+       "authmanager-authn-no-primary": "Kredensial yang diberikan tidak dapat diotentikasi.",
+       "authmanager-authn-no-local-user": "Kredensial yang diberikan tidak terkait dengan satu orang pun pengguna di wiki ini.",
+       "authmanager-authn-no-local-user-link": "Kredensial yang diberikan sah namun tidak terkait dengan satu orang pengguna pun di wiki ini. Silakan masuk log dengan cara lain, atau buat akun baru, dan Anda akan diberikan opsi untuk mengaitkan kredensial sebelumnya ke akun tersebut.",
+       "authmanager-authn-autocreate-failed": "Pembuatan otomatis dari akun lokal gagal: $1",
+       "authmanager-change-not-supported": "Kredensial yang diberikan tidak dapat diganti, karena tidak ada yang akan menggunakannya.",
+       "authmanager-create-disabled": "Pembuatan akun dimatikan.",
+       "authmanager-create-from-login": "Untuk membuat akun Anda, silakan isi kolom di bawah.",
+       "authmanager-create-not-in-progress": "Pembuatan akun tidak dilanjutkan atau data sesi telah hilang. Ulang kembali dari awal.",
+       "authmanager-create-no-primary": "Kredensial yang diberikan tidak dapat digunakan untuk pembuatan akun.",
+       "authmanager-link-no-primary": "Kredensial yang diberikan tidak dapat digunakan untuk menautkan akun.",
+       "authmanager-link-not-in-progress": "Penautan akun tidak dilanjutkan atau data sesi telah hilang. Ulang kembali dari awal.",
+       "authmanager-authplugin-setpass-failed-title": "Penggantian kata sandi gagal",
+       "authmanager-authplugin-setpass-bad-domain": "Domain tidak sah.",
+       "authmanager-autocreate-noperm": "Pembuatan akun otomatis tidak diizinkan.",
+       "authmanager-autocreate-exception": "Pembuatan akun otomatis dimatikan sementara karena galat sebelumnya.",
+       "authmanager-userdoesnotexist": "Pengguna \"$1\" tidak terdaftar.",
+       "authmanager-userlogin-remembermypassword-help": "Kata sandi harus diingat selama lebih dari lamanya sesi tersebut.",
+       "authmanager-username-help": "Nama pengguna untuk otentikasi.",
+       "authmanager-password-help": "Kata sandi untuk otentikasi.",
+       "authmanager-domain-help": "Domain untuk otentikasi eksternal.",
+       "authmanager-retype-help": "Ketik kata sandi lagi untuk mengonfirmasikan.",
+       "authmanager-email-label": "Surel",
+       "authmanager-email-help": "Alamat surel",
+       "authmanager-realname-label": "Nama asli",
+       "authmanager-realname-help": "Nama asli pengguna",
+       "authmanager-provider-password": "Otentikasi menurut kata sandi",
+       "authmanager-provider-password-domain": "Otentikasi menurut kata sandi dan domain",
+       "authmanager-provider-temporarypassword": "Kata sandi sementara",
+       "unlinkaccounts-success": "Akun berikut telah dilepastautkan."
 }
index 8ac3982..d17b90c 100644 (file)
                        "아라",
                        "Shirayuki",
                        "ElizaMag",
-                       "Adam-Yourist"
+                       "Adam-Yourist",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "ТIахьожаярга кIала така хьакхар:",
        "tog-hideminor": "Къайладаккха з|амига дола хувцамаш керда хувцамашта юкъера",
-       "tog-hidepatrolled": "Къайладаккха ха дера чакхдаьнна дола хувцамаш керда хувцамашта юкъера",
-       "tog-newpageshidepatrolled": "Къайлаяьккха ха дера чакхъянна йола оагIонаш керда оагIонашта юкъера",
+       "tog-hidepatrolled": "Къайладаккха ха дера чакхдаьнна дола (патрулированные) хувцамаш керда хувцамашта юкъера",
+       "tog-newpageshidepatrolled": "Къайлаяьккха ха дера чакхъянна йола (патрулированные) оагIонаш керда оагIонашта юкъера",
        "tog-hidecategorization": "Къайлаяха оагӀонай категореш",
-       "tog-extendwatchlist": "Хьашеръяь йола зем бара список, массадола хувцамаш ше чулоацаш, тхьара даь хувцамаш хинна ца Iеш.",
-       "tog-usenewrc": "Ð\9aеÑ\80да Ñ\85Ñ\83вÑ\86амаÑ\88ка Ð° Ñ\85Ñ\8cаÑ\82|аÑ\8fздаÑ\80а Ð·ÐµÐ¼Ð±Ð°ÐºÐºÑ\85аÑ\80га Ð° Ñ\8dÑ\80гадаккÑ\85аÑ\80аÑ\88 Ñ\82оабаде (JavaScript Ñ\8dÑ\88а)",
-       "tog-numberheadings": "Ð\90вÑ\82омаÑ\82иÑ\87еÑ\81ки Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÐ°Ñ\88Ñ\82а Ð½Ñ\83меÑ\80аÑ\86и Ñ\85Ñ\8cае",
-       "tog-showtoolbar": "Ð\93IиÑ\80Ñ\81ай панель хьахьокха хувцам беч хана",
+       "tog-extendwatchlist": "Хьашеръяь йола зем бара список, массадола хувцамаш ше чулоацаш, тIеххьара даь хувцамаш хинна ца Iеш.",
+       "tog-usenewrc": "Ð¥Ñ\83вÑ\86амаÑ\88 Ñ\82оабаÑ\88 ÐµÑ\88 Ð»ÐµÐ»Ð°Ð´Ðµ ÐºÐµÑ\80да Ð½Ð¸Ð¹Ñ\81даÑ\80аÑ\88ка Ð°, Ð·ÐµÐ¼ Ð±Ð°Ñ\80а Ñ\81пиÑ\81ка Ñ\87Ñ\83 Ð°",
+       "tog-numberheadings": "Ð\90вÑ\82омаÑ\82иÑ\87еÑ\81ки Ð½Ñ\83меÑ\80аÑ\86и Ñ\85Ñ\8cае Ð´Ð¾Ð°ÐºÑ\8aой Ñ\86IеÑ\80аÑ\88Ñ\82а",
+       "tog-showtoolbar": "Ð\93IиÑ\80Ñ\81ий панель хьахьокха хувцам беч хана",
        "tog-editondblclick": "Нисъе оагӀонаш шозза IотӀатоӀаеча (JavaScript)",
-       "tog-editsectiononrightclick": "Нийсде дакъа шозза дахка аьтта тоIаер тӀатоӀайича заголовка тIа (JavaScript)",
-       "tog-watchcreations": "Ð\97ем Ð±Ð°Ñ\80а Ñ\81пиÑ\81ка Ñ\82|аÑ\82оÑ\85а Ð°Ð· Ñ\85Ñ\8cаÑ\8fÑ\8c Ð¾Ð°Ð³|онаши чуяьккха файлаши",
-       "tog-watchdefault": "Ð\97ем Ð±Ð°Ñ\80а Ñ\81пиÑ\81ка Ñ\82|аÑ\82оÑ\85а Ð°Ð· Ñ\85ийÑ\86а Ð¾Ð°Ð³|онаши файлай йоазонца сурташ оттадари",
-       "tog-watchmoves": "Ð\97ем Ð±Ð°Ñ\80а Ñ\81пиÑ\81ка Ñ\82|аÑ\82оÑ\85а Ð°Ð· Ñ\86Iи Ñ\85ийÑ\86а Ð¾Ð°Ð³|онаши файлаши",
-       "tog-watchdeletion": "Ð\97ем Ð±Ð°Ñ\80а Ñ\81пиÑ\81ка Ñ\82|аÑ\82оÑ\85а Ð°Ð· Ð´IаÑ\8fÑ\8cккÑ\85а Ð¾Ð°Ð³|онаши файлаши",
-       "tog-minordefault": "Ð\9cаÑ\81Ñ\81аза Ð·Iамига Ð´Ð°Ñ\80аш санна белгалде хувцамаш.",
+       "tog-editsectiononrightclick": "Нийсде дáкъа шозза дахка аьттехьара тоIаер тӀатоӀайича дáкъа цIера тIа (JavaScript)",
+       "tog-watchcreations": "Ð\97ем Ð±ÐµÑ\88 Ð¹Ð¾Ð»Ð° Ð¾Ð°Ð³IонаÑ\88Ñ\82а Ð° Ñ\84айлаÑ\88Ñ\82а Ð° Ñ\82IаÑ\82оÑ\85а Ð°Ð· Ñ\85Ñ\8cаÑ\8fÑ\8c Ð¾Ð°Ð³Iонаши чуяьккха файлаши",
+       "tog-watchdefault": "Ð\97ем Ð±ÐµÑ\88 Ð¹Ð¾Ð»Ð° Ð¾Ð°Ð³IонаÑ\88Ñ\82а Ð° Ñ\84айлаÑ\88Ñ\82а Ð° Ñ\82IаÑ\82оÑ\85а Ð°Ð· Ñ\85ийÑ\86а Ð¾Ð°Ð³Iонаши файлай йоазонца сурташ оттадари",
+       "tog-watchmoves": "Ð\97ем Ð±ÐµÑ\88 Ð¹Ð¾Ð»Ð° Ð¾Ð°Ð³IонаÑ\88Ñ\82а Ð° Ñ\84айлаÑ\88Ñ\82а Ð° Ñ\82IаÑ\82оÑ\85а Ð°Ð· Ñ\86Iи Ñ\85ийÑ\86а Ð¾Ð°Ð³Iонаши файлаши",
+       "tog-watchdeletion": "Ð\97ем Ð±ÐµÑ\88 Ð¹Ð¾Ð»Ð° Ð¾Ð°Ð³IонаÑ\88Ñ\82а Ð° Ñ\84айлаÑ\88Ñ\82а Ð° Ñ\82IаÑ\82оÑ\85а Ð°Ð· Ð´IаÑ\8fÑ\8cккÑ\85а Ð¾Ð°Ð³Iонаши файлаши",
+       "tog-minordefault": "Ð\9cаÑ\81Ñ\81аза Ð·Iамига Ð´Ð¾Ð»аш санна белгалде хувцамаш.",
        "tog-previewontop": "Хьалххе бӀаргтохар хьагойта хувцама кора хьалхашкахь",
        "tog-previewonfirst": "Хувцама дехьавоалаш хан хьалххе бӀаргтохар хьагойта",
-       "tog-enotifwatchlistpages": "Tеркама хьат|аяздар чура оаг|онаши паьлаши хувцамаех лаьца д-хоамне т|а дайта хьа",
-       "tog-enotifusertalkpages": "Са Ð´Ñ\83вÑ\86ама Ð¾Ð°Ð³|он Ñ\82|а Ñ\85Ñ\83вÑ\86амаÑ\88 Ñ\85илÑ\87а, Ð´-Ñ\85оамнеÑ\86 Ñ\85Ñ\8cаÑ\85оам Ð±Ðµ",
-       "tog-enotifminoredits": "Ð\93еÑ\82Ñ\82аÑ\80а Ð·|амига Ñ\85Ñ\83вÑ\86амаÑ\88 Ñ\85илÑ\87а Ð°, Ð´-Ñ\85оамнеÑ\86 Ñ\85Ñ\8cаÑ\85оам Ð±Ðµ",
-       "tog-enotifrevealaddr": "Ð\97\8b Ñ\85оамаÑ\88 Ñ\82|а Ñ\81а Ð´-Ñ\85оамни Ñ\86|ей-меÑ\82Ñ\82иг Ð³Ð¾Ð¹Ñ\82а",
-       "tog-shownumberswatching": "Шоай теркама хьат|аяздар чу оаг|ув чуяьккха доакьошхоша таьрахь гойта",
-       "tog-oldsig": "Ð\94ола ÐºÑ\83лгайоазÑ\83в:",
-       "tog-fancysig": "Ший ÐºÑ\83лгаÑ\8fздаÑ\80а Ð¼Ð°Ñ\81Ñ\81аÑ\85оамбаккÑ\85аÑ\80 (Ñ\88ий Ð»Ð¾|ама Ñ\85Ñ\8cожадерг йоацаш)",
-       "tog-uselivepreview": "СиÑ\85а Ð±|аÑ\80аÑ\85Ñ\8cажаÑ\80 (JavaScript)",
-       "tog-forceeditsummary": "Ð¥Ñ\8cаÑ\85оам Ð±Ðµ, Ð½Ð°Ð³Ð³Ð°Ñ\85Ñ\8c Ñ\81анна Ñ\85Ñ\83вÑ\86ама ÐºÑ\83Ñ\81Ñ\82Ñ\8fздаÑ\80а Ð¼ÐµÑ\82Ñ\82ига Ñ\85Ñ\8cалайиза ÐµÑ\86е",
-       "tog-watchlisthideown": "Са теркама xьат|аяздара хувцамаш къайладаха",
-       "tog-watchlisthidebots": "ТеÑ\80кама xÑ\8cаÑ\82|аÑ\8fздаÑ\80 Ñ\87Ñ\83Ñ\80а Ð±|аÑ\82а хувцамаш къайладаха",
-       "tog-watchlisthideminor": "Са теркама xьат|аяздара з|амига хувцамаш къайладаха",
-       "tog-watchlisthideliu": "ТеÑ\80кама xÑ\8cаÑ\82|аÑ\8fздаÑ\80 Ñ\87Ñ\83Ñ\80а Ñ\85Ñ\8cабайза Ð´Ð¾Ð°ÐºÑ\8aоÑ\88Ñ\85оÑ\88а Ñ\85Ñ\83вÑ\86амаÑ\88 ÐºÑ\8aайладаÑ\85а",
-       "tog-watchlisthideanons": "ТеÑ\80кама xÑ\8cаÑ\82|аÑ\8fздаÑ\80 Ñ\87Ñ\83Ñ\80а Ñ\86|ийоаÑ\86аÑ\87а Ð´Ð¾Ð°ÐºÑ\8aоÑ\88Ñ\85оÑ\88а Ñ\85Ñ\83вÑ\86амаÑ\88 ÐºÑ\8aайладаÑ\85а",
-       "tog-watchlisthidepatrolled": "ТеÑ\80кама xÑ\8cаÑ\82|аÑ\8fздаÑ\80 Ñ\87Ñ\83Ñ\80а Ð´|анийÑ\81даÑ\8c Ñ\85Ñ\83вÑ\86амаÑ\88 ÐºÑ\8aайладаÑ\85а",
+       "tog-enotifwatchlistpages": "Электронни почте гIолла сога хоам бе зем беш йола оагIонаш а файлаш хувцарах",
+       "tog-enotifusertalkpages": "ЭлекÑ\82Ñ\80онни Ð¿Ð¾Ñ\87Ñ\82е Ð³Iолла Ñ\81ога Ñ\85оам Ð±Ðµ Ñ\81а Ð´Ñ\83вÑ\86а Ð¾Ñ\82Ñ\82адаÑ\80а Ð¾Ð°Ð³IÑ\83в Ñ\85ийÑ\86аÑ\87а",
+       "tog-enotifminoredits": "Ð\9eагIонаÑ\88Ñ\82а Ð° Ñ\84айлаÑ\88Ñ\82а Ð´Ð°Ñ\8c Ñ\85Ñ\83вÑ\86амаÑ\88 Ð³ÐµÑ\82Ñ\82аÑ\80а Ð·Iамига Ð´Ð°Ð»Ðµ Ð° Ñ\85оам Ð±Ðµ Ñ\81ога",
+       "tog-enotifrevealaddr": "Ð\94IаÑ\85айÑ\82а Ñ\85оамбаÑ\80аÑ\88 Ñ\87Ñ\83 Ð±IаÑ\80гадейÑ\82а Ñ\81а Ð¿Ð¾Ñ\87Ñ\82а Ð°Ð´Ñ\80еÑ\81",
+       "tog-shownumberswatching": "Шоаш зем бу оагIонашта юкъе ер оагIув чуяьккха доакьошхоша таьрахь гойта",
+       "tog-oldsig": "Ð¥IанзаÑ\80а Ñ\8fздаÑ\8c ÐºÑ\83лг:",
+       "tog-fancysig": "Ð\9aÑ\83лг Ñ\8fздаÑ\80а Ñ\88ий Ð¹Ð¾Ð»Ð° Ð²Ð¸ÐºÐ¸-Ñ\80азмеÑ\82ка (авÑ\82омаÑ\82иÑ\87еÑ\81ки Ñ\82IаÑ\85Ñ\8cожаÑ\8fрг йоацаш)",
+       "tog-uselivepreview": "Ð\9fайда Ñ\8dÑ\86а Ñ\81иÑ\85а Ð´Ð¾Ð»Ð° Ñ\85Ñ\8cалÑ\85Ñ\85е Ð±IаÑ\80гÑ\82оÑ\85аÑ\80",
+       "tog-forceeditsummary": "Ð\94IаÑ\85Ñ\8cалÑ\85адаккÑ\85а, Ð½Ð°Ð³Ð°Ñ\85Ñ\8cа Ñ\81анна Ñ\85Ñ\83вÑ\86ама Ð¹Ð¾Ð°Ð·Ð¾Ð½Ñ\86а Ñ\81Ñ\83Ñ\80Ñ\82 Ð¾Ñ\82Ñ\82адаÑ\80а Ð¼Ð¾Ñ\82Ñ\82иг Ñ\85Ñ\8cалÑ\8aйизанза Ñ\8fле",
+       "tog-watchlisthideown": "Са зем бара хьаязъяьр чура хувцамаш къайладаха",
+       "tog-watchlisthidebots": "Ð\97ем Ð±Ð°Ñ\80а Ñ\85Ñ\8cаÑ\8fзÑ\8aÑ\8fÑ\8cÑ\80 Ñ\87Ñ\83Ñ\80а Ð±Ð¾Ñ\82ий хувцамаш къайладаха",
+       "tog-watchlisthideminor": "Са зем бара хьаязъяьр чура зIамига хувцамаш къайладаха",
+       "tog-watchlisthideliu": "ШоаÑ\88 Ñ\85Ñ\8cабайзийÑ\82а Ð´Ð¾Ð°ÐºÑ\8aоÑ\88Ñ\85оÑ\88а Ñ\85Ñ\83вÑ\86амаÑ\88 ÐºÑ\8aайладаÑ\85а Ð·ÐµÐ¼ Ð±Ð°Ñ\80а Ñ\85Ñ\8cаÑ\8fзÑ\8aÑ\8fÑ\8cÑ\80 Ñ\87Ñ\83Ñ\80а",
+       "tog-watchlisthideanons": "ЦIийоаÑ\86аÑ\87а Ð´Ð¾Ð°ÐºÑ\8aоÑ\88Ñ\85оÑ\88а Ñ\85Ñ\83вÑ\86амаÑ\88 ÐºÑ\8aайладаÑ\85а Ð·ÐµÐ¼ Ð±Ð°Ñ\80а Ñ\85Ñ\8cаÑ\8fзÑ\8aÑ\8fÑ\8cÑ\80 Ñ\87Ñ\83Ñ\80а",
+       "tog-watchlisthidepatrolled": "Ха Ð´Ð°Ñ\8c Ð´Ð¾Ð»Ð° Ñ\85Ñ\83вÑ\86амаÑ\88 ÐºÑ\8aайладаÑ\85а Ð·ÐµÐ¼ Ð±Ð°Ñ\80а Ñ\85Ñ\8cаÑ\8fзÑ\8aÑ\8fÑ\8cÑ\80 Ñ\87Ñ\83Ñ\80а",
        "tog-watchlisthidecategorization": "Къайлаяккха оагӀонай категореш",
-       "tog-ccmeonemails": "Ð\90з Ð´|аÑ\85ийÑ\82аÑ\88 Ð´Ð¾Ð»Ð° Ð´Ð¾Ð°ÐºÑ\8aоÑ\88Ñ\85оÑ\88оа ÐºÐ°Ñ\8cÑ\85аÑ\82аÑ\88 Ñ\81а Ð´-Ñ\85оамни Ñ\82|а Ð´Ð°Ð¹Ñ\82а Ñ\85Ñ\8cа",
+       "tog-ccmeonemails": "Сона Ñ\85Ñ\8cаÑ\82|ааÑ\85ийÑ\82а Ð°Ð· Ð´Ð¾Ð°ÐºÑ\8aаÑ\88Ñ\85оÑ\88Ñ\82а Ð´|адаÑ\85ийÑ\82а Ð´Ð¾Ð»Ð° ÐºÐ°Ñ\8cÑ\85аÑ\82ий ÐºÐµÐ¿Ð°Ñ\88",
        "tog-diffonly": "Шин нийсхьале в|ашинийсдара к|ала бола оаг|он чулоацам ма гойта",
-       "tog-showhiddencats": "Ð\9aÑ\8aайла ÐºÐ°Ñ\82агаÑ\88 Ð³Ð¾Ð¹Ñ\82а",
+       "tog-showhiddencats": "Ð\93ойÑ\82а ÐºÑ\8aайла ÐºÐ°Ñ\82егоÑ\80еÑ\88",
        "tog-useeditwarning": "Хоамбе хьадаь хувцамаш дӀа ца яздеш аз болх дӀаберзабеча ханахь",
        "underline-always": "Даиман",
-       "underline-never": "Ц|аккха",
-       "underline-default": "Ð\9cазаб|аÑ\80глокÑ\85аÑ\80a Ð¾Ñ\82Ñ\82амаÑ\88 Ñ\85айÑ\80аде",
-       "editfont-style": "Ð\9dийÑ\81даÑ\80а Ð¼ÐµÑ\82Ñ\82ига Ñ\87Ñ\83 Ð¹Ð¾Ð»Ð° Ð·Ð°Ñ\80ба Ð±|аÑ\80маÑ\82:",
+       "underline-never": "ЦIаккха",
+       "underline-default": "Ð\91Ñ\80аÑ\83зеÑ\80а Ð³IиÑ\80Ñ\81аÑ\88 Ñ\82оаÑ\8fÑ\80аÑ\88 Ð»ÐµÐ»Ð°е",
+       "editfont-style": "Ð¥Ñ\83вÑ\86ама Ð¼Ð¾Ñ\82Ñ\82иге Ñ\88Ñ\80иÑ\84Ñ\82а Ñ\82айпа:",
        "editfont-default": "Браузерен гӀирса чура шрифт",
-       "editfont-monospace": "Ð\91аÑ\88Ñ\85алон Ð·Ð°Ñ\80ба",
+       "editfont-monospace": "ЦÑ\85Ñ\8cаÑ\82аÑ\80Ñ\80а Ð¹Ð¾Ð°Ñ\86а Ñ\88Ñ\80иÑ\84Ñ\82",
        "editfont-sansserif": "Белгало йоаца шрифт",
        "editfont-serif": "Белгало йола шрифт",
        "sunday": "кIиранди",
        "monday": "оршот",
        "tuesday": "шинара",
        "wednesday": "Кхаьра",
-       "thursday": "ера",
+       "thursday": "éра",
        "friday": "пӀаьраска",
        "saturday": "шоатта",
        "sun": "КIиранди",
        "thu": "Ер",
        "fri": "ПI",
        "sat": "Шоа",
-       "january": "АгIой бутт",
-       "february": "Саь-кур бутт",
-       "march": "Мутт-хьал бутт",
-       "april": "Тушоли бутт",
-       "may_long": "Села бутт",
-       "june": "Этинга бутт",
-       "july": "Баьцамеа бутт",
-       "august": "Мяцхали бутт",
-       "september": "Тов\\Ð\9cиÑ\85ий Ð±Ñ\83Ñ\82Ñ\82",
-       "october": "Ð\90Ñ\80даÑ\80ий\\Ð\90Ñ\8cÑ\80Ñ\85Iий Ð±Ñ\83Ñ\82Ñ\82",
-       "november": "Лай чилла бутт",
-       "december": "Чан-тар бутт",
-       "january-gen": "АгIой бетт",
-       "february-gen": "Саь-кур бетт",
-       "march-gen": "Мутт-хьал бетт",
-       "april-gen": "Тушоли бетт",
-       "may-gen": "Села бетт",
-       "june-gen": "Этинга бетт",
-       "july-gen": "Баьцамеа бетт",
-       "august-gen": "Мецхали бетт",
-       "september-gen": "Тов\\Ð\9cиÑ\85ий Ð±ÐµÑ\82Ñ\82",
-       "october-gen": "Ð\90Ñ\80даÑ\80ий\\Ð\90Ñ\8cÑ\80Ñ\85Iий Ð±ÐµÑ\82Ñ\82",
-       "november-gen": "Лай чилла бетт",
-       "december-gen": "Чан-тар бетт",
+       "january": "АгIой",
+       "february": "Саь-кур",
+       "march": "Мутт-хьал",
+       "april": "Тушоли",
+       "may_long": "Села",
+       "june": "Этинга",
+       "july": "Баьцамеа",
+       "august": "Мяцхали",
+       "september": "Ð\9cиÑ\85ий",
+       "october": "Ð\90Ñ\8cÑ\80Ñ\85Iий",
+       "november": "Лай чилла",
+       "december": "Чан-тар",
+       "january-gen": "АгIой",
+       "february-gen": "Саь-кур",
+       "march-gen": "Мутт-хьал",
+       "april-gen": "Тушоли",
+       "may-gen": "Села",
+       "june-gen": "Этинга",
+       "july-gen": "Баьцамеа",
+       "august-gen": "Мяцхали",
+       "september-gen": "Ð\9cиÑ\85ий",
+       "october-gen": "Ð\90Ñ\8cÑ\80Ñ\85Iий",
+       "november-gen": "Лай чилла",
+       "december-gen": "Чан-тар",
        "jan": "АгIой",
        "feb": "Саь-кур",
        "mar": "Мутт-хьал",
        "apr": "Tушоли",
        "may": "Села",
-       "jun": "Ð\9cангал\\ЭÑ\82инга",
-       "jul": "Баьцамеа\\Меа",
+       "jun": "Этинга",
+       "jul": "Баьцамеа",
        "aug": "Мяцхали",
-       "sep": "Тов\\Ð\9cиÑ\85ий",
-       "oct": "Ð\90Ñ\80даÑ\80ий\\Ð\90Ñ\8cÑ\80Ñ\85Iий",
+       "sep": "Михий",
+       "oct": "АьрхIий",
        "nov": "Лай чилла",
        "dec": "Чан-тар",
-       "january-date": "АгIой бутт $1",
-       "february-date": "Саь-кур бутт $1",
-       "march-date": "Муттхьол $1",
+       "january-date": "АгIой $1",
+       "february-date": "Саь-кур $1",
+       "march-date": "Мутт-хьал $1",
        "april-date": "Тушоли $1",
-       "may-date": "Села бутт $1",
-       "june-date": "Ð\90Ñ\8cÑ\82инг $1",
-       "july-date": "Ð\9a|имаÑ\80Ñ\81 $1",
-       "august-date": "Мангал $1",
-       "september-date": "Ð\9cоажол $1",
-       "october-date": "Тов $1",
-       "november-date": "Лай чилла бутт $1",
-       "december-date": "Чантар $1",
+       "may-date": "Села $1",
+       "june-date": "ЭÑ\82инга $1",
+       "july-date": "Ð\91аÑ\8cÑ\86амеа $1",
+       "august-date": "Мяцхали $1",
+       "september-date": "Ð\9cиÑ\85ий $1",
+       "october-date": "Ð\90Ñ\8cÑ\80Ñ\85Iий $1",
+       "november-date": "Лай чилла $1",
+       "december-date": "Чан-тар $1",
        "period-am": "ДЦ",
        "period-pm": "ДТ",
        "pagecategories": "{{PLURAL:$1|1=Категори|Категореш}}",
        "category-empty": "''Ер категори хӀанза яьсса я (цхьаккха оагIонаш е файлаш йоацаш).''",
        "hidden-categories": "{{PLURAL:$1|1=Къайла категори|Къайла категореш}}",
        "hidden-category-category": "Къайла категореш",
-       "category-subcat-count": "{{PLURAL:$2|Укх категори чу я укхан кIалхара категори.|Укх категори чу я $1 {{PLURAL:$1|кIалхара категори|кIалхара категореш}} $2 массайолчарех.}}",
+       "category-subcat-count": "{{PLURAL:$2|Укх категори чу я алхха ер кIалхара категори.|Укх категори чу $2-нен юкъе $1 {{PLURAL:$1|кIалхара категори|кIалхара категореш}} я}}",
        "category-subcat-count-limited": "Укх категори чу {{PLURAL:$1|кIалхара категори|$1 кIалхара категореш}} я.",
        "category-article-count": "{{PLURAL:$2|Укх категори чу цаI мара оагIув яц.|Укх категори чу я $2 оагӀув, царех оагӀонгахь {{PLURAL:$1|хьагойта $1 оагӀув}}}}",
        "category-article-count-limited": "Укх категори чу {{PLURAL:$1|$1 оагӀув я|1=цаI оагӀув мара яц}}.",
        "noindex-category": "Индекс ца оттаеш оагIонаш",
        "broken-file-category": "Файла тIахьожаяргаш болхбеш йоаца оагIонаш",
        "about": "Сурт оттадар",
-       "article": "Ð\99оазÑ\83в",
+       "article": "СÑ\82аÑ\82Ñ\8cÑ\8f",
        "newwindow": "&nbsp;(керда кора чу)",
-       "cancel": "ЭÑ\88аÑ\86",
+       "cancel": "ЮÑ\85адаккÑ\85а",
        "moredotdotdot": "ДIахо...",
        "morenotlisted": "Ер список хьалйиза яц.",
        "mypage": "ОагIув",
        "and": "&#32;а",
        "qbfind": "Лахар",
        "qbbrowse": "БIаргтохар",
-       "qbedit": "Нисъе",
+       "qbedit": "Нийсде",
        "qbpageoptions": "ОагIон оттамаш",
-       "qbmyoptions": "Са Ð¾Ñ\82Ñ\82амаш",
+       "qbmyoptions": "Ð¥Ñ\8cа Ð³IиÑ\80Ñ\81аÑ\88 Ñ\82оаÑ\8fÑ\80аш",
        "faq": "КТХ",
        "faqpage": "Project:КТХ",
        "actions": "Ардамаш",
-       "namespaces": "ЦIеÑ\80ий Ð¼Ð¾Ñ\82Ñ\82аш",
+       "namespaces": "ЦIеÑ\80ий Ð°Ñ\80енаш",
        "variants": "Варианташ",
        "navigation-heading": "Навигацен меню",
        "errorpagetitle": "ГӀалат",
        "delete": "ДӀаяккха",
        "deletethispage": "ДӀаяккха ер оагӀув",
        "undeletethispage": "Юхаметтаоттае ер оагӀув",
-       "undelete_short": "ЮÑ\85амеÑ\82Ñ\82аоÑ\82Ñ\82ае {{PLURAL:$1|$1 Ð½Ð¸Ð¹Ñ\81даÑ\80|$1 Ð½Ð¸Ð¹Ñ\81даÑ\80аÑ\88|1=нийÑ\81даÑ\80}}",
+       "undelete_short": "ЮÑ\85амеÑ\82Ñ\82аоÑ\82Ñ\82де {{PLURAL:$1|$1 Ð½Ð¸Ð¹Ñ\81даÑ\80|$1 Ð½Ð¸Ð¹Ñ\81даÑ\80аÑ\88}}",
        "viewdeleted_short": "{{PLURAL:$1|$1 дIадаьккха нийсдарга|дIадаьккха нийсдарга|$1 дIадаьккха нийсдарашга}} хьажар",
-       "protect": "Ð\93Iо Ð´Ð°Ñ\80",
+       "protect": "Ð\93Iо Ð´Ðµ",
        "protect_change": "хувца",
-       "protectthispage": "ГIо де укх оагIон",
+       "protectthispage": "ГIо (лорадар) де укх оагIон",
        "unprotect": "ГIо хувца",
-       "unprotectthispage": "Укх оагIон гIо хувца",
+       "unprotectthispage": "Укх оагIон гIо (лорадар) хувца",
        "newpage": "Керда оагӀув",
        "talkpage": "Ер оагIув ювца",
        "talkpagelinktext": "дувца оттадар",
-       "specialpage": "Ð\91алха оагӀув",
+       "specialpage": "Ð\93\83лакха оагӀув",
        "personaltools": "Доакъашхочун гӀирсаш",
-       "articlepage": "Ð\99оазон Ñ\82|а Ð±|аÑ\80гÑ\82аÑ\81Ñ\81а",
+       "articlepage": "Ð\91IаÑ\80гÑ\82оÑ\85а Ð¾Ð°Ð³Iонга",
        "talk": "Дувца оттадар",
        "views": "Хьажараш",
        "toolbox": "ГӀирсаш",
-       "userpage": "Ð\94оакÑ\8aоÑ\88Ñ\85оÑ\87Ñ\83н Ð¾Ð°Ð³|он Ñ\82|а Ð±|аÑ\80гÑ\82аÑ\81Ñ\81а",
-       "projectpage": "Ð¥Ñ\8cаÑ\85Ñ\8cоадайÑ\82ама Ð¾Ð°Ð³|oн Ñ\82|а Ð±|аÑ\80гÑ\82аÑ\81Ñ\81а",
-       "imagepage": "Ð\9bÑ\83Ñ\80даÑ\80а Ð¾Ð°Ð³|oн Ñ\82|а Ð±|аÑ\80гÑ\82аÑ\81Ñ\81а",
-       "mediawikipage": "Xоаман оаг|ув хьахьокха",
-       "templatepage": "Ч|абала Ð¾Ð°Ð³|oн Ñ\82|а Ð±|аÑ\80гÑ\82аÑ\81Ñ\81а",
+       "userpage": "Ð\94оакÑ\8aаÑ\88Ñ\85оÑ\87Ñ\83н Ð¾Ð°Ð³Iон Ð±IаÑ\80гÑ\82оÑ\85а",
+       "projectpage": "Ð\9fÑ\80оекÑ\82а Ð¾Ð°Ð³Iон Ð±IаÑ\80гÑ\82оÑ\85а",
+       "imagepage": "Файла Ð¾Ð°Ð³Iон Ð±IаÑ\80гÑ\82оÑ\85а",
+       "mediawikipage": "Хьахьокха хоам бара оагIув",
+       "templatepage": "Ð\9bеÑ\80а Ð¾Ð°Ð³Iон Ð±IаÑ\80гÑ\82оÑ\85а",
        "viewhelppage": "ГӀо хьаэцар",
-       "categorypage": "Ð\9aаÑ\82ага Ð¾Ð°Ð³|oн Ñ\82|а Ð±|аÑ\80гÑ\82аÑ\81Ñ\81а",
-       "viewtalkpage": "Дувцамага б|аргтасса",
+       "categorypage": "Ð\9aаÑ\82егоÑ\80ен Ð¾Ð°Ð³Iон Ð±IаÑ\80гÑ\82оÑ\85а",
+       "viewtalkpage": "Дувца оттадара бIаргтоха",
        "otherlanguages": "Кхыча меттаех",
-       "redirectedfrom": "($1 тIaра укхаз хьахьожаяь я)",
-       "redirectpagesub": "Ð\94|а-Ñ\85Ñ\8cа Ð´Ð°Ð¹Ñ\82а Ð¾Ð°Ð³|Ñ\83в",
+       "redirectedfrom": "($1 дIа-сахьожаяьй укхаз)",
+       "redirectpagesub": "Ð\9eагIÑ\83в-дIа-Ñ\81аÑ\85Ñ\8cожадаÑ\80",
        "redirectto": "ДIа-сахьожадар укхаза:",
        "lastmodifiedat": "Укх оагIoн тIеххьара хувцам: $2, $1.",
-       "viewcount": "Укх оаг|oн т|а б|аргтассаб {{PLURAL:$1|цхьааца\n|$1 times}}. {{PLURAL:$1|1=цхьазза|$1за}}.",
-       "protectedpage": "Ð\9bоÑ\80ама Ð¾Ð°Ð³|ув",
+       "viewcount": "Укх оагIонга хьежа хиннаб $1{{PLURAL:$1|-зза}}.",
+       "protectedpage": "Ð\93Iо Ð¾Ñ\82Ñ\82адаÑ\8c Ð»Ð¾Ñ\80аÑ\8fÑ\8c Ð¾Ð°Ð³Iув",
        "jumpto": "Дехьавала укхаза:",
        "jumptonavigation": "навигаци",
        "jumptosearch": "лахар",
-       "pool-timeout": "ЧIегатохара сабаран ха чакхаяьннай",
-       "pool-queuefull": "ХаÑ\82Ñ\82аÑ\80ий Ñ\86Ó\80а хьалдизад",
+       "pool-timeout": "ЧIега тохара сабардара ха чакхаяьннай",
+       "pool-queuefull": "Ð\94IаÑ\85аÑ\82Ñ\82аÑ\80ий Ð³Ñ\83лдеÑ\80 хьалдизад",
        "pool-errorunknown": "Довзаш доаца гӀалат",
        "poolcounter-usage-error": "Лелдара г|алат: $1",
-       "aboutsite": "{{grammar:genitive|{{SITENAME}}}} лаьца",
-       "aboutpage": "Project:Ð\9bоаÑ\86ам",
+       "aboutsite": "{{grammar:genitive|{{SITENAME}}}} лаьца дар",
+       "aboutpage": "Project:СÑ\83Ñ\80Ñ\82 Ð¾Ñ\82Ñ\82адаÑ\80",
        "copyright": "$1 чулоацамаца тIакхоачаш да.",
        "copyrightpage": "{{ns:project}}:Автора бокъонаш",
        "currentevents": "ХӀанзара хинна хIамаш",
        "currentevents-url": "Project:ХӀанзара хинна хIамаш",
-       "disclaimers": "Ð\91еÑ\85кÑ\82окÑ\85ам Ñ\85Ñ\8cацаэцар",
-       "disclaimerpage": "Project:Ð\91еÑ\85кÑ\82окÑ\85ам Ñ\85Ñ\8cацаэцар",
+       "disclaimers": "Ð\91еÑ\85кÑ\82окÑ\85ам Ñ\82Iацаэцар",
+       "disclaimerpage": "Project:Ð\91еÑ\85кÑ\82окÑ\85ам Ñ\82Iацаэцар",
        "edithelp": "Хувцам бара новкъостал",
        "helppage-top-gethelp": "ГӀо",
-       "mainpage": "Кертера оагӀув",
-       "mainpage-description": "Кертера оагӀув",
+       "mainpage": "Керттера оагӀув",
+       "mainpage-description": "Керттера оагӀув",
        "policy-url": "Project:Бокъонаш",
        "portal": "Юкъара ков",
        "portal-url": "Project:Юкъара ков",
        "editlink": "хувца",
        "viewsourcelink": "Хьажа дIадолалу ко́дага",
        "editsectionhint": "Дáкъа хувца: $1",
-       "toc": "ЧÑ\83лоаÑ\86ам",
+       "toc": "ЧÑ\83даÑ\80",
        "showtoc": "хьахьокха",
        "hidetoc": "къайладаккха",
        "collapsible-collapse": "чудерзаде",
        "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": "ГӀалат",
        "internalerror_info": "Чура гӀалат: $1",
        "cannotdelete-title": "ОагIув дIаяккха йиш яц \"$1\"",
        "badtitle": "Мегаш йоаца цӀи",
-       "badtitletext": "Ð\95заÑ\88 Ð¹Ð¾Ð»Ð° Ð¾Ð°Ð³Ó\80он Ñ\86Ó\80и Ð½Ð¸Ð¹Ñ\81а Ñ\8fÑ\86, Ñ\8fÑ\8cÑ\81Ñ\81а Ñ\8f, Ðµ Ñ\85аÑ\80Ñ\86аÑ\85Ñ\8c Ð¹Ð¾Ð°Ð»Ð°Ñ\8fй Ð¼ÐµÑ\82Ñ\82ай Ñ\8eкÑ\8aеÑ\80а Ñ\86Iи Ðµ Ð¸Ð½Ñ\82еÑ\80вики Ñ\86Ó\80и. Ð\98Ñ\88Ñ\82Ñ\82а, Ñ\86Ó\80еÑ\80а Ñ\8eкÑ\8aе Ð¾Ñ\82Ñ\82аде Ð¼ÐµÐ³Ð°Ñ\88 Ð´Ð¾Ð°Ñ\86а Ñ\85Ñ\8cаÑ\80акÑ\8aаÑ\88 Ð½Ð¸Ð¹Ñ\81аденна Ñ\85ила Ñ\82аÑ\80лÑ\83ш да.",
+       "badtitletext": "Ð\95заÑ\88 Ð¹Ð¾Ð»Ð° Ð¾Ð°Ð³Ó\80он Ñ\86Ó\80и Ð½Ð¸Ð¹Ñ\81а Ñ\8fÑ\86, Ñ\8fÑ\8cÑ\81Ñ\81а Ñ\8f, Ðµ Ñ\85аÑ\80Ñ\86аÑ\85Ñ\8c Ð¹Ð¾Ð°Ð»Ð°Ñ\8fй Ð¼ÐµÑ\82Ñ\82ий Ñ\8eкÑ\8aеÑ\80а Ñ\86Iи Ðµ Ð¸Ð½Ñ\82еÑ\80вики Ñ\86Ó\80и. Ð\98Ñ\88Ñ\82Ñ\82а, Ñ\86Ó\80еÑ\80а Ñ\8eкÑ\8aе Ð¾Ñ\82Ñ\82аде Ð¼ÐµÐ³Ð°Ñ\88 Ð´Ð¾Ð°Ñ\86а Ñ\85Ñ\8cаÑ\80акаÑ\88 Ð½Ð¸Ð¹Ñ\81аденна Ñ\85ила Ð¼ÐµÐ³Ð°ш да.",
        "viewsource": "Хьажар",
        "actionthrottled": "Сихален овзамал",
        "protectedpagetext": "Ер оаг|ув къайла я хувцамаш дергдоацаш е кхы дола х|амдараш.",
        "createacct-another-username-ph": "Чуйоалае доакъашхочун цӀи",
        "yourpassword": "КъайладIоагӀа:",
        "userlogin-yourpassword": "Пароль",
+       "userlogin-yourpassword-ph": "Iочуязъе хьа пароль",
+       "createacct-yourpassword-ph": "Iочуязъе пароль",
        "yourpasswordagain": "КъайладIоагӀа юха Ӏоязаде:",
+       "createacct-yourpasswordagain": "Бакъйе пароль",
+       "createacct-yourpasswordagain-ph": "Кхы цхьаькхаза Iочуязъе пароль",
        "remembermypassword": "(укх $1 {{PLURAL:$1|1=ден|деношкахь}}) мара са чувалара/чуялара дагалоаца дезаш дац",
+       "userlogin-remembermypassword": "Система чу виса",
        "yourdomainname": "Шун цӀеноагӀув:",
        "login": "Чувала/яла",
        "nav-login-createaccount": "ЦӀи яьккха/Ший oагӀув ела",
        "logout": "Аравала/яла",
        "userlogout": "Аравала/яла",
        "notloggedin": "Оаш шоай цӀи хьааьннадац",
+       "userlogin-noaccount": "Доакъашхочун учета яздар дице хьа?",
+       "userlogin-joinproject": "ДIахоттале {{SITENAME}}аца",
        "nologin": "Леламе дIаяздар дац? '''$1'''.",
-       "nologinlink": "Ð\9bеламе Ð´IаÑ\8fздаÑ\80 кхолла",
-       "createaccount": "УÑ\87Ñ\91Ñ\82а Ñ\8fздаÑ\80 хьакхолла",
+       "nologinlink": "Ð\94агаÑ\80а Ð¹Ð¾Ð°Ð·Ñ\83в Ñ\85Ñ\8cакхолла",
+       "createaccount": "Ð\94агаÑ\80а Ð¹Ð¾Ð°Ð·Ñ\83в хьакхолла",
        "gotaccount": "Укхаза дӀаязабенна дий шо? '''$1'''.",
        "gotaccountlink": "Чувала/яла",
        "userlogin-resetlink": "Чувала/яла цӀии дIоагӀаи дийцаденнадий?",
+       "userlogin-resetpassword-link": "ТIеракхосс хьа пароль?",
+       "userlogin-helplink2": "Система чуваларах новкъостал",
+       "userlogin-createanother": "Кхыдола дагара йоазув хьакхолла",
+       "createacct-emailoptional": "Электронни почта адрес (ца яздича мегаш да)",
+       "createacct-email-ph": "Iочуязде хьа электронни почта адрес",
        "createaccountmail": "КъайладIоагIа д-хоамнец хьадайта",
        "createaccountreason": "Бахьан:",
        "createacct-reason": "Бахьан",
+       "createacct-submit": "Хьакхолла учета яздар",
+       "createacct-another-submit": "Дагара йоазув хьакхолла",
+       "createacct-benefit-heading": "{{SITENAME}} — хьо санна болача наха цхьан беш бола къахьегам ба.",
+       "createacct-benefit-body1": "{{PLURAL:$1|нийсдар|нийсдараш}}",
+       "createacct-benefit-body2": "{{PLURAL:$1|статья|статьяш}}",
+       "createacct-benefit-body3": "{{PLURAL:$1|доакъашхо|доакъашхой}} тӀеххьара хан",
        "badretype": "Оаша яьккха дIоагIий цIераш шоайл таралуш яц.",
        "loginerror": "Дакъалаьцархочун цIи нийса яц",
        "mailmypassword": "Керда къайлад|оаг|а эца",
        "emailconfirmlink": "Доаржален хоамни хьожадорг дIачIоагIаде",
        "loginlanguagelabel": "Мотт: $1",
        "pt-login": "Чувала/яла",
-       "pt-createaccount": "Учёта яздар хьакхолла",
+       "pt-login-button": "Чувала/яла",
+       "pt-createaccount": "Дагара йоазув хьакхолла",
        "pt-userlogout": "Аравала/яла",
        "changepassword": "КъайладIоaгIа дIахувцар",
        "oldpassword": "Къаьна къайладIоагӀа:",
        "retypenew": "Керда къайладIоагӀа юха Ӏоязаде:",
        "resetpass-submit-loggedin": "КъайладIоагӀа дӀахувца",
        "resetpass-submit-cancel": "Юхавал/ялa",
+       "passwordreset": "Пароль тIеракхоссар",
        "passwordreset-username": "Дакъалаьцархочунна цӀи:",
        "passwordreset-email": "Д-хоамни моттиг:",
-       "bold_sample": "Ð\90Ñ\85\81ома текст",
-       "bold_tip": "Ð\90Ñ\85\81ома текст",
+       "bold_sample": "Сома Ð¹Ð¾Ð°Ð·Ð¾Ð½ текст",
+       "bold_tip": "Сома Ð¹Ð¾Ð°Ð·Ð¾Ð½ текст",
        "italic_sample": "Сиха йоазон текст",
        "italic_tip": "Сиха йоазон текст",
-       "link_sample": "ТIаÑ\85Ñ\8cожаÑ\8fÑ\80га Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²Ð¾Ðº",
+       "link_sample": "ТIаÑ\85Ñ\8cожаÑ\8fÑ\80га Ð´Ã¡ÐºÑ\8aа Ñ\86Iи",
        "link_tip": "Чура тIахьожаярг",
-       "extlink_sample": "http://www.example.com Ñ\82IаÑ\85Ñ\8cожаÑ\8fÑ\80га Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²Ð¾Ðº",
+       "extlink_sample": "http://www.example.com Ñ\82IаÑ\85Ñ\8cожаÑ\8fÑ\80га Ð´Ã¡ÐºÑ\8aа Ñ\86Iи",
        "extlink_tip": "Арахьара тIахьожаярг (йиц ма ялийтта префикс http://)",
-       "headline_sample": "Ð\97аголовка текст",
-       "headline_tip": "2-гӀа лагӀа заголовок",
+       "headline_sample": "Ð\94áкÑ\8aа Ñ\86IеÑ\80а текст",
+       "headline_tip": "2-гӀа лагӀара дáкъа цIи",
        "nowiki_sample": "Укхаза хувца езаш йоаца текст хьачуоттае",
        "nowiki_tip": "Теркал ма е вики-форматировани",
-       "image_tip": "Ð\94IаÑ\87уоттаяь файл",
+       "image_tip": "Чуоттаяь файл",
        "media_tip": "Файла тIахьожавар",
        "sig_tip": "Хьа кулгаяздар а, хӀанзара ха а",
        "hr_tip": "ПхьорагIен така (цох пайда эцар тIехдаьнна кастта ма де)",
-       "summary": "Ð¥Ñ\83вÑ\86амай сурт оттадар",
+       "summary": "Ð¥Ñ\83вÑ\86амий сурт оттадар",
        "subject": "БӀагал/кортале:",
        "minoredit": "ЗӀамига хувцам",
        "watchthis": "Зем бе укх оагӀон",
        "savearticle": "ОагӀув дIаязъе",
        "preview": "Хьалхе бӀаргтассар",
        "showpreview": "Хьалххе бIаргтохар",
-       "showdiff": "Даь хувцамаш",
-       "anoneditwarning": "<strong>Теркам бе!</strong> Хьо автор хинна система чуваьннавац. Нагахьа санна Iа моллагIа хувцам бой, Хьа IP-адрес дийла массанен бIаргагуш хургда. Нагахьа санна Хьо <strong>[$1 хьачувоале]</strong> е <strong>[$2 учёта яздар хьакхолле]</strong>, нийсдараш (хувцамаш) бувзам болаш хургда Хьа доакъашхой цIерца, иштта кхыдола толажагIи гIойленагIи дола дикаьш хургда Хьона.",
+       "showdiff": "Даь дола хувцамаш",
+       "anoneditwarning": "<strong>Теркам бе!</strong> Хьо автор хинна система чуваьннавац. Нагахьа санна Iа моллагIа хувцам бой, Хьа IP-адрес дийла массанен бIаргагуш хургда. Нагахьа санна Хьо <strong>[$1 хьачувоале]</strong> е <strong>[$2 дагара йоазув хьакхолле]</strong>, нийсдараш (хувцамаш) бувзам болаш хургда Хьа доакъашхой цIерца, иштта кхыдола толажагIи гIойленагIи дола дикаьш хургда Хьона.",
        "summary-preview": "Лоацам ба:",
        "subject-preview": "Кортале хургья:",
        "blockedtitle": "Дакъалаьцархо чӀега бела ва/я",
        "loginreqpagetext": "Кхыйола оагӀувнашка хьожаргдолаш, оаш $1 де деза.",
        "accmailtitle": "КъайладIоагӀа дӀадахьийтад",
        "newarticle": "(Kерда)",
-       "newarticletext": "Шо Ñ\85Ñ\8cожаÑ\8fÑ\80гаÑ\86а Ð´ÐµÑ\85Ñ\8cадаÑ\8cннад Ð¹Ð¾Ð°Ñ\86а Ð¾Ð°Ð³Ó\80он Ñ\82Ó\80а.\nÐ\98з ÐºÑ\85оллаÑ\80гÑ\8cйолаÑ\88 ÐºÓ\80алÑ\85агÓ\80а Ð´Ð¾Ð°Ð»Ð° ÐºÐ¾Ñ\80аÑ\87Ñ\83 Ñ\82екÑ\81Ñ\82 IоÑ\87Ñ\83Ñ\8fзаде (нагаÑ\85Ñ\8cа ÐºÑ\85еÑ\82аде Ñ\85ала Ð´Ð°Ð»Ðµ [$1 Ð½Ð¾Ð²ÐºÑ\8aоÑ\81Ñ\82алан Ð¾Ð°Ð³Ó\80онга] Ñ\85Ñ\8cажа).\nЦа Ñ\85овÑ\88 Ñ\83кÑ\85аза Ð½Ð¸Ð¹Ñ\81деннадале, Ñ\88оай Ð±Ñ\80аÑ\83зеÑ\80а '''ЮÑ\85а''' (назад) ÐºÐ½Ð¾Ð¿ÐºÐ° Ñ\82Ó\80а Ð¿Ó\80елга тоӀабе.",
-       "noarticletext": "ХIанз укх оагӀув тӀа текст яц.\nШун аьттув ба [[Special:Search/{{PAGENAME}}|цу тайпара цӀи хьоаяр кораде]] кхыйола йоазуваш чу, иштта\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} тара дола тептарий яздаьраш], е\n'''[{{fullurl:{{FULLPAGENAME}}|action=edit}} изза мо цӀи йолаш оагӀув кхолла]'''</span>.",
-       "noarticletext-nopermission": "Ð¥Iанз Ñ\83кÑ\85 Ð¾Ð°Ð³Ó\80он Ñ\82Ó\80а Ñ\82екÑ\81Ñ\82 Ñ\8fÑ\86.\nШÑ\83н Ð°Ñ\8cÑ\82Ñ\82Ñ\83в Ð±Ð° [[Special:Search/{{PAGENAME}}|Ñ\86Ñ\83 Ñ\82айпаÑ\80а Ñ\86Ó\80и Ð±ÐµÐ»Ð³Ð°Ð»Ñ\8aÑ\8fÑ\80 Ñ\85Ñ\8cалаÑ\85а]] ÐºÑ\85Ñ\8bйола Ð¾Ð°Ð³IонаÑ\88 Ñ\82Iа, Ð¸Ñ\88Ñ\82Ñ\82а\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} Ñ\86Ñ\83н Ñ\82аÑ\80а Ð´Ð¾Ð»Ð° Ñ\82епÑ\82аÑ\80ай Ñ\8fздаÑ\8cÑ\80аÑ\88].</span> Ð\98Ñ\88Ñ\82Ñ\82а Ð¹Ð¾Ð»Ð° (Ð\95Ñ\80) оагӀув хьакхолла Хьа бокъо яц.",
+       "newarticletext": "Шо Ñ\82IаÑ\85Ñ\8cожаÑ\8fÑ\80гаÑ\86а Ð´ÐµÑ\85Ñ\8cадаÑ\8cннад Ð¹Ð¾Ð°Ñ\86а Ð¾Ð°Ð³Ó\80он Ñ\82Ó\80а.\nÐ\98з Ñ\85Ñ\8cакÑ\85оллаÑ\80гÑ\8cйолаÑ\88 ÐºÓ\80алÑ\85агÓ\80а Ð´Ð¾Ð°Ð»Ð° ÐºÐ¾Ñ\80аÑ\87Ñ\83 Ñ\82екÑ\81Ñ\82 IоÑ\87Ñ\83Ñ\8fзде (нагаÑ\85Ñ\8cа Ñ\81анна ÐºÑ\85еÑ\82аде Ñ\85ала Ð´Ð°Ð»Ðµ [$1 Ð½Ð¾Ð²ÐºÑ\8aоÑ\81Ñ\82алаÑ\80а Ð¾Ð°Ð³Ó\80онга] Ñ\85Ñ\8cажа).\nЦа Ñ\85овÑ\88 Ñ\83кÑ\85аза Ð½Ð¸Ð¹Ñ\81деннадале, Ñ\88оай Ð±Ñ\80аÑ\83зеÑ\80а '''ЮÑ\85а''' (назад) Ñ\82оIаеÑ\80 Ñ\82Ó\80а Ð¿Ó\80елг тоӀабе.",
+       "noarticletext": "ХIанза укх оагӀон тӀа текст яц.\nШун аьттув ба [[Special:Search/{{PAGENAME}}|цу тайпара цӀи хьоаяр кораде]] кхыйола оагIонаш тIа, иштта\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} тара дола тептарий дIаяздаьраш], е\n'''[{{fullurl:{{FULLPAGENAME}}|action=edit}} изза мо цӀи йолаш оагӀув хьакхолла]'''</span>.",
+       "noarticletext-nopermission": "Ð¥Iанз Ñ\83кÑ\85 Ð¾Ð°Ð³Ó\80он Ñ\82Ó\80а Ñ\82екÑ\81Ñ\82 Ñ\8fÑ\86.\nШÑ\83н Ð°Ñ\8cÑ\82Ñ\82Ñ\83в Ð±Ð° [[Special:Search/{{PAGENAME}}|Ñ\86Ñ\83 Ñ\82айпаÑ\80а Ñ\86Ó\80и Ð±ÐµÐ»Ð³Ð°Ð»Ñ\8aÑ\8fÑ\80 Ñ\85Ñ\8cалаÑ\85а]] ÐºÑ\85Ñ\8bйола Ð¾Ð°Ð³IонаÑ\88 Ñ\82Iа, Ð¸Ñ\88Ñ\82Ñ\82а\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} Ñ\82аÑ\80а Ð´Ð¾Ð»Ð° Ñ\82епÑ\82аÑ\80ай Ð´IаÑ\8fздаÑ\8cÑ\80аÑ\88].</span> Ð\95Ñ\80 оагӀув хьакхолла Хьа бокъо яц.",
        "note": "'''ХӀамоалар:'''",
        "previewnote": "'''Хьалхе б|аргтассам мара бац.'''\nЯздам кхы яздаь дац!",
        "editing": "Хувцам: $1",
+       "creating": "«$1» оагIув хьакхоллар",
        "editingsection": "Хувцам: $1 (оагӀон дáкъа)",
        "editingcomment": "ГӀалатнийсдар $1 (керда декъам)",
        "editconflict": "ГӀалатнийсдара къовсам: $1",
        "yourtext": "Хьа яздам",
        "copyrightwarning": "Теркам бе, $2 ($1 хьажа) бокъонаца лорадеш, тӀахьежама кӀала уллаш, оаш мел чуяккхаш дола хоамаш, яздамаш долга.\nНаггахь санна шоай яздамаш пурам доацаш мала волашву саго хувца е кхы дола моттиге яздердолаш, безам беци, укхаз Ӏочуцаяздеча, дикаьгӀа да.<br />\nОаш дош лу, даь дола хувцама да волга/йолга, е оаш пурам долаш Ӏочуяздеш да кхычера меттигара шоай яздамаш/хоамаш.\n'''Яздархой бокъоца лорадеш дола хӀамаш, цара пурам доацаш, Ӏочумаязаде!'''",
-       "templatesused": "УкÑ\85 Ð¾Ð°Ð³Iон Ñ\82Iа {{PLURAL:$1|1=пайда Ñ\8dÑ\86а Ð\9bо|пайда Ñ\8dÑ\86а Ð\9bонаш}}:",
+       "templatesused": "УкÑ\85 Ð¾Ð°Ð³Iон Ñ\82Iа {{PLURAL:$1|1=пайда Ñ\8dÑ\86а Ð»Ð¾|пайда Ñ\8dÑ\86а Ð»ÐµÑ\80аш}}:",
        "templatesusedpreview": "Хьалхе бӀаргтассама оагӀув тӀа леладеш дола {{PLURAL:$1|1=Куцкеп|Куцкепаш}}:",
        "template-protected": "(лорадаь да)",
        "template-semiprotected": "(цхьа долча даькъе гIо оттадаь да)",
        "mergehistory-reason": "Бахьан:",
        "revertmerge": "Декъа",
        "history-title": "\"$1\" — хувцамай истори",
+       "difference-title": "$1 — версешта юкъе йола башхало",
        "lineno": "МугI $1:",
        "compareselectedversions": "Хьаржа доржамаша тарона тIа хьажа",
-       "editundo": "юхавала/яла",
+       "editundo": "юхадаккха",
+       "diff-multi-sameuser": "({{PLURAL:$1|цхьа юкъ хулаш йола верси|$1 юкъ хулаш йола версеш}} гуш яц цу доакъашхочун)",
        "searchresults": "Лахар чакхдоалаш корадаьр",
        "searchresults-title": "«$1» лахар",
        "notextmatches": "ОагIувнаша яздамий вIашагIакхетараш дац",
        "nextn": "{{PLURAL:$1|1=тIехьайоагIар|тIехьайоагIараш}} $1",
        "prevn-title": "{{PLURAL:$1|1=$1 хьалхара йоазув|$1 хьалхара йоазувнаш}}",
        "nextn-title": "{{PLURAL:$1|ТIадоагIа $1 яздар|ТIадоагIа $1 яздараш}}",
-       "shown-title": "Ð¥Ñ\8cóкÑ\85а $1 {{PLURAL:$1|даÑ\8c Ð¹Ð¾Ð°Ð·Ð¾|даÑ\8c Ð¹Ð¾Ð°Ð·Ð¾Ð½Ð°Ñ\88}} Ñ\83кÑ\85 Ð¾Ã¡Ð³IÑ\83вна тIа",
+       "shown-title": "Ð\93ойÑ\82а $1 {{PLURAL:$1|Ñ\8fздаÑ\8cÑ\80\8fздаÑ\8cÑ\80аÑ\88}} Ñ\83кÑ\85 Ð¾Ã¡Ð³Iон тIа",
        "viewprevnext": "ДIахьажа ($1 {{int:pipe-separator}} $2) ($3)",
        "searchmenu-exists": "'''Укх масса-хьахьоадайтамач ер оаг|ув \"[[:$1]]\" я'''",
        "searchmenu-new": "<strong>Хьакхолла оагIув «[[:$1]]» укх вики-проекте!</strong>\n{{PLURAL:$2|0=|Иштта хьажа Iайха лийха оагIонга.|Иштта хьажа хьай лахара хьахиннарашка.}}",
        "searchprofile-articles-tooltip": "$1 чу лахар",
        "searchprofile-images-tooltip": "Файлаш лахар",
        "searchprofile-everything-tooltip": "Массайола оагIонаш тIа лахар (дувцар оттадара оагIонаш чулоацаш)",
-       "searchprofile-advanced-tooltip": "IоÑ\87Ñ\83Ñ\8fзаÑ\8fÑ\8c Ñ\86IеÑ\80аÑ\80енаÑ\88каÑ\85 лаха",
+       "searchprofile-advanced-tooltip": "IоÑ\87Ñ\83Ñ\8fзаÑ\8fÑ\8c Ñ\86IеÑ\80ий Ð°Ñ\80енаÑ\88ка лаха",
        "search-result-size": "$1 ({{PLURAL:$2|$2 дош|$2 дешаш}})",
        "search-result-category-size": "{{PLURAL:$1|1=$1 дакъа|$1 дакъаш}} ({{PLURAL:$2|1=$2 кIалцатег|$2 кIалцатегаш}}, {{PLURAL:$3|1=$3 паьла|$3 паьлий}})",
        "search-redirect": "(дIа-сахьожадар $1 тIара)",
-       "search-section": "(дакъа «$1»)",
+       "search-section": "(дáкъа «$1»)",
        "search-suggest": "Хьона эшар ер хила мега: $1",
        "search-interwiki-caption": "Гаргалон хьахьоадайтамаш",
        "search-interwiki-default": "$1 хьахиннараш:",
        "search-relatedarticle": "шоайл дола",
        "searchrelated": "гаргара",
        "searchall": "деррига",
-       "search-nonefound": "Хьа дехар дара вIаши нийса доагIаш хилар корадаьдац.",
+       "search-showingresults": "{{PLURAL:$4|Кораяьй <strong>$1</strong> — цхьа оагӀув|Из дош корадаьд <strong>$3</strong> оагӀонашка, царех гойта $2 оагӀув}}",
+       "search-nonefound": "Хьа дехар дара вIаши нийса доагIаш дар корадаьдац.",
        "powersearch-legend": " Доккха тахкар",
        "powersearch-ns": " ЦIерий аренашкахь лахар",
        "powersearch-toggleall": "Деррига",
        "skin-preview": "Хьажа",
        "prefs-personal": "Хьа хьай далам",
        "prefs-rc": "Керда хувцамаш",
-       "prefs-watchlist": "ТеÑ\80кама Ð´Ð°Ð³Ð°Ñ\80Ñ\87е",
+       "prefs-watchlist": "Ð\97ем Ð±Ð°Ñ\80а Ñ\85Ñ\8cаÑ\8fзÑ\8aÑ\8fÑ\8cÑ\80",
        "prefs-watchlist-days": "Ден дукхал",
        "prefs-resetpass": "КъайладIоагIа хувца",
        "prefs-rendering": "ТIера бIаса",
        "timezoneregion-indian": "ХIинда форд",
        "timezoneregion-pacific": "Тийна форд",
        "prefs-searchoptions": "Лахар",
+       "prefs-namespaces": "ЦIерий аренаш",
        "prefs-files": "Паьлаш",
        "youremail": "Д-хоамни:",
        "username": "{{GENDER:$1|Доакъошхочун ц|и}}:",
        "right-createtalk": "дувцама оагIувний хьакхоллам",
        "right-move": "ОагIувний цIи хувца",
        "right-movefile": "Паьлий цIи хувца",
+       "right-writeapi": "ДIаяздара лаьрххIа API пайда эцар",
        "newuserlogpage": "Доакъашхой дIаязбаь таптар",
        "rightslog": "Дакъалаьцархочунна бокъона тептар",
        "action-read": "Укх оагIуви дешам",
        "nchanges": "$1 {{PLURAL:$1|1=хувцам|хувцамаш}}",
        "enhancedrc-history": "истори",
        "recentchanges": "Керда хувцамаш",
-       "recentchanges-legend": "Ð\9aеÑ\80да Ñ\85Ñ\83вÑ\86амай Ð¾Ñ\82Ñ\82амаш",
+       "recentchanges-legend": "Ð\9aеÑ\80да Ñ\85Ñ\83вÑ\86амий Ð³IиÑ\80Ñ\81аÑ\88 Ñ\82оаÑ\8fÑ\80аш",
        "recentchanges-summary": "КIалхагIа ханашца нийсдаь дIаяьздаь да {{grammar:genitive|{{SITENAME}}}}  оагIонай тIеххьара хувцамаш.",
        "recentchanges-feed-description": "Укх ларамца тIехьара массахувцамашт теркам бе.",
        "recentchanges-label-newpage": "Укх хувцамаца керда оагIув кхелла хиннай",
        "rcnotefrom": "КIалхагIа хувцамаш хьахьекха я <strong>$2</strong> денза (<strong>$1</strong> кхачалца).",
        "rclistfrom": "$3 $2 денза даь хувцамаш хьахьокха",
        "rcshowhideminor": "$1 зIамига нийсдараш",
-       "rcshowhideminor-hide": "ДIакъайладаккха",
+       "rcshowhideminor-show": "Хьахьокха",
+       "rcshowhideminor-hide": "Къайладаккха",
        "rcshowhidebots": "$1 боташ",
        "rcshowhidebots-show": "Хьахьокха",
+       "rcshowhidebots-hide": "Къайладаккха",
        "rcshowhideliu": "$1 бовзийтарчара доакъашхой",
        "rcshowhideliu-hide": "Къайлабаха",
        "rcshowhideanons": "$1 цIияккханза доакъашхой",
        "rcshowhideanons-hide": "Къайлабаха",
        "rcshowhidepatr": "$1 теркам даь хувцамаш",
        "rcshowhidemine": "$1 хьа нийсдараш",
-       "rcshowhidemine-hide": "ДIакъайладаккха",
+       "rcshowhidemine-show": "Хьахьокха",
+       "rcshowhidemine-hide": "Къайладаккха",
        "rclinks": "Хьахьокха $2 дийнахь даь хинна тIеххьара $1 хувцамаш\n<br />$3",
        "diff": "башхало",
        "hist": "истори",
        "rc-enhanced-hide": "Ма дарра чулоацамаш къайладаккха",
        "recentchangeslinked": "ВIашагIдувзаденна нийсдараш",
        "recentchangeslinked-feed": "Гаргалон хувцамаш",
-       "recentchangeslinked-toolbox": "УкÑ\85анÑ\86а Ð²IашагIдувзаденна хувцамаш",
+       "recentchangeslinked-toolbox": "Ð\92IашагIдувзаденна хувцамаш",
        "recentchangeslinked-title": "$1ца вIашидувзаденна хувцамаш",
-       "recentchangeslinked-summary": "Ð\95Ñ\80, Iинк Ñ\8fÑ\8c Ð¹Ð¾Ð»Ð° Ð¾Ð°Ð³IÑ\83в (е Ñ\83кÑ\85 Ñ\86аÑ\82егаÑ\87Ñ\83 Ñ\87Ñ\83йоагIаÑ\80аÑ\88), Ð´Ñ\83кÑ\85а Ñ\85а Ð¹Ð¾Ð°Ñ\86аÑ\88 Ñ\85Ñ\8cийÑ\86а Ð¾Ð°Ð³IÑ\83внаÑ\88кий Ð´Ð°Ð³Ð°Ñ\80ле Ñ\8f.\n[[Special:Watchlist|ШÑ\83н Ñ\82еÑ\80кама Ð´Ð°Ð³Ð°Ñ\80ленаÑ\88каÑ\85]] Ñ\87Ñ\83йоагIа Ð¾Ð°Ð³IÑ\83внаÑ\88 '''белгалаÑ\8fÑ\8c Ñ\8f'''.",
+       "recentchangeslinked-summary": "Ð\91елгалаÑ\8fÑ\8c Ð¹Ð¾Ð»Ð° Ð¾Ð°Ð³IÑ\83в Ñ\82IаÑ\85Ñ\8cожавеÑ\88 (е Ð±ÐµÐ»Ð³Ð°Ð»Ð°Ñ\8fÑ\8c Ð¹Ð¾Ð»Ð° ÐºÐ°Ñ\82егоÑ\80ен Ñ\8eкÑ\8aейоагIаÑ\88) Ð¹Ð¾Ð»Ñ\87а Ð¾Ð°Ð³IонаÑ\88Ñ\82а Ð´Ð°Ñ\8c Ñ\85Ñ\83вÑ\86амаÑ\88 Ð´Ð° ÐµÑ\80аÑ\88.\n[[Special:Watchlist|Ð¥Ñ\8cа Ð·ÐµÐ¼ Ð±Ð°Ñ\80а Ñ\85Ñ\8cаÑ\8fзÑ\8aÑ\8fÑ\8cÑ\80а]] Ñ\8eкÑ\8aейоагIаÑ\88 Ð¾Ð°Ð³IонаÑ\88 '''белгалаÑ\8fÑ\8cй'''.",
        "recentchangeslinked-page": "ОагIон цIи",
        "recentchangeslinked-to": "Вешта, белгаляьккха оагIон тIахьожавеш дола оагIонашта даь хувцамаш хьахьокха.",
        "upload": "Файл чуяккха",
        "filedesc": "Лоаца йоазонца сурт оттадар",
        "fileuploadsummary": "Лоаца лоацам:",
        "license": "ЦIийяздар",
-       "license-header": "Лицензирование",
+       "license-header": "Лицензировани",
        "imgfile": "файл",
        "listfiles": "Паьлий дагарче",
        "listfiles_date": "Денха",
        "listfiles_description": "Лоацам",
        "listfiles_count": "Доржамаш",
        "file-anchor-link": "Файл",
-       "filehist": "Файлан истори",
-       "filehist-help": "Ð\9aнопка Ñ\82аÑ\8cÑ\80аÑ\85Ñ\8c\85а Ñ\82оIае Ñ\86Ñ\83 Ñ\85ан Ñ\84айл Ð¼Ð¸Ñ\88Ñ\82а Ñ\85иннай Ñ\85Ñ\8cожаpгволаÑ\88/йолаш",
+       "filehist": "Файла истори",
+       "filehist-help": "ТаÑ\8cÑ\80аÑ\85Ñ\8c\85а Ñ\82Iа Ñ\82оIабе Ñ\86Ñ\83 Ñ\85ан Ñ\84айл Ð¼Ð¸Ñ\88Ñ\82а Ñ\85иннай Ñ\85Ñ\8cожаpгдолаш",
        "filehist-revert": "юхаяьккха",
        "filehist-current": "xIанзара",
        "filehist-datetime": "Таьрахь/Ха",
        "filehist-thumb": "ЗIамигасурт",
        "filehist-thumbtext": "ЗIамига сурт укх версин $1",
        "filehist-user": "Доакъашхо",
-       "filehist-dimensions": "Файлан боарам",
+       "filehist-dimensions": "Файла боарам",
        "filehist-filesize": "Паьла юстарал",
        "filehist-comment": "Белгалдаккхар",
        "imagelinks": "Файлах пайда эцар",
-       "linkstoimage": "{{PLURAL:$1|1=ТIехьайоагIача $1 оагIуво тIахьожаву|ТIехьайоагIача $1 оагIувнаша тIахьожаву}} укх файла тIа:",
+       "linkstoimage": "{{PLURAL:$1|1=ТIехьайоагIача $1 оагIо тIахьожаву|ТIехьайоагIача $1 оагIонаш тIахьожаву}} укх файла тIа:",
        "nolinkstoimage": "Укх файла тIахьожавеш йола оагIонаш яц.",
        "sharedupload": "Ер паьла $1чера я, кхыча хьахьоадайтамча хьахайраде йийшайолаш я.",
-       "sharedupload-desc-here": "Ер файл $1 чура я, иштта кхыйола проекташ чу пайда эца аьттув болаш я.\nЦун [$2 йоазонца сурт оттадара оагIон] информаци кIалхахь хьайоалаяй.",
+       "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увнаш",
+       "statistics-articles": "Статьяш",
+       "statistics-pages": "ОагIонаш",
        "brokenredirects-edit": "хувца",
        "brokenredirects-delete": "дIадаккха",
        "withoutinterwiki-submit": "Хьахьокха",
        "prefixindex": "ОагIувнаший хьалхера цIи хьагойтар",
        "shortpages": "Лоаца оагIувнаш",
        "longpages": "Доккхий оагIувнаш",
+       "protectedpages-page": "ОагIув",
        "usercreated": "{{GENDER:$3|Чуваьннав|Чуяьннай}} $1  $2",
        "newpages": "Керда оагIонаш",
        "move": "ЦIи хувца",
        "allpagessubmit": "Кхоачашде",
        "categories": "Категореш",
        "linksearch": "Т|ера|инкаш лахар",
+       "linksearch-ns": "ЦIерий аренаш:",
        "linksearch-ok": "Хьалáха",
        "linksearch-line": "$1 тIа Iинк $2 юкъера",
        "listgrouprights-members": "(тоабий дагарче)",
+       "listgrouprights-namespaceprotection-namespace": "ЦIерий аре",
        "emailuser": "Дакъалаьцархочоа д-хоамни:",
-       "watchlist": "ТеÑ\80кама Ð´Ð°Ð³Ð°Ñ\80Ñ\87е",
-       "mywatchlist": "Ð\97ем Ð±Ð°Ñ\80а Ñ\81пиÑ\81ок",
+       "watchlist": "Ð\97ем Ð±Ð°Ñ\80а Ñ\85Ñ\8cаÑ\8fзÑ\8aÑ\8fÑ\8cÑ\80",
+       "mywatchlist": "Ð\97ем Ð±Ð°Ñ\80а Ñ\85Ñ\8cаÑ\8fзÑ\8aÑ\8fÑ\8cÑ\80",
        "watchlistfor2": "$1 $2 царна",
        "addedwatchtext": "\"[[:$1]]\" оагIув, шун [[Special:Watchlist|теркама дагаршкахь]] чуяккха я. \nТехьара мел йола укх оагIувни хувцамаш цу дагаршкахь хоам беш хургья. Вешта [[Special:RecentChanges|керда хувцама дагаршкаехь]] сома къоалмаца хьакъоастлуш хургья.",
        "removedwatchtext": "\"[[:$1]]\" оагIув, шун [[Special:Watchlist|теркама дарагчера]] дIаяккха хиннай.",
        "watch": "Зем бе",
        "watchthispage": "Укх оагIува теркам бе",
        "unwatch": "Лора ма де",
+       "notanarticle": "Статья яц",
        "watchlist-details": "Шун теркама дагарченгахь йола  $1 {{PLURAL:$1|1=оагIув|оагIувнаш}}, дувцама оагIувнаш ца лоархIаш.",
        "wlshowlast": "Тlехьара $1 сахьаташ $2 денош  хьахьокха",
        "watchlist-options": "Зем баккха дагарена хувцамаш",
        "deleteotherreason": "Кхыдола бахьан/тIатохар:",
        "deletereasonotherlist": "Кхыдола бахьан",
        "rollbacklink": "юхаяккха",
+       "rollbacklinkcount": "юхататта $1 {{PLURAL:$1|нийсдар}}",
        "protectlogpage": "ГIон тептар",
        "protectedarticle": "\"[[$1]]\" оагIув лорам деж я",
        "modifiedarticleprotection": "\"[[$1]]\" оагIувни лорама лагIа хувцаяьннай",
        "restriction-level": "Чувоала лагIа:",
        "restriction-edit": "ГIалатнийсдар",
        "restriction-move": "ЦIи хувцаp",
-       "restriction-create": "Ð\9aÑ\85оллам",
+       "restriction-create": "Ð¥Ñ\8cакÑ\85оллаÑ\80",
        "restriction-upload": "Чудаккхар",
        "undeletelink": "БIаргтасса/юхаметтаоттаде",
        "undeleteviewlink": "хьажа",
        "undelete-search-submit": "Хьалáха",
-       "namespace": "ЦIерий мотт",
-       "invert": "Харжар юхадаккха",
-       "namespace_association": "Ювзаенна мотт",
+       "namespace": "ЦIерий аренаш:",
+       "invert": "Хержар юхадаккха",
+       "tooltip-invert": "Оттае ер белгало, хержа цIерий аре чу а (белгалъяь яле вIашагIъювзаенна цIерий аре чу а), оагIонаш тIа а даь хувцамаш къайладоахаргдолаш",
+       "namespace_association": "Ювзаенна аре",
+       "tooltip-namespace_association": "Оттае ер белгало, иштта хержа цIерий ареца вIашагIъювзаенна дувца оттадара цIерий аре (е кхыяр) юкъейоаккхаргйолаш",
        "blanknamespace": "(Кертера)",
        "contributions": "{{GENDER:$1|Доакъашхочун}} къахьегам",
        "contributions-title": "$1 дакъалаьцархочунна къахьегам",
        "sp-contributions-username": "IP-моттиг е цIи:",
        "sp-contributions-toponly": "ТIехьара доржамаш лоархаш дола хувцамаш мара ма хьокха",
        "sp-contributions-submit": "Хьалáха",
-       "whatlinkshere": "Ð¥ьожаяргаш укхаза",
-       "whatlinkshere-title": "\"$1\" тIахьожавеш йола оагIонаш",
-       "whatlinkshere-page": "ОагIув",
+       "whatlinkshere": "ТIаÑ\85ьожаяргаш укхаза",
+       "whatlinkshere-title": "\"$1а\" тIахьожавеш йола оагIонаш",
+       "whatlinkshere-page": "ОагIув:",
        "linkshere": "ТIехьайоагIа оагIонаш тIахьожаву «'''[[:$1]]'''»:",
        "nolinkshere": "'''[[:$1]]''' оагIув тIа, кхыдола оагIувашкара Iинкаш йоацаш я",
        "isredirect": "оагIув-дIа-сахьожадар",
        "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": "Фильтры",
+       "whatlinkshere-filters": "Фильтраш",
        "blockip": "Укх {{GENDER:$1|доакъошхочоа}} ч|ега бола",
        "ipboptions": "2 сахьат:2 hours,1 ди:1 day,3 ди:3 days,1 кIира:1 week,2 кIира:2 weeks,1 бутт:1 month,3 бутт:3 months,6 бутт:6 months,1 шу:1 year,сиха ца луш:infinite",
        "ipblocklist": "ЧIега бела дакъалаьцархой",
        "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-pt-mycontris": "{{GENDER:|хьа}} хувцамаш",
        "tooltip-pt-login": "Укхаза хьай цIи аьле чувала/яла йиша я, амма из параз дац",
        "tooltip-pt-logout": "Аравала/яла",
-       "tooltip-pt-createaccount": "Хьа бокъо я учёта яздар кхелла система чу вала, амма параз долаш дац из.",
-       "tooltip-ca-talk": "Ð\9eагIон Ñ\87Ñ\83лоаÑ\86ам дувца оттадар",
+       "tooltip-pt-createaccount": "Хьа бокъо я дагара йоазув кхелла система чувала, амма параз долаш дац из.",
+       "tooltip-ca-talk": "Ð\9eагIон Ñ\87Ñ\83даÑ\80 дувца оттадар",
        "tooltip-ca-edit": "Нийсъе ер оагIув",
-       "tooltip-ca-addsection": "Керда дакъа хьаде",
+       "tooltip-ca-addsection": "Керда дáкъа хьаде",
        "tooltip-ca-viewsource": "Ер оагIув хувцамбарах гIо теха (лорая) я, амма цунна дIадолалу текстага хьажа а, из тIерхьаязъе а бокъо я.",
        "tooltip-ca-history": "Укх оагIон даь хувцамаш тIа дола тептар",
        "tooltip-ca-protect": "Eр оагIув лорае",
        "tooltip-ca-delete": "Ер оагIув дIаяькха",
        "tooltip-ca-move": "Укх оагIон цIи хувца",
-       "tooltip-ca-watch": "Ð\95Ñ\80 Ð¾Ð°Ð³IÑ\83в IайÑ\85а Ð·Ñ\83вÑ\88 Ð¹Ð¾Ð»Ñ\87а Ð¾Ð°Ð³IонаÑ\88Ñ\82а Ñ\8eкÑ\8aеÑ\8fккÑ\85а",
+       "tooltip-ca-watch": "ТIаÑ\82оÑ\85а ÐµÑ\80 Ð¾Ð°Ð³IÑ\83в Ñ\85Ñ\8cа Ð·ÐµÐ¼ Ð±Ð°Ñ\80а Ñ\85Ñ\8cаÑ\8fзÑ\8aÑ\8fÑ\8cÑ\80а",
        "tooltip-ca-unwatch": "Ер оагIув теркам беча каьхата тIара дIаяькха",
        "tooltip-search": "Хьалáха {{grammar:prepositional|{{SITENAME}}}} чу",
-       "tooltip-search-go": "Изза мо цӀи йолаш оагӀув тӀa дехьавала",
-       "tooltip-search-fulltext": "Ð\98зза Ð¼Ð¾ Ñ\8fздаÑ\80 Ð´Ð¾Ð»Ð°Ñ\88 Ð¾Ð°Ð³Ó\80Ñ\83внаш лаха",
-       "tooltip-p-logo": "Кертера оагIув тIа дехьавала",
-       "tooltip-n-mainpage": "Кертера оагIув тIа дехьавала",
-       "tooltip-n-mainpage-description": "Кертера оагIув тIа дехьавала",
-       "tooltip-n-portal": "Ð\93IалгIай Ð\92икипедех лаьца дар а, укхаза де мегаш дар а, малагIа фуд а, мича да а",
+       "tooltip-search-go": "Изза мо цӀи йолаш оагӀон тӀa дехьавала",
+       "tooltip-search-fulltext": "Ð\98зза Ð¼Ð¾ Ñ\82екÑ\81Ñ\82 Ð¹Ð¾Ð»Ð°Ñ\88 Ð¾Ð°Ð³Ó\80онаш лаха",
+       "tooltip-p-logo": "Керттера оагIон тIа дехьавала",
+       "tooltip-n-mainpage": "Керттера оагIон тIа дехьавала",
+       "tooltip-n-mainpage-description": "Керттера оагIон тIа дехьавала",
+       "tooltip-n-portal": "Ð\93IалгIай Ð\92икипейдах лаьца дар а, укхаза де мегаш дар а, малагIа фуд а, мича да а",
        "tooltip-n-currentevents": "ХIанзара хинна хIамах бола хоам",
-       "tooltip-n-recentchanges": "ТÓ\80еÑ\85Ñ\85Ñ\8cаÑ\80а Ñ\85Ñ\83вÑ\86амай Ñ\81пиÑ\81ок",
+       "tooltip-n-recentchanges": "ТÓ\80еÑ\85Ñ\85Ñ\8cаÑ\80а Ñ\85Ñ\83вÑ\86амий Ñ\85Ñ\8cаÑ\8fзÑ\8aÑ\8fÑ\8cÑ\80",
        "tooltip-n-randompage": "Башхало йоаца ца ховш нийсъенна оагӀув хьаела",
        "tooltip-n-help": "Новкъостал лаха мегаш йола моттиг",
-       "tooltip-t-whatlinkshere": "Укхаза тIахьожавеш йола оагIонай список",
-       "tooltip-t-recentchangeslinked": "Укх оагIуво тIахьожавеш йолча оагIонай тIеххьара хувцамаш",
+       "tooltip-t-whatlinkshere": "Укхаза тIахьожавеш йола оагIонаш",
+       "tooltip-t-recentchangeslinked": "Укх оагIо тIахьожавеш йолча оагIонай тIеххьара хувцамаш",
        "tooltip-feed-rss": "Укх оагIувна RSSчу гойтар",
-       "tooltip-feed-atom": "Укх оаг|увна Atomчу гойтар",
+       "tooltip-feed-atom": "Укх оагIонна лаьрххIа Atom чу трансляци яр",
        "tooltip-t-contributions": "{{GENDER:$1|Укх доакъашхочо хийца}} йола оагIонаш",
        "tooltip-t-emailuser": "Укх дакъалаьцархочоа зIы яхьийта",
        "tooltip-t-upload": "Файлаш чуяккха",
-       "tooltip-t-specialpages": "ГIулакха оагIувнаш",
+       "tooltip-t-specialpages": "ГIулакха оагIонаш",
        "tooltip-t-print": "Укх оагIон зарба тохара верси",
-       "tooltip-t-permalink": "ОагIон укх версин тIахьожавеш йола даим латташ йола хьожаярг",
-       "tooltip-ca-nstab-main": "ОагIон чурадар",
+       "tooltip-t-permalink": "Ð\9eагIон Ñ\83кÑ\85 Ð²ÐµÑ\80Ñ\81ин Ñ\82IаÑ\85Ñ\8cожавеÑ\88 Ð¹Ð¾Ð»Ð° Ð´Ð°Ð¸Ð¼ Ð»Ð°Ñ\82Ñ\82аÑ\88 Ð¹Ð¾Ð»Ð° Ñ\82IаÑ\85Ñ\8cожаÑ\8fÑ\80г",
+       "tooltip-ca-nstab-main": "ОагIон чударга хьажар",
        "tooltip-ca-nstab-user": "Доакъашхочун ше доалахь йола оагIув",
        "tooltip-ca-nstab-special": "Ер гIулакха оагIув я, из хувца бокъо яц",
        "tooltip-ca-nstab-project": "Проектан оагIув",
-       "tooltip-ca-nstab-image": "Файлан оагӀув",
+       "tooltip-ca-nstab-image": "Файла оагӀув",
        "tooltip-ca-nstab-template": "Лера оагIув",
        "tooltip-ca-nstab-help": "ГӀон оагIув",
-       "tooltip-ca-nstab-category": "Ð\9aаÑ\82егоÑ\80ий оагӀув",
+       "tooltip-ca-nstab-category": "Ð\9aаÑ\82егоÑ\80ен оагӀув",
        "tooltip-minoredit": "Ер хувцар башха доаца санна белгалде",
-       "tooltip-save": "Хьай хувцамаш лорадеш дIаязде",
-       "tooltip-preview": "Дехар да, оагӀув лораешь дIаязъелехь из мишта я тахка хьалххе хьажарах пайда эцаш!",
+       "tooltip-save": "Хьа хувцамаш лорадеш дIаязде",
+       "tooltip-preview": "Дехар да, оагӀув лораешь дIаязъелехь из мишта я тахка хьалххе бIаргтохарах пайда эцаш!",
        "tooltip-diff": "ДIадолалу текстаца даь хувцамаш хьахьокха",
        "tooltip-compareselectedversions": "Укх оагIувни шин доржамаш тIа юкъера хувцамаш зе.",
        "tooltip-watch": "Ер оагIув теркам беча каьхата тIа яькха",
        "tooltip-rollback": "Цкъа пIелг тоIабе дIадаккха тIехьара редакторас даь хувцамаш",
        "tooltip-undo": "Даь хувцар дIадаьккха, хьалххе бIаргтохар хьахьокха, дIадаккхара бахьан Iочуязде аьттув болаш.",
-       "tooltip-summary": "Лоаца йоазонца сурт оттадар Iочуязде",
+       "tooltip-summary": "Лоаца сурт оттадар Iочуязде",
+       "simpleantispam-label": "Анти-спам тахкар.\n<strong>Цхьа</strong> хIама ма язъе укхаз!",
        "pageinfo-hidden-categories": "{{PLURAL:$1|1=Къайла категори|Къайла категореш}} ($1)",
        "pageinfo-toolboxlink": "ОагIонах бола хоам",
        "previousdiff": "← Хьалхара нийсдар",
        "nextdiff": "ТIайоагIа нийсъар",
-       "file-info-size": "$1 × $2 {{PLURAL:$2|пиксель}}, файлан боарам: $3, MIME-тайпа: $4",
+       "file-info-size": "$1 × $2 {{PLURAL:$2|пиксель}}, файла боарам: $3, MIME-тайпа: $4",
        "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=Кхыбола тIера боарам|Кхыбола тIера боарам}}: $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-help": "ФайлаÑ\81 ÐºÑ\85Ñ\8bдола Ñ\85оамаÑ\88 Ñ\87Ñ\83лоаÑ\86а, Ñ\86иÑ\84Ñ\80овой Ñ\81Ñ\83Ñ\80Ñ\82доакÑ\85аÑ\80го Ðµ Ñ\81канеÑ\80о Ñ\82IаÑ\82оÑ\85аÑ\88 Ð´Ð¾Ð»Ð°. Ð\9dагаÑ\85Ñ\8cа Ñ\84айл Ñ\87Ñ\83Ñ\8fкÑ\85аÑ\87Ñ\83л Ñ\82IеÑ\85Ñ\8cа Ñ\85ийÑ\86а Ñ\85инна Ð´Ð°Ð»Ðµ, Ñ\86Ñ\85Ñ\8cаÑ\86Ñ\86айола Ð¿Ð°Ñ\80амеÑ\82Ñ\80аÑ\88 Ñ\85IанзаÑ\80а Ñ\81Ñ\83Ñ\80Ñ\82а Ñ\82ара йоацаш хила мегаш я.",
+       "metadata": "Мета-дараш",
+       "metadata-help": "Файло ÐºÑ\85Ñ\8bдола Ð´Ð°Ñ\80аÑ\88 Ñ\87Ñ\83лоаÑ\86а, Ñ\86иÑ\84Ñ\80овой Ñ\81Ñ\83Ñ\80Ñ\82доакÑ\85аÑ\80го Ðµ Ñ\81канеÑ\80о Ñ\82IаÑ\82оÑ\85аÑ\88 Ð´Ð¾Ð»Ð°. Ð\9dагаÑ\85Ñ\8cа Ñ\84айл Ñ\87Ñ\83Ñ\8fкÑ\85аÑ\87Ñ\83л Ñ\82IеÑ\85Ñ\8cа Ñ\85ийÑ\86а Ñ\85инна Ð´Ð°Ð»Ðµ, Ñ\86Ñ\85Ñ\8cаÑ\86Ñ\86айола Ð¿Ð°Ñ\80амеÑ\82Ñ\80аÑ\88 Ñ\85IанзаÑ\80а Ñ\81Ñ\83Ñ\80Ñ\82а Ñ\82Iара йоацаш хила мегаш я.",
        "metadata-expand": "Кхыдола хIамаш хьахьокха",
        "metadata-collapse": "Кхыдола хIамаш къайладаккха",
-       "metadata-fields": "УкÑ\85 Ñ\81пиÑ\81ке Ð´Ð°Ð³aÑ\80адаÑ\8c Ñ\81Ñ\83Ñ\80Ñ\82ай Ð¼ÐµÑ\82аÑ\85оамай Ð¹Ð¸Ñ\81Ñ\82оÑ\88, Ñ\85Ñ\8cаÑ\85Ñ\8cекÑ\85а Ñ\85Ñ\83Ñ\80гда Ñ\81Ñ\83Ñ\80Ñ\82ан Ð¾Ð°Ð³Iон Ñ\82Iа, Ð¼ÐµÑ\82аÑ\85оамай Ñ\82аблиÑ\86а Ñ\85Ñ\8cоаÑ\80Ñ\87аÑ\8f Ð¹олаш. Юхедиса йистош къайла хургда.\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
+       "metadata-fields": "УкÑ\85 Ñ\85Ñ\8cаÑ\8fÑ\8cзÑ\8aÑ\8fÑ\80а Ñ\87Ñ\83 Ð´Ð°Ð³aÑ\80адаÑ\8c Ñ\81Ñ\83Ñ\80Ñ\82ий Ð¼ÐµÑ\82аÑ\85оамий Ð¹Ð¸Ñ\81Ñ\82оÑ\88, Ñ\85Ñ\8cаÑ\85Ñ\8cекÑ\85а Ñ\85Ñ\83Ñ\80гда Ñ\81Ñ\83Ñ\80Ñ\82а Ð¾Ð°Ð³Iон Ñ\82Iа, Ñ\85Ñ\8cоаÑ\80Ñ\87адаÑ\8c Ð¼ÐµÑ\82аÑ\85оамий Ð¸Ð»Ñ\8cг Ð´олаш. Юхедиса йистош къайла хургда.\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
        "exif-imagewidth": "Шерал",
        "exif-imagelength": "Лакхал",
        "exif-orientation": "Сурта белгало",
+       "exif-xresolution": "ПхьорагIа тIера боарам",
+       "exif-yresolution": "УрагIа тIера боарам",
+       "exif-datetime": "Файл хийца хинна таьрахьи хаи",
        "exif-imagedescription": "Сурта цIи",
+       "exif-make": "Камера кийчъяь арахийцар",
        "exif-model": "Камера модель",
        "exif-software": "Программни Iалашдар",
        "exif-artist": "Яздархо",
        "exif-colorspace": "Бесай мотт",
        "exif-pixelxdimension": "Сурта шорал",
        "exif-pixelydimension": "Сурта лакхал",
+       "exif-datetimeoriginal": "Оригинальни таьрахьи хаи",
        "exif-datetimedigitized": "Оцифровк яь таьрахь а, ха а",
        "exif-writer": "Яздама да",
        "exif-languagecode": "Мотт",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|дувца оттадар]])",
        "duplicate-defaultsort": "Зем бе. Сатийна дIа-хьа хьоржама доагI \"$2\" хьалхара сатийна дIа-хьа хьоржама доагI \"$1\" хьахьоржа.",
        "version": "Доржам",
-       "version-specialpages": "Ð\91алха оагӀонаш",
+       "version-specialpages": "Ð\93\83лакха оагӀонаш",
        "version-version": "($1)",
        "version-software-version": "Доржам",
        "fileduplicatesearch-filename": "ПаьлацIи:",
        "fileduplicatesearch-submit": "Хьалáха",
-       "specialpages": "ЛаьрххIа йола оагIувнаш",
+       "specialpages": "ЛаьрххIа йола оагIонаш",
        "specialpages-group-users": "Дакъалаьцархой, цара бокъо",
        "specialpages-group-pages": "ОагIувний дагарченаш",
        "specialpages-group-pagetools": "ОагIувнаша гIирсаш",
        "external_image_whitelist": "#Ер мугI ший долаш тайпара дита<pre>\n#Каст-каста оаламаш укхаза дIаязаде(юкъе дола дакъа //)\n#арара суртий URLца дIанийсалургда уш.\n#Пайдан дола, сурташ мо хьахьекха хургья, дахIодараш, сурта тIа Iинкаш мо хуpгья хьахьекха.\n#Укх # тамагIалгаца дIадувлаш дола мугIанаш, оалам мо лоархаш да.\n#МугIанаш яздaтакха каьда да\n\n#Каст-каста оаламаш укх мугIа лакхе дIаязаде. Из мугI ший долаш тайпара дита</pre>",
-       "tag-filter": "[[Special:Tags|белгалонай]] Ð»Ñ\83Ñ\82Ñ\82аÑ\80г:",
+       "tag-filter": "[[Special:Tags|Ð\91елгалонай]] Ñ\84илÑ\8cÑ\82Ñ\80:",
        "tag-filter-submit": "ЦIенъе",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|1=Белгало|Белгалонаш}}]]: $2)",
        "tags-title": "Йоазонаш",
        "tags-hitcount-header": "Белгалаяь хувцамаш",
        "tags-edit": "хувца",
        "tags-hitcount": "$1 {{PLURAL:$1|1=хувцам|хувцамаш}}",
-       "compare-page1": "1. ОагIув",
-       "compare-page2": "2. ОагIув",
+       "tags-create-submit": "Хьакхолла",
+       "compare-page1": "ЦхьоаллагIа оагIув",
+       "compare-page2": "ШоллагIа оагӀув",
        "compare-rev1": "1. Доржам",
        "compare-rev2": "2. Доржам",
        "htmlform-submit": "ДIадахьийта",
        "htmlform-reset": "Хувцамаш юхадаккха",
        "htmlform-selectorother-other": "Кхыдола",
        "logentry-delete-delete": "$1 {{GENDER:$2|дIаяккхай}} оагIув $3",
-       "logentry-newusers-create": "{{GENDER:$2|Доакъашхочо кхеллай}} учёта яздар $1",
+       "logentry-move-move": "$1 {{GENDER:$2|цӀи хийцай}} $3 → $4",
+       "logentry-newusers-create": "{{GENDER:$2|Доакъашхочо хьакхеллад}} дагара йоазув $1",
+       "logentry-upload-upload": "$1 {{GENDER:$2|чуяьккхай}} $3",
        "rightsnone": "(а)",
        "revdelete-summary": "хувцамий лоацам",
        "searchsuggest-search": "Лахар",
+       "pagelang-name": "ОагIув",
        "special-characters-group-latin": "Лаьтмий",
        "special-characters-group-greek": "Джелтий",
        "special-characters-group-cyrillic": "Цырилиций",
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..de1e26b 100644 (file)
@@ -96,7 +96,9 @@
                        "V6rg",
                        "JackLantern",
                        "Mpiva",
-                       "Urielejh"
+                       "Urielejh",
+                       "Matma Rex",
+                       "Matteocng"
                ]
        },
        "tog-underline": "Sottolinea i collegamenti:",
        "password-change-forbidden": "Non è possibile modificare le password su questo wiki.",
        "externaldberror": "Si è verificato un errore con il server di autenticazione esterno, oppure non si dispone delle autorizzazioni necessarie per aggiornare il proprio accesso esterno.",
        "login": "Entra",
+       "login-security": "Verifica la tua identità",
        "nav-login-createaccount": "Entra / registrati",
        "userlogin": "Entra / registrati",
        "userloginnocreate": "Entra",
        "userlogin-resetpassword-link": "Hai dimenticato la password?",
        "userlogin-helplink2": "Aiuto con l'accesso",
        "userlogin-loggedin": "Sei già connesso come {{GENDER:$1|$1}}.\nUsa il modulo sottostante per accedere come altro utente.",
+       "userlogin-reauth": "Devi accedere di nuovo per verificare che sei {{GENDER:$1|$1}}.",
        "userlogin-createanother": "Crea un'altra utenza",
        "createacct-emailrequired": "Indirizzo email",
        "createacct-emailoptional": "Indirizzo di posta elettronica (opzionale)",
        "createacct-email-ph": "Inserisci il tuo indirizzo email",
        "createacct-another-email-ph": "Inserisci l'indirizzo di posta elettronica",
        "createaccountmail": "Usa una password casuale temporanea e inviala all'indirizzo di posta elettronica specificato",
+       "createaccountmail-help": "Può essere utilizzato per creare un'utenza per un'altra persona senza doverne conoscere la password.",
        "createacct-realname": "Nome reale (opzionale)",
        "createaccountreason": "Motivo:",
        "createacct-reason": "Motivo",
        "createacct-reason-ph": "Perché stai creando un'altra utenza",
+       "createacct-reason-help": "Messaggio visualizzato nel registro della creazione dell'utenza",
        "createacct-submit": "Crea la tua utenza",
        "createacct-another-submit": "Crea utenza",
+       "createacct-continue-submit": "Continua la creazione dell'utenza",
+       "createacct-another-continue-submit": "Continua la creazione dell'utenza",
        "createacct-benefit-heading": "{{SITENAME}} cresce grazie a persone come te.",
        "createacct-benefit-body1": "{{PLURAL:$1|modifica|modifiche}}",
        "createacct-benefit-body2": "{{PLURAL:$1|pagina|pagine}}",
        "nocookiesnew": "La registrazione è stata completata, ma non è stato possibile accedere a {{SITENAME}} perché i cookie sono disattivati. Riprovare l'accesso con il nome utente e la password appena creati dopo aver attivato i cookie nel proprio browser.",
        "nocookieslogin": "L'accesso a {{SITENAME}} richiede l'uso dei cookie, che risultano disattivati. Riprovare l'accesso dopo aver attivato i cookie nel proprio browser.",
        "nocookiesfornew": "L'account utente non è stato creato, poiché non abbiamo potuto confermare la sua fonte.\nAssicurati di avere attivato i cookie, ricarica questa pagina e riprova.",
+       "createacct-loginerror": "L'utenza è stata creata correttamente, ma non è stato possibile farti accedere in modo automatico. Procedi con l'[[Special:UserLogin|accesso manuale]].",
        "noname": "Il nome utente indicato non è valido.",
        "loginsuccesstitle": "Accesso effettuato",
        "loginsuccess": "'''Sei stato connesso al server di {{SITENAME}} con il nome utente di \"$1\".'''",
        "createacct-another-realname-tip": "L'indicazione del proprio nome vero è opzionale; se si sceglie di inserirlo, verrà utilizzato per attribuire la paternità dei contenuti inviati.",
        "pt-login": "Entra",
        "pt-login-button": "Entra",
+       "pt-login-continue-button": "Continua l'accesso",
        "pt-createaccount": "Registrati",
        "pt-userlogout": "esci",
        "php-mail-error-unknown": "Errore sconosciuto nella funzione PHP mail()",
        "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",
        "passwordreset-emailsentusername": "Se c'è un indirizzo di posta elettronica associato con questo nome utente, allora verrà inviata una email per reimpostare la password.",
        "passwordreset-emailsent-capture": "È stata inviata una email di reimpostazione della password, il contenuto è riportato di seguito.",
        "passwordreset-emailerror-capture": "È stata generata una email di reimpostazione della password, riportata di seguito. L'invio {{GENDER:$2|all'utente}} non è riuscito: $1",
+       "passwordreset-emailsent-capture2": "L'email di reimpostazione della password {{PLURAL:$1|è stata inviata|sono state inviate}}. {{PLURAL:$1|Il nome|L'elenco di nomi}} utente e password è mostrato di seguito.",
+       "passwordreset-emailerror-capture2": "Invio di email {{GENDER:$2|all'utente}} non riuscito: $1. {{PLURAL:$3|Il nome|L'elenco di nomi}} utente e password è mostrato di seguito.",
+       "passwordreset-nocaller": "Un chiamante deve essere fornito",
+       "passwordreset-nosuchcaller": "Chiamante non esiste: $1",
+       "passwordreset-ignored": "La reimpostazione della password non è stata gestita. Forse nessun provider è configurato?",
+       "passwordreset-invalideamil": "Indirizzo di posta elettronica non valido",
+       "passwordreset-nodata": "Non è stato fornito né un nome utente né un indirizzo di posta elettronica",
        "changeemail": "Modifica o rimuovi indirizzo di posta elettronica",
        "changeemail-header": "Completa questo modulo per cambiare il tuo indirizzo email. Se vuoi rimuovere l'associazione di qualsiasi indirizzo email dalla tua utenza, lascia il nuovo indirizzo email vuoto quando invii il modulo.",
        "changeemail-passwordrequired": "Sarà necessario inserire la password per confermare la modifica.",
        "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}}.",
        "trackingcategories-msg": "Categoria di monitoraggio",
        "trackingcategories-name": "Nome del messaggio",
        "trackingcategories-desc": "Criteri per l'inclusione nella categoria",
+       "restricted-displaytitle-ignored": "Pagine con titoli da visualizzare ignorati.",
+       "restricted-displaytitle-ignored-desc": "La pagina ha un <code><nowiki>{{DISPLAYTITLE}}</nowiki></code> ignorato perché non è equivalente all'effettivo titolo della pagina.",
        "noindex-category-desc": "La pagina non è indicizzata dai robot perché contiene la parola magica <code><nowiki>__NOINDEX__</nowiki></code> e si trova in un namespace dove tale flag è consentito.",
        "index-category-desc": "La pagina contiene <code><nowiki>__INDEX__</nowiki></code> (e si trova in un namespace dove tale flag è consentito) e quindi è indicizzata dai robot, anche se normalmente non lo sarebbe.",
        "post-expand-template-inclusion-category-desc": "La dimensione della pagina sarà più grande di <code>$wgMaxArticleSize</code> dopo aver espanso tutti i template, e dunque alcuni non si espanderanno.",
        "rollbacklinkcount": "rollback di {{PLURAL:$1|una modifica|$1 modifiche}}",
        "rollbacklinkcount-morethan": "rollback di più di {{PLURAL:$1|una modifica|$1 modifiche}}",
        "rollbackfailed": "Rollback fallito",
+       "rollback-missingparam": "Parametri obbligatori mancanti nella richiesta.",
        "cantrollback": "Impossibile annullare le modifiche; l'utente che le ha effettuate è l'unico ad aver contribuito alla pagina.",
        "alreadyrolled": "Non è possibile annullare le modifiche apportate alla pagina [[:$1]] da parte di [[User:$2|$2]] ([[User talk:$2|discussione]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]); un altro utente ha già modificato la pagina oppure ha effettuato il rollback.\n\nLa modifica più recente alla pagina è stata apportata da [[User:$3|$3]] ([[User talk:$3|discussione]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "editcomment": "L'oggetto della modifica era: <em>$1</em>.",
        "revertpage": "Annullate le modifiche di [[Special:Contributions/$2|$2]] ([[User talk:$2|discussione]]), riportata alla versione precedente di [[User:$1|$1]]",
        "revertpage-nouser": "Annullate le modifiche di un utente nascosto, riportata alla versione precedente di {{GENDER:$1|[[User:$1|$1]]}}",
        "rollback-success": "Annullate le modifiche di $1; pagina riportata all'ultima versione di $2.",
+       "rollback-success-notify": "Annullate le modifiche di $1;\npagina riportata all'ultima revisione di $2. [$3 Mostra le modifiche]",
        "sessionfailure-title": "Sessione fallita",
        "sessionfailure": "Si è verificato un problema nella sessione che identifica l'accesso; il sistema non ha eseguito il comando impartito per precauzione. Tornare alla pagina precedente con il tasto 'Indietro' del proprio browser, ricaricare la pagina e riprovare.",
        "changecontentmodel": "Modifica il modello di contenuto di una pagina",
        "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",
        "confirm-watch-top": "Aggiungi questa pagina alla tua lista degli osservati speciali?",
        "confirm-unwatch-button": "OK",
        "confirm-unwatch-top": "Elimina questa pagina dalla tua lista degli osservati speciali?",
+       "confirm-rollback-button": "OK",
+       "confirm-rollback-top": "Ripristinare le modifiche a questa pagina?",
        "percent": "$1&#160;%",
        "quotation-marks": "«$1»",
        "imgmultipageprev": "← pagina precedente",
        "timezone-local": "Locale",
        "duplicate-defaultsort": "Attenzione: la chiave di ordinamento predefinita \"$2\" sostituisce la precedente \"$1\".",
        "duplicate-displaytitle": "<strong>Attenzione:</strong> il titolo visualizzato \"$2\" sostituisce il precedente titolo \"$1\".",
+       "restricted-displaytitle": "<strong>Attenzione:</strong> Il titolo visualizzato \"$1\" è stato ignorato poiché non equivalente al titolo attuale della pagina.",
        "invalid-indicator-name": "<strong>Errore:</strong> attributo <code>name</code> degli indicatori dello stato della pagina non può essere vuoto.",
        "version": "Versione",
        "version-extensions": "Estensioni installate",
        "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-authn-not-in-progress": "L'autenticazione non è in corso o i dati della sessione sono andati persi. Si prega di ricominciare dall'inizio.",
+       "authmanager-authn-no-primary": "Le credenziali fornite non possono essere autenticate.",
+       "authmanager-authn-no-local-user": "Le credenziali fornite non sono associate a nessun utente di questo wiki.",
+       "authmanager-authn-no-local-user-link": "Le credenziali fornite sono valide ma non sono associate a nessun utente di questa wiki. Accedi in un modo diverso o crea un nuovo utente, e avrai un'opzione per collegare le tue credenziali precedenti a quell'utenza.",
+       "authmanager-authn-autocreate-failed": "Creazione automatica di un'utenza locale fallita: $1",
+       "authmanager-change-not-supported": "Le credenziali fornite non possono essere modificate, dato che non verrebbero usate da nulla.",
+       "authmanager-create-disabled": "La creazione di utenze è disabilitata.",
+       "authmanager-create-from-login": "Per creare la tua utenza, completa i campi qui sotto.",
+       "authmanager-create-not-in-progress": "La creazione di un'utenza non è in corso o i dati della sessione sono andati persi. Si prega di ricominciare nuovamente dall'inizio.",
+       "authmanager-create-no-primary": "Le credenziali fornite non possono essere utilizzate per la creazione dell'utenza.",
+       "authmanager-link-no-primary": "Le credenziali fornite non possono essere utilizzate per il collegamento dell'utenza.",
+       "authmanager-link-not-in-progress": "Il collegamento dell'utenza non è in corso o i dati della sessione sono andati persi. Si prega di ricominciare dall'inizio.",
+       "authmanager-authplugin-setpass-failed-title": "Modifica della password fallita",
+       "authmanager-authplugin-setpass-failed-message": "Il plugin di autenticazione ha impedito la modifica della password.",
+       "authmanager-authplugin-create-fail": "Il plugin di autenticazione ha impedito la creazione dell'utenza.",
+       "authmanager-authplugin-setpass-denied": "Il plugin di autenticazione non consente di cambiare le password.",
+       "authmanager-authplugin-setpass-bad-domain": "Dominio non valido.",
+       "authmanager-autocreate-noperm": "La creazione automatica dell'utenza non è permessa.",
+       "authmanager-autocreate-exception": "La creazione automatica di utenze è temporaneamente disabilitata a causa di errori precedenti.",
+       "authmanager-userdoesnotexist": "L'utenza \"$1\" non è registrata.",
+       "authmanager-userlogin-remembermypassword-help": "Se la password deve essere ricordata più a lungo rispetto alla durata della sessione.",
+       "authmanager-username-help": "Nome utente per l'autenticazione.",
+       "authmanager-password-help": "Password per l'autenticazione.",
+       "authmanager-domain-help": "Dominio per l'autenticazione esterna.",
+       "authmanager-retype-help": "Conferma nuovamente la password.",
+       "authmanager-email-label": "Email",
+       "authmanager-email-help": "Indirizzo email",
+       "authmanager-realname-label": "Nome reale",
+       "authmanager-realname-help": "Nome reale dell'utente",
+       "authmanager-provider-password": "Autenticazione basata su password",
+       "authmanager-provider-password-domain": "Autenticazione con password o basata su dominio",
+       "authmanager-provider-temporarypassword": "Password temporanea",
+       "authprovider-confirmlink-message": "Basandosi sui recenti tentativi di accesso, le seguenti utenze possono essere collegate al tuo account wiki. Collegarle ti consente di effettuare l'accesso tramite di esse. Si prega di selezionare quelle che devono essere collegate.",
+       "authprovider-confirmlink-request-label": "Utenze che dovrebbero essere collegate",
+       "authprovider-confirmlink-success-line": "$1: collegato correttamente.",
+       "authprovider-confirmlink-failed": "Il collegamento dell'utenza non è pienamente riuscito: $1",
+       "authprovider-confirmlink-ok-help": "Continua dopo la visualizzazione di messaggi di errore di collegamento.",
+       "authprovider-resetpass-skip-label": "Salta",
+       "authprovider-resetpass-skip-help": "Salta reimpostazione della password.",
+       "authform-nosession-login": "L'autenticazione ha avuto successo, ma il tuo browser non è in grado di \"ricordare\" che ti sei collegato.\n\n$1",
+       "authform-nosession-signup": "L'utenza è stata creata, ma il tuo browser non è in grado di \"ricordare\" che ti sei collegato.\n\n$1",
+       "authform-newtoken": "Token mancante. $1",
+       "authform-notoken": "Token mancante",
+       "authform-wrongtoken": "Token errato",
+       "specialpage-securitylevel-not-allowed-title": "Non consentito",
+       "specialpage-securitylevel-not-allowed": "Siamo spiacenti, non sei autorizzato ad utilizzare questa pagina perché la tua identità non può essere verificata.",
+       "authpage-cannot-login": "Impossibile avviare l'accesso.",
+       "authpage-cannot-login-continue": "Impossibile continuare l'accesso. La tua sessione è probabilmente scaduta.",
+       "authpage-cannot-create": "Impossibile iniziare la creazione dell'utenza.",
+       "authpage-cannot-create-continue": "Impossibile continuare la creazione dell'utenza. La tua sessione è probabilmente scaduta.",
+       "authpage-cannot-link": "Impossibile avviare il collegamento dell'utenza.",
+       "authpage-cannot-link-continue": "Impossibile continuare il collegamento dell'utenza. La tua sessione è probabilmente scaduta.",
+       "cannotauth-not-allowed-title": "Permesso negato",
+       "cannotauth-not-allowed": "Non sei autorizzato a utilizzare questa pagina",
+       "changecredentials": "Modifica credenziali",
+       "changecredentials-submit": "Modifica credenziali",
+       "changecredentials-invalidsubpage": "$1 non è una tipologia di credenziale valida.",
+       "changecredentials-success": "Le tue credenziali sono state modificate.",
+       "removecredentials": "Rimuovi credenziali",
+       "removecredentials-submit": "Rimuovi credenziali",
+       "removecredentials-invalidsubpage": "$1 non è una tipologia di credenziale valida.",
+       "removecredentials-success": "Le tue credenziali sono state eliminate.",
+       "credentialsform-provider": "Tipo di credenziali:",
+       "credentialsform-account": "Nome utenza:",
+       "cannotlink-no-provider-title": "Non ci sono utenze collegabili",
+       "cannotlink-no-provider": "Non ci sono utenze collegabili.",
+       "linkaccounts": "Collega utenze",
+       "linkaccounts-success-text": "L'utenza è stata collegata.",
+       "linkaccounts-submit": "Collega utenze",
+       "unlinkaccounts": "Scollega utenze",
+       "unlinkaccounts-success": "L'utenza è stata scollegata."
 }
index 4f85d2c..a240fd2 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": "編集",
        "yourdiff": "差分",
        "copyrightwarning": "{{SITENAME}}への投稿はすべて、$2 (詳細は$1を参照)のもとで公開したと見なされることにご注意ください。\n自分が書いたものが他の人に容赦なく編集され、自由に配布されるのを望まない場合は、ここに投稿しないでください。<br />\nまた、投稿するのは、自分で書いたものか、パブリック ドメインまたはそれに類するフリーな資料からの複製であることを約束してください。\n<strong>著作権保護されている作品は、許諾なしに投稿しないでください!</strong>",
        "copyrightwarning2": "{{SITENAME}}への投稿はすべて、他の投稿者によって編集、変更、除去される場合があります。\n自分が書いたものが他の人に容赦なく編集されるのを望まない場合は、ここに投稿しないでください。<br />\nまた、投稿するのは、自分で書いたものか、パブリック ドメインまたはそれに類するフリーな資料からの複製であることを約束してください(詳細は$1を参照)。\n<strong>著作権保護されている作品は、許諾なしに投稿しないでください!</strong>",
-       "editpage-cannot-use-custom-model": "ã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\81®ã\82³ã\83³ã\83\86ã\83³ã\83\88ã\83»ã\83¢ã\83\87ã\83«(content model)ã\82\92å¤\89æ\9b´ã\81\99ã\82\8bã\81\93ã\81¨ã\81¯ã\80\81できません。",
+       "editpage-cannot-use-custom-model": "ã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\81®ã\82³ã\83³ã\83\86ã\83³ã\83\84ã\83»ã\83¢ã\83\87ã\83«ã\81¯å¤\89æ\9b´できません。",
        "longpageerror": "<strong>エラー: 投稿された文章は {{PLURAL:$1|$1 KB}} の長さがあります。これは投稿できる最大の長さ {{PLURAL:$2|$2 KB}} を超えています。</strong>\nこの編集内容は保存できません。",
        "readonlywarning": "<strong>警告: データベースがメンテナンスのためロックされており、現在は編集内容を保存できません。</strong>\n必要であれば文章をコピー&amp;ペーストしてテキストファイルとして保存し、後ほど保存をやり直してください。\n\nデータベースをロックしたシステム管理者による説明は以下の通りです: $1",
        "protectedpagewarning": "<strong>警告: このページは保護されているため、管理者権限を持つ利用者のみが編集できます。</strong>\n参考として以下に最後の記録を表示します:",
        "right-override-export-depth": "リンク先ページを5階層まで含めて書き出す",
        "right-sendemail": "他の利用者にメールを送信",
        "right-passwordreset": "パスワード再設定メールを閲覧",
-       "right-managechangetags": "[[Special:Tags|タグ]]のデータベースにおける作成および削除",
+       "right-managechangetags": "[[Special:Tags|タグ]]の作成、有効化および無効化",
        "right-applychangetags": "自分の編集に[[Special:Tags|タグ]]を適用する",
        "right-changetags": "個々の版と記録項目の任意の[[Special:Tags|タグ]]の追加と削除",
        "grant-group-email": "メールの送信",
        "action-viewmyprivateinfo": "自分の非公開情報の閲覧",
        "action-editmyprivateinfo": "自分の非公開情報の編集",
        "action-editcontentmodel": "ページのコンテンツモデルを編集",
-       "action-managechangetags": "タグのデータベースにおける作成および削除",
+       "action-managechangetags": "タグの作成、有効化および無効化",
        "action-applychangetags": "自分の編集にタグを適用する",
        "action-changetags": "個々の版および記録項目への任意のタグの追加と除去",
        "nchanges": "$1 {{PLURAL:$1|回の変更}}",
        "revertpage": "[[Special:Contributions/$2|$2]] ([[User talk:$2|トーク]]) による編集を [[User:$1|$1]] による直前の版へ差し戻しました",
        "revertpage-nouser": "非表示の利用者による編集を {{GENDER:$1|[[User:$1|$1]]}} による直前の版へ差し戻しました",
        "rollback-success": "$1による編集を差し戻しました。\n$2による直前の版へ変更されました。",
+       "rollback-success-notify": "$1による編集を差し戻しました。\n$2による直前の版へ変更されました。[$3 変更を表示]",
        "sessionfailure-title": "セッションの失敗",
        "sessionfailure": "ログインのセッションに問題が発生しました。\nセッション乗っ取りを防ぐため、操作を取り消しました。\n前のページへ戻って再度読み込んだ後に、もう一度試してください。",
        "changecontentmodel": "ページのコンテンツ・モデルの変更",
        "changecontentmodel-success-title": "コンテンツ・モデルは変更されました",
        "changecontentmodel-success-text": "[[:$1]]のコンテンツ・タイプは変更されました。",
        "changecontentmodel-cannot-convert": "[[:$1]]上のコンテントは$2の型には変換できません。",
-       "changecontentmodel-nodirectediting": "$1 ã\82³ã\83³ã\83\86ã\83³ã\83\88・モデルは、ダイレクト編集をサポートしていません。",
-       "log-name-contentmodel": "ã\82³ã\83³ã\83\86ã\83³ã\83\88・モデル変更記録",
+       "changecontentmodel-nodirectediting": "$1 ã\82³ã\83³ã\83\86ã\83³ã\83\84・モデルは、ダイレクト編集をサポートしていません。",
+       "log-name-contentmodel": "ã\82³ã\83³ã\83\86ã\83³ã\83\84・モデル変更記録",
        "log-description-contentmodel": "ページのコンテンツ・モデルに関連する出来事",
        "logentry-contentmodel-change": "$1 がページ $3 のコンテンツ・モデルを \"$4\" から \"$5\" に{{GENDER:$2|変更しました}}",
        "logentry-contentmodel-change-revertlink": "差し戻し",
        "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",
        "lockdbsuccesstext": "データベースをロックしました。<br />\nメンテナンスが完了したら、忘れずに[[Special:UnlockDB|ロックを除去]]してください。",
        "unlockdbsuccesstext": "データベースのロックを解除しました。",
        "lockfilenotwritable": "データベースのロック ファイルが書き込み禁止です。\nデータベースをロックまたはロック解除するには、ウェブ サーバーがこれに書き込める必要があります。",
+       "databaselocked": "データベースは既にロックされています。",
        "databasenotlocked": "データベースはロックされていません。",
        "lockedbyandtime": "($1 が $2 $3 から)",
        "move-page": "「$1」の移動",
        "sessionprovider-generic": "$1 セッション",
        "randomrootpage": "おまかせルートページ",
        "log-action-filter-block": "ブロックの種類",
+       "log-action-filter-delete": "削除の種類:",
+       "log-action-filter-import": "取り込みの種類:",
+       "log-action-filter-managetags": "タグ管理の種類:",
        "log-action-filter-move": "移動の種類:",
        "log-action-filter-newusers": "アカウント作成の種類:",
+       "log-action-filter-patrol": "巡回の種類:",
        "log-action-filter-protect": "保護の種類:",
        "log-action-filter-upload": "アップロードの種類",
        "log-action-filter-all": "すべて",
        "log-action-filter-block-unblock": "ブロック解除",
        "log-action-filter-delete-delete": "ページの削除",
        "log-action-filter-delete-restore": "ページの復帰",
+       "log-action-filter-delete-event": "記録の削除",
+       "log-action-filter-delete-revision": "版指定削除",
+       "log-action-filter-import-interwiki": "ウィキ間の取り込み",
+       "log-action-filter-import-upload": "XML アップロードによる取り込み",
+       "log-action-filter-managetags-create": "タグの作成",
+       "log-action-filter-managetags-delete": "タグの削除",
+       "log-action-filter-managetags-activate": "タグの有効化",
+       "log-action-filter-managetags-deactivate": "タグの無効化",
        "log-action-filter-move-move": "転送を上書きしない移動",
        "log-action-filter-move-move_redir": "転送を上書きする移動",
        "log-action-filter-newusers-create": "匿名利用者による作成",
        "log-action-filter-newusers-create2": "登録利用者による作成",
        "log-action-filter-newusers-autocreate": "自動的な作成",
+       "log-action-filter-patrol-patrol": "手動巡回",
+       "log-action-filter-patrol-autopatrol": "自動巡回",
        "log-action-filter-protect-protect": "保護",
-       "log-action-filter-protect-modify": "保護の設定変更",
+       "log-action-filter-protect-modify": "保護設定の変更",
        "log-action-filter-protect-unprotect": "保護解除",
+       "log-action-filter-protect-move_prot": "保護設定の移動",
+       "log-action-filter-suppress-event": "記録の秘匿",
+       "log-action-filter-suppress-revision": "版の秘匿",
+       "log-action-filter-suppress-delete": "ページの秘匿",
        "log-action-filter-upload-upload": "新規アップロード",
-       "log-action-filter-upload-overwrite": "再アップロード"
+       "log-action-filter-upload-overwrite": "再アップロード",
+       "authmanager-authn-autocreate-failed": "ローカルアカウントの自動作成が失敗しました: $1",
+       "authmanager-userdoesnotexist": "利用者アカウント「$1」は登録されていません。"
 }
index 34241c6..ab19715 100644 (file)
@@ -8,7 +8,8 @@
                        "아라",
                        "Chabi1",
                        "Katxis",
-                       "Macofe"
+                       "Macofe",
+                       "Dcljr"
                ]
        },
        "tog-underline": "Lingk andalainin",
        "watchlisttools-view": "Vyuu rilivant chienjdem",
        "watchlisttools-edit": "Vyuu ahn edit wachlis",
        "watchlisttools-raw": "Edit raa wachlis",
-       "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1| talk]])‎",
+       "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|diskoshan]])‎",
        "specialpages": "Peshal piej",
        "tag-filter": "[[Special:Tags|Tag]] filta:",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Tag|Tags}}]]: $2)",
index a8fd122..57d4099 100644 (file)
@@ -9,7 +9,8 @@
                        "Midnight Gambler",
                        "아라",
                        "Jyllanj",
-                       "Ghiutun"
+                       "Ghiutun",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "Unjestreg henwisnenge:",
        "morenotlisted": "Listen ä ett komplett.",
        "mypage": "Siid",
        "mytalk": "Diskusjon",
-       "anontalk": "Diskusjonssiid for denn IP-adress",
+       "anontalk": "Diskusjonssiid",
        "navigation": "Navigasjon",
        "and": "&#32;å",
        "qbfind": "Syeg",
        "viewsource-title": "Sie tjeljkoden te $1",
        "actionthrottled": "Begrænsneng å hånjleng",
        "viewsourcetext": "Du ken dog se og åfskreve'n keldekode til æ side:",
+       "exception-nologin": "Ikke loggen på",
        "welcomeuser": "Wælkomen, $1!",
        "welcomecreation-msg": "Det konto ä bløwen opretten.\nGlæmm ett å ønda din [[Special:Preferences|instellenge for {{SITENAME}}]].",
        "yourname": "Det brugenaun:",
        "createacct-emailoptional": "E-mailadress (walgfri)",
        "createacct-email-ph": "Intast dej e-mailadress",
        "createacct-another-email-ph": "Intast e-mailadress",
+       "createaccountreason": "Begrunjels:",
        "createacct-submit": "Oprett det konto",
+       "createacct-another-submit": "Oprett konto",
        "createacct-benefit-heading": "{{SITENAME}} laws å menske som du.",
        "createacct-benefit-body1": "{{PLURAL:$1|redigiireng|redigiirenge}}",
        "createacct-benefit-body2": "{{PLURAL:$1|siid|side}}",
        "pt-createaccount": "Oprett konto",
        "pt-userlogout": "Logg å",
        "retypenew": "Djentast ny adgångskode",
+       "botpasswords-label-delete": "Slett",
        "resetpass-submit-cancel": "Åbryd",
        "passwordreset": "Nullstell adgångskode",
+       "passwordreset-username": "Brugenaun:",
        "bold_sample": "Fied tekst",
        "bold_tip": "Fied tekst",
        "italic_sample": "Kursiw tekst",
        "history-feed-title": "Versjonshistori",
        "history-feed-item-nocomment": "$1 mä $2",
        "rev-delundel": "ønda sijtbarhed",
+       "revdelete-show-file-submit": "Ja",
+       "revdelete-log": "Begrunjels:",
        "history-title": "$1: Versjonshistorik",
        "difference-title": "Forskell mellem versjone å \"$1\"",
        "lineno": "Linje $1:",
        "badsig": "Syntaksi i signaturen ä udjylji; kontrolliir wenlist den brugtje HTML.",
        "badsiglength": "Din signatur ä for lång. Den ma hyest inholj $1 {{PLURAL:$1|tejn}}.",
        "yourgender": "Hwant forträkke du å blyw beskriiwen?",
+       "email": "E-mail",
        "prefs-help-realname": "Åndjiels å rijti naun ä walgfritj.\nHwes du wælge å oplys det naun, wil dä blyw brugtj te å tilskriiw dej det arbejt.",
        "prefs-editor": "Redigiirengsprogramme",
        "prefs-preview": "Forhånjswisneng",
        "rcshowhideminor-show": "Wis",
        "rcshowhideminor-hide": "Sjul",
        "rcshowhidebots": "$1 robotte",
-       "rcshowhidebots-show": "Sjul",
+       "rcshowhidebots-show": "Wis",
        "rcshowhidebots-hide": "Sjul",
        "rcshowhideliu": "$1 registriirtje bruga",
        "rcshowhideliu-show": "Wis",
        "rcshowhidemine": "$1 ejne bidraw",
        "rcshowhidemine-show": "Wis",
        "rcshowhidemine-hide": "Sjul",
+       "rcshowhidecategorization-show": "Wis",
+       "rcshowhidecategorization-hide": "Sjul",
        "rclinks": "Wis siensti $1 øndrenge i di sisti $2 daw<br />$3",
        "diff": "forskell",
        "hist": "historik",
index 874055f..912c679 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",
        "moredotdotdot": "Liyané...",
        "morenotlisted": "Pratélan iki ora jangkep.",
        "mypage": "Kaca",
-       "mytalk": "Geguneman",
-       "anontalk": "Geguneman",
+       "mytalk": "Parembugan",
+       "anontalk": "Parembugan",
        "navigation": "Napigasi",
        "and": "&#32;lan",
        "qbfind": "Golèk",
        "unprotectthispage": "Owah rereksan kaca iki",
        "newpage": "Kaca anyar",
        "talkpage": "Rembug kaca iki",
-       "talkpagelinktext": "gunem",
+       "talkpagelinktext": "rembugan",
        "specialpage": "Kaca mirunggan",
        "personaltools": "Piranti priangga",
        "articlepage": "Deleng kaca isi",
-       "talk": "Rerembugan",
+       "talk": "Parembugan",
        "views": "Praèn",
        "toolbox": "Piranti",
        "userpage": "Deleng kaca panganggo",
        "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]]",
        "undo-success": "Suntingan iki bisa dibatalaké. Tulung priksa prabandhingan ing ngisor iki kanggo mesthèkaké yèn prakara iki pancèn sing bener panjenengan pèngin lakoni, banjur simpenen pangowahan iku kanggo ngrampungaké pambatalan suntingan.",
        "undo-failure": "Suntingan iki ora bisa dibatalakén amerga ana konflik panyuntingan antara.",
        "undo-norev": "Suntingan iki ora bisa dibatalaké amerga ora ana utawa wis dibusak.",
-       "undo-summary": "Balèkaké owahan $1 déning [[Special:Contributions/$2|$2]] ([[User talk:$2|gunem]])",
+       "undo-summary": "Balèkaké owahan $1 déning [[Special:Contributions/$2|$2]] ([[User talk:$2|rembugan]])",
        "undo-summary-username-hidden": "Batalna revisi $1 saking panganggo kang didhelikake",
        "cantcreateaccounttitle": "Akun ora bisa digawé",
        "cantcreateaccount-text": "Saka alamat IP iki ('''$1''') ora diparengaké nggawé akun utawa rékening. Sing mblokir utawa ora marengaké iku [[User:$3|$3]].\n\nAlesané miturut $3 yaiku ''$2''",
        "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:",
        "grouppage-suppress": "{{ns:project}}:Oversight",
        "right-read": "Maca kaca-kaca",
        "right-edit": "Besut kaca",
-       "right-createpage": "Gawé kaca (sing dudu kaca rerembugan)",
-       "right-createtalk": "Gawé kaca rerembugan",
+       "right-createpage": "Gawé kaca (sing dudu kaca parembugan)",
+       "right-createtalk": "Gawé kaca parembugan",
        "right-createaccount": "Nggawé rékening (akun) panganggo anyar",
        "right-minoredit": "Tandhani minangka besutan cilik",
        "right-move": "Ngalih kaca",
        "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\".",
        "cantrollback": "Ora bisa mbalèkaké suntingan; panganggo pungkasan iku siji-sijiné penulis artikel iki.",
        "alreadyrolled": "Ora bisa mbalèkaké suntingan pungkasan [[:$1]] déning [[User:$2|$2]] ([[User talk:$2|Wicara]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]); wong liya wis nyunting utawa mbalèkaké kaca artikel iku.\n\nSuntingan pungkasan dilakoni déning [[User:$3|$3]] ([[User talk:$3|Wicara]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "editcomment": "Ringkesan suntingan yaiku: <em>$1</em>.",
-       "revertpage": "Besutan sing dibalèkaké [[Special:Contributions/$2|$2]] ([[User talk:$2|gunem]]) bab owahan pungkasan déning [[User:$1|$1]]",
+       "revertpage": "Besutan sing dibalèkaké [[Special:Contributions/$2|$2]] ([[User talk:$2|rembugan]]) bab owahan pungkasan déning [[User:$1|$1]]",
        "revertpage-nouser": "Suntingan déning panganggo sing didhelikake, dibalèkaké nèng benahan pungkasan déning [[User:$1|$1]]",
        "rollback-success": "Suntingan dibalèkaké déning $1;\ndiowahi bali menyang vèrsi pungkasan déning $2.",
        "sessionfailure-title": "Sèsi gagal",
        "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",
        "move-page-legend": "Mindhah kaca",
        "movepagetext": "Formulir ing ngisor iki bakal ngowahi jeneng sawijining kaca, mindhah kabèh sajarahé menyang kaca sing anyar. Irah-irahan utawa judhul sing lawas bakal dadi kaca pangalihan menyang irah-irahan sing anyar. Pranala menyang kaca sing lawas ora bakal diowahi; dadi pastèkna dhisik mriksa pangalihan [[Special:DoubleRedirects|dobel]] utawa [[Special:BrokenRedirects|pangalihan sing rusak]] sawisé pamindhahan. Panjenengan sing tanggung jawab mastèkaké menawa kabèh pranala-pranala tetep nyambung ing kaca panujon kaya samesthiné.\n\nGatèkna yèn kaca iki '''ora''' bakal dipindhah yèn wis ana kaca liyané sing nganggo irah-irahan sing anyar, kejaba kaca iku kosong utawa ora nduwé sajarah panyuntingan. Dadi tegesé panjenengan bisa ngowahi jeneng kaca iku manèh kaya sedyakala menawa panjenengan luput, lan panjenengan ora bisa nimpani kaca sing wis ana.\n\n'''PÈNGET!'''\nPerkara iki bisa ngakibataké owah-owahan sing drastis lan ora kaduga kanggo kaca-kaca sing populèr;\npastekaké dhisik panjenengan ngerti konsekwènsi saka panggayuh panjenengan sadurungé dibanjuraké.",
        "movepagetext-noredirectfixer": "Formulir di bawah ini digunakan untuk mengubah nama suatu halaman dan memindahkan semua data sejarah ke nama baru.\nJudul yang lama akan menjadi halaman peralihan menuju judul yang baru.\nPastikan untuk memeriksa pengalihan [[Special:DoubleRedirects|ganda]] atau [[Special:BrokenRedirects|rusak]].\nAnda bertanggung jawab untuk memastikan bahwa pranala terus menyambung ke halaman yang seharusnya.\n\nPerhatikan bahwa halaman '''tidak''' akan dipindah apabila telah ada halaman yang menggunakan judul yang baru, kecuali bila halaman tersebut kosong atau merupakan halaman peralihan dan tidak mempunyai sejarah penyuntingan.\nIni berarti Anda dapat mengubah nama halaman kembali seperti semula apabila Anda membuat kesalahan, dan Anda tidak dapat menimpa halaman yang telah ada.\n\n'''Peringatan:'''\nHal ini dapat mengakibatkan perubahan yang tak terduga dan drastis bagi halaman yang populer;\nPastikan Anda mengerti konsekuensi dari perbuatan ini sebelum melanjutkan.",
-       "movepagetalktext": "Menawa sampéyan nyénthang kothak iki, kaca geguneman sing magepokan bakal otomatis dilih nyang sesirah anyar, kajaba kaca gegunemané wis ana isiné sadurungé.\n\nYèn mangkéné, sampéyan kudu ngalih utawa nggabung kaca-kaca iku kanthi manual.",
+       "movepagetalktext": "Menawa sampéyan nyénthang kothak iki, kaca parembugan sing magepokan bakal otomatis dilih nyang sesirah anyar, kajaba kaca parembugané sing dituju wis ana isiné.\n\nYèn mangkéné, sampéyan kudu ngalih utawa nggabung kaca-kaca iku kanthi manual.",
        "moveuserpage-warning": "'''Pèngetan:''' Sampéyan arep mindhahaké kaca panganggo. Mangga cathet yèn namung kaca sing bakal dipindhahaké lan panganggo '''ora''' bakal diganti jenengé.",
        "movenologintext": "Panjenengan kudu dadi panganggo sing wis ndaftar lan wis [[Special:UserLogin|mlebu log]] kanggo mindhah kaca.",
        "movenotallowed": "Panjenengan ora pareng ngalihaké kaca.",
        "movepage-moved-noredirect": "Kanggo gawé pengalihan wis ditahan.",
        "articleexists": "Satunggalipun kaca kanthi asma punika sampun wonten, utawi asma ingkang panjenengan pendhet mboten leres. Sumangga nyobi asma sanèsipun.",
        "cantmove-titleprotected": "Panjenengan ora bisa mindhahaké kaca iki menyang lokasi iki, amerga irah-irahan tujuan lagi direksa; ora olèh digawé",
-       "movetalk": "Lih kaca geguneman sing magepokan",
+       "movetalk": "Lih kaca parembugan sing magepokan",
        "move-subpages": "Lih anak kaca (tekan $1)",
-       "move-talk-subpages": "Lih anak kaca saka kaca geguneman (tekan $1)",
+       "move-talk-subpages": "Lih anak kaca saka kaca parembugan (tekan $1)",
        "movepage-page-exists": "Kaca $1 wis ana lan ora bisa ditindhes sacara otomatis.",
        "movepage-page-moved": "Kaca $1 wis dipindhah menyang $2.",
        "movepage-page-unmoved": "Kaca $1 ora bisa dialihaké menyang $2.",
        "tooltip-pt-userpage": "Kaca {{GENDER:|panganggoning sampéyan}}",
        "tooltip-pt-anonuserpage": "Kaca panganggo IP panjenengan",
        "tooltip-pt-mytalk": "Kaca gegunemaning {{GENDER:|sampéyan}}",
-       "tooltip-pt-anontalk": "Rerembugan bab besutan-besutan saka alamat IP iki",
+       "tooltip-pt-anontalk": "Parembug ing besutan-besutan saka alamat IP iki",
        "tooltip-pt-preferences": "Pilih-pilihaning {{GENDER:|sampéyan}}",
        "tooltip-pt-watchlist": "Pratélaning kaca sing sampéyan awasi owah-owahané",
        "tooltip-pt-mycontris": "Pratélaning sumbanganing {{GENDER:|sampéyan}}",
        "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é",
        "watchlisttools-edit": "Deleng lan besut pawawangan",
        "watchlisttools-raw": "Besut pawawangan wantahan",
-       "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|geguneman]])",
+       "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|rembugan]])",
        "duplicate-defaultsort": "Pènget: Kunci pilih asal (''Default sort key'') \"$2\" nggantèkaké kunci pilih asal sadurungé \"$1\".",
        "version": "Versi",
        "version-extensions": "Èkstènsi sing wis diinstalasi",
index b9885e0..1e16e27 100644 (file)
@@ -26,7 +26,8 @@
                        "SHOTHA",
                        "Gi777ga",
                        "Matma Rex",
-                       "Sopopruidze"
+                       "Sopopruidze",
+                       "Dixtosa"
                ]
        },
        "tog-underline": "ბმულების ხაზგასმა:",
@@ -44,6 +45,7 @@
        "tog-watchdefault": "დაამატე ჩემი კონტროლის სიას ჩემს მიერ რედაქტირებული გვერდები და ფაილები",
        "tog-watchmoves": "ჩასვი გვერდები და ფაილები, რომლებიც მე გადამაქვს, ჩემს კონტროლის სიაში",
        "tog-watchdeletion": "ჩასვი გვერდები და ფაილები, რომლებსაც მე ვშლი, ჩემს კონტროლის სიაში",
+       "tog-watchuploads": "დაამატე ჩემი ატვირთული ფაილები ჩემი კონტროლის სიას ხოლმე",
        "tog-watchrollback": "დაამატე ჩემი კონტროლის სიას გვერდები, სადაც მე სწრაფი გაუქმება განვახორციელე",
        "tog-minordefault": "ყველა რედაქტირების მონიშვნა, როგორც უმნიშვნელო, უპირობოდ",
        "tog-previewontop": "წინასწარი გადახედვის ჩვენება რედაქტირების დაფამდე",
@@ -68,7 +70,7 @@
        "tog-ccmeonemails": "გამომიგზავნე ელფოსტების ასლები, რომლებსაც მე სხვა მომხმარებლებს ვუგზავნი",
        "tog-diffonly": "დამალე გვერდის შიგთავსი ცვლილების ქვევით",
        "tog-showhiddencats": "დამალული კატეგორიების ჩვენება",
-       "tog-norollbackdiff": "á\83\92á\83\90á\83£á\83¥á\83\9bá\83\94á\83\91á\83\98á\83¡á\83\90á\83¡ á\83\92á\83\90á\83\9bá\83\9dá\83¢á\83\9dá\83\95á\83\94á\83\97 ცვლილებათა განსხვავება",
+       "tog-norollbackdiff": "á\83ªá\83\95á\83\9aá\83\98á\83\9aá\83\94á\83\91á\83\98á\83¡ á\83\92á\83\90á\83£á\83¥á\83\9bá\83\94á\83\91á\83\98á\83¡á\83\90á\83¡ á\83\90á\83  á\83\9bá\83\90á\83\9cá\83\90á\83®á\83\9d ცვლილებათა განსხვავება",
        "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": "თქვენ კვლავ უნდა შეხვიდეთ სისტემაში რათა შემოწმდეს რომ ხართ $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}} მომხმარებლების შესვლისთვის იყენებს \"ქუქის ჩანაწერს\". თქვენ იგი გათიშეთ. გთხოვთ, ჩართოთ ისინი და ხელმეორედ მოსინჯოთ.",
        "nocookiesfornew": "მომხმარებლის ანგარიში არ შექმნილა, რადგან მისი წყარო ვერ დადასტურდა.\nუზრუნველყოფილი უნდა იყოს ჭდეების აქტიურობა. შემდეგ განაახლეთ გვერდი და სცადეთ ხელახლა",
        "nocookiesforlogin": "{{int:nocookieslogin}}",
+       "createacct-loginerror": "ანგარიში წარმატებით შეიქმნა, თუმცა თქვენ ვერ შეხვალთ სისტემაში ავტომატურად. გთხოვთ გამოიყენოთ [[Special:UserLogin|ეს გვერდი]].",
        "noname": "თქვენს მიერ მითითებული მომხმარებლის სახელი ქმედითი არ არის.",
        "loginsuccesstitle": "სისტემაში შესვლა განხორციელდა",
        "loginsuccess": "'''ამჟამად შესული ხართ {{SITENAME}}-ში როგორც „$1“.'''",
-       "nosuchuser": "á\83\9bá\83\9dá\83\9bá\83®á\83\9bá\83\90á\83 á\83\94á\83\91á\83\94á\83\9aá\83\98 á\83¡á\83\90á\83®á\83\94á\83\9aá\83\90á\83\93 $1 á\83\90á\83  á\83\90á\83 á\83¡á\83\94á\83\91á\83\9dá\83\91á\83¡.\ná\83\9bá\83\9dá\83\9bá\83®á\83\9bá\83\90á\83 á\83\94á\83\91á\83\94á\83\9aá\83\97á\83\90 á\83¡á\83\90á\83®á\83\94á\83\9aá\83\94á\83\91á\83\98 á\83\92á\83 á\83«á\83\9cá\83\9dá\83\91á\83\90á\83\93á\83\98á\83\90 á\83\90á\83¡á\83\9dá\83\94á\83\91á\83\98á\83¡ á\83 á\83\94á\83\92á\83\98á\83¡á\83¢á\83 á\83\90á\83\9bá\83\93á\83\94..\ná\83¨á\83\94á\83\90á\83\9bá\83\9dá\83¬á\83\9bá\83\94á\83\97 á\83¡á\83\90á\83®á\83\94á\83\9aá\83\98á\83¡ á\83\93á\83\90á\83¬á\83\94á\83 á\83\90 á\83\90á\83\9c[[Special:CreateAccount|შექმენით ახალი ანგარიში]].",
+       "nosuchuser": "á\83\9bá\83\9dá\83\9bá\83®á\83\9bá\83\90á\83 á\83\94á\83\91á\83\94á\83\9aá\83\98 á\83¡á\83\90á\83®á\83\94á\83\9aá\83\90á\83\93 $1 á\83\90á\83  á\83\90á\83 á\83¡á\83\94á\83\91á\83\9dá\83\91á\83¡.\ná\83\9bá\83\9dá\83\9bá\83®á\83\9bá\83\90á\83 á\83\94á\83\91á\83\94á\83\9aá\83\97á\83\90 á\83¡á\83\90á\83®á\83\94á\83\9aá\83\94á\83\91á\83¨á\83\98 á\83\90á\83¡á\83\9dá\83\94á\83\91á\83\98á\83¡ á\83 á\83\94á\83\92á\83\98á\83¡á\83¢á\83 á\83¡ á\83\90á\83¥á\83\95á\83¡ á\83\9bá\83\9cá\83\98á\83¨á\83\95á\83\9cá\83\94á\83\9aá\83\9dá\83\91á\83\90.\ná\83¨á\83\94á\83\90á\83\9bá\83\9dá\83¬á\83\9bá\83\94á\83\97 á\83¡á\83\90á\83®á\83\94á\83\9aá\83\98 á\83\90á\83\9c [[Special:CreateAccount|შექმენით ახალი ანგარიში]].",
        "nosuchusershort": "მომხმარებელი სახელით „$1“ არ არსებობს. შეამოწმეთ მართლწერა.",
        "nouserspecified": "საჭიროა მომხმარებლის სახელის მითითება.",
        "login-userblocked": "ეს მომხმარებელი დაბლოკილია. სისტემაში შესვლა არაა ნებადართული.",
        "noemail": "აქ „$1“ მომხმარებლის ელ. ფოსტის მისამართი მითითებული არ არის.",
        "noemailcreate": "თქვენ უნდა მიუთითოთ ელ-ფოსტის კორექტული მისამართი.",
        "passwordsent": "ახალი პაროლი გაიგზავნა ელ-ფოსტით მომხმარებელს \"$1\".\nგთხოვთ შეხვიდეთ სისტემაში მისი მიღების შემდეგ.",
-       "blocked-mailpassword": "á\83\97á\83¥á\83\95á\83\94á\83\9cá\83\98 IP á\83\9bá\83\98á\83¡á\83\90á\83\9bá\83\90á\83 á\83\97á\83\98 á\83 á\83\94á\83\93á\83\90á\83¥á\83¢á\83\98á\83 á\83\94á\83\91á\83\98á\83¡á\83\97á\83\95á\83\98á\83¡ á\83\93á\83\90á\83\91á\83\9aá\83\9dá\83\99á\83\98á\83\9aá\83\98á\83\90, á\83\90á\83\9bá\83\98á\83¢á\83\9dá\83\9b á\83\90á\83  á\83¨á\83\94á\83\92á\83\98á\83«á\83\9aá\83\98á\83\90á\83\97 á\83\9eá\83\90á\83 á\83\9dá\83\9aá\83\98á\83¡ á\83\90á\83¦á\83\93á\83\92á\83\94á\83\9cá\83\98á\83¡ á\83\92á\83\90á\83\9bá\83\9dá\83§á\83\94á\83\9cá\83\94á\83\91á\83\90 á\83\99á\83\9dá\83\9cá\83¤á\83\9aá\83\98á\83¥á\83¢á\83\98á\83¡ á\83\92á\83\90á\83\9bá\83\9d.",
+       "blocked-mailpassword": "á\83\97á\83¥á\83\95á\83\94á\83\9cá\83\98 IP á\83\9bá\83\98á\83¡á\83\90á\83\9bá\83\90á\83 á\83\97á\83\98 á\83\93á\83\90á\83\91á\83\9aá\83\9dá\83\99á\83\98á\83\9aá\83\98á\83\90 á\83 á\83\94á\83\93á\83\90á\83¥á\83¢á\83\98á\83 á\83\94á\83\91á\83\98á\83¡á\83\92á\83\90á\83\9c á\83\93á\83\90 á\83¡á\83\98á\83¡á\83¢á\83\94á\83\9bá\83\98á\83¡ á\83¨á\83\94á\83¡á\83\90á\83«á\83\9aá\83\9d á\83\90á\83 á\83\90á\83\99á\83\94á\83\97á\83\98á\83\9aá\83¡á\83\98á\83\9cá\83\93á\83\98á\83¡á\83\98á\83\94á\83 á\83\98 á\83\92á\83\90á\83\9bá\83\9dá\83§á\83\94á\83\9cá\83\94á\83\91á\83\98á\83¡á\83\92á\83\90á\83\9c á\83\97á\83\90á\83\95á\83\98á\83¡ á\83\90á\83 á\83\98á\83\93á\83\94á\83\91á\83\98á\83¡ á\83\9bá\83\98á\83\96á\83\9cá\83\98á\83\97 á\83\9eá\83\90á\83 á\83\9dá\83\9aá\83\98á\83¡ á\83\90á\83¦á\83\93á\83\92á\83\94á\83\9cá\83\90á\83ª á\83¨á\83\94á\83\96á\83¦á\83£á\83\93á\83£á\83\9aá\83\98á\83\90.",
        "eauthentsent": "A confirmation email has been sent to the specified email address.\nBefore any other email is sent to the account, you will have to follow the instructions in the email, to confirm that the account is actually yours.",
        "throttled-mailpassword": "პაროლის შეხსენება უკვე გაგზავნილია ბოლო {{PLURAL:$1|საათის|$1 საათის}} განმავლობაში.\nბოროტად გამოყენების თავიდან აცილებისთვის, მხოლოდ ერთი შეხსენება იგზავნება ყოველ {{PLURAL:$1|საათში|$1 საათში}}.",
        "mailerror": "შეცდომა ფოსტის გაგზავნაში: $1",
        "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": "ამ ცვლილების დასადასტურებლად დაგჭირდებათ პაროლის შეყვანა.",
        "minoredit": "მცირე რედაქტირება",
        "watchthis": "უთვალთვალე ამ გვერდს",
        "savearticle": "გვერდის შენახვა",
+       "publishpage": "გვერდის გამოქვეყნება",
        "preview": "წინასწარი გადახედვა",
        "showpreview": "წინასწარი გადახედვის ჩვენება",
        "showdiff": "ცვლილებების ჩვენება",
        "accmailtext": "შემთხვევითი მეთოდით შექმნილი პაროლი მომხმარებლისათვის [[User talk:$1|$1]] გაგზავნილია მისამართზე $2.\n\nავტორიზაციის გავლის შემდეგ შესაძლებელი იქნება ამ ანგარიშის  ''[[Special:ChangePassword|პაროლის შეცვლა]]'' ანგარიშში შესვლის გვერდზე.",
        "newarticle": "(ახალი)",
        "newarticletext": "ბმულის მეშვეობით თქვენ მოხვდით გვერდზე, რომელიც ჯერ არ არსებობს.\nგვერდის შესაქმნელად შეიყვანეთ ინფორმაცია ქვემო ფანჯარაში\n(იხ. [$1 დახმარების გვერდი] დამატებითი ინფორმაციისთვის).\nთუ ამ გვერდზე შეცდომით მოხვდით, დაბრუნდით უკან თქვენი ბრაუზერის მეშვეობით.",
-       "anontalkpagetext": "----''ეს არის ანონიმური მომხმარებლის განხილვის გვერდი, რომელსაც ანგარიში ჯერ არ შეუქმნია ან არ იყენებს მას.\n\nშესაბამისად, ჩვენ მისი ციფრული IP მისამართი უნდა გამოვიყენოთ მისი იდენტიფიცირებისთვის.\n\nამგვარი მისამართი შეიძლება რამდენიმე მომხმარებელმა გამოიყენოს.\n\nთუ თქვენ ანონიმური მომხმარებელი ხართ და თვლით, რომ სხვისთვის გამიზნული მითითება მიიღეთ, გთხოვთ [[Special:CreateAccount|შექმენით ანგარიში ან დარეგისტრირდით]] მომავალში გაუგებრობის თავიდან ასაცილებლად.''",
+       "anontalkpagetext": "----\n<em>ეს არის ანონიმური მომხმარებლის განხილვის გვერდი, რომელსაც ანგარიში ჯერ არ შეუქმნია ან არ იყენებს მას.</em>\n\nშესაბამისად, ჩვენ მისი ციფრული IP მისამართი უნდა გამოვიყენოთ მისი იდენტიფიცირებისთვის.\nამგვარი მისამართი შეიძლება რამდენიმე მომხმარებელმა გამოიყენოს.\n\nთუ თქვენ ხართ ანონიმური მომხმარებელი და თვლით, რომ გაუგებარი მითითებები მიიღეთ, გთხოვთ ან [[Special:UserLogin|შედით სისტემაში]] ან [[Special:CreateAccount|დაარეგისტირიეთ]] თქვენი ანგარიში მომავალში გაუგებრობის თავიდან ასაცილებლად.",
        "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}}}} წაშლების ჟურნალში].",
        "userpage-userdoesnotexist": "მომხმარებლის ანგარიში „$1“ არ არსებობს. დარწმუნდით, რომ ნამდვილად გსურთ ამ ანგარიშის შექმნა ან შესწორება.",
        "userpage-userdoesnotexist-view": "მომხმარებელი „$1“ არ არის დარეგისტრირებული.",
        "blocked-notice-logextract": "ეს მომხმარებელი უკვე დაიბლოკა.\nდაბლოკვის მიზეზი შემდეგშია:",
-       "clearyourcache": "'''შენიშვნა:''' შენახვის შემდეგ შესაძლოა დაგჭირდეთ ბრაუზერის ქეშის გაწმენდა ცვლილებების სანახავად. \n* '''Firefox / Safari:''' დააჭირეთ ''Shift'' ''Reload''-ზე დაწკაპებისას, ან დააჭირეთ ''Ctrl-F5'', ან ''Ctrl-R'' (''⌘-R'' Mac-ზე); \n* '''Google Chrome:''' დააჭირეთ ''Ctrl-Shift-R'' (''⌘-Shift-R'' Mac-ზე);\n* '''IE:''' დააჭირეთ ''Ctrl'' ''Refresh''-ზე დაწკაპებისას, ან დააჭირეთ ''Ctrl-F5'';\n* '''Opera''' გაწმინდეთ კეში ''Tools→Preferences''-დან.",
+       "clearyourcache": "<strong>შენიშვნა:</strong> შენახვის შემდეგ შესაძლოა დაგჭირდეთ ბრაუზერის ქეშის გაწმენდა ცვლილებების სანახავად. \n* <strong>Firefox / Safari:</strong> დააჭირეთ <em>Shift</em>  და <em>Reload</em>, ან დააჭირეთ <em>Ctrl-F5</em>, ან <em>Ctrl-R</em> (<em>⌘-R</em> Mac-ზე); \n* <strong>Google Chrome:</strong> დააჭირეთ <em>Ctrl-Shift-R</em> (<em>⌘-Shift-R</em> Mac-ზე);\n* <strong>IE:</strong> დააჭირეთ <em>Ctrl</em> და <em>Refresh</em>, ან დააჭირეთ <em>Ctrl-F5</em>;\n* <strong>Opera</strong> გაწმინდეთ კეში <em>Tools→Preferences</em>-დან.",
        "usercssyoucanpreview": "'''რჩევა:''' შენახვამდე გამოიყენეთ ღილაკი \"{{int:showpreview}}\" თქვენი ახალი CSS ტესტირებისთვის.",
        "userjsyoucanpreview": "'''რჩევა:''' შენახვამდე გამოიყენეთ ღილაკი \"{{int:showpreview}}\" თქვენი ახალი JS ტესტირებისთვის.",
        "usercsspreview": "'''გახსოვდეთ, რომ თქვენ მხოლოდ წინასწარ გადახედვას უყურებთ თქვენს მომხმარებლის CSS-ს, ის ჯერ შენახული არ არის!'''",
        "right-override-export-depth": "გვერდების ექსპორტირება, დაკავშირებული გვერდების ჩათვლით 5-მდე სიიღრმით",
        "right-sendemail": "გაგუგზავნე ელექტრონული ფოსტა სხვა მომხმარებლებს",
        "right-passwordreset": "ელ.ფოსტის ნახვა პაროლის შეცვლით",
-       "right-managechangetags": "[[Special:Tags|tags]] შექმნა და წაშლა მონაცემთა ბაზიდან",
+       "right-managechangetags": "[[Special:Tags|ტეგების]] შექმნა და (დე)აქტივაცია",
        "right-applychangetags": "[[Special:Tags|tags]] მიღება თქვენ ცვლილებებთან ერთად",
        "right-changetags": "თვითნებური [[Special:Tags|tags]] დამატება ან წაშლა ცალკეულ ცვლილებებსა და ჟურნალის ჩანაწერებში",
        "grant-generic": "\"$1\" უფლებები",
        "action-viewmyprivateinfo": "თქვენი პირადი ინფორმაციის ხილვა",
        "action-editmyprivateinfo": "თქვენი პირადი ინფორმაციის რედაქტირება",
        "action-editcontentmodel": "გვერდის კონტენტური მოდელის რედაქტირება",
-       "action-managechangetags": "á\83\93á\83\90á\83¡á\83\90á\83\97á\83\90á\83£á\83 á\83\94á\83\91á\83\98á\83¡ á\83¨á\83\94á\83¥á\83\9bá\83\9cá\83\90 á\83\93á\83\90 á\83¬á\83\90á\83¨á\83\9aá\83\90 á\83\9bá\83\9dá\83\9cá\83\90á\83ªá\83\94á\83\9bá\83\97á\83\90 á\83\91á\83\90á\83\96á\83\98á\83\93á\83\90á\83\9c",
+       "action-managechangetags": "á\83¢á\83\94á\83\92á\83\94á\83\91á\83\98á\83¡ á\83¨á\83\94á\83¥á\83\9bá\83\9cá\83\90 á\83\93á\83\90 (á\83\93á\83\94\83\90á\83¥á\83¢á\83\98á\83\95á\83\90á\83ªá\83\98á\83\90",
        "action-applychangetags": "ტეგების მიღება თქვენ ცვლილებებთან ერთად",
        "action-changetags": "თავისუფალი ტეგების დამატება და წაშლა ცალკეულ ცვლილებებსა და ჟურნალების ჩანაწერებში",
        "nchanges": "$1 ცვლილება",
        "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|ეს გვერდი არის გამოყნებული სხვა გვერდებში]]",
        "recentchanges-page-removed-from-category": "[[:$1]] წაიშალა კატეგორიიდან",
-       "recentchanges-page-removed-from-category-bundled": "[[:$1]] á\83\93á\83\90 [[Special:WhatLinksHere/$1|{{PLURAL:$2|á\83\94á\83 á\83\97á\83\98 á\83\92á\83\95á\83\94á\83 á\83\93á\83\98|$2 á\83\92á\83\95á\83\94á\83 á\83\93á\83\98}}]] á\83¬á\83\90á\83\98á\83¨á\83\90á\83\9aá\83\90 á\83\99á\83\90á\83¢á\83\94á\83\92á\83\9dá\83 á\83\98á\83\98á\83\93á\83\90á\83\9c",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]] á\83\90á\83\9bá\83\9dá\83\95á\83\90á\83 á\83\93á\83\90 á\83\99á\83\90á\83¢á\83\94á\83\92á\83\9dá\83 á\83\98á\83\98á\83\93á\83\90á\83\9c. [[Special:WhatLinksHere/$1|á\83\94á\83¡ á\83\92á\83\95á\83\94á\83 á\83\93á\83\98 á\83\92á\83\90á\83\9bá\83\9dá\83\98á\83§á\83\94á\83\9cá\83\94á\83\91á\83\90 á\83¡á\83®á\83\95á\83\90 á\83\92á\83\95á\83\94á\83 á\83\93á\83\94á\83\91á\83¨á\83\98]]",
        "autochange-username": "მედიავიკის ავტომატური ცვლილება",
        "upload": "ფაილის დამატება",
        "uploadbtn": "ფაილის დამატება",
        "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": "წინ",
        "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": "á\83\9bá\83\9dá\83\9bá\83®á\83\9bá\83\90á\83 á\83\94á\83\91á\83\94á\83\9aá\83\9bá\83\90 $1 {{GENDER:$2|á\83¨á\83\94á\83ªá\83\95á\83\90á\83\9aá\83\90}} á\83¯á\83\92á\83£á\83¤á\83\98á\83¡ á\83¬á\83\94á\83\95á\83 á\83\9dá\83\91á\83\90 $3-á\83\97á\83\95á\83\98ს $4-დან $5-ზე",
+       "logentry-rights-rights": "á\83\9bá\83\9dá\83\9bá\83®á\83\9bá\83\90á\83 á\83\94á\83\91á\83\94á\83\9aá\83\9bá\83\90 $1 {{GENDER:$2|á\83¨á\83\94á\83£á\83ªá\83\95á\83\90á\83\9aá\83\90}} á\83¯á\83\92á\83£á\83¤á\83\98 $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 dd471d5..c8172ed 100644 (file)
@@ -33,6 +33,7 @@
        "tog-watchdefault": "Мен өңдеген беттерді және файлдарды бақылау тізіміне қосу",
        "tog-watchmoves": "Мен жылжытқан беттерді және файлдарды бақылау тізіміне қосу",
        "tog-watchdeletion": "Мен жойған беттерді және файлдарды бақылау тізіміне қосу",
+       "tog-watchuploads": "Бақылау тізіміме мен жүктеген файлдарды қосу",
        "tog-watchrollback": "Мен шегіндіруін орындаған беттерді бақылау тізіміме қосу",
        "tog-minordefault": "Әдепкі бойынша барлық өңдемелерді шағын деп белгілеу",
        "tog-previewontop": "Қарап шығу аумағын өңдеу терезесінің жоғарғы жағында көрсету",
        "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": "МедиаУики өздікті өзгерісі",
        "fewestrevisions": "Ең аз түзетілген беттер",
        "nbytes": "$1 {{PLURAL:$1|байт|байт}}",
        "ncategories": "$1 {{PLURAL:$1|Санат|Санаттар}}",
-       "ninterwikis": "$1 {{PLURAL:$1|интеруики|интеруикилер}}",
+       "ninterwikis": "$1 {{PLURAL:$1|интеруики|интеруики}}",
        "nlinks": "$1 сілтеме",
        "nmembers": "$1 {{PLURAL:$1|мүше|мүше}}",
        "nmemberschanged": "$1 → $2 {{PLURAL:$2|мүше|мүше}}",
index dbee372..9cea7b2 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": "{{GENDER:$2|사용자}} 이메일 보내기 실패: $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}}\"을 입력하면, 넘겨주기 문서가 생성될 것입니다.",
        "right-move-rootuserpages": "최상위 사용자 문서 이동",
        "right-move-categorypages": "분류 문서 이동",
        "right-movefile": "파일 이동",
-       "right-suppressredirect": "문서 옮길 때 원래 문서 이름으로 된 넘겨주기를 만들지 않기",
+       "right-suppressredirect": "문서 옮길 때 원래 문서 이름으로 된 넘겨주기를 만들지 않기",
        "right-upload": "파일 올리기",
        "right-reupload": "이미 존재하는 파일을 다시 올리기",
        "right-reupload-own": "자신이 이미 올린 파일 덮어쓰기",
        "apisandbox": "API 실험실",
        "apisandbox-jsonly": "API 연습장을 이용하려면 자바스크립트가 필요합니다.",
        "apisandbox-api-disabled": "이 사이트에서는 API가 꺼져 있습니다.",
-       "apisandbox-intro": "<strong>미디어위키 웹 서비스 API</strong>를 시험해보려면 이 페이지를 이용해보세요. API 용법에 대해서는 [[mw:API:Main page|API 문서]]을 참고하십시오. 예: [//www.mediawiki.org/wiki/API#A_simple_example 대문의 내용 요청하기]. 더 많은 예를 보려면 액션을 선택하세요.\n\n여기가 연습장이라도 이 페이지에서 실행하는 동작때문에 위키를 변경할 수도 있다는 점에 유의하십시오.",
+       "apisandbox-intro": "<strong>미디어위키 웹 서비스 API</strong>를 시험해보려면 이 페이지를 이용해보세요. API 용법에 대해서는 [[mw:API:Main page|API 문서]]를 참고하십시오. 예: [//www.mediawiki.org/wiki/API#A_simple_example 대문의 내용 요청하기]. 더 많은 예를 보려면 액션을 선택하세요.\n\n여기가 연습장이라도 이 페이지에서 실행하는 동작 때문에 위키를 변경할 수도 있다는 점에 유의하십시오.",
        "apisandbox-fullscreen": "패널 늘리기",
        "apisandbox-fullscreen-tooltip": "브라우저 창에 맞도록 샌드박스 패널 늘리기",
        "apisandbox-unfullscreen": "페이지 보기",
        "trackingcategories-msg": "추적용 분류",
        "trackingcategories-name": "메시지 이름",
        "trackingcategories-desc": "분류 포함 기준",
+       "restricted-displaytitle-ignored": "제목 표시가 무시된 문서",
+       "restricted-displaytitle-ignored-desc": "문서의 실제 제목과 일치하지 않기 때문에 무시된 <code><nowiki>{{DISPLAYTITLE}}</nowiki></code>이 있는 문서입니다.",
        "noindex-category-desc": "문서는 그것과 그 플래그가 허용된 곳에 있는 이름공간에서 <code><nowiki>__NOINDEX__</nowiki></code> 특수 명령이 있기 때문에 로봇이 색인하지 않습니다.",
        "index-category-desc": "문서는 그것(과 플래그가 허용된 곳에 있는 이름공간에 있는 것)에 <code><nowiki>__INDEX__</nowiki></code>가 있어서, 정상적이지 않을 곳에 로봇에 의해 색인됩니다.",
        "post-expand-template-inclusion-category-desc": "모든 틀을 전개하였을 때, 문서 크기가 <code>$wgMaxArticleSize</code>보다 커지므로, 어떤 틀은 전개하지 않았습니다.",
        "rollbacklinkcount": "{{PLURAL:$1|편집}} $1회 되돌리기",
        "rollbacklinkcount-morethan": "{{PLURAL:$1|편집}} $1회 이상 되돌리기",
        "rollbackfailed": "되돌리기 실패",
+       "rollback-missingparam": "요청에 필요한 변수가 존재하지 않습니다.",
        "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": "$1의 편집을 되돌렸습니다.\n$2의 마지막 판으로 바뀌었습니다.",
+       "rollback-success-notify": "$1의 편집을 되돌렸습니다.\n$2의 마지막 판으로 바뀌었습니다. [$3 차이 보기]",
        "sessionfailure-title": "세션 실패",
        "sessionfailure": "로그인 세션에 문제가 발생한 것 같습니다.\n세션 하이재킹을 막기 위해 동작이 취소되었습니다.\n브라우저의 뒤로 버튼을 누르고 문서를 새로 고침한 후에 다시 시도해 주세요.",
        "changecontentmodel": "문서의 콘텐츠 모델을 변경",
        "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": "메타데이터",
        "confirm-watch-top": "이 문서를 주시문서 목록에 추가할까요?",
        "confirm-unwatch-button": "확인",
        "confirm-unwatch-top": "이 문서를 주시문서 목록에서 뺄까요?",
+       "confirm-rollback-button": "확인",
+       "confirm-rollback-top": "이 문서의 편집을 되돌리시겠습니까?",
        "quotation-marks": "“$1”",
        "imgmultipageprev": "← 이전 페이지",
        "imgmultipagenext": "다음 페이지 →",
        "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-no-primary": "제공된 자격 증명으로 인증할 수 없습니다.",
+       "authmanager-authn-no-local-user": "자격 증명으로 이 위키의 어느 사용자로도 로그인 할 수 없습니다.",
+       "authmanager-authn-no-local-user-link": "제공된 자격 증명은 유효하지만 이 위키의 어느 사용자와도 연결되어 있지 않습니다. 다른 방식으로 로그인하거나, 새로운 사용자를 생성하면 자격 증명을 계정에 추가할 수 있게 됩니다.",
+       "authmanager-authn-autocreate-failed": "로컬 계정 자동 생성 실패: $1",
+       "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-invalidsubpage": "$1은 유효한 자격 증명이 아닙니다.",
+       "changecredentials-success": "자격 증명이 변경되었습니다.",
+       "removecredentials": "자격 증명 제거",
+       "removecredentials-submit": "자격 증명 제거",
+       "removecredentials-invalidsubpage": "$1 은(는) 유효한 자격 증명이 아닙니다.",
+       "removecredentials-success": "자격 증명이 제거되었습니다.",
+       "credentialsform-provider": "자격 증명:",
+       "credentialsform-account": "계정 이름:",
+       "cannotlink-no-provider-title": "연결할 수 있는 계정이 없음",
+       "cannotlink-no-provider": "연결할 수 있는 계정이 없습니다.",
+       "linkaccounts": "계정 연결",
+       "linkaccounts-success-text": "계정이 연결되었습니다.",
+       "linkaccounts-submit": "계정 연결",
+       "unlinkaccounts": "계정 연결 해제",
+       "unlinkaccounts-success": "계정의 연결이 해제되었습니다."
 }
index 0a3f3a3..ce4419a 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",
        "confirm-watch-top": "Sulle mer di Sigg en Ding Oppaßleß opnämme?",
        "confirm-unwatch-button": "Lohß Jonn!",
        "confirm-unwatch-top": "Sulle mer di Sigg uß Dinger Oppaßleß erußnämme?",
+       "confirm-rollback-button": "Lohß Jonn!",
        "semicolon-separator": ";",
        "word-separator": "&#32;",
        "ellipsis": "&nbsp;…",
        "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-authplugin-setpass-failed-title": "Dat Paßwoot ze änndere hät nit jeflupp",
+       "authmanager-userdoesnotexist": "Ene Metmaacher mem Nahme „$1“ es nit ennjedrahre.",
+       "authmanager-domain-help": "De Domäijn för de Zohjangsdaht vun ußerhallef beschtähtech ze krijje.",
+       "authmanager-email-label": "<i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mail</i>",
+       "authmanager-email-help": "De Addräß för de <i lang=\"en\">e-mail</i>",
+       "authmanager-realname-label": "Der „reeschteje“ Nahme",
+       "authmanager-provider-temporarypassword": "Zweschepasswood:",
+       "authprovider-resetpass-skip-label": "Övverjonn",
+       "specialpage-securitylevel-not-allowed-title": "Nit zohjelohße",
+       "cannotauth-not-allowed-title": "Zohjang verbodde.",
+       "changecredentials-submit": "Ändere",
+       "changecredentials-submit-cancel": "Ophüre",
+       "removecredentials-submit": "Fott nämme",
+       "removecredentials-submit-cancel": "Ophüre"
 }
index f03072b..8078259 100644 (file)
@@ -17,7 +17,8 @@
                        "Bikarhêner",
                        "Uygar",
                        "MikaelF",
-                       "Macofe"
+                       "Macofe",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "Xetekê di bin girêdanê de çêke:",
@@ -33,7 +34,7 @@
        "tog-editsectiononrightclick": "Beşekê bi rast-klîkekê biguherîne",
        "tog-watchcreations": "Rûpelên min çêkirin û dosyeyên min barkirin, têxe nav lîsteya min a şopandinê",
        "tog-watchdefault": "Rûpelên min guhertin û dosyeyên min barkirin, têxe nav lîsteya min a şopandinê",
-       "tog-watchmoves": "Rûpelên min navê wan guhertin, têxe nav lîsteya min a şopandinê",
+       "tog-watchmoves": "Rûpel û dosyeyên ku ez navên wan diguherînim, têxe nav lîsteya min a şopandinê",
        "tog-watchdeletion": "Rûpel û dosyeyên min jêbirin, têxe nav lîsteya min a şopandinê",
        "tog-minordefault": "Her guhertinekê weke guhertineke biçûk nîşan bide",
        "tog-previewontop": "Pêşdîtina gotarê li jorî cihê guherandinê nîşan bide",
        "passwordreset-emailtitle": "Hûragahiyên hesab li ser {{SITENAME}}",
        "passwordreset-emailelement": "Navê bikarhêner:\n$1\n\nŞîfreya niha:\n$2",
        "passwordreset-emailsentemail": "E-nameyeke bibîrxistinê hate şandin.",
+       "passwordreset-invalideamil": "Navnîşana enameyê ya nederbasdar",
        "changeemail": "Navnîşana enameya xwe biguherîne an rabike",
        "changeemail-oldemail": "Navnîşana e-nameya niha:",
        "changeemail-newemail": "Navnîşana e-nameya nû:",
        "postedit-confirmation-restored": "Ev rûpel hate restorekirin.",
        "postedit-confirmation-saved": "Guhertina te hate tomarkirin.",
        "edit-already-exists": "Nikarî rûpeleka nuh çêke.\nEw berê heye.",
+       "defaultmessagetext": "Nivîsa peyamê ya standart",
        "invalid-content-data": "Daneyên naverokê yên nederbasdar",
        "content-model-wikitext": "wîkînivîs",
        "content-model-text": "nivîsê sade",
        "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",
        "unblocklink": "astengkirinê rake",
        "change-blocklink": "Astengkirinê biguherîne",
        "contribslink": "beşdarî",
-       "emaillink": "e-name bişîne",
+       "emaillink": "e-name bişîne",
        "autoblocker": "Otomatîk hate astengkirin ji ber ku IP'ya wê û ya \"[[User:$1|$1]]\" yek in. Sedem: \"''$2''\"",
        "blocklogpage": "Astengkirina têketinê",
        "blocklogentry": "\"[[$1]]\" ji bo dema $2, $3 asteng kir",
        "confirm-purge-top": "Bîra vê rûpelê jêbîbe ?",
        "confirm-watch-button": "Temam",
        "confirm-unwatch-button": "Baş e",
+       "confirm-rollback-button": "Baş e",
        "quotation-marks": "\"$1\"",
        "imgmultipageprev": "← rûpela berî vê",
        "imgmultipagenext": "rûpela din →",
        "mw-widgets-titleinput-description-new-page": "rûpel hê tune ye",
        "mw-widgets-titleinput-description-redirect": "beralî bike ber bi $1 ve",
        "log-action-filter-all": "Hemû",
-       "log-action-filter-block-block": "Asteng bike"
+       "log-action-filter-block-block": "Asteng bike",
+       "authmanager-email-label": "E-name",
+       "authmanager-email-help": "Navnîşana e-nameyê"
 }
index f6c6e64..5627252 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",
        "confirm-watch-top": "Dës Säit op Är Iwwerwaachungslëscht bäisetzen?",
        "confirm-unwatch-button": "OK",
        "confirm-unwatch-top": "Dës Säit vun Ärer Iwwerwaachungslëscht erofhuelen?",
+       "confirm-rollback-button": "OK",
+       "confirm-rollback-top": "Ännerunge vun dëser Säit zrécksetzen?",
        "quotation-marks": "\"$1\"",
        "imgmultipageprev": "← Vireg Säit",
        "imgmultipagenext": "nächst Säit →",
        "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",
+       "specialpage-securitylevel-not-allowed": "Leider däerft Dir dës Säit net benotze well Är Identitéit net konnt iwwerpréift ginn.",
+       "cannotauth-not-allowed-title": "Erlaabnes refuséiert",
+       "cannotauth-not-allowed": "Dir däerft dës Säit net benotzen",
+       "changecredentials-submit": "Änneren",
+       "changecredentials-success": "Är Idendifikatiounsinformatioune goufe geännert.",
+       "removecredentials-submit": "Ewechhuelen",
+       "credentialsform-account": "Numm vum Kont:",
+       "cannotlink-no-provider-title": "Et gëtt keng Benotzerkonte fir ze verlinken",
+       "linkaccounts": "Benotzerkonte verbannen",
+       "linkaccounts-submit": "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 3eb98b1..070ad89 100644 (file)
        "password-change-forbidden": "Šajā wiki paroles nevar mainīt.",
        "externaldberror": "Notikusi vai nu ārējās autentifikācijas datubāzes kļūda, vai arī tev nav atļauts izmainīt savu ārējo kontu.",
        "login": "Pieslēgties",
+       "login-security": "Apstiprini savu identitāti",
        "nav-login-createaccount": "Izveidot jaunu lietotāju vai doties iekšā",
        "userlogin": "Izveidot jaunu lietotāju vai doties iekšā",
        "userloginnocreate": "Pieslēgties",
        "retypenew": "Atkārto jauno paroli",
        "resetpass_submit": "Uzstādīt paroli un ieiet",
        "changepassword-success": "Jūsu parole tika nomainīta veiksmīgi!",
+       "botpasswords": "Botu paroles",
+       "botpasswords-createnew": "Izveidot jaunu bota paroli",
+       "botpasswords-editexisting": "Rediģētu esošu bota paroli",
        "botpasswords-label-appid": "Bota nosaukums:",
        "botpasswords-label-create": "Izveidot",
        "botpasswords-label-update": "Atjaunināt",
        "botpasswords-label-resetpassword": "Atiestatīt paroli",
        "botpasswords-label-restrictions": "Lietošanas ierobežojumi:",
        "botpasswords-label-grants-column": "Piešķirts",
+       "botpasswords-deleted-title": "Bota parole dzēsta",
        "resetpass_forbidden": "Paroles nav iespējams nomainīt",
        "resetpass-no-info": "Jums ir nepieciešams ieiet, lai tūlīt piekļūtu šai lapai.",
        "resetpass-submit-loggedin": "Mainīt paroli",
        "minoredit": "Maznozīmīgs labojums",
        "watchthis": "Uzraudzīt šo lapu",
        "savearticle": "Saglabāt lapu",
+       "publishpage": "Saglabāt lapu",
        "preview": "Pirmskats",
        "showpreview": "Rādīt pirmskatu",
        "showdiff": "Rādīt izmaiņas",
        "userpage-userdoesnotexist": "Lietotājs \"<nowiki>$1</nowiki>\" nav reģistrēts.\nLūdzu, pārliecinies vai vēlies izveidot/izmainīt šo lapu.",
        "userpage-userdoesnotexist-view": "Dalībnieks \"$1\" nav reģistrēts.",
        "blocked-notice-logextract": "Šis dalībnieks pašlaik ir nobloķēts.\n\nPēdējais bloķēšanas reģistra ieraksts ir apskatāms zemāk:",
-       "clearyourcache": "'''Piezīme:''' Lai redzētu izmaiņas, pēc saglabāšanas jums var nākties iztīrīt sava pārlūka kešatmiņu.\n* '''Firefox / Safari:''' Pieturiet ''Shift'' un klikšķiniet uz ''Pārlādēt'' vai nospiediet ''Ctrl-F5'' vai ''Ctrl-R'' (''Command-R'' uz Mac)\n* '''Google Chrome:''' Nospiediet ''Ctrl-Shift-R'' (''Command-Shift-R'' uz Mac)\n* '''Internet Explorer:''' Pieturiet ''Ctrl'' un klikšķiniet uz ''Pārlādēt'' vai nospiediet ''Ctrl-F5''\n* '''Konqueror:''' Klikšķiniet uz ''Pārlādēt'' vai nospiediet ''F5''\n* '''Opera:''' Iztīriet kešatmiņu ''Tools → Preferences''",
+       "clearyourcache": "<strong>Piezīme:</strong> Lai redzētu izmaiņas, pēc saglabāšanas var nākties iztīrīt sava pārlūka kešatmiņu.\n* <strong>Firefox / Safari:</strong> Pieturi <em>Shift</em> un klikšķini uz <em>Pārlādēt</em> vai nospied <em>Ctrl-F5</em> vai <em>Ctrl-R</em> (<em>⌘-R</em> uz Mac)\n* <strong>Google Chrome:</strong> Nospied <em>Ctrl-Shift-R</em> (<em>⌘-Shift-R</em> uz Mac)\n* <strong>Internet Explorer:</strong> Pieturi <em>Ctrl</em> un klikšķini uz <em>Pārlādēt</em> vai nospied <em>Ctrl-F5</em>\n* <strong>Opera:</strong> Dodies uz <em>Menu → Settings</em> (<em>Opera → Preferences</em> uz Mac) un pēc tam uz <em>Privacy & security → Clear browsing data → Cached images and files</em>.",
        "usercssyoucanpreview": "'''Ieteikums:''' Lieto pogu \"{{int:showpreview}}\", lai pārbaudītu savu jauno CSS pirms saglabāšanas.",
        "userjsyoucanpreview": "'''Ieteikums:''' Lieto pogu \"{{int:showpreview}}\", lai pārbaudītu savu jauno JavaScript pirms saglabāšanas.",
        "usercsspreview": "'''Atceries, ka šis ir tikai tava dalībnieka CSS pirmskats, lapa vēl nav saglabāta!'''",
        "right-editusercssjs": "Izmainīt citu dalībnieku CSS un JS failus",
        "right-editusercss": "Izmainīt citu dalībnieku CSS failus",
        "right-edituserjs": "Izmainīt citu dalībnieku JS failus",
+       "right-editmyusercss": "Rediģējiet savus dalībnieka CSS failus",
+       "right-editmyuserjs": "Rediģējiet savus dalībnieka JavaScript failus",
        "right-viewmywatchlist": "Apskatīt savu uzraugāmo rakstu sarakstu",
        "right-rollback": "Ātri veikt atriti pēdējā dalībnieka labojumiem, kas veica izmaiņas kādā konkrētā lapā",
        "right-markbotedits": "Atzīmēt labojumus, kam veikta atrite, kā bota labojumus",
        "right-siteadmin": "Bloķēt un atbloķēt datubāzi",
        "right-sendemail": "Sūtīt e-pastu citiem dalībniekiem",
        "right-passwordreset": "Apskatīt paroles atiestatīšanas e-pasta ziņojumus",
+       "grant-group-email": "Sūtīt e-pastu",
+       "grant-createaccount": "Izveidot kontu",
        "newuserlogpage": "Jauno dalībnieku reģistrs",
        "newuserlogpagetext": "Jauno lietotājvārdu reģistrs.",
        "rightslog": "Dalībnieku tiesību reģistrs",
        "upload-form-label-infoform-description": "Apraksts",
        "upload-form-label-usage-title": "Pielietojums",
        "upload-form-label-usage-filename": "Faila nosaukums",
+       "upload-form-label-infoform-categories": "Kategorijas",
+       "upload-form-label-infoform-date": "Datums",
        "backend-fail-stream": "Nevar straumēt failu $1.",
        "backend-fail-backup": "Nevar dublēt failu $1.",
        "backend-fail-notexists": "Fails $1 nepastāv.",
        "apisandbox": "API smilškaste",
        "apisandbox-api-disabled": "API ir atspējots šajā tīmekļa vietnē.",
        "apisandbox-reset": "Notīrīt",
+       "apisandbox-retry": "Mēģināt vēlreiz",
        "apisandbox-examples": "Piemēri",
        "apisandbox-results": "Rezultāti",
        "apisandbox-request-url-label": "Pieprasījuma URL:",
        "whatlinkshere-hidelinks": "$1 saites",
        "whatlinkshere-hideimages": "$1 failu saites",
        "whatlinkshere-filters": "Filtri",
+       "whatlinkshere-submit": "Aiziet",
        "autoblockid": "Autobloķēšana #$1",
        "block": "Bloķēt dalībnieku",
        "unblock": "Atbloķēt lietotāju",
        "confirm-watch-button": "Labi",
        "confirm-watch-top": "Pievienot šo lapu uzraugāmo lapu sarakstam?",
        "confirm-unwatch-button": "Labi",
+       "confirm-rollback-button": "Labi",
        "imgmultipageprev": "← iepriekšējā lapa",
        "imgmultipagenext": "nākamā lapa →",
        "imgmultigo": "Aiziet!",
        "imgmultigoto": "Iet uz lapu $1",
        "img-lang-default": "(noklusējuma valoda)",
+       "img-lang-go": "Aiziet",
        "ascending_abbrev": "pieaug.",
        "descending_abbrev": "dilst.",
        "table_pager_next": "Nākamā lapa",
        "version-libraries-license": "Licence",
        "version-libraries-description": "Apraksts",
        "version-libraries-authors": "Autori",
+       "redirect-submit": "Aiziet",
        "redirect-value": "Vērtība:",
        "redirect-user": "Lietotāja ID",
        "redirect-page": "Lapas ID",
        "expand_templates_preview": "Pirmskats",
        "pagelang-name": "Lapa",
        "pagelang-language": "Valoda",
+       "pagelang-select-lang": "Izvēlieties valodu",
+       "pagelang-submit": "Iesniegt",
+       "mediastatistics-table-mimetype": "MIME tips",
+       "mediastatistics-table-count": "Failu skaits",
+       "mediastatistics-table-totalbytes": "Kopējais izmērs",
+       "mediastatistics-header-unknown": "Nav zināms",
+       "mediastatistics-header-bitmap": "Bitmap attēli",
+       "mediastatistics-header-drawing": "Zīmējumi (vector attēli)",
        "mediastatistics-header-audio": "Audio",
+       "mediastatistics-header-video": "Video",
+       "mediastatistics-header-total": "Visi faili",
        "special-characters-group-latin": "Latīņu",
        "special-characters-group-latinextended": "Latīņu (papildus)",
        "special-characters-group-ipa": "IPA",
        "special-characters-group-symbols": "Simboli",
        "special-characters-group-greek": "Grieķu",
+       "special-characters-group-greekextended": "Grieķu paplašināta",
        "special-characters-group-cyrillic": "Kirilica",
        "special-characters-group-arabic": "Arābu",
        "special-characters-group-persian": "Persiešu",
        "special-characters-group-gujarati": "Gudžarati",
        "mw-widgets-dateinput-no-date": "Nav izvēlēts datums",
        "mw-widgets-titleinput-description-new-page": "lapa vēl nepastāv",
-       "api-error-blacklisted": "Lūdzu, izvēlieties citu, aprakstošu nosaukumu!"
+       "api-error-blacklisted": "Lūdzu, izvēlieties citu, aprakstošu nosaukumu!",
+       "authmanager-email-label": "E-pasts",
+       "authmanager-email-help": "E-pasta adrese",
+       "authmanager-realname-label": "Tavs īstais vārds",
+       "authmanager-realname-help": "Dalībnieka īstais vārds",
+       "authprovider-resetpass-skip-label": "Izlaist",
+       "specialpage-securitylevel-not-allowed-title": "Nav atļauts"
 }
index c968a69..4348976 100644 (file)
        "loginsuccesstitle": "सम्प्रवेश भएल",
        "loginsuccess": "'''अहाँ सम्प्रवेश केलहुँ {{SITENAME}} \"$1\".'''क रूपमे।",
        "nosuchuser": "\"$1\" नामसँ कोनो प्रयोक्ता नै अछि।\nप्रयोक्तानाम ब्रह्मक्षर-लघ्वक्षर भेद युक्त अछि।\nअपन ह्रिजै जाँची, वा [[Special:CreateAccount|नव खाता बनाबी]] ।",
-       "nosuchusershort": "\"$1\" à¤¨à¤¾à¤®à¥\8dना कोनो प्रयोक्ता नै अछि।\nअपन हिजए सुधारी।",
+       "nosuchusershort": "\"$1\" à¤¨à¤¾à¤®à¤\95 कोनो प्रयोक्ता नै अछि।\nअपन हिजए सुधारी।",
        "nouserspecified": "अहाँक एकटा प्रयोक्तानाम देबऽ पडत।",
        "login-userblocked": "ई प्रयोक्ता प्रतिबन्धित अछि। सम्प्रवेशक अधिकार नै अछि।",
-       "wrongpassword": "à¤\97लत à¤\95à¥\82à¤\9fशबà¥\8dद à¤¦à¥\87ल à¤\97à¥\87ल।\nफà¥\87रसà¤\81 à¤ªà¥\8dरयास à¤\95रà¥\82।",
-       "wrongpasswordempty": "रिà¤\95à¥\8dत à¤\95à¥\82à¤\9fशबà¥\8dद à¤¦à¥\87ल à¤\97à¥\87ल।\nफà¥\87रसà¤\81 à¤ªà¥\8dरयास à¤\95रà¥\82।",
+       "wrongpassword": "à¤\97लत à¤\95à¥\82à¤\9fशबà¥\8dद à¤¦à¥\87ल à¤\97à¥\87ल।\nफà¥\87रसà¤\81 à¤ªà¥\8dरयास à¤\95रà¥\80।",
+       "wrongpasswordempty": "रिà¤\95à¥\8dत à¤\95à¥\82à¤\9fशबà¥\8dद à¤¦à¥\87ल à¤\97à¥\87ल।\nफà¥\87रसà¤\81 à¤ªà¥\8dरयास à¤\95रà¥\80।",
        "passwordtooshort": "कूटशब्द कमसँ कम {{PLURAL:$1|1 वर्ण|$1 वर्णक}} हुअए।",
        "passwordtoolong": "कुटशब्द kuttsabda {{PLURAL:$1|1 वर्ण|$1 वर्णों}} से बेसी नम्हर भ्या सकएत अछि।",
        "passwordtoopopular": "आम पासवर्ड अहाँ नै चुनि सकएत अछि। कृपया अनोखा पासवर्ड चुनी।",
        "password-name-match": "अहाँक कूटशब्द अहाँक प्रयोक्तानामसँ भिन्न हेबाक चाही।",
        "password-login-forbidden": "ऐ प्रयोक्तानाम आ कूटशब्दक प्रयोग प्रतिबन्धित अछि।",
-       "mailmypassword": "नà¥\82तन à¤\95à¥\82à¤\9fशबà¥\8dद à¤\88-पतà¥\8dरसà¤\81 à¤ªà¤ à¤¾à¤\89",
-       "passwordremindertitle": "नव अस्थायी कूटशब्द {{अन्तर्जाल-पता}} लेल।",
-       "passwordremindertext": "कियो (सम्भवतः अहाँ, अनिकेत $1 सँ) एकटा नव कूटशब्दक आग्रह {{अन्तर्जाल}} ($4) लेल केलौं। एकटा अस्थायी कूटशब्द प्रयोक्ता \"$2\" लेल बनाओल गेल अछि आ \"$3\" रूपमे स्थापित कएल गेल अछि। जँ ई अहाँक इच्छा अछि तँ अहाँकेँ सम्प्रवेश करए पड़त आ एकटा नव कूटशब्दक चुनाव करए पड़त। \nअहाँक अस्थायी कूटशब्द खतम भऽ जाएत {{PLURAL:$5|एक दिन|$5 दिन}} मे।",
-       "noemail": "पà¥\8dरयà¥\8bà¤\95à¥\8dता \"$1\" à¤²à¥\87ल à¤\95à¥\8bनà¥\8b à¤\88-पतà¥\8dर à¤¸à¤\82केत दर्ज नै अछि।",
-       "noemailcreate": "अहाँकेँ एकटा मान्य ई-पत्र संकेत देबऽ पड़त।",
-       "passwordsent": "à¤\8fà¤\95à¤\9fा à¤¨à¤µ à¤\95à¥\82à¤\9fशबà¥\8dद \"$1\" à¤²à¥\87ल à¤ªà¤\82à¤\9cà¥\80à¤\95à¥\83त à¤\88-पतà¥\8dर à¤¸à¤\82à¤\95à¥\87तपर à¤ªà¤ à¤¾à¤\8fल à¤\97à¥\87ल à¤\85à¤\9bि।\nà¤\9cà¤\96न à¤\85हाà¤\81à¤\95à¥\87à¤\81 à¤\88 à¤­à¥\87à¤\9fà¥\88à¤\8f à¤¤à¤\81 à¤«à¥\87रसà¤\81 à¤¸à¤®à¥\8dपà¥\8dरवà¥\87श à¤\95रà¥\82।",
+       "mailmypassword": "नà¥\82तन à¤\95à¥\82à¤\9fशबà¥\8dद à¤\88-पतà¥\8dरसà¤\81 à¤ªà¤ à¤¾à¤¬à¥\80",
+       "passwordremindertitle": "{{SITENAME}}क लेल नव अस्थायी कूटशब्द",
+       "passwordremindertext": "कियो (सम्भवतः अहाँ, अनिकेत $1 सँ) एकटा नव कूटशब्दक आग्रह {{SITENAME}} ($4) केनए अछि। एकटा अस्थायी कूटशब्द प्रयोक्ता \"$2\" लेल बनाओल गेल अछि आ \"$3\" रूपमे स्थापित कएल गेल अछि। जँ ई अहाँक इच्छा अछि तँ अहाँक सम्प्रवेश करए पडत आ एकटा नव कूटशब्दक चुनाव करए पडत। \nअहाँक अस्थायी कूटशब्द खतम भऽ जाएत {{PLURAL:$5|एक दिन|$5 दिन}} मे।",
+       "noemail": "पà¥\8dरयà¥\8bà¤\95à¥\8dता \"$1\" à¤²à¥\87ल à¤\95à¥\8bनà¥\8b à¤\88-पतà¥\8dर à¤¸à¤\99à¥\8dकेत दर्ज नै अछि।",
+       "noemailcreate": "अहाँक एकटा मान्य ई-पत्र सङ्केत देबऽ पडत।",
+       "passwordsent": "à¤\8fà¤\95à¤\9fा à¤¨à¤µ à¤\95à¥\82à¤\9fशबà¥\8dद \"$1\" à¤²à¥\87ल à¤ªà¤\9eà¥\8dà¤\9cà¤\9cà¥\80à¤\95à¥\83त à¤\88-पतà¥\8dर à¤¸à¤\99à¥\8dà¤\95à¥\87तपर à¤ªà¤ à¤¾à¤\8fल à¤\97à¥\87ल à¤\85à¤\9bि।\nà¤\9cà¤\96न à¤\85हाà¤\81à¤\95 à¤\88 à¤­à¥\87à¤\9fà¥\88à¤\8f à¤¤à¤\81 à¤«à¥\87रसà¤\81 à¤¸à¤®à¥\8dपà¥\8dरवà¥\87श à¤\95रà¥\80।",
        "blocked-mailpassword": "अहाँक अनिकेत सम्पादन लेल प्रतिबन्धित अछि, आ दुरुपयोग रोकबा लेल कुटशब्द प्रत्याहरण सेवा ई लेल उपलब्ध नै अछि।",
        "eauthentsent": "एकटा पावती ई-पत्र निर्धारित ई-पत्र संकेतपर पठा देल गेल अछि।\nऐ खातापर कोनो दोसर ई-पत्र पठाएल जएबासँ पहिने, अहाँकेँ ऐ ई-पत्रक निर्देशक पालन करए पड़त, जइसँ ई पुष्ट भऽ सकए जे ई खाता वास्तवमे अहींक अछि।",
        "throttled-mailpassword": "एकटा कूटशब्द स्मारक पहिनहिये पठाएल गेल अछि, {{PLURAL:$1|घण्टा|$1 घण्टा}}क भीतर।\nदुरुपयोग रोकबा लेल, मात्र एकटा कूटशब्द {{PLURAL:$1|घण्टा|$1 घण्टा}}मे पठाएल जाएत।",
        "mailerror": "ई-पत्र पठेबामे त्रुटी: $1",
        "acct_creation_throttle_hit": "अहाँके आइ॰पि. पतासँ आएल आगंतुक चौबीस घण्टा सँ बैसी ई विकिमे {{PLURAL:$1|एक खाता|$1 खाता}} बनौलक अछि, इ समयावधिमे ई अधिकतम सिमा छी। अतः अखन ई आइ॰पि. पताके प्रयोग करए वाला आगंतुक आर कोनो खाता नै खोइल सकएत अछि ।",
-       "emailauthenticated": "à¤\85हाà¤\81à¤\95 à¤\88-पतà¥\8dर à¤¸à¤\82à¤\95à¥\87त $2 à¤\95à¥\87à¤\81 $3 बजे सत्यापित भेल।",
-       "emailnotauthenticated": "à¤\85हाà¤\81à¤\95 à¤\88-पतà¥\8dर à¤¸à¤\82à¤\95à¥\87त à¤\85à¤\96न à¤§à¤°à¤¿ à¤¸à¤¤à¥\8dयापित à¤¨à¥\88 à¤­à¥\87ल à¤\85à¤\9bि।\nनिà¤\9aा à¤¦à¥\87ल à¤\97à¥\87ल à¤\95à¥\8bनà¥\8b à¤¸à¥\81विधा à¤\95à¥\87 à¤²à¥\87ल à¤\85हाà¤\81à¤\95à¥\87 ई-पत्र नै भेजल जाएत।",
-       "noemailprefs": "à¤\87 à¤¸à¥\81विधा à¤¸à¤­ à¤\95ऽ à¤ªà¥\8dरयà¥\8bà¤\97 à¤\95रà¤\8f à¤\95à¥\87 à¤²à¥\87ल à¤\85पन à¤µà¤¿à¤\95लà¥\8dपमà¥\87 à¤\88-पतà¥\8dर à¤ªà¤¤à¤¾ à¤°à¤¾à¤\96à¥\81।",
-       "emailconfirmlink": "à¤\85पन à¤\88-पतà¥\8dर à¤¸à¤\82à¤\95à¥\87त à¤¸à¤¤à¥\8dयापित à¤\95रà¥\81",
-       "invalidemailaddress": "à¤\85मानà¥\8dय à¤ªà¥\8dरारà¥\82पà¤\95 à¤\95ारण à¤\90 à¤\88-पतà¥\8dर à¤¸à¤\82à¤\95à¥\87तà¤\95à¥\87à¤\81 à¤¸à¥\8dवà¥\80à¤\95ार à¤¨à¥\88 à¤\95à¤\8fल à¤\9cा à¤¸à¤\95à¥\88à¤\8f।\nà¤\8fà¤\95à¤\9fा à¤®à¤¾à¤¨à¥\8dय à¤\88-पतà¥\8dर à¤¸à¤\82à¤\95à¥\87त à¤²à¤¿à¤\96à¥\82 à¤µà¤¾ à¤\93à¤\87 à¤¸à¥\8dथानà¤\95à¥\87à¤\81 à¤\96ालà¥\80 à¤\95रà¥\81।",
-       "cannotchangeemail": "à¤\96ाता à¤\88-पतà¥\8dर à¤¸à¤\82केत ऐ विकिपर बदलल नै जा सकैए।",
+       "emailauthenticated": "à¤\85हाà¤\81à¤\95 à¤\88-पतà¥\8dर à¤¸à¤\99à¥\8dà¤\95à¥\87त $2 à¤\95 $3 बजे सत्यापित भेल।",
+       "emailnotauthenticated": "à¤\85हाà¤\81à¤\95 à¤\88-पतà¥\8dर à¤¸à¤\99à¥\8dà¤\95à¥\87त à¤\85à¤\96न à¤§à¤°à¤¿ à¤¸à¤¤à¥\8dयापित à¤¨à¥\88 à¤­à¥\87ल à¤\85à¤\9bि।\nनिà¤\9aा à¤¦à¥\87ल à¤\97à¥\87ल à¤\95à¥\8bनà¥\8b à¤¸à¥\81विधाà¤\95 à¤²à¥\87ल à¤\85हाà¤\81à¤\95 ई-पत्र नै भेजल जाएत।",
+       "noemailprefs": "à¤\88 à¤¸à¥\81विधा à¤¸à¤­ à¤\95ऽ à¤ªà¥\8dरयà¥\8bà¤\97 à¤\95रà¤\8fà¤\95 à¤²à¥\87ल à¤\85पन à¤µà¤¿à¤\95लà¥\8dपमà¥\87 à¤\88-पतà¥\8dर à¤ªà¤¤à¤¾ à¤°à¤¾à¤\96à¥\80।",
+       "emailconfirmlink": "à¤\85पन à¤\88-पतà¥\8dर à¤¸à¤\99à¥\8dà¤\95à¥\87त à¤¸à¤¤à¥\8dयापित à¤\95रà¥\80",
+       "invalidemailaddress": "à¤\85मानà¥\8dय à¤ªà¥\8dरारà¥\82पà¤\95 à¤\95ारण à¤\90 à¤\88-पतà¥\8dर à¤¸à¤\99à¥\8dà¤\95à¥\87तà¤\95 à¤¸à¥\8dवà¥\80à¤\95ार à¤¨à¥\88 à¤\95à¤\8fल à¤\9cा à¤¸à¤\95à¥\88à¤\8f।\nà¤\8fà¤\95à¤\9fा à¤®à¤¾à¤¨à¥\8dय à¤\88-पतà¥\8dर à¤¸à¤\99à¥\8dà¤\95à¥\87त à¤²à¤¿à¤\96à¥\80 à¤µà¤¾ à¤\93à¤\87 à¤¸à¥\8dथानà¤\95à¥\87 à¤\96ालà¥\80 à¤\95रà¥\80।",
+       "cannotchangeemail": "à¤\96ाता à¤\88-पतà¥\8dर à¤¸à¤\99à¥\8dकेत ऐ विकिपर बदलल नै जा सकैए।",
        "emaildisabled": "ई अन्तर्जाल ई-पत्र नै पठाएत।",
        "accountcreated": "खाता खुजि गेल",
        "accountcreatedtext": "[[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|वार्ता]]) के लेल खाता खोलल गेल अछि।",
        "php-mail-error-unknown": "पी.एच.पी.कऽ समाद कार्य() मे अज्ञात दोष भेल।",
        "user-mail-no-addy": "बिन ई-पत्र संकेतक ई-पत्र पठेबाक प्रयास कएल गेल।",
        "user-mail-no-body": "एकटा खाली वा बहुत कनिका ई-पत्र भेजवाक प्रयास कल गेल।",
-       "changepassword": "à¤\95à¥\82à¤\9fशबà¥\8dद à¤¬à¤¦à¤²à¥\82",
-       "resetpass_announce": "समà¥\8dपà¥\8dरवà¥\87श à¤¸à¤®à¥\8dपà¥\82रà¥\8dण à¤\95रबा à¤²à¥\87ल, à¤\85हाà¤\81 à¤\8fà¤\95à¤\9fा à¤¨à¤µ à¤\95à¥\82à¤\9fशबà¥\8dद à¤\8fतà¤\8f à¤¨à¤¿à¤°à¥\8dधारित à¤\95रà¥\81।",
+       "changepassword": "à¤\95à¥\82à¤\9fशबà¥\8dद à¤¬à¤¦à¤²à¥\80",
+       "resetpass_announce": "समà¥\8dपà¥\8dरवà¥\87श à¤¸à¤®à¥\8dपà¥\82रà¥\8dण à¤\95रबा à¤²à¥\87ल, à¤\85हाà¤\81 à¤\8fà¤\95à¤\9fा à¤¨à¤µ à¤\95à¥\82à¤\9fशबà¥\8dद à¤\8fतà¤\8f à¤¨à¤¿à¤°à¥\8dधारित à¤\95रà¥\80।",
        "resetpass_text": "<!-- पाठ एतऽ लिखू -->",
-       "resetpass_header": "à¤\96ाता à¤\95à¥\82à¤\9fशबà¥\8dद à¤¬à¤¦à¤²à¥\82",
+       "resetpass_header": "à¤\96ाता à¤\95à¥\82à¤\9fशबà¥\8dद à¤¬à¤¦à¤²à¥\80",
        "oldpassword": "पुरान कूटशब्द",
        "newpassword": "नव कूटशब्द",
-       "retypenew": "नव à¤\95à¥\82à¤\9fशबà¥\8dद à¤«à¥\87रसà¤\81 à¤\9fà¤\82à¤\95ित à¤\95रà¥\82",
-       "resetpass_submit": "à¤\95à¥\82à¤\9fशबà¥\8dद à¤¬à¤¨à¤¾à¤\89 à¤\86 à¤¸à¤®à¥\8dपà¥\8dरवà¥\87श à¤\95रà¥\82",
-       "changepassword-success": "à¤\85हाà¤\81à¤\95 à¤ªà¤¾à¤¸à¤µà¤°à¥\8dड सफलतासँ बदलि देल गेल!",
-       "changepassword-throttled": "à¤\85हाà¤\81 à¤¢à¤¼à¥\87र à¤°à¤¾à¤¸ à¤¸à¤®à¥\8dपà¥\8dरवà¥\87श à¤ªà¥\8dरयास à¤\95à¥\87लहà¥\81à¤\81।\nफà¥\87र à¤ªà¥\8dरयास $1 à¤\95रबासà¤\81 à¤ªà¤¹à¤¿à¤¨à¥\87 à¤\95नà¥\87 à¤\95ाल à¤¥à¤®à¥\8dहà¥\82।",
+       "retypenew": "नव à¤\95à¥\82à¤\9fशबà¥\8dद à¤«à¥\87रसà¤\81 à¤\9fà¤\82à¤\95ित à¤\95रà¥\80",
+       "resetpass_submit": "à¤\95à¥\82à¤\9fशबà¥\8dद à¤¬à¤¨à¤¾à¤\89 à¤\86 à¤¸à¤®à¥\8dपà¥\8dरवà¥\87श à¤\95रà¥\80",
+       "changepassword-success": "à¤\85हाà¤\81à¤\95 à¤\95à¥\82à¤\9fशबà¥\8dद सफलतासँ बदलि देल गेल!",
+       "changepassword-throttled": "अहाँ ढेर रास सम्प्रवेश प्रयास केलहुँ।\nफेर प्रयास $1 करबासँ पहिने कने काल थम्हू।",
        "botpasswords": "बोट पासवर्ड",
        "botpasswords-disabled": "बोट पासवर्ड अखन निष्क्रिय अछि।",
        "botpasswords-no-central-id": "बोट पासवर्डक उपयोग करएक लेल अहाँक मुख्य खातासँ प्रवेश करै पडत।",
        "resetpass-expired": "अहाँके कूटशब्दक वैधता अवधि खत्तम भऽ गेल अछि । कृपया सम्प्रवेशित करवाक लेल नयाँ कूटशब्द राखु।",
        "resetpass-expired-soft": "अहाँके कूटशब्दकऽ वैधता अवधि समाप्त भऽ गेल आर कूटशब्द परिवार्तान करवाक आवश्यकता अछि। कृपया एगो नव कूटशब्द राखु, वा पाछु रिसेट करवाक लेल \"{{int:resetpass-submit-cancel}}\" क्लिक करु।",
        "resetpass-validity-soft": "अहाँके कूटशब्द मान्य नै अछि: $1 \n\nकृपया आब एगो नव कूटशब्द चुनु, वा पाछु पुनर्स्थापित करए के लेल \"{{int:resetpass-submit-cancel}}\" में क्लिक करू।",
-       "passwordreset": "à¤\95à¥\82à¤\9fशबà¥\8dद à¤«à¥\87रसà¤\81 à¤¬à¤¨à¤¾à¤\89",
-       "passwordreset-text-one": "à¤\85पन à¤\95à¥\82à¤\9fशबà¥\8dद à¤°à¥\80सà¥\87à¤\9f à¤\95रवाà¤\95 à¤²à¥\87ल à¤\87 à¤«à¤¾à¤°à¤® à¤­à¤°à¥\81 ।",
-       "passwordreset-text-many": "{{PLURAL:$1|à¤\88-पतà¥\8dरà¤\95à¥\87 à¤®à¤¾à¤§à¥\8dयमसऽ à¤\8fà¤\95à¤\9fा à¤\85सà¥\8dथायà¥\80 à¤\95à¥\82à¤\9fशबà¥\8dद à¤ªà¤¾à¤µà¥\88लà¥\87ल à¤\95à¥\8bनà¥\8b à¤\8fà¤\95à¤\9fा à¤¡à¤¿à¤¬à¥\8dबा à¤­à¤°à¥\81 ।}}",
+       "passwordreset": "à¤\95à¥\82à¤\9fशबà¥\8dद à¤«à¥\87रसà¤\81 à¤¬à¤¨à¤¾à¤¬à¥\80",
+       "passwordreset-text-one": "à¤\85पन à¤\95à¥\82à¤\9fशबà¥\8dद à¤°à¥\80सà¥\87à¤\9f à¤\95रवाà¤\95 à¤²à¥\87ल à¤\87 à¤«à¤¾à¤°à¤® à¤­à¤°à¥\80।",
+       "passwordreset-text-many": "{{PLURAL:$1|à¤\88-पतà¥\8dरà¤\95à¥\87 à¤®à¤¾à¤§à¥\8dयमसऽ à¤\8fà¤\95à¤\9fा à¤\85सà¥\8dथायà¥\80 à¤\95à¥\82à¤\9fशबà¥\8dद à¤ªà¤¾à¤µà¥\88लà¥\87ल à¤\95à¥\8bनà¥\8b à¤\8fà¤\95à¤\9fा à¤¡à¤¿à¤¬à¥\8dबा à¤­à¤°à¥\80।}}",
        "passwordreset-disabled": "कूटशब्द फेरसँ बनाएब ऐ विकीपर अक्षम कएल अछि।",
        "passwordreset-emaildisabled": "कूटशब्द फेरसँ बनाएब ऐ विकीपर अक्षम कएल अछि।",
        "passwordreset-username": "प्रयोक्तानाम",
        "passwordreset-capture": "परिणाम ई-पत्र देखू?",
        "passwordreset-capture-help": "जँ अहाँ ऐ बक्शाकेँ देखै छी, ई-पत्र (तात्कालिक कूटशब्दक संग) अहाँकेँ देखाएल जाएत आ संगे प्रयोक्ताकेँ पठाएल जाएत।",
        "passwordreset-email": "ई-पत्र संकेत",
-       "passwordreset-emailtitle": "लेखा विवरण {{अन्तर्जालक नाम}}",
-       "passwordreset-emailtext-ip": "कियो (सम्भवतः अहाँ, अन्तर्जाल सेवा कल्पक $1 सँ) अपन लेखा विवरणक पुनःस्मरणक लेल अनुरोध केलहुँ ऐ लेल {{ अन्तर्जालक नाम}} ($4). ई प्रयोक्ता {{PLURAL:$3|लेखा अछि| लेखा सभ अछि}}\nऐ ई-पत्र संकेतसँ सम्बन्धित:\n\n$2\n\n{{PLURAL:$3|ई अल्पकालक कूटशब्द| ई सभ अल्पकालक कूटशब्द}} खतम भऽ जाएत {{PLURAL:$5|एक दिन|$5 पाँच दिन}}.\nअहाँ सम्प्रवेश करू आ एकटा नव कूटशब्द चुनू।. जौं कियो आन ई आग्रह केने अछि, वा अहाँकेँ अपन पुरान कूटशब्द मोन पड़ि गेल अछि , आ आब एकरा बदलबाक इच्छा नै राखै छी तँ अहाँ ऐ संदेशकेँ बिसरि जाउ आ अपन पुरान कूटशब्दक प्रयोग करैत रहू।",
+       "passwordreset-emailtitle": "{{SITENAME}} पर लेखा विवरण",
+       "passwordreset-emailtext-ip": "कियो (सम्भवतः अहाँ, अन्तर्जाल सेवा कल्पक $1 सँ) अपन लेखा विवरणक पुनःस्मरणक लेल अनुरोध केलहुँ ऐ लेल {{SITENAME}} ($4). ई प्रयोक्ता {{PLURAL:$3|लेखा अछि|लेखा सभ अछि}}\nऐ ई-पत्र संकेतसँ सम्बन्धित:\n\n$2\n\n{{PLURAL:$3|ई अल्पकालक कूटशब्द| ई सभ अल्पकालक कूटशब्द}} खतम भऽ जाएत {{PLURAL:$5|एक दिन|$5 पाँच दिन}}.\nअहाँ सम्प्रवेश करू आ एकटा नव कूटशब्द चुनू।. जौं कियो आन ई आग्रह केने अछि, वा अहाँकेँ अपन पुरान कूटशब्द मोन पड़ि गेल अछि , आ आब एकरा बदलबाक इच्छा नै राखै छी तँ अहाँ ऐ संदेशकेँ बिसरि जाउ आ अपन पुरान कूटशब्दक प्रयोग करैत रहू।",
        "passwordreset-emailtext-user": "प्रयोक्ता $1 {{अन्तर्जाल}} पर अहाँक खाता विवरणक {{SITENAME}} लेल फेरसँ ($4) आग्रह केने छथि। ई प्रयोक्ता {{PLURAL:$3|खाता अछि|खाता सभ अछि}} ऐ ई-पत्र संकेतसँ जुड़ल: $2\n{{PLURAL:$3| ई अस्थायी कूटशब्द|ई सभ अस्थायी कूटशब्द}} खतम भऽ जाएत {{PLURAL:$5|एक दिन|$5 दिन}} मे।\nअहाँ सम्प्रवेश करू आ एकटा नव कूटशब्द आब चुनू। जँ कियो दोसर ई आग्रह केने छथि, वा जँ अहाँकेँ अपन मूल कूटशब्द मोन पड़ि गेल अछि, आ अहाँ आब ओइ कूटशब्दकेँ नै बदलऽ चाहै छी, अहाँ ऐ संदेशकेँ बिसरि सकै छी आ अपन पुरान कूटशब्दक प्रयोग जारी राखि सकै छी।",
        "passwordreset-emailelement": "प्रयोक्ता: \n$1\n\nअस्थायी कूटशब्द: \n$2",
        "passwordreset-emailsentemail": "एकटा ई-पत्र मोन पाड़बा लेल पठाओल गेल अछि।",
        "resettokens-token-label": "$1 (वर्तमान मूल्य: $2)",
        "resettokens-watchlist-token": "[[Special:Watchlist|अहाँके साकांक्षसूची के पृष्ठसभ में परिवर्तन सभ]] के वेब फिट (Atom/RSS) लेल स्तोक",
        "resettokens-done": "टोकन रीसेट भेल अछि।",
-       "resettokens-resetbutton": "à¤\9bानल à¤\9fà¥\8bà¤\95न à¤°à¥\80सà¥\87à¤\9f à¤\95रà¥\81",
-       "bold_sample": "à¤\97à¤\81हà¥\80र à¤²à¥\87à¤\96न",
-       "bold_tip": "à¤\97à¤\81हà¥\80र à¤²à¥\87à¤\96न",
+       "resettokens-resetbutton": "à¤\9aà¥\81नल à¤\9fà¥\8bà¤\95न à¤°à¥\80सà¥\87à¤\9f à¤\95रà¥\80",
+       "bold_sample": "मà¥\8bà¤\9f à¤ªà¤¾à¤ ",
+       "bold_tip": "मà¥\8bà¤\9f à¤ªà¤¾à¤ ",
        "italic_sample": "कटि लेखन",
        "italic_tip": "क़टि लेखन",
-       "link_sample": "लिà¤\82à¤\95 à¤\89पाधि",
-       "link_tip": "à¤\85à¤\82तरà¤\82à¤\97 à¤\87शारा",
-       "extlink_sample": "http://www.example.com à¤²à¤¿à¤\82à¤\95 à¤\89पाधि",
-       "extlink_tip": "बहरà¥\80 à¤²à¤¿à¤\82à¤\95 (यादि à¤°à¤¾à¤\96à¥\82 http:// उपसर्ग)",
-       "headline_sample": "मà¥\81à¤\96à¥\8dयपà¤\82à¤\95à¥\8dति à¤²à¥\87à¤\96न",
-       "headline_tip": "सà¥\8dतर 2 à¤®à¥\81à¤\96à¥\8dयपà¤\82à¤\95à¥\8dति",
-       "nowiki_sample": "फà¥\89रà¥\8dमà¥\87à¤\9f à¤µà¤¿à¤¹à¥\80न à¤²à¥\87à¤\96 à¤\8fतय",
-       "nowiki_tip": "विà¤\95à¥\80 à¤«à¥\89रमà¥\87à¤\9fिà¤\82à¤\97à¤\95à¥\87à¤\81 à¤\9bà¥\8bड़à¥\82",
+       "link_sample": "लिà¤\99à¥\8dà¤\95 à¤¶à¥\80रà¥\8dषà¤\95",
+       "link_tip": "à¤\86नà¥\8dतरिà¤\95 à¤²à¤¿à¤\99à¥\8dà¤\95",
+       "extlink_sample": "http://www.example.com à¤²à¤¿à¤\99à¥\8dà¤\95 à¤¶à¥\80रà¥\8dषà¤\95",
+       "extlink_tip": "बाहà¥\8dय à¤²à¤¿à¤\99à¥\8dà¤\95 (यादि à¤°à¤¾à¤\96à¥\80 http:// उपसर्ग)",
+       "headline_sample": "शà¥\80रà¥\8dषà¤\95 à¤ªà¤¾à¤ ",
+       "headline_tip": "दà¥\8dवितà¥\80य-सà¥\8dतर à¤¶à¥\80रà¥\8dषà¤\95",
+       "nowiki_sample": "à¤\85पà¥\8dरारà¥\82पित à¤ªà¤¾à¤  à¤\8fतय à¤°à¤¾à¤\96à¥\80",
+       "nowiki_tip": "विà¤\95à¥\80 à¤ªà¥\8dरारà¥\82पण à¤¨à¤\9cरà¤\85नà¥\8dदाà¤\9c à¤\95रà¥\80",
        "image_sample": "उदाहरण.jpg",
        "image_tip": "समाहित चित्र",
        "media_sample": "उदाहरण.ogg",
        "hr_tip": "अक्षांशीय पंक्ति (अल्प उपयोग)",
        "summary": "सारांश:",
        "subject": "विषय:",
-       "minoredit": "à¤\85लà¥\8dप à¤¸à¤\82पादन",
-       "watchthis": "à¤\8fहि à¤ªà¥\83षà¥\8dठà¤\95à¥\87à¤\81 à¤¦à¥\87à¤\96à¥\82",
-       "savearticle": "पनà¥\8dनाà¤\95 à¤°à¤\95à¥\8dषण à¤\95रà¥\82",
+       "minoredit": "à¤\85लà¥\8dप à¤¸à¤®à¥\8dपादन",
+       "watchthis": "à¤\88 à¤ªà¥\83षà¥\8dठà¤\95à¥\87 à¤§à¥\8dयानसà¥\82à¤\9aà¥\80मà¥\87 à¤°à¤¾à¤\96à¥\80",
+       "savearticle": "पनà¥\8dनाà¤\95 à¤°à¤\95à¥\8dषण à¤\95रà¥\80",
        "preview": "पूर्वावलोकन",
        "showpreview": "पूर्वप्रदर्शन",
-       "showdiff": "परिवरà¥\8dतà¥\8dतन à¤¦à¥\87à¤\96ाà¤\8a",
-       "blankarticle": "<strong>à¤\9aà¥\87तावनà¥\80:</strong> à¤\86हाà¤\81 à¤\8fà¤\95 à¤°à¤¿à¤\95à¥\8dत à¤ªà¤¨à¥\8dना à¤\95à¥\87 à¤¨à¤¿à¤°à¥\8dमाण à¤\95à¤\87र à¤°à¤¹à¤² à¤\9bà¥\80।\nयदि à¤\86हाà¤\81 \"{{int:savearticle}}\" à¤\95à¥\8b à¤ªà¥\81नà¤\83 à¤¦à¤¾à¤¬à¤\88 à¤\9aिà¤\8f à¤¤ à¤ªà¤¨à¥\8dना à¤\95à¥\87 à¤¬à¤¿à¤¨à¤¾ à¤\95à¥\8bनà¥\8b à¤¸à¤¾à¤®à¤\97à¥\8dरà¥\80 à¤\95à¥\87 à¤¨à¤¿à¤°à¥\8dमित à¤\95à¥\8dया à¤¸à¤\95à¥\88à¤\9aिà¤\8f ।",
-       "anoneditwarning": "'''à¤\9aà¥\87तà¥\8cनà¥\80:''' à¤\85हाà¤\81 à¤¸à¤®à¥\8dपà¥\8dरवà¥\87शित à¤¨à¥\88 à¤\9bà¥\80।\nà¤\85हाà¤\81à¤\95 à¤\85निà¤\95à¥\87त à¤\90 पन्नाक सम्पादन इतिहासमे दर्ज कएल जाएत।",
-       "anonpreviewwarning": "'' अहाँ सम्प्रवेशित नै छी। अखन रक्षण केलासँ अहाँक अनिकेत पता ऐ पन्नाक सम्पादन इतिहासमे दर्ज भऽ जाएत।''",
-       "missingsummary": "'''स्मारक:''' अहाँ सम्पादन सार नै देने छी।\nजँ अहाँ फेरसँ क्लिक करब \"{{int:savearticle}}\", अहाँक सम्पादन बिना एकर संरक्षित भऽ जाएत।",
+       "showdiff": "परिवरà¥\8dतन à¤¦à¥\87à¤\96ाबà¥\80",
+       "blankarticle": "<strong>à¤\9aà¥\87तावनà¥\80:</strong> à¤\85हाà¤\81 à¤\8fà¤\95 à¤°à¤¿à¤\95à¥\8dत à¤ªà¤¨à¥\8dना à¤\95à¥\87 à¤¨à¤¿à¤°à¥\8dमाण à¤\95रि à¤°à¤¹à¤² à¤\9bà¥\80।\nयदि à¤\85हाà¤\81 \"{{int:savearticle}}\" à¤\95 à¤ªà¥\81नà¤\83 à¤¦à¤¾à¤¬à¤¬à¥\88 à¤¤ à¤ªà¤¨à¥\8dनाà¤\95 à¤¬à¤¿à¤¨à¤¾ à¤\95à¥\8bनà¥\8b à¤¸à¤¾à¤®à¤\97à¥\8dरà¥\80à¤\95 à¤¨à¤¿à¤°à¥\8dमित à¤­ à¤\9cाà¤\8fत।",
+       "anoneditwarning": "'''à¤\9aà¥\87तà¥\8cनà¥\80:''' à¤\85हाà¤\81 à¤¸à¤®à¥\8dपà¥\8dरवà¥\87शित à¤¨à¥\88 à¤\9bà¥\80।\nà¤\85हाà¤\81à¤\95 à¤\85निà¤\95à¥\87त à¤\88 पन्नाक सम्पादन इतिहासमे दर्ज कएल जाएत।",
+       "anonpreviewwarning": "<em>अहाँ सम्प्रवेशित नै छी। अखन रक्षण केलासँ अहाँक अनिकेत पता ई पन्नाक सम्पादन इतिहासमे दर्ज भऽ जाएत।</em>",
+       "missingsummary": "<strong>स्मारक:</strong> अहाँ सम्पादन सार नै देने छी।\nजँ अहाँ फेरसँ क्लिक करब \"{{int:savearticle}}\", अहाँक सम्पादन बिना एकर संरक्षित भऽ जाएत।",
        "selfredirect": "<strong>चेतावनी:</strong> आहाँ स्वेम के ई पन्ना पुनः निर्देशीत कएर रहल छी।\nआहाँ अनुप्रेषित के लेल गलत लक्ष्य निर्दिष्ट भ्या सकएत अछि, या आहाँ गलत पन्ना कें संपादन कैर सकएत छी।\nआहाँ फेरो से \"{{int:savearticle}}\" क्लिक करएत छी, रीडायरेक्ट ओनाहो भी बनाबल जेल अछि।",
        "missingcommenttext": "कृपा कऽ अपन विचार नीचाँ प्रविष्ट करू।",
        "missingcommentheader": "'''स्मरण:''' अहाँ कोनो विषय/ शीर्षक ऐ टिप्पणीक लेल नै देने छी।\nजँ अहाँ फेरसँ क्लिक करब \"{{int:savearticle}}\" , अहाँक सम्पादन बिना एकर संरक्षित भऽ जाएत।",
        "blockednoreason": "कोनो कारण देल नै अछि।",
        "whitelistedittext": "अहाँकेँ $1पन्ना सम्पादन करबा लेल",
        "confirmedittext": "पन्ना सभक सम्पादन केलासँ पूर्व अहाँ अपन ई-पत्र संकेतकेँ सत्यापित करू।\nकृपा कऽ अपन ई-पत्र पता दर्ज करू आ सत्यापित करू ऐ सँ [[Special:Preferences|प्रयोक्ताक पसिन्न सभ]]",
-       "nosuchsectiontitle": "सà¤\82वरà¥\8dà¤\97 à¤¨à¥\88 à¤¤à¤¾à¤\95ि à¤¸à¤\95ल",
-       "nosuchsectiontext": "à¤\85हाà¤\81 à¤\8fहन à¤¸à¤\82वरà¥\8dà¤\97à¤\95à¥\87à¤\81 सम्पादित करबाक प्रयास केलहुँ जे अछि नै।\nअहाँ जखन ई पन्ना देख रहल छलहुँ तखन ई मेटा देल गेल हएत वा दोसर ठाम हटा देल गेल हएत।",
+       "nosuchsectiontitle": "à¤\8fहन à¤\95à¥\8bनà¥\8b à¤\85नà¥\81भाà¤\97 à¤¶à¥\80रà¥\8dषà¤\95 à¤¨à¥\88 à¤\85à¤\9bि",
+       "nosuchsectiontext": "à¤\85हाà¤\81 à¤\8fहन à¤\85नà¥\81भाà¤\97à¤\95 सम्पादित करबाक प्रयास केलहुँ जे अछि नै।\nअहाँ जखन ई पन्ना देख रहल छलहुँ तखन ई मेटा देल गेल हएत वा दोसर ठाम हटा देल गेल हएत।",
        "loginreqtitle": "सम्प्रवेश आवश्यक",
        "loginreqlink": "सम्प्रवेश",
        "loginreqpagetext": "अहाँ निश्चयरूपेँ $1 दोसर पन्ना देखबाक लेल।",
        "accmailtext": "एकटा बिना क्रमबला निर्माण पद्धतिसँ कूटशब्दक निर्माण [[User talk:$1|$1]] लेल $2 केँ पठाएल गेल अछि।\n\nऐ खाताक कूटशब्द बदलल जा सकैए ''[[Special:ChangePassword|कूटशब्द बदलू]]'' पन्नापर सम्प्रवेश केलाक बाद।",
        "newarticle": "(नव)",
        "newarticletext": "अहाँ एहेन पन्नाक लिंकक अनुसरण कऽ आएल छी जे पन्ना अखन बनले नै अछि।\nपन्ना बनेबाक लेल नीचाँक बक्शामे टाइप केनाइ शुरू करू (देखू [$1  सहायता पन्ना] विषेष जानकारी लेल)।",
-       "anontalkpagetext": "----'' à¤\88 à¤\8fà¤\95à¤\9fा à¤\85नाम à¤ªà¥\8dरयà¥\8bà¤\95à¥\8dताà¤\95 à¤²à¥\87ल à¤µà¤¾à¤°à¥\8dता à¤ªà¤¨à¥\8dना à¤\9bà¥\80 à¤\9cà¥\87 à¤\85à¤\96न à¤§à¤°à¤¿ à¤\85पन à¤\96ाता à¤¨à¥\88 à¤\96à¥\8bलनà¥\87 à¤\9bथि, à¤µà¤¾ à¤\9cà¥\87 à¤\8fà¤\95र à¤ªà¥\8dरयà¥\8bà¤\97 à¤¨à¥\88 à¤\95रà¥\88 à¤\9bथि।\nहमरा à¤¸à¤­à¤\95à¥\87à¤\81 à¤¤à¤\87 à¤²à¥\87ल à¤\85à¤\82à¤\95à¥\80य à¤\85निà¤\95à¥\87तà¤\95 à¤ªà¥\8dरयà¥\8bà¤\97 à¤¹à¥\81नà¤\95ा à¤¦à¥\87à¤\96ार à¤\95रबा à¤²à¥\87ल à¤\95रऽ à¤ªà¤¡à¤¼à¤¿ à¤°à¤¹à¤² à¤\85à¤\9bि।\nà¤\90 à¤¤à¤°à¤¹à¤\95 à¤\85निà¤\95à¥\87त à¤\85नà¥\87à¤\95 à¤ªà¥\8dरयà¥\8bà¤\95à¥\8dता à¤¦à¥\8dवारा à¤¸à¤¾à¤\9dà¥\80 à¤\95à¤\8fल à¤\9cा à¤¸à¤\95à¥\88त à¤\85à¤\9bि।\nà¤\9cà¤\81 à¤\85हाà¤\81 à¤\85नाम à¤ªà¥\8dरयà¥\8bà¤\95à¥\8dता à¤\9bà¥\80 à¤\86 à¤¬à¥\81à¤\9dà¥\88 à¤\9bà¥\80 à¤\9cà¥\87 à¤¬à¤¿à¤¨à¤¾ à¤®à¤¤à¤²à¤¬à¤\95 à¤\9fिपà¥\8dपणà¥\80 à¤\85हाà¤\81 à¤¦à¤¿à¤¸ à¤¦à¥\87ल à¤\9cा à¤°à¤¹à¤² à¤\85à¤\9bि, à¤¤à¤\81 à¤\95à¥\83पा à¤\95ऽ [[Special:CreateAccount|à¤\8fà¤\95à¤\9fा à¤\96ाता à¤\96à¥\8bलà¥\82]] à¤µà¤¾ [[Special:UserLogin|समà¥\8dपà¥\8dरवà¥\87श]] à¤\9cà¤\87सà¤\81 à¤­à¤µà¤¿à¤·à¥\8dयमà¥\87 à¤\86न à¤\85नाम à¤ªà¥\8dरयà¥\8bà¤\95à¥\8dतासà¤\81 à¤\85हाà¤\81à¤\95à¥\87à¤\81 दिक्कत नै हो।''",
+       "anontalkpagetext": "----'' à¤\88 à¤\8fà¤\95à¤\9fा à¤\85नाम à¤ªà¥\8dरयà¥\8bà¤\95à¥\8dताà¤\95 à¤²à¥\87ल à¤µà¤¾à¤°à¥\8dता à¤ªà¤¨à¥\8dना à¤\9bà¥\80 à¤\9cà¥\87 à¤\85à¤\96न à¤§à¤°à¤¿ à¤\85पन à¤\96ाता à¤¨à¥\88 à¤\96à¥\8bलनà¥\87 à¤\9bथि, à¤µà¤¾ à¤\9cà¥\87 à¤\8fà¤\95र à¤ªà¥\8dरयà¥\8bà¤\97 à¤¨à¥\88 à¤\95रà¥\88 à¤\9bथि।\nहमरा à¤¸à¤­à¤\95à¥\87à¤\81 à¤¤à¤\87 à¤²à¥\87ल à¤\85à¤\82à¤\95à¥\80य à¤\85निà¤\95à¥\87तà¤\95 à¤ªà¥\8dरयà¥\8bà¤\97 à¤¹à¥\81नà¤\95ा à¤¦à¥\87à¤\96ार à¤\95रबा à¤²à¥\87ल à¤\95रऽ à¤ªà¤¡à¤¿ à¤°à¤¹à¤² à¤\85à¤\9bि।\nà¤\90 à¤¤à¤°à¤¹à¤\95 à¤\85निà¤\95à¥\87त à¤\85नà¥\87à¤\95 à¤ªà¥\8dरयà¥\8bà¤\95à¥\8dता à¤¦à¥\8dवारा à¤¸à¤¾à¤\9dà¥\80 à¤\95à¤\8fल à¤\9cा à¤¸à¤\95à¥\88त à¤\85à¤\9bि।\nà¤\9cà¤\81 à¤\85हाà¤\81 à¤\85नाम à¤ªà¥\8dरयà¥\8bà¤\95à¥\8dता à¤\9bà¥\80 à¤\86 à¤¬à¥\81à¤\9dà¥\88 à¤\9bà¥\80 à¤\9cà¥\87 à¤¬à¤¿à¤¨à¤¾ à¤®à¤¤à¤²à¤¬à¤\95 à¤\9fिपà¥\8dपणà¥\80 à¤\85हाà¤\81 à¤¦à¤¿à¤¸ à¤¦à¥\87ल à¤\9cा à¤°à¤¹à¤² à¤\85à¤\9bि, à¤¤à¤\81 à¤\95à¥\83पा à¤\95ऽ [[Special:CreateAccount|à¤\8fà¤\95à¤\9fा à¤\96ाता à¤\96à¥\8bलà¥\80]] à¤µà¤¾ [[Special:UserLogin|समà¥\8dपà¥\8dरवà¥\87श]] à¤\9cà¤\87सà¤\81 à¤­à¤µà¤¿à¤·à¥\8dयमà¥\87 à¤\86न à¤\85नाम à¤ªà¥\8dरयà¥\8bà¤\95à¥\8dतासà¤\81 à¤\85हाà¤\81à¤\95 दिक्कत नै हो।''",
        "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}}|ऐ पन्ना शीर्षक लेल ताकू]]",
        "missing-revision": "\"{{FULLPAGENAME}}\" पन्ना के अवतरण #$1 मौजूद नई अछि ।\n\nओन त ई एक हट्याल गेल पन्ना के पुराना कडी पे क्लिक करबाक कारण से होएत अछि।\nअधिक जानकारी के लेल आहाँ [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} हटाबै के लॉग] देख सकै अछि।",
        "updated": "(अद्यतन  कएल)",
        "note": "'''टिप्पणी:'''",
        "previewnote": "'''मोन राखू ई मातर पूर्वावलोकन छी।'''\nअहाँक परिवर्तन अखन धरि सँचिआएल नै गेल अछि!",
-       "continue-editing": "सà¤\82पादन à¤\95à¥\8dषà¥\87तà¥\8dर à¤\9cाà¤\89",
-       "previewconflict": "ई पूर्वदृश्य देखबैए उपरका सम्पादन क्षेत्रक पाठ , ई आएत जखन अहाँ संरक्षित करब।",
+       "continue-editing": "समà¥\8dपादन à¤\95à¥\8dषà¥\87तà¥\8dर à¤\9cाà¤\8f",
+       "previewconflict": "ई पूर्वदृश्य देखबैए उपरका सम्पादन क्षेत्रक पाठ, ई आएत जखन अहाँ संरक्षित करब।",
        "session_fail_preview": "''' दुखी छी! अहाँक सत्रक दत्तांश खतम भऽ गेल तै कारणसँ अहाँक सम्पादनक निपटारा नै भऽ सकल।'''\nफेरसँ प्रयास करू।\nजँ ई फेरसँ काज नै करैए, प्रयोग करू [[Special:UserLogout|निष्क्रमण]] आ फेर सम्प्रवेश करू।",
        "session_fail_preview_html": "''' दुखी छी! हम अहाँक सम्पादनक निष्पादन नै कऽ सकलहुँ कारण सत्रक दत्तांश खतम भऽ गेल।'''\n''कारण {{अन्तर्जाल}} लग काँच एच.टी.एम.एल. दत्तांश सक्रिय छै, पूर्वदृश्य जावास्क्रिप्ट आक्रमणक डरसँ नुकाएल राखल गेल अछि।''\n'''जँ ई वैध सम्पादन प्रयास अछि, कृपा कऽ पुनः प्रयास करू।'''\nजँ ई अखनो काज नै कऽ रहल अछि, प्रयास करू [[Special:UserLogout|निष्क्रमण कऽ रहल छी]] आ फेरसँ सम्प्रवेश।",
        "token_suffix_mismatch": "'''अहाँक सम्पादन अस्वीकार कऽ देल गेल अछि कारण अहाँक ग्राहक प्रेष्यमान अंक विधानक विराम चेन्ह सभकेँ नष्ट कऽ देलन्हि।'''\nई सम्पादन पन्नाक पाठकेँ दूषित होएबासँ बचेबा लेल अमान्य कऽ देल गेल।\nई कखनो काल होइए जखन अहाँ जाल आधारित अनाम दोसरा लेल चल सेवा प्रयुक्त करै छी।",
        "permissionserrorstext-withaction": "अहाँके अनुमति नै अछि $2 लेल, ऐ लेल {{PLURAL:$1|कारण|कारण सभ}}:",
        "recreate-moveddeleted-warn": "'''चेतौनी''': अहाँ फेरसँ ओ पन्ना बना रहल छी जे पहिने मेटा देल गेल छै।'''\n\nअहाँ विचारू जे की ई सम्पादन केनाइ उचित अछि।\nऐ पन्नाक मेटाएल बला आ हटाएल वृत्तलेख एतए सुविधा लेल देल जा रहल अछि:",
        "moveddeleted-notice": "ई पन्ना मेटा देल गेल अछि।\nऐ पन्ना लेल मेटाएल आ हटाएल बला वृत्तलेख सन्दर्भ लेल नीचाँ देल गेल अछि।",
-       "log-fulllog": "सभà¤\9fा à¤µà¥\83तà¥\8dतलà¥\87à¤\96 à¤¦à¥\87à¤\96à¥\82",
+       "log-fulllog": "सभà¤\9fा à¤µà¥\83तà¥\8dतलà¥\87à¤\96 à¤¦à¥\87à¤\96à¥\80",
        "edit-hook-aborted": "सम्पादन नोकसीसँ खतम भेल।\nई कोनो कारण नै देलक।",
        "edit-gone-missing": "पन्ना अद्यतन नै भऽ सकल।\nलगैए जे ई मेटा देल गेल अछि।",
        "edit-conflict": "सम्पादन अन्तर",
        "edit-no-change": "अहाँक सम्पादनपर ध्यान नै देल गेल, कारण ऐ सँ पाठमे कोनो परिवर्तन नै आएल।",
        "postedit-confirmation-created": "पन्ना निर्माण करल गेल अछि ।",
        "postedit-confirmation-restored": "पन्नाके पुराण स्थितिमे लौने गेल अछि ।",
-       "postedit-confirmation-saved": "अहाके संपादनके सुरक्षित भेल ।",
+       "postedit-confirmation-saved": "अहाक सम्पादन सुरक्षित भेल ।",
        "edit-already-exists": "नव पन्नाक निर्माण नै भऽ सकल।\nई पहिनहियेसँ वर्तमान अछि।",
-       "defaultmessagetext": "पà¥\82रà¥\8dवनिरà¥\8dधारित à¤¸à¤\82देश पाठ",
+       "defaultmessagetext": "पà¥\82रà¥\8dवनिरà¥\8dधारित à¤¸à¤¨à¥\8dदेश पाठ",
        "content-failed-to-parse": "$1 के लेल $2 सामग्री के बिच्छेदन करए में विफल, त्रुटि: $3",
        "invalid-content-data": "अवैध डाटा सामग्री",
        "content-not-allowed-here": "[[$2]] पृष्ठ पर \"$1\" सामग्री वर्जित अछि।",
        "currentrevisionlink": "नूतन संशोधन",
        "cur": "हीन",
        "next": "आगाँ",
-       "last": "à¤\85à¤\82तिम",
+       "last": "पिà¤\9bला",
        "page_first": "पहिल",
        "page_last": "अन्तिम",
        "histlegend": "फाइल तुलना तंत्रांशक चयन: संशोधन तुलनाक रेडियो बक्शाकेँ चिन्हित करू आ एन्टर बटन क्लिक करू वा सभसँ नीचाँक बटन क्लिक करू। <br />\nकहबी: '''({{int:cur}})''' = अद्यतन संशोधनसँ अन्तर, '''({{int:last}})''' = अद्यतनसँ पहिलुका संशोधनसँ अन्तर, '''{{int:minoreditletter}}''' = मामूली सम्पादन।",
        "rev-suppressed-unhide-diff": "ऐ तुलना निर्धारकक कोनो एकटा संशोधन '''दबाएल''' गेल अछि।\nवर्णन ताकि सकै छी [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} suppression log] मे।\nअहाँ अखनो [$1 ई तुलना निर्धारक देखू] जँ अहाँ आगाँ बढ़ऽ चाहै छी।",
        "rev-deleted-diff-view": "ई पन्ना संशोधनऐ तुलना निर्धारकक कोनो एकटा संशोधन '''मेटाएल''' गेल अछि।\nअहाँ एकरा देख सकै छी; वर्ण भेट सकैए [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log] मे।",
        "rev-suppressed-diff-view": "ऐ तुलना निर्धारकक कोनो एकटा संशोधन '''दबाएल''' गेल अछि।\nअहाँ एकरा देख सकै छी; वर्णन भेट सकैए [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} suppression log]मे।",
-       "rev-delundel": "दà¥\87à¤\96ाà¤\89/ à¤¨à¥\81à¤\95ाà¤\89",
-       "rev-showdeleted": "दà¥\87à¤\96ाà¤\89",
-       "revisiondelete": "मà¥\87à¤\9fाà¤\89 / à¤¸à¤\82शà¥\8bधन à¤«à¥\87रसà¤\81 à¤\86नà¥\82",
+       "rev-delundel": "दà¥\83षà¥\8dà¤\9fिà¤\95à¥\81शलता à¤¬à¤¦à¤²à¥\80",
+       "rev-showdeleted": "दà¥\87à¤\96ाबà¥\80",
+       "revisiondelete": "à¤\85वतरण à¤¹à¤\9fाबà¥\80/पà¥\81नरà¥\8dसà¥\8dथापित à¤\95रà¥\80",
        "revdelete-nooldid-title": "अमान्य लक्ष्य संशोधन",
        "revdelete-nooldid-text": "अहाँ चाहे तँ ऐ प्रकार्यक निष्पादन लेल कोनो विशेष लक्ष्य संशोधन नै तँए-तफसिला केने छी, विशेष संशोधन नै उपस्थित अछि, वा अहाँ वर्तमान संशोधनकेँ नुकेबाक प्रयास कऽ रहल छी।",
        "revdelete-no-file": "विषिष्ट संचिका अछिये नै।",
        "revdelete-failure": "$1'''संशोधन दृश्यता अद्यतन नै कएल जा सकल:'''",
        "logdelete-success": "'''वृत्तलेख दृश्यता सफलतासँ निर्धारित भेल।'''",
        "logdelete-failure": "'''वृत्तलेख दृश्यता निर्धारित नै भऽ सकल।'''$1",
-       "revdel-restore": "दà¥\83षà¥\8dà¤\9fिà¤\95à¥\81शलता à¤¬à¤¦à¤²à¥\82",
+       "revdel-restore": "दà¥\83षà¥\8dà¤\9fिà¤\95à¥\81शलता à¤¬à¤¦à¤²à¥\80",
        "pagehist": "पन्नाक इतिहास",
        "deletedhist": "मेटाएल इतिहास",
        "revdelete-hide-current": "तिथि $2, $1 क अनुक्रमकेँ नुकेबा काल भ्रम: ई वर्तमान संशोधन छी।\nई नुकाएल नै जा सकैए।",
        "suppressionlogtext": "नीचाँ मेटाएल आ प्रतिबन्धक उल्लेख अछि जे संचालकसँ नुकाएल सामिग्री अछि।\nअखन स्थित प्रभावी प्रतिबन्ध आ अवरोध लेल देखू [[Special:BlockList|IP block list]] ।",
        "mergehistory": "मिज्झर भेल पन्ना सभक इतिहास",
        "mergehistory-header": "ई पन्ना अहाँकेँ एकटा स्रोत पन्नाक एकटा नव पन्नामे संशोधन इतिहासकेँ मिज्झर करबाक अनुमति दैत अछि।\nसुनिश्चित होउ जे ई परिवर्तन ऐतिहासिक पन्ना सांतत्य स्थापित करत।",
-       "mergehistory-box": "दू पन्नाक संशोधनकेँ मिज्झर करू।",
+       "mergehistory-box": "दू पन्नाक संशोधन मिज्झर करी।",
        "mergehistory-from": "मूल पन्ना:",
        "mergehistory-into": "लक्ष्य पन्ना:",
        "mergehistory-list": "मिज्झर योग्य सम्पादन इतिहास",
        "mergehistory-merge": "[[:$1]] एकर संशोधन सभकेँ [[:$2]] मे मिलाएल जा सकैए।\nरेडियो बटन स्तम्भक प्रयोग मात्र संशोधनकेँ निर्धारित समए वा ओइसँ पहिने मिज्झर करबामे प्रयोग करू।\nमोन राखू जे उपर नीचाँक लागिक प्रयोग ऐ स्तम्भकेँ पुनर्स्थापित कऽ देत।",
        "mergehistory-go": "मिज्झर होइ योग्य सम्पादन सभकेँ देखाउ",
-       "mergehistory-submit": "संशोधन सभकेँ मिज्झर करू",
+       "mergehistory-submit": "संशोधन सभके मिज्झर करी",
        "mergehistory-empty": "कोनो संशोधन मिज्झर नै कएल जा सकैए।",
        "mergehistory-done": "$3 {{PLURAL:$3|संशोधन|संशोधन सभ}} एकर $1 सफलता पूर्वक मिज्झर कएल गेल [[:$2]] मे।",
        "mergehistory-fail": "इतिहासक मिश्रणकेँ नै कऽ सकल, कृपा कऽ पन्ना आ समए परिमितिकेँ फेरसँ जाँचू।",
        "difference-title-multipage": "\"$1\" आर \"$2\" पृष्ठसभ मे अंतर",
        "difference-multipage": "(पन्ना सभक बीचमे अन्तर)",
        "lineno": "पंक्त्ति $1:",
-       "compareselectedversions": "à¤\9aयन à¤\95à¤\8fल à¤¸à¤\82शà¥\8bधन à¤¸à¤­à¤\95 à¤¤à¥\81लना à¤\95रà¥\82",
-       "showhideselectedversions": "दà¥\87à¤\96ाà¤\89/ à¤¨à¥\81à¤\95ाà¤\89 à¤\9aयनित à¤¸à¤\82शà¥\8bधन à¤¸à¤­",
+       "compareselectedversions": "à¤\9aयन à¤\95à¤\8fल à¤¸à¤\82शà¥\8bधन à¤¸à¤­à¤\95 à¤¤à¥\81लना à¤\95रà¥\80",
+       "showhideselectedversions": "à¤\9aयनित à¤\85वतरण à¤¦à¥\87à¤\96ाबà¥\80/नà¥\81à¤\95ाबà¥\80",
        "editundo": "असम्पादन",
        "diff-empty": "(कोनो अंतर नै)",
        "diff-multi-sameuser": "(इ प्रयोक्ताद्वारा {{PLURAL:$1|कएल गेल बीचके एक अवतरण नै देखाओल गेल |कएल गेल बीचके $1 अवतरण नै देखाओल गेल}})",
        "searchprofile-images": "दृश्य-श्रव्य",
        "searchprofile-everything": "सभटा",
        "searchprofile-advanced": "विशिष्ट",
-       "searchprofile-articles-tooltip": "$1 à¤®à¥\87 à¤¤à¤¾à¤\95à¥\82",
+       "searchprofile-articles-tooltip": "$1 à¤®à¥\87 à¤¤à¤¾à¤\95à¥\80",
        "searchprofile-images-tooltip": "सञ्चिकासभ लेल ताकी",
        "searchprofile-everything-tooltip": "सभटा सामिग्रीमे ताकू (चर्चा पन्ना सहित)",
-       "searchprofile-advanced-tooltip": "बनाà¤\8fल à¤¨à¤¾à¤®à¤¸à¥\8dथान à¤¸à¤­à¤®à¥\87 à¤¤à¤¾à¤\95à¥\82",
+       "searchprofile-advanced-tooltip": "बनाà¤\8fल à¤¨à¤¾à¤®à¤¸à¥\8dथान à¤¸à¤­à¤®à¥\87 à¤¤à¤¾à¤\95à¥\80",
        "search-result-size": "$1 ({{PLURAL:$2|1 शब्द|$2 शब्दसभ}})",
        "search-result-category-size": "{{PLURAL:$1|1 सदस्य|$1 सदस्य}} ({{PLURAL:$2|1 उपसंवर्ग|$2 उपसंवर्ग}}, {{PLURAL:$3|1 संचिका|$3 संचिका}})",
        "search-redirect": "(रस्ता बदलेन $1)",
        "search-category": "(श्रेणी $1)",
        "search-file-match": "(फाइल सामग्रीसे मेल खेलक अछि)",
        "search-suggest": "अहाँ मोने अछि जे:$1",
-       "search-interwiki-caption": "समà¥\8dबनà¥\8dधित à¤ªà¤°à¤¿à¤¯à¥\8bà¤\9cना à¤¸à¤­",
-       "search-interwiki-default": "$1 à¤¸à¤­à¤\9fा परिणाम:",
+       "search-interwiki-caption": "à¤\85नà¥\8dय à¤ªà¥\8dरà¤\95लà¥\8dप",
+       "search-interwiki-default": "$1 à¤¸à¤\81 परिणाम:",
        "search-interwiki-more": "(आर)",
        "search-relatedarticle": "सम्बन्धी",
        "searchrelated": "सम्बन्धी",
        "search-error": "खोजवाके समय निम्न त्रुटि उत्पन्न भेल: $1",
        "preferences": "विकल्प",
        "mypreferences": "खासमखास",
-       "prefs-edits": "समà¥\8dपादनà¤\95 à¤¸à¤\82à¤\96à¥\8dया",
-       "prefsnologintext2": "अपन वरीयतासभके बदलैक लेल $1 करू।",
+       "prefs-edits": "समà¥\8dपादनà¤\95 à¤¸à¤\99à¥\8dà¤\96à¥\8dया:",
+       "prefsnologintext2": "अपन वरीयतासभके बदलैक लेल कृपया सम्प्रवेश करी।",
        "prefs-skin": "रूप",
        "skin-preview": "पूर्वावलोकन",
        "datedefault": "कोनो मोनपसंद नै",
        "prefs-personal": "प्रयोक्ता परिचय",
        "prefs-rc": "हालक परिवर्तन",
        "prefs-watchlist": "साकांक्ष-सूची",
-       "prefs-editwatchlist": "साà¤\95ाà¤\82à¤\95à¥\8dषसà¥\82à¤\9aà¥\80 à¤¬à¤¦à¤²à¥\82",
+       "prefs-editwatchlist": "साà¤\95ाà¤\82à¤\95à¥\8dषसà¥\82à¤\9aà¥\80 à¤¬à¤¦à¤²à¥\80",
        "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": "बढ़ाà¤\8fल à¤¸à¤¾à¤\95ाà¤\82à¤\95à¥\8dष à¤¸à¥\82à¤\9aà¥\80मà¥\87 à¤\85धिà¤\95तम à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन à¤¦à¥\87à¤\96ाà¤\8fब:",
+       "prefs-watchlist-edits": "बढाएल साकांक्ष सूचीमे अधिकतम परिवर्तन देखाएब:",
        "prefs-watchlist-edits-max": "बेसीसँ बेसी:१०००",
        "prefs-watchlist-token": "साकांक्ष-सूची खेप:",
        "prefs-misc": "आर",
-       "prefs-resetpass": "à¤\95à¥\82à¤\9fशबà¥\8dद à¤¬à¤¦à¤²à¥\82",
+       "prefs-resetpass": "à¤\95à¥\82à¤\9fशबà¥\8dद à¤¬à¤¦à¤²à¥\80",
        "prefs-changeemail": "ई-पत्र संकेत बदलू",
-       "prefs-setemail": "à¤\88-पतà¥\8dर à¤¸à¤\82à¤\95à¥\87त à¤¨à¤¿à¤°à¥\8dधारित à¤\95रà¥\82",
-       "prefs-email": "à¤\88-पतà¥\8dर à¤\9aà¥\81नाव",
+       "prefs-setemail": "à¤\88-पतà¥\8dर à¤¸à¤\82à¤\95à¥\87त à¤¨à¤¿à¤°à¥\8dधारित à¤\95रà¥\80",
+       "prefs-email": "à¤\88-पतà¥\8dर à¤µà¤¿à¤\95लà¥\8dपसभ",
        "prefs-rendering": "मुँहकान",
        "saveprefs": "सुरक्षित करू",
        "restoreprefs": "सभटा पूर्वनिर्धारित चयनकेँ फेरसँ आनू",
        "prefs-editing": "सम्पादन कऽ रहल छी",
        "rows": "पाँती सभ",
        "columns": "स्तम्भ सभ",
-       "searchresultshead": "ताà¤\95à¥\82",
+       "searchresultshead": "ताà¤\95à¥\80",
        "stub-threshold": "सीमा <a href=\"#\" class=\"stub\">काटल लागि</a> सँचियाएल (अष्टक):",
        "stub-threshold-sample-link": "उदाहरण",
        "stub-threshold-disabled": "अशक्त कएल",
        "recentchangesdays": "आइ-काल्हिक परिवर्तनमे कतेक दिन देखाएल गेल:",
        "recentchangesdays-max": "बेसीसँ बेसी $1 {{PLURAL:$1|दिन|दिन}}",
        "recentchangescount": "पूर्वनिर्धारित रूपेँ एतेक सम्पादन देखाएल गेल:",
-       "prefs-help-recentchangescount": "à¤\90 मे सम्मिलित अछि आइ-काल्हिक परिवर्तन, पन्नाक इतिहास आ वृत्तलेख",
+       "prefs-help-recentchangescount": "à¤\8fहिमे सम्मिलित अछि आइ-काल्हिक परिवर्तन, पन्नाक इतिहास आ वृत्तलेख",
        "prefs-help-watchlist-token2": "इ अहाँके कंक्षाकसूचीके वेब फिडके गोपनीय चाभी छी ।\nइ जे कोइ लंग अछि उ अपन कंक्षाकसूची पैढ सकैत अछि, ऐ लेल इ क्यों गोटा स नै बाटब ।\n[[Special:ResetTokens|एकरा रीसेट करवाक लेल यै ठाम क्लिक करु]]।",
        "savedprefs": "अहाँक पसिन्न सुरक्षित कएल गेल",
        "savedrights": "प्रयोक्ता {{GENDER:$1|$1}}क सदस्य अधिकार सङ्ग्रह कएल गेल।",
        "timezonelegend": "समय क्षेत्र",
        "localtime": "स्थानीय समए:",
-       "timezoneuseserverdefault": "पà¥\82रà¥\8dवनिरà¥\8dधारित à¤µà¤¿à¤¤à¤°à¤\95 à¤ªà¥\8dरयà¥\81à¤\95à¥\8dत à¤\95रà¥\82 ($1)",
-       "timezoneuseoffset": "à¤\86न (सà¤\82तà¥\81लन à¤\95à¥\87निहारà¤\95 à¤¨à¤¿à¤°à¥\8dदà¥\87श à¤\95रà¥\82)",
+       "timezoneuseserverdefault": "पà¥\82रà¥\8dवनिरà¥\8dधारित à¤µà¤¿à¤¤à¤°à¤\95 à¤ªà¥\8dरयà¥\81à¤\95à¥\8dत à¤\95रà¥\80 ($1)",
+       "timezoneuseoffset": "à¤\86न (सनà¥\8dतà¥\81लन à¤\95à¥\87निहारà¤\95 à¤¨à¤¿à¤°à¥\8dदà¥\87श à¤\95रà¥\80)",
        "servertime": "वितरक समए:",
-       "guesstimezone": "à¤\97वà¥\87षà¤\95à¤\95 à¤ªà¥\8dरयà¥\8bà¤\97 à¤\95ऽ à¤­à¤°à¥\82",
-       "timezoneregion-africa": "à¤\85फà¥\8dरà¥\80का",
+       "guesstimezone": "à¤\97वà¥\87षà¤\95à¤\95 à¤ªà¥\8dरयà¥\8bà¤\97 à¤\95ऽ à¤­à¤°à¥\80",
+       "timezoneregion-africa": "à¤\85फà¥\8dरिका",
        "timezoneregion-america": "अमेरिका",
-       "timezoneregion-antarctica": "à¤\85à¤\82टार्कटिका",
+       "timezoneregion-antarctica": "à¤\85नà¥\8dटार्कटिका",
        "timezoneregion-arctic": "आर्कटिक",
-       "timezoneregion-asia": "à¤\8fà¤िया",
-       "timezoneregion-atlantic": "à¤\85à¤\9fलाà¤\82टिक महासागर",
+       "timezoneregion-asia": "à¤\8fसिया",
+       "timezoneregion-atlantic": "à¤\85à¤\9fलानà¥\8dटिक महासागर",
        "timezoneregion-australia": "अस्ट्रेलिया",
        "timezoneregion-europe": "यूरोप",
-       "timezoneregion-indian": "हिà¤\82द महासागर",
-       "timezoneregion-pacific": "पà¥\8dरशाà¤\82त महासागर",
-       "allowemail": "à¤\86न à¤ªà¥\8dरयà¥\8bà¤\95à¥\8dताà¤\95 à¤\88-पतà¥\8dर à¤¸à¤®à¤°à¥\8dथ à¤\95रà¥\82",
-       "prefs-searchoptions": "à¤\96à¥\8bà¤\9c à¤µà¤¿à¤\95लà¥\8dप",
-       "prefs-namespaces": "नामस्थान सभ",
+       "timezoneregion-indian": "हिनà¥\8dद महासागर",
+       "timezoneregion-pacific": "पà¥\8dरशानà¥\8dत महासागर",
+       "allowemail": "à¤\86न à¤ªà¥\8dरयà¥\8bà¤\95à¥\8dताà¤\95 à¤\88-पतà¥\8dर à¤¸à¤®à¤°à¥\8dथ à¤\95रà¥\80",
+       "prefs-searchoptions": "ताà¤\95à¥\80",
+       "prefs-namespaces": "नामस्थानसभ",
        "default": "पूर्वनिर्धारित",
        "prefs-files": "संचिका सभ",
        "prefs-custom-css": "खास सी.एस.एस.",
        "username": "{{GENDER:$1|प्रयोगकर्तानाम}}:",
        "prefs-memberingroups": "निम्नलिखित {{PLURAL:$1|समूह|समूहसभ}}क {{GENDER:$2|सदस्य}}:",
        "prefs-memberingroups-type": "$1",
-       "prefs-registration": "पà¤\82जीकरणक समए:",
+       "prefs-registration": "पà¤\9eà¥\8dजीकरणक समए:",
        "prefs-registration-date-time": "$1",
        "yourrealname": "असली नाम:",
        "yourlanguage": "भाषा:",
        "prefs-help-email-others": "अहाँ ई विकल्प चुनि सकै छी जे अहाँकेँ दोसरा द्वारा ई-पत्रसँ, अहाँक प्रयोक्ता वा वार्ता पन्नापर देल लिंकक माध्यमसँ, सम्पर्क कएल जा सकए।\nअहाँक ई-पत्र संकेतक खुलासा नै हएत जखन कियो आन अहाँसँ सम्पर्क करत।",
        "prefs-help-email-required": "ई-पत्र संकेत जरूरी अछि।",
        "prefs-info": "न्यूनतम जानकारी",
-       "prefs-i18n": "à¤\85à¤\82तर्राष्ट्रियकरण",
-       "prefs-signature": "à¤\9aà¥\87नà¥\8dहासà¥\80",
-       "prefs-dateformat": "तिथिक बगेबानी",
+       "prefs-i18n": "à¤\85नà¥\8dतर्राष्ट्रियकरण",
+       "prefs-signature": "हसà¥\8dताà¤\95à¥\8dषर",
+       "prefs-dateformat": "तिथि प्रारूप",
        "prefs-timeoffset": "समए संशोधक",
        "prefs-advancedediting": "विशिष्ट विकल्प सभ",
-       "prefs-editor": "सà¤\82पादक",
+       "prefs-editor": "समà¥\8dपादक",
        "prefs-preview": "पूर्वावलोकन",
-       "prefs-advancedrc": "विशिष्ट विकल्प सभ",
-       "prefs-advancedrendering": "विशिष्ट विकल्प सभ",
-       "prefs-advancedsearchoptions": "विशिष्ट विकल्प सभ",
-       "prefs-advancedwatchlist": "विशिष्ट विकल्प सभ",
-       "prefs-displayrc": "दृश्य विकल्प सभ",
-       "prefs-displaywatchlist": "दृश्य विकल्प सभ",
+       "prefs-advancedrc": "विशिष्ट विकल्पसभ",
+       "prefs-advancedrendering": "विशिष्ट विकल्पसभ",
+       "prefs-advancedsearchoptions": "विशिष्ट विकल्पसभ",
+       "prefs-advancedwatchlist": "विशिष्ट विकल्पसभ",
+       "prefs-displayrc": "दृश्य विकल्पसभ",
+       "prefs-displaywatchlist": "दृश्य विकल्पसभ",
        "prefs-tokenwatchlist": "टोकन",
        "prefs-diffs": "अन्तर निर्धारक सभ",
        "prefs-help-prefershttps": "इ प्राथमिकता अहाँके फेर स सम्प्रवेश करलाक बाद प्रभाव पडत।",
        "prefs-tabs-navigation-hint": "सुझाव: अहाँ टैब्स सूचीमे टैब्सके बीच आवागमन करवाक लेल बाम आर दाहिना बागलके कुंजिसभके उपयोग कइर सकैत छी।",
        "userrights": "प्रयोक्ता अधिकारक प्रबन्धन",
-       "userrights-lookup-user": "पà¥\8dरयà¥\8bà¤\95à¥\8dता à¤¸à¤\82वरà¥\8dà¤\97 à¤¸à¤­à¤\95 à¤ªà¥\8dरबनà¥\8dध à¤\95रà¥\82",
-       "userrights-user-editname": "à¤\8fà¤\95à¤\9fा à¤ªà¥\8dरयà¥\8bà¤\95à¥\8dतानाम à¤²à¤¿à¤\96à¥\82:",
+       "userrights-lookup-user": "पà¥\8dरयà¥\8bà¤\95à¥\8dता à¤¸à¤®à¥\82हसभà¤\95 à¤ªà¥\8dरबनà¥\8dध à¤\95रà¥\80",
+       "userrights-user-editname": "à¤\8fà¤\95à¤\9fा à¤ªà¥\8dरयà¥\8bà¤\95à¥\8dतानाम à¤²à¤¿à¤\96à¥\80:",
        "editusergroup": "{{GENDER:$1|सदस्य}} समूहसभक सम्पादन करी",
        "editinguser": "सदस्य '''[[User:$1|$1]]''' $2 क अधिकार बदलि\n{{GENDER:$1|सदस्य}}क सदस्य अधिकार बदलल जा रहल अछि <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "प्रयोक्ता संवर्ग सभक सम्पादन करू",
        "group-bureaucrat": "अधिकारी",
        "group-suppress": "नुकाबए वाला",
        "group-all": "(सभ)",
-       "group-user-member": "{{लिंग:$1|प्रयोक्ता}}",
-       "group-autoconfirmed-member": "{{लिंग:$1|स्वतःअनुमोदित प्रयोक्ता}}",
-       "group-bot-member": "{{लिंग:$1|स्वचालक}}",
-       "group-sysop-member": "{{लिंग:$1|माइनजन}}",
-       "group-bureaucrat-member": "{{लिंग:$1|अधिकारी}}",
+       "group-user-member": "{{GENDER:$1|प्रयोगकर्ता}}",
+       "group-autoconfirmed-member": "{{GENDER:$1|स्वतः स्थापित प्रयोगकर्ता}}",
+       "group-bot-member": "{{GENDER:$1|बोट}}",
+       "group-sysop-member": "{{GENDER:$1|प्रबन्धक}}",
+       "group-bureaucrat-member": "{{GENDER:$1|प्रशासक}}",
        "group-suppress-member": "{{GENDER:$1|नुकाए वाला}}",
-       "grouppage-user": "{{ns:project}}:पà¥\8dरयà¥\8bà¤\95à¥\8dता सभ",
-       "grouppage-autoconfirmed": "{{ns:project}}:स्वतःअनुमोदित प्रयोक्ता सभ",
-       "grouppage-bot": "{{ns:project}}:स्वचालक सभ",
-       "grouppage-sysop": "{{ns:project}}:माà¤\87नà¤\9cन à¤¸à¤­",
-       "grouppage-bureaucrat": "{{ns:project}}:अधिकारी सभ",
+       "grouppage-user": "{{ns:project}}:पà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dतासभ",
+       "grouppage-autoconfirmed": "{{ns:project}}:स्वतःअनुमोदित प्रयोक्तासभ",
+       "grouppage-bot": "{{ns:project}}:स्वचालकसभ",
+       "grouppage-sysop": "{{ns:project}}:पà¥\8dरबनà¥\8dधà¤\95",
+       "grouppage-bureaucrat": "{{ns:project}}:अधिकारीसभ",
        "grouppage-suppress": "{{ns:project}}:नुकाबी",
        "right-read": "पन्ना सभ पढ़ू",
-       "right-edit": "पन्ना सभ सम्पादन करू",
-       "right-createpage": "पन्ना सभ बनाउ (जे वार्ता पन्ना नै हुअए)",
-       "right-createtalk": "वार्ता पन्ना सभ बनाउ",
-       "right-createaccount": "नव प्रयोक्ता खाता सभ बनाउ",
+       "right-edit": "पन्नासभ सम्पादन करी",
+       "right-createpage": "पन्नासभ बनाबी (जे वार्ता पन्ना नै हुअए)",
+       "right-createtalk": "वार्ता पन्नासभ बनाबी",
+       "right-createaccount": "नव प्रयोक्ता खातासभ बनाबी",
        "right-autocreateaccount": "बाहरी खातासँ स्वतः प्रवेश",
        "right-minoredit": "सम्पादन सभकेँ मामूली चिन्हित करू",
-       "right-move": "पनà¥\8dना à¤¸à¤­ à¤\98सà¤\95ाà¤\89",
-       "right-move-subpages": "पनà¥\8dना à¤¸à¤­à¤\95à¥\87à¤\81 à¤\89पपनà¥\8dना à¤¸à¤­à¤\95 à¤¸à¤\82à¤\97 à¤\98सà¤\95ाà¤\89",
-       "right-move-rootuserpages": "मà¥\82ल à¤ªà¥\8dरयà¥\8bà¤\95à¥\8dता à¤ªà¤¨à¥\8dना à¤¸à¤­ à¤\98सà¤\95ाà¤\89",
-       "right-move-categorypages": "शà¥\8dरà¥\87णà¥\80 à¤ªà¥\83षà¥\8dठ à¤¸à¥\8dथानाà¤\82तरित à¤\95रà¥\82",
-       "right-movefile": "सà¤\82à¤\9aिà¤\95ा à¤¸à¤­à¤\95à¥\87à¤\81 à¤\98सà¤\95ाà¤\89",
-       "right-suppressredirect": "पनà¥\8dना à¤\98सà¤\95à¥\87बा à¤\95ाल à¤®à¥\82ल à¤ªà¤¨à¥\8dना à¤¸à¤­à¤¸à¤\81 à¤²à¤¾à¤\97ि à¤¸à¤­ à¤¨à¥\88 à¤¬à¤¨à¤¾à¤\89",
-       "right-upload": "सà¤\82à¤\9aिà¤\95ा à¤¸à¤­ à¤\89पारà¥\8bपित à¤\95रà¥\82",
-       "right-reupload": "वरà¥\8dतमान à¤¸à¤\82à¤\9aिà¤\95ा à¤¸à¤­à¤\95 à¤ªà¥\81नरà¥\8dलà¥\87à¤\96न à¤\95रà¥\82",
-       "right-reupload-own": "अपन उपारोपित पन्ना सभक पुनर्लेखन करू",
+       "right-move": "पनà¥\8dना à¤\98सà¤\95ाबà¥\80",
+       "right-move-subpages": "पà¥\83षà¥\8dठ à¤\89पपà¥\83षà¥\8dठसभ à¤¸à¤¹à¤¿à¤¤ à¤\98सà¤\95ाबà¥\80",
+       "right-move-rootuserpages": "मà¥\82ल à¤ªà¥\8dरयà¥\8bà¤\95à¥\8dता à¤ªà¤¨à¥\8dना à¤\98सà¤\95ाबà¥\80",
+       "right-move-categorypages": "शà¥\8dरà¥\87णà¥\80 à¤ªà¥\83षà¥\8dठ à¤\98सà¤\95ाबà¥\80",
+       "right-movefile": "सà¤\9eà¥\8dà¤\9aिà¤\95ा à¤¸à¤­ à¤\98सà¤\95ाबà¥\80",
+       "right-suppressredirect": "पà¥\83षà¥\8dठ à¤\98सà¤\95à¥\87बाà¤\95ाल à¤ªà¥\81नरà¥\8dनिरà¥\8dदà¥\87श à¤¨à¥\88 à¤\9bà¥\8bडà¥\80",
+       "right-upload": "सà¤\9eà¥\8dà¤\9aिà¤\95ासभ à¤\89पारà¥\8bपित à¤\95रà¥\80",
+       "right-reupload": "वरà¥\8dतमान à¤¸à¤\9eà¥\8dà¤\9aिà¤\95ासभà¤\95 à¤ªà¥\81नरà¥\8dलà¥\87à¤\96न à¤\95रà¥\80",
+       "right-reupload-own": "अपन उपारोपित पन्नासभक पुनर्लेखन करी",
        "right-reupload-shared": "श्रव्य-दृश्य साझी बखारीक फाइलक पुनर्लेखन स्थानीय रूपेँ करू।",
        "right-upload_by_url": "सार्वत्रिक विभव संकेतसँ संचिका उपारोपित करू",
        "right-purge": "जालक उपस्मृतिकेँ बिना स्वीकृतिक पन्नाक लेल खतम करू",
        "right-deleterevision": "निर्धारित संशोधित पन्ना मेटाउ आ फेरसँ आनू",
        "right-deletedhistory": "मेटाएल इतिहास प्रविष्टि देखू, बिना लागिक पाठक",
        "right-deletedtext": "मेटाएल पाठ आ दूटा मेटाएल संशोधनक बीचक परिवर्तन देखू",
-       "right-browsearchive": "मà¥\87à¤\9fाà¤\8fल à¤ªà¤¨à¥\8dना à¤¸à¤­à¤\95à¥\87à¤\81 à¤¤à¤¾à¤\95à¥\82",
-       "right-undelete": "पनà¥\8dना à¤«à¥\87रसà¤\81 à¤\86नà¥\82",
+       "right-browsearchive": "मà¥\87à¤\9fाà¤\8fल à¤ªà¤¨à¥\8dना à¤¤à¤¾à¤\95à¥\80",
+       "right-undelete": "पनà¥\8dना à¤«à¥\87रसà¤\81 à¤\86नà¥\80",
        "right-suppressrevision": "संचालकसँ नुकाएल संशोधनकेँ पुनरीक्षित करू आ फेरसँ आनू",
        "right-viewsuppressed": "कोनो प्रयोक्ताके नुकाएल संसोधन देखु",
        "right-suppressionlog": "व्यक्तिगत वृत्तलेख देखू",
        "rightslog": "प्रयोक्ता अधिकार वृत्तलेख",
        "rightslogtext": "ई प्रयोक्ता अधिकार परिवर्तन सभक वृतलेख छी।",
        "action-read": "ई पन्ना पढ़ू",
-       "action-edit": "ई पन्नाकेँ सम्पादित करू",
+       "action-edit": "ई पन्नाक सम्पादित करी",
        "action-createpage": "पन्ना सभ बनाउ",
-       "action-createtalk": "वारà¥\8dता à¤ªà¤¨à¥\8dना à¤¸à¤­ à¤¬à¤¨à¤¾à¤\89",
-       "action-createaccount": "à¤\88 à¤ªà¥\8dरयà¥\8bà¤\95à¥\8dता à¤\96ाता à¤¬à¤¨à¤¾à¤\89",
-       "action-history": "पन्नाक इतिहासकेँ मिज्झर करू",
-       "action-minoredit": "ऐ सम्पादनकेँ मामूली कहू",
-       "action-move": "ऐ पृष्ठकेँ घसकाउ",
-       "action-move-subpages": "ऐ पन्ना आ एकर उपपन्नाकेँ घसकाउ",
-       "action-move-rootuserpages": "मà¥\82ल à¤ªà¥\8dरयà¥\8bà¤\95à¥\8dता à¤ªà¤¨à¥\8dना à¤¸à¤­ à¤\98सà¤\95ाà¤\89",
-       "action-move-categorypages": "शà¥\8dरà¥\87णà¥\80 à¤ªà¥\83षà¥\8dठ à¤¸à¥\8dथानाà¤\82तरित à¤\95रà¥\82",
+       "action-createtalk": "वारà¥\8dता à¤ªà¤¨à¥\8dना à¤¬à¤¨à¤¾à¤¬à¥\80",
+       "action-createaccount": "à¤\88 à¤ªà¥\8dरयà¥\8bà¤\95à¥\8dता à¤\96ाता à¤¬à¤¨à¤¾à¤¬à¥\80",
+       "action-history": "पन्नाक इतिहास मिज्झर करी",
+       "action-minoredit": "ऐ सम्पादनके मामूली कही",
+       "action-move": "ऐ पृष्ठके घसकाबी",
+       "action-move-subpages": "ऐ पन्ना आ एकर उपपन्नाके घसकाबी",
+       "action-move-rootuserpages": "मà¥\82ल à¤ªà¥\8dरयà¥\8bà¤\95à¥\8dता à¤ªà¤¨à¥\8dना à¤\98सà¤\95ाबà¥\80",
+       "action-move-categorypages": "शà¥\8dरà¥\87णà¥\80 à¤ªà¥\83षà¥\8dठ à¤\98सà¤\95ाबà¥\80",
        "action-movefile": "ई संचिकाकेँ घसकाउ",
        "action-upload": "ई संचिकाकेँ उपारोपित करू",
        "action-reupload": "ई संचिकाक पुनर्लेखन करू",
        "recentchanges-label-unpatrolled": "ऐ सम्पादनक पुनरीक्षण अखन धरि नै कएल गेल अछि।",
        "recentchanges-label-plusminus": "पन्नाके आकार इ बाइट संख्यासे बदलल गेल",
        "recentchanges-legend-heading": "<strong>कुञ्जी:</strong>",
-       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|नयाà¤\81 à¤ªà¤¨à¥\8dनसभà¤\95à¥\87 à¤¸à¥\82à¤\9aà¥\80]] à¤¸à¤¹à¥\8b à¤¦à¥\87à¤\96à¥\81)",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|नव à¤ªà¤¨à¥\8dनसभà¤\95 à¤¸à¥\82à¤\9aà¥\80]] à¤¸à¥\87हà¥\8b à¤¦à¥\87à¤\96à¥\80)",
        "rcnotefrom": "नीचाँमे '''$2''' सँ भेल परिवर्तन अछि ('''$1''' धरि देखाएल)।",
        "rclistfrom": "$3 $2 सँ शुरू भेल नव परिवर्तन देखू",
-       "rcshowhideminor": "$1 à¤\85लà¥\8dप à¤¸à¤\82पादन",
-       "rcshowhideminor-show": "दà¥\87à¤\96ाà¤\89",
-       "rcshowhideminor-hide": "नà¥\81à¤\95ाà¤\8a",
-       "rcshowhidebots": "$1 स्वचालक सभ",
-       "rcshowhidebots-show": "दà¥\87à¤\96ाà¤\89",
-       "rcshowhidebots-hide": "नà¥\81à¤\95ाà¤\8a",
-       "rcshowhideliu": "$1 सम्प्रवेशित प्रयोक्ता सभ",
-       "rcshowhideliu-show": "दà¥\87à¤\96ाà¤\89",
-       "rcshowhideliu-hide": "नà¥\81à¤\95ाà¤\8a",
-       "rcshowhideanons": "$1 अज्ञात प्रयोक्ता सभ",
-       "rcshowhideanons-show": "दà¥\87à¤\96ाà¤\8a",
-       "rcshowhideanons-hide": "नà¥\81à¤\95ाà¤\8a",
-       "rcshowhidepatr": "$1 à¤¸à¤\82चालित सम्पादन",
-       "rcshowhidepatr-show": "दà¥\87à¤\96ाà¤\89",
-       "rcshowhidepatr-hide": "नà¥\81à¤\95ाà¤\8a",
-       "rcshowhidemine": "$1 हमर सम्पादन सभ",
-       "rcshowhidemine-show": "दà¥\87à¤\96ाà¤\89",
-       "rcshowhidemine-hide": "नà¥\81à¤\95ाà¤\8a",
+       "rcshowhideminor": "$1 à¤\85लà¥\8dप à¤¸à¤®à¥\8dपादन",
+       "rcshowhideminor-show": "दà¥\87à¤\96ाबà¥\80",
+       "rcshowhideminor-hide": "नà¥\81à¤\95ाबà¥\80",
+       "rcshowhidebots": "$1 स्वचालक",
+       "rcshowhidebots-show": "दà¥\87à¤\96ाबà¥\80",
+       "rcshowhidebots-hide": "नà¥\81à¤\95ाबà¥\80",
+       "rcshowhideliu": "पञ्जीकृत प्रयोगकर्तासभ $1",
+       "rcshowhideliu-show": "दà¥\87à¤\96ाबà¥\80",
+       "rcshowhideliu-hide": "नà¥\81à¤\95ाबà¥\80",
+       "rcshowhideanons": "$1 अज्ञात प्रयोक्तासभ",
+       "rcshowhideanons-show": "दà¥\87à¤\96ाबà¥\80",
+       "rcshowhideanons-hide": "नà¥\81à¤\95ाबà¥\80",
+       "rcshowhidepatr": "$1 à¤¸à¤\9eà¥\8dचालित सम्पादन",
+       "rcshowhidepatr-show": "दà¥\87à¤\96ाबà¥\80",
+       "rcshowhidepatr-hide": "नà¥\81à¤\95ाबà¥\80",
+       "rcshowhidemine": "$1 हमर सम्पादनसभ",
+       "rcshowhidemine-show": "दà¥\87à¤\96ाबà¥\80",
+       "rcshowhidemine-hide": "नà¥\81à¤\95ाबà¥\80",
        "rcshowhidecategorization-show": "देखाबी",
        "rcshowhidecategorization-hide": "नुकाबी",
        "rclinks": "देखाऊ अंतिम $1 परिवर्त्तन अंतिम $2 दिनमे<br />$3",
        "diff": "अन्तर",
        "hist": "इति.",
-       "hide": "नà¥\81à¤\95ाà¤\8a",
-       "show": "दà¥\87à¤\96ाà¤\89",
+       "hide": "नà¥\81à¤\95ाबà¥\80",
+       "show": "दà¥\87à¤\96ाबà¥\80",
        "minoreditletter": "अ",
        "newpageletter": "न",
        "boteditletter": "ब",
        "rc-enhanced-expand": "वर्णन देखाउ (जावास्क्रिप्ट चाही)",
        "rc-enhanced-hide": "वर्णन नुकाउ",
        "rc-old-title": "मूल रूप स \"$1\" नाम स बनाएल गेल रह",
-       "recentchangeslinked": "सà¤\82बà¤\82धित à¤ªà¤°à¤¿à¤µà¤°à¥\8dत्तन",
-       "recentchangeslinked-feed": "सà¤\82बà¤\82धित à¤ªà¤°à¤¿à¤µà¤°à¥\8dत्तन",
+       "recentchangeslinked": "समà¥\8dबनà¥\8dधित à¤ªà¤°à¤¿à¤µà¤°्तन",
+       "recentchangeslinked-feed": "समà¥\8dबनà¥\8dधित à¤ªà¤°à¤¿à¤µà¤°्तन",
        "recentchangeslinked-toolbox": "सम्बन्धित परिवर्तन",
        "recentchangeslinked-title": "\"$1\" मे भेल परिवर्तन",
        "recentchangeslinked-summary": "ई विशेष पन्नासँ सम्बद्ध पन्ना सभमे (आकि कोनो विशेष वर्गक समूहमे) भेल परिवर्तनक सूची छी ।\n[[Special:Watchlist|your watchlist]]  पर पन्नासभ '''गाढ़''' अछि।",
        "randomredirect-nopages": "नामस्थान \"$1\" मे कोनो बदलेनबला लागि नै अछि।",
        "statistics": "सांख्यिकी",
        "statistics-header-pages": "पन्नाक सांख्यिकी",
-       "statistics-header-edits": "साà¤\82à¤\96à¥\8dयिà¤\95à¥\80à¤\95 à¤¸à¤®à¥\8dपादन à¤\95रà¥\82",
-       "statistics-header-users": "पà¥\8dरयà¥\8bà¤\95à¥\8dता à¤¸à¤¾à¤\82à¤\96à¥\8dयिà¤\95à¥\80",
-       "statistics-header-hooks": "दà¥\8bसर à¤¸à¤¾à¤\82à¤\96à¥\8dयिà¤\95à¥\80",
+       "statistics-header-edits": "समà¥\8dपादन à¤¤à¤¥à¥\8dयाà¤\99à¥\8dà¤\95",
+       "statistics-header-users": "पà¥\8dरयà¥\8bà¤\95à¥\8dता à¤¤à¤¥à¥\8dयाà¤\99à¥\8dà¤\95",
+       "statistics-header-hooks": "दà¥\8bसर à¤¤à¤¥à¥\8dयाà¤\99à¥\8dà¤\95",
        "statistics-articles": "अनुक्रम पन्ना सभ",
        "statistics-pages": "पन्ना सभ",
        "statistics-pages-desc": "वार्ता पन्ना, बदलेन इत्यादि सहित सभटा विकि पन्ना सभ।",
        "statistics-files": "उपारोपित संचिका सभ",
-       "statistics-edits": "{{अन्तर्जाल}} अएबासँ लऽ कऽ भेल पन्ना सम्पादन सभ।",
+       "statistics-edits": "{{SITENAME}} अएबासँ लऽ कऽ भेल पन्ना सम्पादन",
        "statistics-edits-average": "प्रति पन्ना औसत सम्पादन",
-       "statistics-users": "पà¤\82जीकृत [[Special:ListUsers|प्रयोक्ता]]",
+       "statistics-users": "पà¤\9eà¥\8dजीकृत [[Special:ListUsers|प्रयोक्ता]]",
        "statistics-users-active": "सक्रिय प्रयोक्ता",
        "statistics-users-active-desc": "प्रयोक्ता जे अन्तिम {{PLURAL:$1|दिन|$1 दिन}} मे कोनो काज केने छथि",
        "pageswithprop-submit": "जाऊ",
        "double-redirect-fixer": "बदलेन स्थायित्व",
        "brokenredirects": "टूटल बदलेन सभ",
        "brokenredirectstext": "ई बदलेन सभ नै अवस्थित पन्ना सभक दिस जाइत अछि।",
-       "brokenredirects-edit": "सà¤\82पादन à¤\95रà¥\82",
-       "brokenredirects-delete": "मà¥\87à¤\9fाà¤\89",
-       "withoutinterwiki": "बिना à¤­à¤¾à¤·à¤¾ à¤²à¤¾à¤\97िà¤\95 à¤ªà¤¨à¥\8dना à¤¸à¤­",
+       "brokenredirects-edit": "समà¥\8dपादन à¤\95रà¥\80",
+       "brokenredirects-delete": "मà¥\87à¤\9fाबà¥\80",
+       "withoutinterwiki": "बिना à¤­à¤¾à¤·à¤¾ à¤²à¤¿à¤\99à¥\8dà¤\95à¤\95 à¤ªà¤¨à¥\8dना",
        "withoutinterwiki-summary": "ई पन्ना सभ दोसर भाषाक संस्करण सभ दिस संकेत नै करैए।",
        "withoutinterwiki-legend": "उपसर्ग",
        "withoutinterwiki-submit": "देखाउ",
-       "fewestrevisions": "एकाध संशोधनबला पन्ना सभ",
+       "fewestrevisions": "एकाध संशोधनबला पन्ना",
        "nbytes": "$1 {{PLURAL:$1|बाइट|बाइट्स}}",
-       "ncategories": "{{PLURAL:$1|सà¤\82वरà¥\8dà¤\97|à¤\95à¤\8fà¤\9fा à¤¸à¤\82वरà¥\8dà¤\97}}",
-       "ninterwikis": "$1 à¤\85नà¥\8dतरविà¤\95ि {{PLURAL:$1|à¤\9cड़à¥\80|à¤\9cड़ि सभ}}",
-       "nlinks": "$1 {{PLURAL:$1|लाà¤\97ि|लाà¤\97ि सभ}}",
-       "nmembers": "$1 {{PLURAL:$1|सदस्य|सदस्य सभ}}",
-       "nmemberschanged": "$1 → $2 {{PLURAL:$2|प्रयोक्ता|प्रयोक्ता सभ}}",
-       "nrevisions": "$1{{PLURAL:$1|संशोधन|संशोधन सभ}}",
-       "nimagelinks": "$1पर प्रयुक्त {{PLURAL:$1|पन्ना|पन्ना सभ}}",
-       "ntransclusions": "$1पर प्रयुक्त {{PLURAL:$1|पन्ना|पन्ना सभ}}",
+       "ncategories": "{{PLURAL:$1|शà¥\8dरà¥\87णà¥\80|शà¥\8dरà¥\87णà¥\80सभ}}",
+       "ninterwikis": "$1 à¤\85नà¥\8dतरविà¤\95ि {{PLURAL:$1|लिà¤\99à¥\8dà¤\95|लिà¤\99à¥\8dà¤\95सभ}}",
+       "nlinks": "$1 {{PLURAL:$1|लिà¤\99à¥\8dà¤\95|लिà¤\99à¥\8dà¤\95सभ}}",
+       "nmembers": "$1 {{PLURAL:$1|सदस्य|सदस्यसभ}}",
+       "nmemberschanged": "$1 → $2 {{PLURAL:$2|प्रयोक्ता|प्रयोक्तासभ}}",
+       "nrevisions": "$1{{PLURAL:$1|संशोधन|संशोधनसभ}}",
+       "nimagelinks": "$1पर प्रयुक्त {{PLURAL:$1|पन्ना|पन्नासभ}}",
+       "ntransclusions": "$1पर प्रयुक्त {{PLURAL:$1|पन्ना|पन्नासभ}}",
        "specialpage-empty": "ऐ पन्ना लेल कोनो परिणाम नै अछि।",
-       "lonelypages": "अनाथ पन्ना सभ",
-       "lonelypagestext": "à¤\88 à¤ªà¤¨à¥\8dना à¤¸à¤­ à¤¨à¥\87 à¤\95à¥\8bनà¥\8b {{à¤\85नà¥\8dतरà¥\8dà¤\9cाल}} à¤¸à¤\81 à¤\9cà¥\81ड़ल à¤\85à¤\9bि à¤\86 à¤¨à¤¹à¤¿à¤¯à¥\87 à¤\85नà¥\8dतरà¥\8dबाहà¥\8dय à¤°à¥\82पसà¤\81 à¤¦à¥\8bसर à¤ªà¤¨à¥\8dनमà¥\87 à¤\85à¤\9bि।",
-       "uncategorizedpages": "अवर्गीकृत पन्ना सभ",
-       "uncategorizedcategories": "à¤\85वरà¥\8dà¤\97à¥\80à¤\95à¥\83त à¤¸à¤\82वरà¥\8dà¤\97 सभ",
-       "uncategorizedimages": "à¤\85वरà¥\8dà¤\97à¥\80à¤\95à¥\83त à¤¸à¤\82à¤\9aिà¤\95ा सभ",
-       "uncategorizedtemplates": "अवर्गीकृत नमूना सभ",
-       "unusedcategories": "नà¥\88 à¤ªà¥\8dरयà¥\8bà¤\97 à¤\95à¤\8fल à¤¸à¤\82वरà¥\8dà¤\97 सभ",
-       "unusedimages": "बिना à¤ªà¥\8dरयà¥\8bà¤\97à¤\95 à¤¸à¤\82à¤\9aिà¤\95ा सभ",
-       "wantedcategories": "à¤\86वशà¥\8dयà¤\95 à¤¸à¤\82वरà¥\8dà¤\97 सभ",
-       "wantedpages": "आवश्यक पन्ना सभ",
+       "lonelypages": "अनाथ पन्नासभ",
+       "lonelypagestext": "ई पन्ना सभ ने कोनो {{अन्तर्जाल}} सँ जुडल अछि आ नहिये अन्तर्बाह्य रूपसँ दोसर पन्नमे अछि।",
+       "uncategorizedpages": "अवर्गीकृत पन्नासभ",
+       "uncategorizedcategories": "à¤\85वरà¥\8dà¤\97à¥\80à¤\95à¥\83त à¤¶à¥\8dरà¥\87णà¥\80सभ",
+       "uncategorizedimages": "à¤\85वरà¥\8dà¤\97à¥\80à¤\95à¥\83त à¤¸à¤\9eà¥\8dà¤\9aिà¤\95ासभ",
+       "uncategorizedtemplates": "अवर्गीकृत नमूनासभ",
+       "unusedcategories": "नà¥\88 à¤ªà¥\8dरयà¥\8bà¤\97 à¤\95à¤\8fल à¤¶à¥\8dरà¥\87णà¥\80सभ",
+       "unusedimages": "बिना à¤ªà¥\8dरयà¥\8bà¤\97à¤\95 à¤¸à¤\9eà¥\8dà¤\9aिà¤\95ासभ",
+       "wantedcategories": "à¤\86वशà¥\8dयà¤\95 à¤¶à¥\8dरà¥\87णà¥\80सभ",
+       "wantedpages": "आवश्यक पन्नासभ",
        "wantedpages-badtitle": "परिणाम सूचीमे अमान्य शीर्षक:$1",
-       "wantedfiles": "à¤\86वशà¥\8dयà¤\95 à¤¸à¤\82à¤\9aिà¤\95ा सभ",
-       "wantedtemplates": "आवश्यक नमूना सभ",
-       "mostlinked": "सभसँ बेसी लागिबला पन्ना सभ",
-       "mostlinkedcategories": "सभसà¤\81 à¤¬à¥\87सà¥\80 à¤²à¤¾à¤\97िबला à¤¸à¤\82वरà¥\8dà¤\97 सभ",
-       "mostlinkedtemplates": "सभसँ बेसी लागिबला नमूना सभ",
-       "mostcategories": "सभसà¤\81 à¤¬à¥\87सà¥\80 à¤¸à¤\82वरà¥\8dà¤\97बला à¤ªà¤¨à¥\8dना सभ",
-       "mostimages": "सभसà¤\81 à¤¬à¥\87सà¥\80 à¤²à¤¾à¤\97िबला à¤¸à¤\82à¤\9aिà¤\95ा सभ",
+       "wantedfiles": "à¤\86वशà¥\8dयà¤\95 à¤¸à¤\9eà¥\8dà¤\9aिà¤\95ासभ",
+       "wantedtemplates": "आवश्यक नमूनासभ",
+       "mostlinked": "सभसँ बेसी लागिबला पन्नासभ",
+       "mostlinkedcategories": "सभसà¤\81 à¤¬à¥\87सà¥\80 à¤²à¤¾à¤\97िबला à¤¶à¥\8dरà¥\87णà¥\80सभ",
+       "mostlinkedtemplates": "सभसँ बेसी लागिबला नमूनासभ",
+       "mostcategories": "सभसà¤\81 à¤¬à¥\87सà¥\80 à¤¶à¥\8dरà¥\87णà¥\80बला à¤ªà¤¨à¥\8dनासभ",
+       "mostimages": "सभसà¤\81 à¤¬à¥\87सà¥\80 à¤²à¤¾à¤\97िबला à¤¸à¤\9eà¥\8dà¤\9aिà¤\95ासभ",
        "mostinterwikis": "सर्वाधिक अन्तरविकी जडीभेल पृष्ठसभ",
        "mostrevisions": "सभसँ बेसी संशोधनबला पन्ना सभ",
        "prefixindex": "उपसर्गक संग सभटा पृष्ठ",
        "protectedtitles": "संरक्षित शीर्षक सभ",
        "protectedtitlesempty": "कोनो पन्ना ऐ सभ परिमिति लेल सुरक्षित नै राखल गेल अछि।",
        "listusers": "प्रयोक्ता सूची",
-       "listusers-editsonly": "सम्पादन करैबला प्रयोक्ताकेँ मात्र देखाउ",
-       "listusers-creationsort": "निरà¥\8dमाण à¤¤à¤¿à¤¥à¤¿à¤\95 à¤¹à¤¿à¤¸à¤¾à¤¬à¤¸à¤\81 à¤\9bाà¤\81à¤\9fà¥\82",
-       "listusers-desc": "अवरोही क्रम में क्रमबद्ध करी",
-       "usereditcount": "$1 {{PLURAL:$1|सम्पादन|सम्पादन सभ}}",
-       "usercreated": "{{GENDER:$3| बनैलक|बनैलकिन्ह}} $1 तिथि पर $2 काले",
+       "listusers-editsonly": "सम्पादन करैबला प्रयोक्ताक मात्र देखाबी",
+       "listusers-creationsort": "निरà¥\8dमाण à¤¤à¤¿à¤¥à¤¿à¤\95 à¤¹à¤¿à¤¸à¤¾à¤¬à¤¸à¤\81 à¤\9bाà¤\81à¤\9fà¥\80",
+       "listusers-desc": "अवरोही क्रममे क्रमबद्ध करी",
+       "usereditcount": "$1 {{PLURAL:$1|सम्पादन|सम्पादनसभ}}",
+       "usercreated": "{{GENDER:$3|बनैलक|बनैलकिन्ह}} $1 तिथि पर $2 काले",
        "newpages": "नव पन्नासभ",
        "newpages-username": "प्रयोक्तानाम:",
-       "ancientpages": "सभसँ पुरान पन्ना सभ",
-       "move": "हà¤\9fाà¤\89",
-       "movethispage": "à¤\90 à¤ªà¥\83षà¥\8dठà¤\95à¥\87à¤\81 à¤\98सà¤\95ाà¤\89",
+       "ancientpages": "सभसँ पुरान पन्नासभ",
+       "move": "सà¥\8dथानानà¥\8dतरण",
+       "movethispage": "à¤\88 à¤ªà¥\83षà¥\8dठà¤\95à¥\87 à¤\98सà¤\95ाबà¥\80",
        "unusedimagestext": "ई सभ संचिका अछि मुदा कोनो पन्नामे निवशित नै अछि।\nकृपा कऽ ई बुझू जे दोसर जालस्थल सभ सोझ सार्वत्रिक विभव संकेतबला कोनो संचिकासँ लागि बना सकैए, आ तँए सरिय प्रयोगक बादो अखनो एतए सूचित कएल जा सकैए।",
        "unusedcategoriestext": "ई संवर्ग पन्ना सभ अछि, ओना कोनो दोसर पन्ना वा संवर्ग ओकर प्रयोग करैत अछि।",
        "notargettitle": "बिन लक्ष्यक",
        "apihelp": "API मद्दत",
        "apihelp-no-such-module": "मोड्युल \"$1\" नै भेटल।",
        "apisandbox": "ए॰पी॰आइ प्रयोगपृष्ठ",
-       "apisandbox-submit": "à¤\85नà¥\81रà¥\8bध à¤\95रà¥\81",
+       "apisandbox-submit": "à¤\85नà¥\81रà¥\8bध à¤\95रà¥\80",
        "apisandbox-reset": "स्पष्ट",
        "apisandbox-examples": "उदाहरण",
        "apisandbox-results": "परिणाम",
        "apisandbox-request-url-label": "अनुरोध URL:",
        "apisandbox-request-time": "अनुरोध समय: $1",
-       "booksources": "à¤\95िताबà¤\95 à¤¸à¤¨à¥\8dदरà¥\8dभ à¤¸à¤­",
-       "booksources-search-legend": "à¤\95िताबà¤\95 à¤¸à¤¨à¥\8dदरà¥\8dभà¤\95 à¤²à¥\87ल à¤¤à¤¾à¤\95à¥\82",
+       "booksources": "à¤\95िताबà¤\95 à¤¸à¥\8dरà¥\8bत",
+       "booksources-search-legend": "à¤\95िताबà¤\95 à¤¸à¥\8dरà¥\8bत à¤¤à¤¾à¤\95à¥\80",
        "booksources-isbn": "आइ.एस.बी.एन.:",
-       "booksources-search": "ताà¤\95à¥\82",
+       "booksources-search": "ताà¤\95à¥\80",
        "booksources-text": "नीचाँ दोसर जालस्थलसँ लागि सभक सूची अछि जे नव आ प्रयोग कएल किताब बेचैए, आ ई पोथी सभक विषयमे ओहो सूचना दऽ सकैए जे अहाँ ताकि रहल छी:",
        "booksources-invalid-isbn": "देल आइ.एस.बी.एन. संख्या मान्य नै बुझाइत अछि; कृपा कऽ मूल स्रोतसँ द्वितीयक बनेबा काल भेल भ्रमकेँ जाँचू।",
        "specialloguserlabel": "कर्ता:",
        "allpagessubmit": "जाए",
        "allpagesprefix": "उपसर्गक संग दृश्य पन्ना सभ:",
        "allpagesbadtitle": "देल पन्नाक शीर्षक गलत, गलत सम्बन्धित अन्तर-भाषा अन्तर विकी शीर्षक छी। ई एक वा बेशी कलाकार युक्त भऽ सकैए जे शीर्षकमे प्रयुक्त नै कएल जा सकैए।",
-       "allpages-bad-ns": "{{जालस्थल}} मे \"$1\" नामगाम नै अछि।",
-       "allpages-hide-redirects": "बदलà¥\87न à¤¨à¥\81à¤\95ाà¤\8aà¤\81",
+       "allpages-bad-ns": "{{SITENAME}} मे \"$1\" नामगाम नै अछि।",
+       "allpages-hide-redirects": "पà¥\81नरà¥\8dनिरà¥\8dदà¥\87श à¤¨à¥\81à¤\95ाबà¥\80",
        "cachedspecial-viewing-cached-ttl": "अहाँ ई पृष्ठ के क्यास कएल अवतरण देख रहल छी, जे $1 पूरान भऽ सकएत अछि।",
        "cachedspecial-viewing-cached-ts": "अहाँ इ पृष्ठ के क्यास कएल गएल अवतरण देख रहल छी, जे कि संभवतः वर्तमान अवस्था सँ भिन्न भऽ सकएत अछि।",
        "cachedspecial-refresh-now": "लब्का देखु",
-       "categories": "सà¤\82वरà¥\8dà¤\97 सभ",
+       "categories": "शà¥\8dरà¥\87णà¥\80सभ",
        "categoriespagetext": "ई {{PLURAL:$1|संवर्गमे अछि|संवर्ग सभमे अछि}} पन्ना वा मीडिया।\n[[Special:UnusedCategories|Unused categories]] एतए देखाएल नै अछि।\nईहो देखू [[Special:WantedCategories|wanted categories]]।",
        "categoriesfrom": "पन्ना प्रदर्शन प्रारम्भ भेल:",
-       "deletedcontributions": "मेटाएल प्रयोक्ता योगदान सभ",
-       "deletedcontributions-title": "मेटाएल प्रयोक्ता योगदान सभ",
-       "sp-deletedcontributions-contribs": "योगदान सभ",
-       "linksearch": "बाहरà¤\95 à¤¸à¤®à¥\8dबनà¥\8dधक खोज",
+       "deletedcontributions": "मेटाएल प्रयोक्ता योगदान",
+       "deletedcontributions-title": "मेटाएल प्रयोक्ता योगदान",
+       "sp-deletedcontributions-contribs": "योगदान",
+       "linksearch": "बाहà¥\8dय à¤²à¤¿à¤\99à¥\8dक खोज",
        "linksearch-pat": "खोज तरीका:",
        "linksearch-ns": "नामस्थान :",
-       "linksearch-ok": "ताà¤\95à¥\82",
+       "linksearch-ok": "ताà¤\95à¥\80",
        "linksearch-text": "ब्रह्मास्त्र जेना \"*.wikipedia.org\" प्रयोग कएल जा सकैए।\nसहायक संविद:$1 (खोजमे ऐमेसँ कोनो नै जोड़ू)।",
        "linksearch-line": "$2 सँ $1 क लागि अछि।",
        "linksearch-error": "निमंत्रकनामक प्रारम्भमे ब्रह्मास्त्र आबि सकैए।",
        "listusersfrom": "प्रयोक्ता प्रदर्शन प्रारम्भ भेल:",
-       "listusers-submit": "दà¥\87à¤\96ाà¤\89",
+       "listusers-submit": "दà¥\87à¤\96ाबà¥\80",
        "listusers-noresult": "कोनो प्रयोक्ता नै",
        "listusers-blocked": "(प्रतिबन्धित)",
        "activeusers": "सक्रिय प्रयोक्ता सभक सूची",
        "emailfrom": "एतऽसँ:",
        "emailto": "ऐलेल:",
        "emailsubject": "विषय:",
-       "emailmessage": "सà¤\82देश:",
-       "emailsend": "पठाà¤\89",
+       "emailmessage": "सनà¥\8dदेश:",
+       "emailsend": "पठाबà¥\80",
        "emailccme": "हमर संदेशक द्वितीयक हमर ई-पत्रपर पठाउ",
        "emailccsubject": "अहाँक संदेशक द्वितीयक $1: $2",
        "emailsent": "ई-पत्र पठेलौं",
        "unwatching": "छोड़ल ...",
        "watcherrortext": "अहाँक साकांक्ष-सूची विकल्प \"$1\" लेल बदलबा काल एकटा भ्रम आएल।",
        "enotif_reset": "सभ पन्नाकेँ देखल चिन्हित करू",
-       "enotif_impersonal_salutation": "{{अन्तर्जाल}} प्रयोक्ता",
+       "enotif_impersonal_salutation": "{{SITENAME}} प्रयोगकर्ता",
        "enotif_subject_deleted": "{{SITENAME}} पन्ना $1 के {{gender:$2|$2}} हटेलक",
        "enotif_subject_created": "{{SITENAME}} पन्ना $1 को {{gender:$2|$2}} बनेलक",
        "enotif_subject_moved": "{{SITENAME}} पृष्ठ $1 के {{gender:$2|$2}} घसकेलक",
        "namespace_association": "सम्बद्ध चेन्हासी",
        "tooltip-namespace_association": "ऐ बक्साकेँ सही करू जइसँ वार्ता आ विषय नामस्थान समाहित कएल जा सकए चुनल नामस्थानमे",
        "blanknamespace": "(मुख्य)",
-       "contributions": "प्रयोक्ताक योगदान सभ",
+       "contributions": "{{GENDER:$1|प्रयोगकर्ता}} योगदान",
        "contributions-title": "$1 लेल प्रयोक्ताक अवदान",
        "mycontris": "योगदान",
        "anoncontribs": "योगदानसभ",
-       "contribsub2": "$1 ($2) लेल",
+       "contribsub2": "{{GENDER:$3|$1}} ($2)क लेल",
        "contributions-userdoesnotexist": "प्रयोक्ता खाता \"$1\" पंजीकृत नै अछि।",
        "nocontribs": "कोनो परिवर्तन ऐ सँ मेल नै खाइए।",
        "uctop": "(शिखर)",
        "month": "माससँ (आ पहिने)",
        "year": "ऐ साल (आ पहिने)",
-       "sp-contributions-newbies": "नव à¤\96ाताà¤\95 à¤\85वदानà¤\95à¥\87à¤\81 à¤¦à¥\87à¤\96ाà¤\89",
+       "sp-contributions-newbies": "मातà¥\8dर à¤¨à¤µ à¤\96ाताà¤\95 à¤¯à¥\8bà¤\97दान à¤¦à¥\87à¤\96ाबà¥\80",
        "sp-contributions-newbies-sub": "नब प्रयोक्ताकऽ लेल",
        "sp-contributions-newbies-title": "नब प्रयोक्ताकऽ योगदान",
        "sp-contributions-blocklog": "प्रतिबन्धित वृत्तलेख",
        "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ाबà¥\80",
        "whatlinkshere-hidetrans": "$1 परागत",
        "whatlinkshere-hidelinks": "$1 सम्बन्ध सभ",
        "whatlinkshere-hideimages": "$1 फाइल जडी सभ",
        "autoblockid": "स्वतःप्रतिबन्धित #$1",
        "block": "प्रयोक्ताकेँ प्रतिबन्धित करू",
        "unblock": "प्रयोक्ताकेँ प्रतिबन्धसँ हटाउ",
-       "blockip": "प्रयोक्ताकेँ प्रतिबन्धित करू",
+       "blockip": "{{GENDER:$1|प्रयोक्ता}}क प्रतिबन्धित करी",
        "blockip-legend": "प्रयोक्ताकेँ प्रतिबन्धित करू",
        "blockiptext": "नीचाँक आवेदनक प्रयोग कोनो खास अनिकेत वा प्रयोक्तानामक लिखैक प्रवेशकेँ प्रतिबन्धित करबा लेल करू।\nई अतत्तः करैबलाक विरुद्ध प्रयुक्त हुअए, आ एकर अनुसार [[{{MediaWiki:Policy-url}}|policy]]।\nनीचाँ स्पष्ट कारण लिखू (जेना, खास पन्नाकेँ देखबैत जतए अतत्तः कएल गेल अछि)।",
        "ipaddressorusername": "अनिकेत संकेत वा प्रयोक्तानाम:",
index b2eed98..58e4cdd 100644 (file)
@@ -7,13 +7,15 @@
                        "לערי ריינהארט",
                        "Bennylin",
                        "아라",
-                       "Macofe"
+                       "Macofe",
+                       "Mbrt"
                ]
        },
        "tog-underline": "Garisen ngisoré pranala:",
        "tog-hideminor": "Umpetna suntingan cilik nang owahan anyar",
        "tog-hidepatrolled": "Umpetna suntingan sing wis dipatroli nang owahan anyar",
        "tog-newpageshidepatrolled": "Umpetna kaca sing wis dipatroli sekang daftar kaca anyar",
+       "tog-hidecategorization": "Umpetna kategori nang kaca",
        "tog-extendwatchlist": "Kembangna daftar pengawasan kanggo nidokna kabeh pangowahan, ora mung sing paling anyar thok",
        "tog-usenewrc": "Klompok owahan miturut kaca nang owahan anyar lan daptar pangawasan (mbutuhna JavaScript)",
        "tog-numberheadings": "Aweh nomer judul secara otomatis",
@@ -24,6 +26,7 @@
        "tog-watchdefault": "Tambahna kaca lan berkas sing tek-sunting maring daptar pangawasanne inyong",
        "tog-watchmoves": "Tambahna kaca lan berkas sing tek-pindah maring daptar pangawasanne inyong",
        "tog-watchdeletion": "Tambahna kaca lan berkas sing tek-busek maring daptar pangawasanne inyong",
+       "tog-watchuploads": "Sogna file anyar sing nyong unggah nang daptar sawangane nyong",
        "tog-watchrollback": "Tambahna kaca sing wis tek rollback maring daftar pangawasane inyong",
        "tog-minordefault": "Otomatis nandani kabeh suntingan dadi suntingan cilik",
        "tog-previewontop": "Tidokna pratayang sedurunge kotak sunting",
        "tog-watchlisthidebots": "Umpetna suntingane bot sekang daftar pangawasan",
        "tog-watchlisthideminor": "Umpetna suntingan cilik sekang daftar pangawasan",
        "tog-watchlisthideliu": "Umpetna suntingane pangganggo sing mlebu log sekang daftar pangawasan",
+       "tog-watchlistreloadautomatically": "Muat balik daptar sawangane otomatis yen saringan kebesut (Perintaeh JavaScript)",
        "tog-watchlisthideanons": "Umpetna suntingane panganggo anonim sekang daftar pangawasan",
        "tog-watchlisthidepatrolled": "Umpetna suntingan sing wis dipatroli sekang daftar pangawasan",
+       "tog-watchlisthidecategorization": "Umpetna kategori nang kaca",
        "tog-ccmeonemails": "Kirimi inyong salinan imel sing tak-kirimna maring panganggo sejen",
        "tog-diffonly": "Aja tidokna isi kaca nang ngisor bedane suntingan",
        "tog-showhiddencats": "Tidokna kategori sing diumpetna",
-       "tog-norollbackdiff": "Lirwakna perbedaan seuwise nglakokna pambalikan",
+       "tog-norollbackdiff": "Aja ndeleng perbedaane seuwise nglakokna pambalikan",
        "tog-useeditwarning": "Elingna inyong angger ninggalna kaca panyuntingan sing durung disimpen owahane",
        "tog-prefershttps": "Gunakna koneksi aman terus angger mlebu log",
        "underline-always": "Saben",
@@ -57,7 +62,7 @@
        "editfont-monospace": "Aksara (font) Monospace",
        "editfont-sansserif": "Aksara (font) Sans-serif",
        "editfont-serif": "Aksara (font) Serif",
-       "sunday": "Minggu",
+       "sunday": "Ahad",
        "monday": "Senen",
        "tuesday": "Selasa",
        "wednesday": "Rebo",
        "october-date": " $1 Oktober",
        "november-date": "$1 November",
        "december-date": "$1 Desember",
+       "period-am": "AM",
+       "period-pm": "PM",
        "pagecategories": "{{PLURAL:$1|Kategori|Kategori}}",
        "category_header": "Kaca nang kategori \"$1\"",
        "subcategories": "Subkategori",
        "poolcounter-usage-error": "Usage error: $1",
        "aboutsite": "Prakara {{SITENAME}}",
        "aboutpage": "Project:Prakara",
-       "copyright": "Kabeh teks ana miturut $1.",
+       "copyright": "Kabeh teks ana miturut $1 namung sing cathetan liya beda.",
        "copyrightpage": "{{ns:project}}:Hak cipta",
        "currentevents": "Kedaden Anyar",
        "currentevents-url": "Project:Prastawa sekiye",
        "nstab-template": "Cithakan",
        "nstab-help": "Pitulung",
        "nstab-category": "Kategori:",
+       "mainpage-nstab": "Kaca Utama",
        "nosuchaction": "Ora ana tindakan kaya kuwe",
        "nosuchactiontext": "Tindakan sing dijaluk URL kuwe ora sah.\nRika ndeyan salah ngetikna URL, utawa ngetutna pranala sing ora bener.\nKiye bisa uga ngindikasikna nek ana ''bug'' nang piranti alus sing digunakna nang {{SITENAME}}.",
        "nosuchspecialpage": "Ora ana kaca astamiwa kaya kuwe",
        "nospecialpagetext": "<strong>Rika njaluk kaca astamiwa sing ora sah.</strong>\n\nDaftar kaca astamiwa sing sah teyeng dideleng nang [[Special:SpecialPages|{{int:specialpages}}]].",
        "error": "Kasalahan",
        "databaseerror": "Kasalahan basis data",
+       "databaseerror-text": "Ana kesalahan nang panyuwunan database wonten. Kasalahan iki mbokmenawa nuduhna anane kesalahan nang piranti alus.",
+       "databaseerror-textcl": "Ana kesalahan nang database query",
+       "databaseerror-query": "Queri:$1",
+       "databaseerror-function": "Fungsine:$1",
+       "databaseerror-error": "Eror:$1",
+       "transaction-duration-limit-exceeded": "Nggo ngindari nciptakna replikasi lag duwur, transaksi iki dibatalna sebab durasi write ($1) nglewihi $2 {{PLURAL: $ 2 | detik | detik}} batas. Angger Rikangowah akeh item sekaligus,jajal ngelakokna beberapa operasi sing lewih cilik nggo gantine.",
        "laggedslavemode": "'''Pènget:''' Kaca kiye mbokmenawa isiné dudu pangowahan pungkasan.",
        "readonly": "Basis data dikunci",
        "enterlockreason": "Lebokna alesan panguncèn, kalebu uga prakiran kapan kunci bakal dibuka",
-       "readonlytext": "Basis data lagi dikunci sekang inputan anyar lan modifikasi liyane, ndeyane lagi ana perawatan basis data, seuwise kuwe tuli bakal balik normal maning.\n\nAdministrator sing ngunci kiye aweh katerangan kaya kiye: $1",
+       "readonlytext": "Basis data agi dikonci sekang inputan anyar lan modifikasi liyane, ndeyane agi ana perawatan basis data, seuwise kuwe toli bakal mbalik normal maning.\n\nAdministrator sing ngunci kiye aweh katerangan kaya kiye: $1",
        "missing-article": "Basis data ora teyeng nemokna teks paca sing kudune ana, yaiku \"$1\" $2.\n\nKiye biasanye jalaran pranala daluwarsa maring revisi sedurunge sekang kaca sing wis dibusak.\n\nAngger dudu kuwe sebabe, Rika ndeyan nemokna \"bug\" nang software. \nMonggo dilaporna maring [[Special:ListUsers/sysop|administrator]], karo nyebutna URL sing dituju.\n\nA",
        "missingarticle-rev": "(révisi#: $1)",
        "missingarticle-diff": "(Béda: $1, $2)",
        "readonly_lag": "Basis data uwis dikunci otomatis sawetara basis data sekunder lagi nglakokna sinkronisasi karo basis data utama",
        "internalerror": "Kasalahan internal",
        "internalerror_info": "Kasalahan internal: $1",
+       "internalerror-fatal-exception": "pengecualiane fatal tipe \"$1\"",
        "filecopyerror": "Ora teyeng nyalin berkas \"$1\" maring \"$2\".",
        "filerenameerror": "Ora teyeng ngowahi jeneng berkas sekang \"$1\" dadi \"$2\".",
        "filedeleteerror": "Ora teyeng mbusak berkas \"$1\".",
        "directorycreateerror": "Ora teyeng nggawé dirèktori \"$1\".",
+       "directoryreadonlyerror": "Direktori \"$1\" mung diwaca thok.",
+       "directorynotreadableerror": "Direktori \"$1\" ora teyeng diwaca.",
        "filenotfound": "Ora teyeng nemokna berkas \"$1\".",
        "unexpected": "Nilai-ne nang jaba jangkauan: \"$1\"=\"$2\".",
        "formerror": "Kasalahan: Ora teyeng ngirimna formulir.",
        "actionthrottled": "Tindakan diwatesi",
        "actionthrottledtext": "Kanggo ngukur anti-spam, Rika diwatesi gole nglakoni tikdakan kiye keseringen nang wektu sing cendhak, lan Rika uwis nglewati watese kuwe.\nMonggo dijajal maning nang sawetara menit.",
        "protectedpagetext": "Kaca kiye uwis dikunci ben ora teyeng disunting utawa aksi liyane (pokoke ora teyeng diapa-apakna maning).",
-       "viewsourcetext": "Rika teyeng ndeleng lan nyalin sumbere kaca kiye:",
-       "viewyourtext": "Rika teyeng ndeleng lan nyalin sumbere '''suntingane Rika''' nang kaca kiye:",
+       "viewsourcetext": "Rika teyeng ndeleng lan nyalin sumbere kaca kiye.",
+       "viewyourtext": "Rika teyeng ndeleng lan nyalin sumbere <strong>suntingane Rika</strong> meng kaca kiye:",
        "protectedinterface": "Kaca kiye isine teks antarmuka ding dienggo piranti alus nang wiki kiye, lan uwis dikunci nggo menghindari kasalahan.\nKanggo nambaih utawa ngowaih terjemahan nang kabeh wiki, monggo gunakna [//translatewiki.net/ translatewiki.net], proyek lokalisasi MediaWiki.",
-       "editinginterface": "'''Pènget:''' Rika nyunting kaca sing dienggo nyedyakna tèks antarmuka kanggo piranti alus.\nPangowahan kaca kiye bakal awèh pangaruh maring tampilan antarmuka panganggo duweke panganggo sejen nang wiki kiye.\nAngger arep nambaih utawa ngowaih terjemahan, monggo gunakna [//translatewiki.net/translatewiki.net], proyèk lokalisasi MediaWiki.",
+       "editinginterface": "'''Penget:''' Rika nyunting kaca sing dienggo nyedyakna teks antarmuka kanggo piranti alus.\nPangowahan kaca kiye engko aweh pangaruh maring tampilan antarmuka panganggo duweke panganggo liyane nang wiki kiye.",
        "cascadeprotected": "Kaca kiye wis direksa sekang penyuntingan jalaran melu mlebu nang {{PLURAL:$1|kaca|kaca-kaca}} nang ngisor kiye sing wis direksa nganggo opsi \"runtun\":\n$2",
        "namespaceprotected": "Rika ora duwe hak akses kanggo nyunting kaca nang bilik jeneng '''$1'''.",
        "customcssprotected": "Rika ora duwe izin nggo nyunting kaca CSS kiye, jalaran isine pengaturan pribadine panganggo sejen.",
        "filereadonlyerror": "Ora teyeng ngowaih berkas \"$1\" jalaran panyimpenan berkas \"$2\" ana nang mode-mung-teyeng-diwaca.\n\nAdministrator sing ngunci aweh keterangan: \"$3\".",
        "invalidtitle-knownnamespace": "Irah-irahan ora sah nang bilikjeneng \"$2\" lan teks \"$3\"",
        "invalidtitle-unknownnamespace": "Judhul ora sah nang bilik jeneng sing ora dingerteni nomer $1 lan teks \"$2\"",
-       "exception-nologin-text": "Kaca utawa kelakon kiye mbutuhna mlebu log nèng wiki kiye dhisit.",
+       "exception-nologin": "Urung mlebu",
+       "exception-nologin-text": "Tulung mlebu disit ben Rika duwe akses maring kaca kiye.",
+       "exception-nologin-text-manual": "Tulung $1 ben tenyeng duwe akses maring kaca kiye.",
        "virus-badscanner": "Kasalahan konfigurasi: pamindai virus ora dikenal: ''$1''",
        "virus-scanfailed": "Pemindaian gagal (kode $1)",
        "virus-unknownscanner": "Antivirus ora ditepungi:",
        "logouttext": "'''Rika uwis metu log sekang sistem.'''\n\nDigatekna ya, cokan ana kaca sing esih terus nidokna nek rika esih mlebu log nganti Rika mbusak singgahan nang panjelajah web-e Rika.",
+       "cannotlogoutnow-title": "Ora teyeng metu siki",
+       "cannotlogoutnow-text": "Metu ora dadi angger nganggo:$1",
+       "welcomeuser": "Sugeng teka,$1",
        "welcomecreation-msg": "Akune Rika uwis digawe. \nAja kelalen ngowaih [[Special:Preferences|preferensi {{SITENAME}}]] Rika.",
        "yourname": "Jeneng panganggo:",
        "userlogin-yourname": "Jenengpanganggo",
        "remembermypassword": "Emutna data login-ne inyong nang peramban kiye (kanggo paling suwe $1 {{PLURAL:$1|dina|dina}})",
        "userlogin-remembermypassword": "Jorna ben Inyong tetep mlebu log",
        "userlogin-signwithsecure": "Gunakna koneksi aman",
+       "cannotloginnow-title": "Ora teyeng mlebu siki",
        "yourdomainname": "Domain Rika:",
        "password-change-forbidden": "Rika ora teyeng ngowaih tembung sandhi nang wiki kiye.",
        "externaldberror": "Ana kesalahan otentikasi basis data utawa Rika ora olih nglakokna pemutakhiran maring akun eksternale Rika.",
        "createacct-reason-ph": "Kenangapa Rika nggawe akun sejen",
        "createacct-submit": "Gawe akune Rika",
        "createacct-another-submit": "Gawe akun liyane",
+       "createacct-continue-submit": "Lanjutna penggawean akun",
        "createacct-benefit-heading": "{{SITENAME}} kuwe digawe nang wong kaya Rika.",
        "createacct-benefit-body1": "{{PLURAL:$1|owahan|owahan}}",
        "createacct-benefit-body2": "{{PLURAL:$1|kaca}}",
        "noname": "Jeneng panganggo sing Rika lebokna ora sah.",
        "loginsuccesstitle": "Sukses mlebu log",
        "loginsuccess": "'''Rika sekiye mlebu log nang {{SITENAME}} nganggo jeneng \"$1\".'''",
-       "nosuchuser": "Ora ana panganggo sing jenenge \"$1\".\nJeneng panganggo kuwe mbedakna kapitalisasi.\nPriksa maning ejaane Rika, utawa [[Special:CreateAccount|gawe akun anyar]]",
+       "nosuchuser": "Ora ana panganggo sing jenenge \"$1\".\nJeneng panganggo kuwe dibedakna nang kapitalisasi.\nPriksa maning ejaane Rika, utawa [[Special:CreateAccount|gawe akun anyar]]",
        "nosuchusershort": "Ora ana panganggo sing jenenge \"$1\".\nJajal dipriksa maning ejaane Rika.",
        "nouserspecified": "Rika kudu nglebokna jeneng panganggo.",
        "login-userblocked": "Panganggo kiye diblok. Ora olih mlebu log.",
        "preview": "Pra tayang",
        "showpreview": "Pra tayang",
        "showdiff": "Ndeleng bedané",
-       "anoneditwarning": "Rika ora kadaftar mlebu.\nAlamat IP-ne Rika bakal dicatet nang sajarah panyuntingane kaca kiye.",
+       "anoneditwarning": "Rika ora kadaftar utawa urung mlebu.\nAlamat IP-ne Rika bakal dicatet nang sajarah panyuntingane kaca kiye.",
        "anonpreviewwarning": "''Rika durung mlebu log. Nyimpen kaca bakal nyatetna alamat IP-ne Rika nang riwayat suntingan kaca kiye.''",
        "missingsummary": "'''Pènget:''' Rika ora nglebokna ringkesan panyuntingan. \nAngger Rika mencèt tombol Simpen maning, suntingane Rika bakal kasimpen tanpa ringkesan panyuntingan.",
        "missingcommenttext": "Tulung lebokna komentar nang ngisor kiye.",
        "shown-title": "Tidokna $1 {{PLURAL:$1|asil|asil}} saben kaca",
        "viewprevnext": "Deleng ($1 {{int:pipe-separator}} $2) ($3)",
        "searchmenu-exists": "''' Ana kaca nganggo jeneng \"[[:$1]]\" nang wiki kiye.'''",
-       "searchmenu-new": "'''Gawe kaca \"[[:$1]]\" nang wiki kiye!'''",
+       "searchmenu-new": "'''Gawe kaca \"[[:$1]]\" nang wiki kiye!''' {{PLURAL:$2|0=|Deleng uga kaca sing Rika golet.|Deleng uga penggoletan sing digolet.}}",
        "searchprofile-articles": "Isine kaca",
        "searchprofile-images": "Multimedia",
        "searchprofile-everything": "Kabèh",
        "prefs-signature": "Tapak asta",
        "prefs-dateformat": "Format tanggal",
        "prefs-timeoffset": "Format wektu",
-       "prefs-advancedediting": "Opsi lanjutan",
+       "prefs-advancedediting": "Opsi lanjutane",
        "prefs-advancedrc": "Opsi lanjutan",
        "prefs-advancedrendering": "Opsi lanjutan",
        "prefs-advancedsearchoptions": "Opsi lanjutan",
        "userrights": "Manajemen hak panganggo",
        "userrights-lookup-user": "Ngatur kelompok panganggo",
        "userrights-user-editname": "Lebokna jeneng panganggo:",
-       "editusergroup": "Sunting kelompok panganggo",
+       "editusergroup": "Besut {{GENDER:$1|kelompok}} panganggo",
        "editinguser": "Ngganti hak akses nggo pangganggo '''[[User:$1|$1]]''' $2",
        "userrights-editusergroup": "Sunting kelompok panganggo",
        "saveusergroups": "Simpen kelompok panganggo",
        "revertpage": "Suntingane [[Special:Contributions/$2|$2]] ([[User talk:$2|dhiskusi]]) dibalekna maring vèrsi pungkasan sekang [[User:$1|$1]]",
        "revertpage-nouser": "Mbalekna suntingan sekang (jeneng panganggo dibusek) ming revisi pungkasan sekang [[User:$1|$1]]",
        "rollback-success": "Mbalekna suntingane $1;\ndibalekna ming revisi pungkasan sekang $2.",
+       "rollback-success-notify": "Mbalekna besutan sekang $1; owah mbalik nggo revisi mburi sekang $2. [$3 Deleng owahane]",
        "sessionfailure-title": "Sèsi gagal",
        "sessionfailure": "Ketone lagi ana masalah karo sesi log-e Rika;\nloge Rika wis dibatalna nggo nyegah pambajakan.\nMonggo mbalik ming kaca sedurunge, dibaleni gole muatna kaca (reload) lan jajal diunggahna maning.",
        "protectlogpage": "Log pangreksan",
        "whatlinkshere-prev": "{{PLURAL:$1|sedurungé|$1 sedurungé}}",
        "whatlinkshere-next": "{{PLURAL:$1|terusane|$1 terusane}}",
        "whatlinkshere-links": "← pranala",
-       "whatlinkshere-hideredirs": "$1 pengalihan",
+       "whatlinkshere-hideredirs": "$1 Dialihna",
        "whatlinkshere-hidetrans": "$1 transklusi",
        "whatlinkshere-hidelinks": "$1 pranala",
        "whatlinkshere-hideimages": "$1 pranala berkas",
        "allmessagesdefault": "Tèks baku",
        "thumbnail-more": "Gedhèkna",
        "thumbnail_error": "Luput gole gawe gambar cilik (''thumbnail''): $1",
-       "tooltip-pt-userpage": "Kaca panganggone Rika",
+       "tooltip-pt-userpage": "{{GENDER:|Kaca panganggone}} Rika",
        "tooltip-pt-mytalk": "Kaca dhiskusine Rika",
-       "tooltip-pt-preferences": "Preferensine Rika",
+       "tooltip-pt-preferences": "Preferensine {{GENDER:|Rika}}",
        "tooltip-pt-watchlist": "Daftar kaca sing Rika awasi owah-owahane",
        "tooltip-pt-mycontris": "Daftar kontribusine Rika",
        "tooltip-pt-login": "Rika diajak kon mlebu log; senajan kuwe ora kudu.",
        "tooltip-t-whatlinkshere": "Daftar kabeh kaca wiki sing duwe pranala maring kaca kiye",
        "tooltip-t-recentchangeslinked": "Owahan anyar nang kaca sing gandeng karo kaca kiye",
        "tooltip-feed-atom": "''Atom feed'' kanggo kaca kiye",
-       "tooltip-t-contributions": "Deleng daftar kontribusine pangganggo kiye",
+       "tooltip-t-contributions": "Deleng daftar kontribusine pangganggo  {{GENDER:$1|kiye}}",
        "tooltip-t-emailuser": "Kirimna e-mail maring panganggo kiye",
        "tooltip-t-upload": "Unggahna gambar utawa berkas media",
        "tooltip-t-specialpages": "Daftar kabeh kaca astamiwa",
        "file-info-size": "$1 × $2 piksel, ukuran berkas: $3, tipe MIME: $4",
        "file-nohires": "Ora ana résolusi sing luwih dhuwur.",
        "svg-long-desc": "Berkas SVG, nominal $1 × $2 piksel, gedhené berkas: $3",
-       "show-big-image": "Résolusi kebak",
+       "show-big-image": "Resolusi biasa",
        "bad_image_list": "Formate kaya kiye:\n\nMung butir daftar (baris sing diawali karo tanda*) sing melu diitung.\nPranala disit dhewek nang baris kuwe kudu pranala maring berkas sing ala.\nPranala seteruse nang baris sing padha dianggep dadi \"pengecualian\", yakuwe artikel sing bisa nampilna berkas kuwe mau.",
        "metadata": "Metadata",
        "metadata-help": "Berkas kiye ngandhut informasi tambahan, sing ndeyane ditambahna sekang kamera digital utawa ''scanner'' sing digunakna nggo nggawe utawa ''digitalisasi'' berkas kiye.\nAngger berkas kiye uwis diowahi sekang versi asline, rincian sing ana ndeyane wis ora sacara kebak nidokna informasi sekang gambar sing wis dimodifikasi kiye.",
        "specialpages": "Kaca-kaca khusus",
        "external_image_whitelist": " #Jorna baen larikan kiye apa anané<pre>\n#Gunakna fragmèn èksprèsi regular (mung bagéyan nang antarane //) nang ngisor\n#Fragmèn kiye bakal dicocogna karo URL sekang gambar-gambar èksternal\n#Fragmèn sing cocog bakal ditampilna minangka gambar, nék ora ya mung pranala maring gambare baen sing ditampilna\n#Larikan sing diwiwiti nganggo # dianggep minangka komentar\n#Kiye ora mbédakna aksara gedhé/cilik\n\n#Sogna kabèh fragmèn èksprèsi regular nang dhuwuré larikan kiye. Jorna baen larikan kiye apa anané</pre>",
        "tag-filter": "Filter [[Special:Tags|Tag]]:",
-       "rightsnone": "(ora ana)"
+       "rightsnone": "(ora ana)",
+       "searchsuggest-search": "Golet"
 }
index accb759..8e9b13d 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“.",
        "noemail": "Нема заведено е-поштенска адреса за корисник „$1“.",
        "noemailcreate": "Потребно е да наведете важечка е-поштенска адреса",
        "passwordsent": "Нова лозинка е испратена на е-поштенската адреса заведена за „$1“.\nВе молиме најавете се повторно откако ќе ја примите пораката.",
-       "blocked-mailpassword": "Ð\92аÑ\88аÑ\82а IP-адÑ\80еÑ\81а Ðµ Ð±Ð»Ð¾ÐºÐ¸Ñ\80ана Ð·Ð° Ñ\83Ñ\80едÑ\83ваÑ\9aе, Ð¸Ñ\81Ñ\82овÑ\80емено Ðµ Ñ\81Ñ\82авена Ð·Ð°Ð±Ñ\80ана Ð·Ð° ÐºÐ¾Ñ\80иÑ\81Ñ\82еÑ\9aе Ð½Ð° Ñ\84Ñ\83нкÑ\86иÑ\98аÑ\82а Ð·Ð° Ð¾Ð±Ð½Ð¾Ð²Ð° Ð½Ð° Ð»Ð¾Ð·Ð¸Ð½ÐºÐ° Ð·Ð° Ð´Ð° Ñ\81е Ñ\81пÑ\80еÑ\87и Ð¼Ð¾Ð¶Ð½Ð¾Ñ\81Ñ\82а Ð·Ð° Ð·Ð»Ð¾Ñ\83поÑ\82Ñ\80еба.",
+       "blocked-mailpassword": "Ð\92аÑ\88аÑ\82а IP-адÑ\80еÑ\81а Ð¸Ð¼Ð° Ð·Ð°Ð±Ñ\80ана Ð·Ð° Ñ\83Ñ\80едÑ\83ваÑ\9aе. Ð\97а Ð´Ð° Ñ\81е Ñ\81пÑ\80еÑ\87и Ð·Ð»Ð¾Ñ\83поÑ\82Ñ\80еба, Ð½Ðµ Ðµ Ð´Ð¾Ð·Ð²Ð¾Ð»ÐµÐ½Ð¾ Ð¿Ð¾Ð²Ñ\80аÑ\82ок Ð½Ð° Ð»Ð¾Ð·Ð¸Ð½ÐºÐ° Ð¾Ð´ Ð½Ðµа.",
        "eauthentsent": "На назначената адреса е испратена потврдна порака.\nПред да се испрати друга порака на корисничката сметка, ќе морате да ги проследите напатствијата во пораката, за да потврдите дека таа корисничка сметка е навистина ваша.",
        "throttled-mailpassword": "Веќе е испратена порака за измена на лозинката во {{PLURAL:$1|изминатиов час|изминативе $1 часа}}.\nЗа да се спречи злоупотреба, само едно потсетување може да се праќа на {{PLURAL:$1|секој час|секои $1 часа}}.",
        "mailerror": "Грешка при испраќање на е-поштата: $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",
        "changepassword-success": "Вашата лозинка е сменета!",
        "changepassword-throttled": "Имате премногу обиди за најава за кратко време.\nПочекајте $1 пред да се обидете повторно.",
        "botpasswords": "Ботовски лозинки",
+       "botpasswords-existing": "Постоечки ботовски лозинки",
+       "botpasswords-createnew": "Направи нова ботовска лозинка",
+       "botpasswords-editexisting": "Измени постоечка ботовска лозинка",
        "botpasswords-label-appid": "Име на ботот:",
        "botpasswords-label-create": "Создај",
        "botpasswords-label-update": "Поднови",
        "botpasswords-label-delete": "Избриши",
        "botpasswords-label-resetpassword": "Ставете нова лозинка",
        "botpasswords-label-grants": "Применливи доделувања:",
+       "botpasswords-label-grants-column": "Доделено",
+       "botpasswords-bad-appid": "Името на ботот „$1“ е неважечко.",
        "resetpass_forbidden": "Лозинките не може да се менуваат",
        "resetpass-no-info": "Мора да сте најавени ако сакате да имате директен пристап до оваа страница.",
        "resetpass-submit-loggedin": "Смени лозинка",
        "mergehistory-empty": "Нема преработки кои можат да се спојат.",
        "mergehistory-done": "$3 {{PLURAL:$3|преработка |преработки}} на $1 успешно {{PLURAL:$3|е споена|се споени}} во [[:$2]].",
        "mergehistory-fail": "Не е возможно да се направи спојување на историјата, проверете ја страницата и временските параметри.",
+       "mergehistory-fail-bad-timestamp": "Временската ознака е неважечка.",
+       "mergehistory-fail-invalid-source": "Изворната страница е неважечка.",
+       "mergehistory-fail-invalid-dest": "Целната страница е неважечка.",
+       "mergehistory-fail-permission": "Немате дозвола за да ја споите историјата.",
+       "mergehistory-fail-self-merge": "Изворната и целната страница се исти.",
        "mergehistory-fail-toobig": "Не можам да извршам спојување на историјата бидејќи така ќе се надмине границата од {{PLURAL:$1|една преработка|$1 преработки}}.",
        "mergehistory-no-source": "Изворната страница $1 не постои.",
        "mergehistory-no-destination": "Целната страница $1 не постои.",
        "editusergroup": "Уреди кориснички групи",
        "editinguser": "Менување на правата на {{GENDER:$1|корисникот}} <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "Уреди ги корисничките групи",
-       "saveusergroups": "Зачувај ги корисничките групи",
+       "saveusergroups": "Зачувај ги {{GENDER:$1|корисничките}} групи",
        "userrights-groupsmember": "Член на:",
        "userrights-groupsmember-auto": "Подразбран член на:",
        "userrights-groups-help": "Можете да измените на кои групи припаѓа корисник:\n* Штиклирано - корисникот е во таа група.\n* Нештиклирано - корисникот не припаѓа на групата.\n* Ѕвездичка (*) - не можете да ја отстраните групата откако сте ја додале (и обратно).",
        "grant-group-administration": "Вршење на административни дејства",
        "grant-group-other": "Разни активности",
        "grant-blockusers": "Блокирање и одблокирање корисници",
-       "grant-createaccount": "Ð\9dапÑ\80ави сметки",
+       "grant-createaccount": "Ð\9fÑ\80авеÑ\9aе сметки",
        "grant-createeditmovepage": "Создавање, уредување и преместување страници",
-       "grant-delete": "Бришење на страници, преработки и дневнички записи",
-       "grant-editinterface": "Измена на именскиот простор „МедијаВики“ и кориснички CSS/JS",
-       "grant-editmycssjs": "Уредување на ваш кориснички CSS/JavaScript",
-       "grant-editmyoptions": "Уредете ги вашите кориснички нагодувања",
-       "grant-editmywatchlist": "Уреди мои набљудувани",
-       "grant-editpage": "Ð\98змени постоечки страници",
+       "grant-delete": "Бришење страници, преработки и дневнички записи",
+       "grant-editinterface": "Измена на именскиот простор „МедијаВики“ и кориснички CSS/JavaScript",
+       "grant-editmycssjs": "Уредување на вашиот кориснички CSS/JavaScript",
+       "grant-editmyoptions": "Уредување на вашите кориснички нагодувања",
+       "grant-editmywatchlist": "Уредување на вашите набљудувани",
+       "grant-editpage": "Ð\9cенÑ\83ваÑ\9aе постоечки страници",
        "grant-editprotected": "Уредување на заштитени страници",
        "grant-highvolume": "Високообемно уредување",
        "grant-oversight": "Скривање на корисници и преработки",
        "grant-rollback": "Отповикување на измени во страници",
        "grant-sendemail": "Испраќање на е-пошта до други корисници",
        "grant-uploadeditmovefile": "Подигање, замена и преместување на податотеки",
-       "grant-uploadfile": "Подигни нови податотеки",
+       "grant-uploadfile": "Подигање нови податотеки",
+       "grant-basic": "Основни права",
        "grant-viewdeleted": "Преглед на избришани податотеки и страници",
        "grant-viewmywatchlist": "Преглед на вашите набљудувања",
        "newuserlogpage": "Дневник на регистрирања на корисници",
        "uploadstash-badtoken": "Не успеав да го извршам бараното дејство, можеби поради тоа што вашата сигурносна шифра е истечена. Обидете се повторно.",
        "uploadstash-errclear": "Чистењето на податотеките не успеа.",
        "uploadstash-refresh": "Превчитај го списокот на податотеки",
+       "uploadstash-thumbnail": "погл. минијатура",
        "invalid-chunk-offset": "Неважечка појдовна точка",
        "img-auth-accessdenied": "Оневозможен пристап",
        "img-auth-nopathinfo": "Недостасува PATH_INFO.\nВашиот опслужувач не е нагоден за да ја предаде оваа информација.\nМожеби се заснова на CGI, и така не подржува img_auth.\nПогл. https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
        "apisandbox": "Извршнички песочник",
        "apisandbox-api-disabled": "Извршникот е оневозможен на ова мрежно место.",
        "apisandbox-intro": "Страницава служи за вршење проби со '''Извршник на МедијаВики'''.\n\nПовеќе за употребата на овој извршник ќе најдете во [//www.mediawiki.org/wiki/API:Main_page неговата документација].  Пример: [//www.mediawiki.org/wiki/API#A_simple_example преземање на содржината на главната страница].  Одберете дејство за да видите повеќе примери.\n\nИмајте предвид дека она шо го правите на страницава може да се одрази врз викито, иако ова е песочник.",
+       "apisandbox-unfullscreen": "Прикажи страница",
        "apisandbox-submit": "Постави барање",
        "apisandbox-reset": "Исчисти",
+       "apisandbox-retry": "Пробај пак",
        "apisandbox-examples": "Примери",
        "apisandbox-dynamic-parameters": "Дополнителни параметри",
        "apisandbox-dynamic-parameters-add-label": "Додај параметар:",
        "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",
        "confirm-watch-top": "Да ја додадам страницава во набљудуваните?",
        "confirm-unwatch-button": "ОК",
        "confirm-unwatch-top": "Да ја отстранам страницава од набљудуваните?",
+       "confirm-rollback-button": "ОК",
+       "confirm-rollback-top": "Да ги отповикам уредувањата на страницава?",
        "percent": "$1&#160;%",
        "quotation-marks": "„$1“",
        "imgmultipageprev": "&larr; претходна страница",
        "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",
        "special-characters-group-ipa": "МФА",
        "special-characters-group-symbols": "Симболи",
        "special-characters-group-greek": "Грчки",
+       "special-characters-group-greekextended": "Грчки (допол.)",
        "special-characters-group-cyrillic": "Кирилица",
        "special-characters-group-arabic": "Арапски",
        "special-characters-group-arabicextended": "Арапски-проширено",
        "api-error-blacklisted": "Одберете поинаков, описен наслов.",
        "sessionprovider-generic": "$1 седници",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "седници со колачиња",
-       "randomrootpage": "Случајна основна страница"
+       "randomrootpage": "Случајна основна страница",
+       "log-action-filter-block": "Тип на блок:",
+       "log-action-filter-contentmodel": "Тип на змена на содржинскиот модел:",
+       "log-action-filter-delete": "Тип на бришење:",
+       "log-action-filter-import": "Тип на увоз:",
+       "log-action-filter-managetags": "Тип на дејство за управување со ознаки:",
+       "log-action-filter-move": "Тип на преместување:",
+       "log-action-filter-newusers": "Тип на создавање сметка:",
+       "log-action-filter-patrol": "Тип на патролирање:",
+       "log-action-filter-protect": "Тип на заштита:",
+       "log-action-filter-rights": "Тип на промена во правата",
+       "log-action-filter-suppress": "Тип на скривање",
+       "log-action-filter-upload": "Тип на подигање:",
+       "log-action-filter-all": "Сите",
+       "log-action-filter-block-block": "блокирање",
+       "log-action-filter-block-reblock": "Измена на блок",
+       "log-action-filter-block-unblock": "Одблокирање",
+       "log-action-filter-contentmodel-change": "Промена на содржински модел",
+       "log-action-filter-contentmodel-new": "Создавање страница со нестандарден содржински модел",
+       "log-action-filter-delete-delete": "Бришење на страница",
+       "log-action-filter-delete-restore": "Повраток на страница",
+       "log-action-filter-delete-event": "Бришење на дневник",
+       "log-action-filter-delete-revision": "Бришење на преработка",
+       "log-action-filter-import-interwiki": "Прекувики-увоз",
+       "log-action-filter-import-upload": "Увоз со подигање XML",
+       "log-action-filter-managetags-create": "Создавање на ознаки",
+       "log-action-filter-managetags-delete": "Бришење на ознаки",
+       "log-action-filter-managetags-activate": "Активирање на ознаки",
+       "log-action-filter-managetags-deactivate": "Деактивирање на ознаки",
+       "log-action-filter-move-move": "Преместување без запис врз пренасочувања",
+       "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-resetpass-skip-label": "Прескокни",
+       "authprovider-resetpass-skip-help": "Прескокни го задавањето на нова лозинка."
 }
index cbf66c4..a84e3e4 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}}",
        "nocookiesnew": "'A riggistrazione è stata completata, ma nun se può accedere a {{SITENAME}} pecché 'e cookie songo disattivate. Prova n'ata vota c' 'o nomme e 'a password quanno 'e cookie sarrann'attivate dint'o navigatore stesso.",
        "nocookieslogin": "{{SITENAME}} usa cookies pe' putè dà accies'a ll'utente.\n'E cookies vuoste songo stutate.\nPe' piacere appicciate 'e cookies dint'o navigatóre e pruvate n'ata vota.",
        "nocookiesfornew": "'O cunto utente nu s'è criato, pecché nun s'è potuto confirmà d' 'a fonte suja.\nVide si 'e cookies song'appicciate, ricarreca 'a paggena e prova n'ata vota.",
+       "createacct-loginerror": "'O cunto fuje criato apposto, ma nun fosse stato possibile 'e ve fà trasì in modo automatico. Trasite cu l'[[Special:UserLogin|accesso manuale]].",
        "noname": "Nun avite specificato nu nomme valido d'utente.",
        "loginsuccesstitle": "Acciesso affettuato",
        "loginsuccess": "'''Si stato cunnesso ô server 'e {{SITENAME}} cu 'o nomme utente 'e \"$1\".'''",
        "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",
        "passwordreset-emailsentusername": "Si esistesse nu cunto e-mail suòccio a stu nomme utente, allora se mannarrà na mmasciata pe' riabbià 'a password.",
        "passwordreset-emailsent-capture": "Na mmasciata e-mail pe' riabbià 'a password è stata mannata, chista mmasciata 'a putite vedé ccà abbascio.",
        "passwordreset-emailerror-capture": "Na mmasciata e-mail pe' riabbià 'a password è stata mannata, 'a putite vedé ccà abbascio, ma aita sapé ca nun s'è mannata a {{GENDER:$2|l'utente}} pecché c'è stato cocch'errore: $1",
+       "passwordreset-emailsent-capture2": "L'email 'e reimpostazione d' 'a password {{PLURAL:$1|è stata mannata|so' state mannate}}. {{PLURAL:$1|'O nomme|L'elenco 'e nomme}} utente e password è mmustato ccà.",
+       "passwordreset-emailerror-capture2": "'O mannà 'email {{GENDER:$2|a ll'utente}} guastaje: $1. {{PLURAL:$3|'O nomme|L'elenco 'e nomme}} utente e password se ffà vedé ccà.",
+       "passwordreset-nocaller": "Nu chiammate s'avess'a dà",
+       "passwordreset-nosuchcaller": "'O chiammante nun esiste: $1",
+       "passwordreset-ignored": "'A reimpustazione d' 'a password nun s'è gistita. Fosse ca nisciunu fornitore è stato mpustato?",
+       "passwordreset-invalideamil": "Indirizzo 'e posta email nun valido",
+       "passwordreset-nodata": "Nun è stato fornito né nomme utente né indirizzo 'e posta email",
        "changeemail": "Cagna o lèva l'indirizzo e-mail",
        "changeemail-header": "Ghienchete stu modulo pe' puté cagnà 'o indirizzo e-mail d' 'o vuosto. Si vuje vulite luvà e 'o scucchià l'associazione 'e cocche cunto mail d' 'o cunto vuosto, lassate 'o cunto e-mail nuovo abbacante quanno mannarrate stu modulo.",
        "changeemail-passwordrequired": "Avit'a miette 'a password vuosto pe' dà a cunferma 'e stu cagnamiento.",
        "right-override-export-depth": "Esporta 'e paggene azzeccanno 'e paggene cullegate nfin'a na profondità 'e 5",
        "right-sendemail": "Manna na mail a ll'at'utente",
        "right-passwordreset": "Vide 'e mmasciate 'e rimpustazione d' 'a password",
-       "right-managechangetags": "Crìa e scancella 'e [[Special:Tags|tag]] d' 'o database",
+       "right-managechangetags": "Crìa e appiccia/stuta 'e [[Special:Tags|tag]]",
        "right-applychangetags": "Appreca [[Special:Tags|tag]] pe' tramente ca se fanno 'e cagnamiente 'e coccheruno",
        "right-changetags": "Azzecca o lèva a caso 'e [[Special:Tags|tag]] dint'a verziune nnividuale e riggistre 'e log",
+       "right-deletechangetags": "Scancella l'[[Special:Tags|etichette]] d' 'o database",
        "grant-generic": "Pacco 'e deritte \"$1\"",
        "grant-group-page-interaction": "Interagisce ch' 'e paggene",
        "grant-group-file-interaction": "Intergische ch' 'e file 'e media",
        "action-viewmyprivateinfo": "vide 'e date perzunale",
        "action-editmyprivateinfo": "cagnà 'e proprie date perzunale",
        "action-editcontentmodel": "càgna 'o mudelo 'e cuntenute 'e na paggena",
-       "action-managechangetags": "crìa e scancella 'e tag d' 'o database",
+       "action-managechangetags": "crìa e appiccia/stuta tag",
        "action-applychangetags": "appreca tag pe' tramente ca se fanno 'e cagnamiente vuoste",
        "action-changetags": "azzecca o lèva tag a caso dint'a verziune nnividuale e riggistre 'e log",
+       "action-deletechangetags": "scancellare 'e tag d' 'o database",
        "nchanges": "$1 {{PLURAL:$1|cagnamiento|cagnamiente}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|'a ll'urdema visita}}",
        "enhancedrc-history": "cronologgia",
        "trackingcategories-msg": "Categurìe 'e cuntrollo",
        "trackingcategories-name": "Nomme d' 'a mmasciata",
        "trackingcategories-desc": "Criterie p' 'o miettere dint' 'a categurìa",
+       "restricted-displaytitle-ignored": "Paggene cu titule 'a ffà vedé ignurate",
+       "restricted-displaytitle-ignored-desc": "'A paggena tene nu <code><nowiki>{{DISPLAYTITLE}}</nowiki></code> gnurato peccéh nu fosse eguale a 'o titolo d' 'a paggena 'e mo'.",
        "noindex-category-desc": "'A paggena nun è indicizzata 'a 'e robot pecché cuntene 'a parola maggica <code><nowiki>__NOINDEX__</nowiki></code> e se trova dint'a nu namespace addò chistu flag è permesso.",
        "index-category-desc": "'A paggena téne 'o codece <code><nowiki>__INDEX__</nowiki></code> dinto (e se trova dint'a nu namespace addò chistu flag è permesso), e picciò è indicizzata 'a 'e robot, pure si normalmente nun fosse accussì.",
        "post-expand-template-inclusion-category-desc": "'A dimensione d' 'a paggena è cchiù granne 'e <code>$wgMaxArticleSize</code> aropp'a spannere tutt' 'e template, e picciò cocche template nun se so' spannute.",
        "rollbacklinkcount": "annulla {{PLURAL:$1|nu cagnamiento|$1 cagnamiente}}",
        "rollbacklinkcount-morethan": "annulla cchiù 'e {{PLURAL:$1|nu cagnamiento|$1 cagnamiente}}",
        "rollbackfailed": "Annullamento fallito",
+       "rollback-missingparam": "Parammetre obbligate mancante int' 'a richiesta.",
        "cantrollback": "Nun se può annullà stu cagnamiento;\nsapite ca l'urdemo autore è stato pure sul'isso a faticà dint'a sta paggena (nun ce sta n'at'autore).",
        "alreadyrolled": "Nun se può turna arreto a l'urdemo cagnamiento [[:$1]] 'a [[User:$2|$2]] ([[User talk:$2|Chiacchiera]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]);\ncocch'ato ha cagnato o annullato 'a paggena già.\n\nL'urdemo cangamiento d' 'a paggena fuje 'a [[User:$3|$3]] ([[User talk:$3|Chiacchiera]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "editcomment": "'O riepilego d' 'o cagnamiento era: <em>$1</em>.",
        "revertpage": "Cangiaje 'e cagnamiénte 'e [[Special:Contributions/$2|$2]] ([[User talk:$2|discussione]]), cu â verzione 'e pprimma 'e  [[User:$1|$1]]",
        "revertpage-nouser": "Annullate 'e cagnamiente 'e n'utente annascunnuto, è stata ripigliata ll'urdema verzione 'e {{GENDER:$1|[[User:$1|$1]]}}",
        "rollback-success": "Cagnamiente annullate 'a $1;\ns'è turnat arreto a l'urdema verzione 'e $2.",
+       "rollback-success-notify": "Cagnamiente annullate 'a $1;\ns'è turnat arreto a l'urdema verzione 'e $2. [$3 Fà vedé 'e cagnamiente]",
        "sessionfailure-title": "Sessione fallita",
        "sessionfailure": "Pare ca stanno probbleme cu 'a sessiona toja;\nst'azione è stata fermata pe' precauzione annanz' 'e cavall' 'e troia;\nPe' piacere turnate arreto, carrecate n'ata vota 'a paggena pe pruvate n'ata vota.",
        "changecontentmodel": "Cagna 'o mudello 'e cuntenute 'e na paggena",
        "changecontentmodel-success-text": "'O tipo 'e cuntenut 'e [[:$1]] è stato cagnato.",
        "changecontentmodel-cannot-convert": "'E cuntenute dint'a [[:$1]] nun se ponno scagnà a nu tipo 'e $2.",
        "changecontentmodel-nodirectediting": "'O mudello 'e cuntenute $1 nun suppurtasse 'o cagnamiento diretto",
+       "changecontentmodel-emptymodels-title": "Nisciuno modello 'e cuntenute a disposizione",
+       "changecontentmodel-emptymodels-text": "'E cuntenute dint'a [[:$1]] nun se ponno scagnà a nisciuno tipo.",
        "log-name-contentmodel": "Riggistro 'e cagnamiente d' 'o mudello 'e cuntenute",
        "log-description-contentmodel": "Evvente azzeccate c' 'o mudello 'e cuntenute 'e na paggena",
        "logentry-contentmodel-new": "$1 {{GENDER:$2|criaje}} 'a paggena $3 ausanno nu mudell' 'e cuntenute nun-predefinito \"$5\"",
        "whatlinkshere-prev": "{{PLURAL:$1|apprima|apprime $1}}",
        "whatlinkshere-next": "{{PLURAL:$1|appriesso|$1 appriesso}}",
        "whatlinkshere-links": "← jonte",
-       "whatlinkshere-hideredirs": "$1 redirects",
+       "whatlinkshere-hideredirs": "$1 redirect",
        "whatlinkshere-hidetrans": "$1 'nclusione",
        "whatlinkshere-hidelinks": "$1 jonte",
        "whatlinkshere-hideimages": "$1 links d' 'o file",
        "lockdbsuccesstext": "'O database è stato bloccato.<br />\nArricuordateve 'e [[Special:UnlockDB|luvà 'o blocco]] appriesso c' 'a manutenziona sarrà fernuta.",
        "unlockdbsuccesstext": "'O database è stato sbluccato.",
        "lockfilenotwritable": "Nun se può scrivere ncopp' 'o file 'e blocco d' 'o database.\nPe' bluccà o sbluccà 'o database abbesuogne 'e scrivere dint' 'o server web.",
+       "databaselocked": "'O database è bluccato già.",
        "databasenotlocked": "'O database nun è bluccato.",
        "lockedbyandtime": "(pe' {{GENDER:$1|$1}} 'o $2 a 'e $3)",
        "move-page": "Mòve $1",
        "confirm-watch-top": "Vulite azzeccà sta paggena int' 'a lista 'e paggene cuntrullate vuosta?",
        "confirm-unwatch-button": "OK",
        "confirm-unwatch-top": "Vulite luvà sta paggena d' 'a lista 'e paggene cuntrullate vuosta?",
+       "confirm-rollback-button": "OK",
+       "confirm-rollback-top": "Turnà arreto 'e cagnamiente 'e sta paggena?",
        "quotation-marks": "\"$1\"",
        "imgmultipageprev": "← paggena 'e primma",
        "imgmultipagenext": "paggena successiva →",
        "timezone-local": "Lucale",
        "duplicate-defaultsort": "<strong>Attenziò:</strong> A chiave d'arricetto \"$2\" se miette ncuollo a nu valore 'e primma \"$1\".",
        "duplicate-displaytitle": "<strong>Attenziò:</strong> A chiave d'arricetto \"$2\" se scagna p' 'o valore 'e primma \"$1\".",
+       "restricted-displaytitle": "<strong>Attenziò:</strong> 'O titolo ccà \"$1\" è stato lassato perdere pecché nun fosse eguale a 'o titolo 'e mò d' 'a paggena.",
        "invalid-indicator-name": "<strong>Errore:</strong> attribbuto <code>name</code> 'e ll'innecature d' 'o stato d' 'a paggena nu può rummanè abbacante.",
        "version": "Verziona",
        "version-extensions": "Estenziune installate",
        "tags-delete-not-found": "'O tag $1 nun esiste.",
        "tags-delete-too-many-uses": "'O tag \"$1\" è apprecato a cchiù 'e $2 {{PLURAL:$2|verziona|verziune}}, cosa ca vulesse dicere ca nun se ò scancellà.",
        "tags-delete-warnings-after-delete": "'O tag \"$1\" s'è scancellato, ma {{PLURAL:$2|s'è ncuntrato ll'avviso|se songhe ncuntrate ll'avise}} ccà:",
+       "tags-delete-no-permission": "Nun tenite 'o permesso pe' scancellà 'e tag 'e cagnamiente.",
        "tags-activate-title": "Appiccia 'o tag",
        "tags-activate-question": "Vuje state p'appiccià 'o tag \"$1\".",
        "tags-activate-reason": "Mutivo:",
        "log-action-filter-suppress-block": "Scancellazione 'utente 'a blocco",
        "log-action-filter-suppress-reblock": "Scancellazione utente 'a re-blocco",
        "log-action-filter-upload-upload": "Carreca nova",
-       "log-action-filter-upload-overwrite": "Recarreca"
+       "log-action-filter-upload-overwrite": "Recarreca",
+       "authmanager-authn-not-in-progress": "L'autenticazione nun è 'ncurzo o 'e date d' 'a sessione so' ghiute pierze. Verite 'accummincià n'ata vota a 'o prencipio.",
+       "authmanager-authn-no-primary": "'E credenziale ca s'hanno rato nun se ponno autenticà.",
+       "authmanager-authn-no-local-user": "'E credenziale ca s'hanno rato nun se ponno ffà suoccie a nisciun' 'utente int'a stu wiki."
 }
index 49d1068..319be59 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",
        "badtitletext": "De naam van de op-evreugen zied is niet geldig, leeg, of n interwiki-verwiezing naor n onbekende of ongeldige wiki.",
        "perfcached": "Disse gegevens koemen uut t tussengeheugen en bin misschien niet aktueel. Der {{PLURAL:$1|is hooguut een resultaot|bin hooguut $1 resultaoten}} beschikbaor in t tussengeheugen.",
        "perfcachedts": "Disse gegevens koemen uut t tussengeheugen die veur t lest bie-ewörken is op $2 um $3. Der {{PLURAL:$4|is hooguut een resultaot|bin hooguut $4 resultaoten}} beschikbaor in t tussengeheugen.",
-       "querypage-no-updates": "'''Disse zied wörden niet meer bie-ewörken.'''",
+       "querypage-no-updates": "'''Disse zied wördt niet meer bie-ewörken.'''",
        "viewsource": "Brontekste bekieken",
        "viewsource-title": "Bron bekieken van $1",
        "actionthrottled": "Haandeling tegenehöllen",
        "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",
        "unusedimages": "Ongebruukten bestaanden",
        "wantedcategories": "Gewunste kategorieën",
        "wantedpages": "Gewunste ziejen",
+       "wantedpages-summary": "Lieste van niet-bestaonde ziejen mit de meeste verwiezingen derhinne, ziejen waor allinnig mer naor deurverwezen wördt staon der niet bie. Veur n lieste van niet-bestaonde ziejen waor naor deurverwezen wördt, ku'j terechte op [[{{#special:BrokenRedirects}}|de lieste van ebreuken deurverwiezingen]].",
        "wantedpages-badtitle": "Ongeldige ziednaam in resultaot: $1",
        "wantedfiles": "Gewunste bestaanden",
        "wantedfiletext-cat": "De volgende bestaanden wörden gebruukt mer bestaon niet. Bestaanden van externe databanken kunnen op-eneumen ween in de lieste, ondanks dat ze bestaon. Soortgelieke vals positieven wörden <del>deurehaold weeregeven</del>. Ziejen die niet-bestaonde bestaanden insluten staon op de zied [[:$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-next": "{{PLURAL:$1|volgende|volgende $1}}",
        "whatlinkshere-links": "← verwiezingen",
        "whatlinkshere-hideredirs": "$1 deurverwiezingen",
-       "whatlinkshere-hidetrans": "$1 in-evoegden mallen",
-       "whatlinkshere-hidelinks": "$1 verwiezingen",
+       "whatlinkshere-hidetrans": "Vörlageninbinnungen $1",
+       "whatlinkshere-hidelinks": "Lenken $1",
        "whatlinkshere-hideimages": "$1 bestaandsverwiezingen",
        "whatlinkshere-filters": "Filters",
        "autoblockid": "Automatiese blokkering #$1",
index aa9052c..a840651 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 Redirects",
+       "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..fa03e51 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)",
        "anoneditwarning": "<strong>Waarschuwing:</strong> u bent niet aangemeld.\nUw IP-adres wordt opgeslagen als u wijzigingen op deze pagina maakt. Wanneer u <strong>[$1 aanmeldt]</strong> of <strong>[$2 een gebruiker aanmaakt]</strong> verschijnen uw bewerkingen onder uw gebruikersnaam, naast andere voordelen.",
        "anonpreviewwarning": "''U bent niet aangemeld.''\n''Door uw bewerking op te slaan wordt uw IP-adres opgeslagen in de paginageschiedenis.''",
        "missingsummary": "'''Let op:''' u hebt geen bewerkingssamenvatting opgegeven.\nAls u nogmaals op \"{{int:savearticle}}\" klikt wordt de bewerking zonder samenvatting opgeslagen.",
-       "selfredirect": "<strong>Waarschuwing:</strong> U heeft een doorverwijzing gemaakt naar dezelfde pagina. Mogelijk heeft u de verkeerde bestemming voor de doorverwijzing gebruikt, of bewerkt u de verkeerde pagina. Door nogmaals op \"{{int:savearticle}}\" te klikken word de doorverwijzing alsnog aangemaakt.",
+       "selfredirect": "<strong>Waarschuwing:</strong> U heeft een doorverwijzing gemaakt naar deze pagina. Mogelijk heeft u de verkeerde bestemming voor de doorverwijzing gebruikt, of bewerkt u de verkeerde pagina. Door nogmaals op \"{{int:savearticle}}\" te klikken word de doorverwijzing alsnog aangemaakt.",
        "missingcommenttext": "Plaats uw reactie hieronder.",
        "missingcommentheader": "<strong>Let op:</strong> u hebt geen onderwerp/kop voor deze opmerking opgegeven.\nAls u opnieuw op \"{{int:savearticle}}\" klikt, wordt uw wijziging zonder een onderwerp/kop opgeslagen.",
        "summary-preview": "Bewerkingssamenvatting nakijken:",
        "undelete-error-long": "Er zijn fouten opgetreden bij het herstellen van het bestand:\n\n$1",
        "undelete-show-file-confirm": "Weet u zeker dat u een verwijderde versie van het bestand \"<nowiki>$1</nowiki>\" van $2 om $3 wilt bekijken?",
        "undelete-show-file-submit": "Ja",
-       "namespace": "Naamruimte:",
+       "namespace": "Naamruimte:&nbsp;",
        "invert": "Selectie omkeren",
        "tooltip-invert": "Selecteer dit om wijzigingen te verbergen in de geselecteerde naamruimte (en de gekoppelde naamruimte indien aangevinkt)",
        "tooltip-whatlinkshere-invert": "Selecteer dit vakje om koppelingen van pagina's in de geselecteerde naamruimte te verbergen.",
        "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",
        "confirm-watch-top": "Deze pagina toevoegen aan uw volglijst?",
        "confirm-unwatch-button": "OK",
        "confirm-unwatch-top": "Deze pagina verwijderen uit uw volglijst?",
+       "confirm-rollback-button": "OK",
        "quotation-marks": "\"$1\"",
        "imgmultipageprev": "← vorige pagina",
        "imgmultipagenext": "volgende pagina →",
        "timezone-local": "Lokale tijd",
        "duplicate-defaultsort": "'''Waarschuwing:''' de standaardsortering \"$2\" krijgt voorrang voor de sortering \"$1\".",
        "duplicate-displaytitle": "<strong>Waarschuwing:</strong>Titelweergave \"$2\" overschrijft eerdere titelweergave \"$1\".",
+       "restricted-displaytitle": "<strong>Waarschuwing:</strong> Titelweergave \"$1\" werd genegeerd omdat deze niet overeenkomt met de werkelijke paginatitel.",
        "invalid-indicator-name": "<strong>Fout:</strong> de eigenschap <code>name</code> van de paginastatusindicators mag niet leeg zijn.",
        "version": "Versie",
        "version-extensions": "Geïnstalleerde uitbreidingen",
        "log-action-filter-rights-rights": "Handmatige aanpassing",
        "log-action-filter-rights-autopromote": "Automatische aanpassing",
        "log-action-filter-upload-upload": "Nieuwe upload",
-       "log-action-filter-upload-overwrite": "Herupload"
+       "log-action-filter-upload-overwrite": "Herupload",
+       "authmanager-email-label": "E-mail"
 }
index d67458b..dec25ba 100644 (file)
@@ -28,7 +28,7 @@
        "tog-numberheadings": "Numerotar automaticament los títols",
        "tog-showtoolbar": "Far veire la barra d'aisinas de modificacion (necessita JavaScript)",
        "tog-editondblclick": "Modificar de paginas amb un clic doble (necessita JavaScript)",
-       "tog-editsectiononrightclick": "Activar la modificacion de seccions en fasent un clic drech suls títols (necessita JavaScript)",
+       "tog-editsectiononrightclick": "Activar la modificacion de seccions en fasent un clic dreit suls títols (necessita JavaScript)",
        "tog-watchcreations": "Apondre las paginas que creï e los fichièrs qu'impòrti a ma lista de seguiment",
        "tog-watchdefault": "Apondre las paginas que modifiqui e los fichièrs qu'impòrti a ma lista de seguiment",
        "tog-watchmoves": "Apondre las paginas e los fichièrs que tòrni nomenar a ma lista de seguiment",
@@ -47,7 +47,7 @@
        "tog-uselivepreview": "Utilizar l’apercebut rapid",
        "tog-forceeditsummary": "M'avertir quand ai pas completat lo contengut de la bóstia de comentaris",
        "tog-watchlisthideown": "Amagar mas pròprias modificacions dins la lista de seguiment",
-       "tog-watchlisthidebots": "Amagar los cambiaments faches pels bòts dins la lista de seguiment",
+       "tog-watchlisthidebots": "Amagar los cambiaments faits pels bòts dins la lista de seguiment",
        "tog-watchlisthideminor": "Amagar las modificacions menoras dins la lista de seguiment",
        "tog-watchlisthideliu": "Amaga, de la lista, las modificacions pels utilizaires connectats",
        "tog-watchlisthideanons": "Amaga, de la lista, las modificacions anonimas",
        "jumptosearch": "Recercar",
        "view-pool-error": "O planhèm, los servidors son subrecargats pel moment.\nTròp d’utilizaires cercan a accedir a aquesta pagina.\nEsperatz un moment abans d'ensajar d’accedir a aquesta pagina.\n\n$1",
        "generic-pool-error": "O planhèm, los servidors son subrecargats pel moment.\nTròp d’utilizaires ensajan de consultar aquesta ressorsa.\nEsperatz un moment abans d'ensajar d’accedir a aquesta pagina.",
-       "pool-timeout": "Relambi depassat pendent l'espèra del varrolh",
+       "pool-timeout": "Relambi depassat pendent l'espèra del verrolh",
        "pool-queuefull": "La fila de trabalh es plena",
        "pool-errorunknown": "Error desconeguda",
        "pool-servererror": "Lo servici de comptatge de la reserva es pas disponible ($1).",
        "privacy": "Politica de confidencialitat",
        "privacypage": "Project:Confidencialitat",
        "badaccess": "Error de permission",
-       "badaccess-group0": "Avètz pas los dreches sufisents per realizar l’accion que demandatz.",
+       "badaccess-group0": "Avètz pas los dreits sufisents per realizar l’accion que demandatz.",
        "badaccess-groups": "L’accion qu'ensajatz de realizar es pas accessibla qu’als utilizaires {{PLURAL:$2|del grop|d´un d´aquestes gropes}}: $1.",
        "versionrequired": "Version $1 de MediaWiki necessària",
        "versionrequiredtext": "La version $1 de MediaWiki es necessària per utilizar aquesta pagina. Consultatz [[Special:Version|la pagina de las versions]]",
        "nosuchspecialpage": "Pagina especiala inexistanta",
        "nospecialpagetext": "<strong>Avètz demandat una pagina especiala qu'es pas reconeguda pel logicial {{SITENAME}}.</strong>\n\nUna lista de las paginas especialas pòt èsser trobada sus [[Special:SpecialPages|{{int:specialpages}}]].",
        "error": "Error",
-       "databaseerror": "Error de la banca de donadas",
-       "databaseerror-text": "Una error de requèsta de banca de donadas s'es producha. Aquò pòt provenir d'un bug dins lo logicial.",
-       "databaseerror-textcl": "Una error de requèsta de banca de donadas s'es produsida.",
+       "databaseerror": "Error de la basa de donadas",
+       "databaseerror-text": "Una error de requèsta de basa de donadas s'es produita. Aquò pòt provenir d'un bug dins lo logicial.",
+       "databaseerror-textcl": "Una error de requèsta de basa de donadas s'es produita.",
        "databaseerror-query": "Requèsta : $1",
        "databaseerror-function": "Foncion : $1",
        "databaseerror-error": "Error : $1",
        "laggedslavemode": "<strong>Atencion :</strong> Aquesta pagina pòt conténer pas totes los darrièrs cambiaments efectuats.",
-       "readonly": "Mesas a jorn blocadas sus la banca de donadas",
-       "enterlockreason": "Indicatz la rason del varrolhatge, e mai una estimacion de sa durada",
-       "readonlytext": "Los ajustons e mesas a jorn de la banca de donadas son actualament blocats, probablament per permetre la mantenença de la banca, aprèp aquò, tot dintrarà dins l'òrdre.\n\nL’administrator qu'a varrolhat la banca de donadas a balhat l’explicacion seguenta : $1",
+       "readonly": "Mesas a jorn blocadas sus la basa de donadas",
+       "enterlockreason": "Indicatz la rason del verrolhatge, e mai una estimacion de sa durada",
+       "readonlytext": "Los empeutons e mesas a jorn de la basa de donadas son actualament blocats, probablament per permetre la mantenença de la basa, aprèp aquò, tot dintrarà dins l'òrdre.\n\nL’administrator qu'a verrolhat la basa de donadas a balhat l’explicacion seguenta :<br /> $1",
        "missing-article": "La banca de donada a pas trobat lo tèxte d’una pagina qu’auriá degut trobar, intitolada « $1 » $2.\n\nAquò es, en principi, causat en seguissent lo ligam perimit d'un diff o de l’istoric cap a una pagina qu'es estada suprimida.\n\nS'es pas lo cas, belèu avètz trobat un bòg dins lo programa.\nInformatz-ne un [[Special:ListUsers/sysop|administrator]] aprèp aver notada l’adreça cibla del ligam.",
        "missingarticle-rev": "(revision#: $1)",
        "missingarticle-diff": "(Diff: $1, $2)",
-       "readonly_lag": "La banca de donadas es estada automaticament clavada pendent que los servidors segondaris ratrapan lor retard sul servidor principal.",
+       "readonly_lag": "La basa de donadas es estada automaticament clavada pendent que los servidors segondaris ratrapan lor retard sul servidor principal.",
        "internalerror": "Error intèrna",
        "internalerror_info": "Error intèrna: $1",
        "internalerror-fatal-exception": "Error fatala de tipe \"$1\"",
        "no-null-revision": "Impossible de crear una novèla revision voida per la pagina « $1 »",
        "badtitle": "Títol marrit",
        "badtitletext": "Lo títol de la pagina demandada es invalid, void o s’agís d’un títol interlenga o interprojècte mal ligat. Benlèu conten un o maites caractèrs que pòdon pas èsser utilizats dins los títols.",
-       "perfcached": "Las donadas seguendas son en escondedor e benlèu, son pas a jorn. Un maximum de {{PLURAL:$1|un resultat|$1 resultats}} es disponible dins l'escondedor.",
-       "perfcachedts": "Las donadas seguendas son en escondedor e benlèu, son pas a jorn. Un maximum de {{PLURAL:$1|un resultat|$1 resultats}} es disponible dins l'escondedor.",
+       "perfcached": "Las donadas seguendas son en cache e benlèu, son pas a jorn. Un maximum de {{PLURAL:$1|un resultat|$1 resultats}} es disponible dins lo cache.",
+       "perfcachedts": "Las donadas seguendas son en cache e benlèu, son pas a jorn. Un maximum de {{PLURAL:$1|un resultat|$1 resultats}} es disponible dins lo cache.",
        "querypage-no-updates": "Las mesas a jorn per aquesta pagina son actualamnt desactivadas. Las donadas çaijós son pas mesas a jorn.",
        "viewsource": "Vejatz lo tèxte font",
        "viewsource-title": "Veire la font de $1",
        "namespaceprotected": "Avètz pas la permission de modificar las paginas de l’espaci de noms « '''$1''' ».",
        "customcssprotected": "Avètz pas la permission d'editar aquesta pagina CSS perque conten de preferéncias d’autres utilizaires.",
        "customjsprotected": "Avètz pas la permission d'editar aquesta pagina JavaScript perque conten de preferéncias d’autres utilizaires.",
-       "mycustomcssprotected": "Avètz pas lo drech de modificar aquesta pagina CSS.",
-       "mycustomjsprotected": "Avètz pas lo drech de modificar aquesta pagina JavaScript.",
-       "myprivateinfoprotected": "Avètz pas los dreches per modificar vòstras informacions personalas.",
-       "mypreferencesprotected": "Avètz pas los dreches per modificar vòstras preferéncias.",
+       "mycustomcssprotected": "Avètz pas lo dreit de modificar aquesta pagina CSS.",
+       "mycustomjsprotected": "Avètz pas lo dreit de modificar aquesta pagina JavaScript.",
+       "myprivateinfoprotected": "Avètz pas los dreits per modificar vòstras informacions personalas.",
+       "mypreferencesprotected": "Avètz pas los dreits per modificar vòstras preferéncias.",
        "ns-specialprotected": "Las paginas dins l’espaci de noms « {{ns:special}} » pòdon pas èsser modificadas",
        "titleprotected": "Aqueste títol es estat protegit a la creacion per [[User:$1|$1]].\nLo motiu avançat es <em>$2</em>.",
-       "filereadonlyerror": "Impossible de modificar lo fichièr « $1 » perque lo repertòri de fichièrs « $2 » es en lectura sola.\n\nL'administrator que l'a varrolhat a provesit aqueste motiu : « $3 ».",
+       "filereadonlyerror": "Impossible de modificar lo fichièr « $1 » perque lo repertòri de fichièrs « $2 » es en lectura sola.\n\nL'administrator del sistèma que l'a verrolhat a provesit aqueste motiu : « $3 ».",
        "invalidtitle-knownnamespace": "Títol invalid amb l'espaci de noms « $2 » e l'intitulat « $3 »",
        "invalidtitle-unknownnamespace": "Títol invalid amb lo numèro d'espaci de noms $1 e l'intitulat « $2 » desconeguts",
        "exception-nologin": "Pas connectat",
        "exception-nologin-text": "[[Special:Userlogin|Connectatz-vos]] per poder accedir a aquesta pagina o aquesta accion.",
        "exception-nologin-text-manual": "$1 per poder accedir a aquesta pagina o aquesta accion.",
        "virus-badscanner": "Marrida configuracion : escaner de virús desconegut : ''$1''",
-       "virus-scanfailed": "Fracàs de la recèrca (còde $1)",
+       "virus-scanfailed": "Fracàs de la recèrca (còdi $1)",
        "virus-unknownscanner": "antivirús desconegut :",
        "logouttext": "'''Ara, sètz desconnectat.'''\n\nNotatz que d'unas paginas pòdon èsser encara afichadas coma s'eratz encara connectat, fins al moment qu'escafaretz l'escondedor de vòstre navigador.",
        "cannotlogoutnow-title": "Impossible de se desconnectar ara",
        "cannotloginnow-title": "Impossible de se connectar ara",
        "yourdomainname": "Vòstre domeni",
        "password-change-forbidden": "Podètz pas modificar los senhals sus aqueste wiki.",
-       "externaldberror": "Siá una error s’es producha amb la banca de donadas d’autentificacion extèrna, siá sètz pas autorizat a metre a jorn vòstre compte extèrne.",
+       "externaldberror": "Siá una error s’es produita amb la basa de donadas d’autentificacion extèrna, siá sètz pas autorizat a metre a jorn vòstre compte extèrne.",
        "login": "Identificacion",
        "nav-login-createaccount": "Crear un compte o se connectar",
        "userlogin": "Crear un compte o se connectar",
        "createacct-reason-ph": "Perqué creatz un autre compte",
        "createacct-submit": "Creatz vòstre compte",
        "createacct-another-submit": "Crear un compte",
-       "createacct-benefit-heading": "{{SITENAME}} es escrich per de monde coma vos.",
+       "createacct-benefit-heading": "{{SITENAME}} es escrit per de monde coma vos.",
        "createacct-benefit-body1": "{{PLURAL:$1|cambiament|cambiaments}}",
        "createacct-benefit-body2": "{{PLURAL:$1|pagina|paginas}}",
        "createacct-benefit-body3": "{{PLURAL:$1|contributor recent|contributors recents}}",
        "login-throttled": "Avètz ensajat un tròp grand nombre de connexions darrièrament.\nEsperatz $1 abans d’ensajar tornarmai.",
        "login-abort-generic": "Vòstra temptativa de connexion a fracassat",
        "loginlanguagelabel": "Lenga: $1",
-       "suspicious-userlogout": "Vòstra demanda de desconnexion es estada refusada perque sembla qu’es estada mandada per un navigador copat o la mesa en escondedor d’un proxy.",
+       "suspicious-userlogout": "Vòstra demanda de desconnexion es estada refusada perque sembla qu’es estada mandada per un navigador copat o la mesa en cache d’un proxy.",
        "createacct-another-realname-tip": "Lo nom vertadièr es opcional.\nSe decidissètz de lo provesir, serà utilizat per atribuir a l’utilizaire sos trabalhs.",
        "pt-login": "Se connectar",
        "pt-login-button": "Se connectar",
        "resetpass-submit-cancel": "Anullar",
        "resetpass-wrong-oldpass": "Senhal actual o temporari invalid.\nBenlèu ja avètz modificat vòstre senhal o demandat un senhal temporari novèl.",
        "resetpass-recycled": "Reïnicializatz vòstre senhal a quicòm mai que l’actual.",
-       "resetpass-temp-emailed": "Sètz connect{{GENDER:|at|ada}} amb un còde temporari provesit per corrièr electronic.\nPer acabar la connexion, vos cal provesir un senhal novèl aicí :",
+       "resetpass-temp-emailed": "Sètz connect{{GENDER:|at|ada}} amb un còdi temporari provesit per corrièr electronic.\nPer acabar la connexion, vos cal provesir un senhal novèl aicí :",
        "resetpass-temp-password": "Senhal temporari :",
        "resetpass-abort-generic": "La modificacion del senhal es estada anulada per una extension.",
        "resetpass-expired": "Vòstre senhal a expirat. Provesissètz-ne un novèl per vos connectar.",
        "changeemail-none": "(pas cap)",
        "changeemail-password": "Vòstre senhal sus {{SITENAME}} :",
        "changeemail-submit": "Cambiar l'adreça electronica:",
-       "changeemail-throttled": "Avètz fach tròp de temptativas de connexion.\nEsperatz $1 abans d’ensajar tornarmai.",
+       "changeemail-throttled": "Avètz fait tròp de temptativas de connexion.\nEsperatz $1 abans d’ensajar tornarmai.",
        "resettokens": "Reïnicializar los getons",
        "resettokens-text": "Aici, podètz reïnicializar los getons que permeton d’accedir a d'unas donadas privadas associadas a vòstre compte.\n\nLo vos caldriá far se las avètz partejats accidentalament amb qualqu'un o se vòstre compte es estat compromés.",
        "resettokens-no-tokens": "I a pas cap de geton de reïnicializar.",
        "blankarticle": "<strong>Atencion :</strong> La pagina que creatz es voida.\nSe clicatz tornarmai sus « {{int:savearticle}} », la pagina serà creada sens cap de contengut.",
        "anoneditwarning": "<strong>Atencion :<strong> sètz pas connectat.\nVòstra adreça IP serà visibla per tot lo monde se fasètz de modificacions. Se <strong>[$1 vos connectatz]</strong> o <strong>[$2 creatz un compte]</strong>, vòstras modificacions seràn atribuidas a vòstre nom d’utilizaire, entre autres avantatges.",
        "anonpreviewwarning": "''Sètz pas identificat. Salvar enregistrarà vòstra adreça IP dins l’istoric de las modificacions de la pagina.''",
-       "missingsummary": "'''Atencion :''' avètz pas modificat lo resumit de vòstra modificacion. Se clicatz tornarmai sul boton « Salvar », lo salvament serà fach sens avertiment mai.",
+       "missingsummary": "'''Atencion :''' avètz pas modificat lo resumit de vòstra modificacion. Se clicatz tornarmai sul boton « Salvar », lo salvament serà fait sens avertiment mai.",
        "missingcommenttext": "Mercé de metre un comentari çaijós.",
-       "missingcommentheader": "'''*Rampèl:''' Avètz pas escrich de títol per aqueste comentari. Se tornatz clicar sus \"{{*int:*savearticle}}\" serà enregistrat sens títol.",
+       "missingcommentheader": "<strong>Rapèl :</strong> Avètz pas provesit cap de subjècte per aqueste comentari.\nSe clicatz tornamai sus « {{int:Savearticle}} », vòstra modificacion serà enregistrada sens subjècte.",
        "summary-preview": "Previsualizacion del resumit :",
        "subject-preview": "Previsualizacion del subjècte",
        "blockedtitle": "L'utilizaire es blocat",
        "anontalkpagetext": "---- ''Sètz sus la pagina de discussion d'un utilizaire anonim qu'a pas encara creat un compte o que n'utiliza pas.\nPer aquesta rason, devèm utilizar son adreça IP per l'identificar. Una adreça d'aqueste tipe pòt èsser partejada entre mantun utilizaire. Se sètz un utilizaire anonim e se constatatz que de comentaris que vos concernisson pas vos son estats adreçats, podètz [[Special:CreateAccount|crear un compte]] o [[Special:UserLogin|vos connectar]] per evitar tota confusion venenta amb d’autres contributors anonims.''",
        "noarticletext": "Pel moment, i a pas cap de tèxte sus aquesta pagina ;\npodètz [[Special:Search/{{PAGENAME}}|aviar una recèrca sul títol d'aqueste títol de pagina]] dins las autras pagina,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} recercar dins las operacions ligadas]\no [{{fullurl:{{FULLPAGENAME}}|action=edit}} crear aquesta pagina]</span>.",
        "noarticletext-nopermission": "Actualament i a pas cap de tèxte dins aquesta pagina.\nPodètz [[Special:Search/{{PAGENAME}}|far una recèrca sul títol de la pagina]] dins las autras paginas,\no <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} recercar dins los jornals associats]</span>.",
-       "missing-revision": "La revision n° $1 de la pagina intitulada « {{FULLPAGENAME}} » existís pas.\n\nAquò se produsís en general en seguent un ligam istoric obsolèt cap a una pagina qu'es estada suprimida.\nPodètz trobar mai de detalhs dins lo [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} jornal de las supressions].",
+       "missing-revision": "La revision n° $1 de la pagina intitulada « {{FULLPAGENAME}} » existís pas.\n\nAquò se produtz en general en seguent un ligam istoric obsolèt cap a una pagina qu'es estada suprimida.\nPodètz trobar mai de detalhs dins lo [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} jornal de las supressions].",
        "userpage-userdoesnotexist": "Lo compte d'utilizaire « <nowiki>$1</nowiki> » es pas enregistrat. Indicatz se volètz crear o editar aquesta pagina.",
        "userpage-userdoesnotexist-view": "Lo compte d'utilizaire « $1 » es pas enregistrat.",
        "blocked-notice-logextract": "Aqueste utilizaire es actualament blocat.\nLa darrièra entrada del jornal dels blocatges es indicada çaijós a títol d’informacion :",
        "usercssyoucanpreview": "'''Astúcia :''' Utilizatz lo boton 'Previsualizacion' per testar vòstre fuèlh css/js novèl abans de l'enregistrar.",
        "userjsyoucanpreview": "'''Astúcia :''' Utilizatz lo boton 'Previsualizacion' per testar vòstre fuèlh css/js novèl abans de l'enregistrar.",
        "usercsspreview": "'''Remembratz-vos que sètz a previsualizar vòstre pròpri fuèlh CSS !'''\n'''Es pas estada encara enregistrada !'''",
-       "userjspreview": "'''Remembratz-vos que sètz a visualizar o testar vòstre còde JavaScript e qu’es pas encara estat enregistrat !'''",
+       "userjspreview": "'''Remembratz-vos que sètz a visualizar o testar vòstre còdi JavaScript e qu’es pas encara estat enregistrat !'''",
        "sitecsspreview": "'''Remembratz-vos que sètz a previsualizar vòstre pròpri fuèlh CSS !'''\n'''Es pas estada encara enregistrada !'''",
-       "sitejspreview": "'''Remembratz-vos que sètz a visualizar o testar vòstre còde JavaScript e qu’es pas encara estat enregistrat !'''",
+       "sitejspreview": "'''Remembratz-vos que sètz a visualizar o testar vòstre còdi JavaScript e qu’es pas encara estat enregistrat !'''",
        "userinvalidcssjstitle": "'''Atencion :''' existís pas d'estil « $1 ». Remembratz-vos que las paginas personalas amb extensions .css e .js utilizan de títols en minusculas, per exemple, {{ns:user}}:Foo/vector.css e non pas {{ns:user}}:Foo/Vector.css.",
        "updated": "(Mes a jorn)",
        "note": "'''Nòta :'''",
        "explainconflict": "Aqueste pagina es estada salvada aprèp qu'avètz començat de la modificar.\nLa zòna d'edicion superiora conten lo tèxte tal coma es enregistrat actualament dins la banca de donadas.\nVòstras modificacions apareisson dins la zòna d'edicion inferiora.\nVos va caler aportar vòstras modificacions al tèxte existent.\n'''Sol''' lo tèxte de la zòna superiora serà salvat.",
        "yourtext": "Vòstre tèxte",
        "storedversion": "Version enregistrada",
-       "nonunicodebrowser": "'''Atencion : Vòstre navigador supòrta pas l’unicode. Una solucion temporària es estada trobada per vos permetre de modificar un article en tota seguretat : los caractèrs non-ASCII apareisseràn dins vòstra bóstia de modificacion en tant que còdes exadecimals. Deuriatz utilizar un navigador mai recent.'''",
+       "nonunicodebrowser": "'''Atencion : Vòstre navigador supòrta pas l’unicode. Una solucion temporària es estada trobada per vos permetre de modificar un article en tota seguretat : los caractèrs non-ASCII apareisseràn dins vòstra bóstia de modificacion en tant que còdis exadecimals. Deuriatz utilizar un navigador mai recent.'''",
        "editingold": "'''Atencion : sètz a modificar una version obsolèta d'aquesta pagina. Se salvatz, totas las modificacions efectuadas dempuèi aquesta version seràn perdudas.'''",
        "yourdiff": "Diferéncias",
-       "copyrightwarning": "Totas las contribucions a {{SITENAME}} son consideradas coma publicadas jols tèrmes de la $2 (vejatz $1 per mai de detalhs). Se desiratz pas que vòstres escriches sián modificats e distribuits a volontat, mercés de los sometre pas aicí.<br /> Nos prometètz tanben qu'avètz escrich aquò vos-meteis, o que l’avètz copiat d’una font provenent del domeni public, o d’una ressorsa liura.'''UTILIZETZ PAS DE TRABALHS JOS COPYRIGHT SENS AUTORIZACION EXPRÈSSA !'''",
-       "copyrightwarning2": "Totas las contribucions a {{SITENAME}} pòdon èsser modificadas o suprimidas per d’autres utilizaires. Se desiratz pas que vòstres escriches sián modificats e distribuits a volontat, mercés de los sometre pas aicí.<br /> Tanben nos prometètz qu'avètz escrich aquò vos-meteis, o que l’avètz copiat d’una font provenent del domeni public, o d’una ressorsa liura. (vejatz $1 per mai de detalhs). '''UTILIZETZ PAS DE TRABALHS JOS COPYRIGHT SENS AUTORIZACION EXPRÈSSA !'''",
+       "copyrightwarning": "Totas las contribucions a {{SITENAME}} son consideradas coma publicadas jols tèrmes de la $2 (vejatz $1 per mai de detalhs). Se desiratz pas que vòstres escrits sián modificats e distribuits a volontat, mercés de los sometre pas aicí.<br /> Nos prometètz tanben qu'avètz escrit aquò vos-meteis, o que l’avètz copiat d’una font provenent del domeni public, o d’una ressorsa liura.'''UTILIZETZ PAS DE TRABALHS JOS COPYRIGHT SENS AUTORIZACION EXPRÈSSA !'''",
+       "copyrightwarning2": "Totas las contribucions a {{SITENAME}} pòdon èsser modificadas o suprimidas per d’autres utilizaires. Se desiratz pas que vòstres escrits sián modificats e distribuits a volontat, mercés de los sometre pas aicí.<br /> Tanben nos prometètz qu'avètz escrit aquò vos-meteis, o que l’avètz copiat d’una font provenent del domeni public, o d’una ressorsa liura. (vejatz $1 per mai de detalhs). '''UTILIZETZ PAS DE TRABALHS JOS COPYRIGHT SENS AUTORIZACION EXPRÈSSA !'''",
        "longpageerror": "'''ERROR : Lo tèxte qu'avètz somés fa {{PLURAL:$1|un Kio|$1 Kio}}, çò que depassa lo limit fixat a {{PLURAL:$2|un Kio|$2 Kio}}.'''. Pòt pas èsser salvat.",
-       "readonlywarning": "'''AVERTIMENT : La banca de donadas es estada varrolhada per d'operacions de mantenença. Doncas, poiretz pas publicar vòstras modificacions pel moment.'''\nPodètz copiar e pegar vòstre tèxte dins un fichièr de tèxte e lo salvar per mai tard.\n\nL’administrator qu'a varrolhat la banca de donadas a balhat l’explicacion seguenta : $1",
+       "readonlywarning": "<strong>AVERTIMENT : La basa de donadas es estada verrolhada per d'operacions de mantenença. Doncas, poiretz pas publicar vòstras modificacions pel moment.</strong>\nL’administrator sistèma qu'an verrolhada la basa de donadas a donat l’explicacion seguenta : $1",
        "protectedpagewarning": "'''AVERTIMENT : Aquesta pagina es protegida. Sols los utilizaires qu'an l'estatut d'administrator la p�don modificar. ''' La darri�ra entrada del jornal es afichada �aij�s per refer�ncia :",
        "semiprotectedpagewarning": "'''N�ta:''' Aquesta pagina es estada protegida d'un tal biais que sols los contributors enregistrats la p�scan modificar. La darri�ra entrada del jornal es afichada �aij�s per refer�ncia :",
        "cascadeprotectedwarning": "'''ATENCION :''' Aquesta pagina es estada protegida de biais que sols los administrators pòscan l’editar.\nAquesta proteccion es estada facha perque aquesta pagina es inclusa dins {{PLURAL:$1|una pagina protegida|de paginas protegidas}} amb la « proteccion en cascada » activada.",
-       "titleprotectedwarning": "'''ATENCION : Aquesta pagina es estada protegida de tal biais que de [[Special:ListGroupRights|dreches especifics]] son requesits per la poder crear.''' La darri�ra entrada del jornal es afichada �aij�s per refer�ncia :",
+       "titleprotectedwarning": "'''ATENCION : Aquesta pagina es estada protegida de tal biais que de [[Special:ListGroupRights|dreits especifics]] son requesits per la poder crear.''' La darrièra entrada del jornal es afichada çaijós per referéncia :",
        "templatesused": "{{PLURAL:$1|Modèl utilizat|Modèls utilizats}} sus aquesta pagina :",
        "templatesusedpreview": "{{PLURAL:$1|Modèl utilizat|Modèls utilizats}} dins aquesta previsualizacion :",
        "templatesusedsection": "{{PLURAL:$1|Modèl utilizat|Modèls utilizats}} dins aquesta seccion :",
        "template-semiprotected": "(semiprotegit)",
        "hiddencategories": "{{PLURAL:$1|Categoria amagada|Categorias amagadas}} qu'aquesta pagina ne fa partida :",
        "edittools": "<!-- Tot tèxte picat aicí serà afichat jos las bóstias de modificacion o d’impòrt de fichièr. -->",
-       "nocreatetext": "{{SITENAME}} a restrencha la possibilitat de crear de paginas novèlas.\nPodètz tonar en rèire e modificar una pagina existenta, [[Special:UserLogin|vos connectar o crear un compte]].",
+       "nocreatetext": "{{SITENAME}} a restrenta la possibilitat de crear de paginas novèlas.\nPodètz tonar en rèire e modificar una pagina existenta, [[Special:UserLogin|vos connectar o crear un compte]].",
        "nocreate-loggedin": "Avètz pas la permission de crear de paginas novèlas.",
        "sectioneditnotsupported-title": "Modificacion de seccion pas presa en carga",
        "sectioneditnotsupported-text": "La modificacion d'una seccion es pas suportada dins aquesta pagina de modificacion.",
        "edit-hook-aborted": "Modificacion fracassada per croquet.\nCap d'explicacion pas balhada.",
        "edit-gone-missing": "A pas pogut metre a jorn la pagina.\nSembla que siá estada suprimida.",
        "edit-conflict": "Modificar lo conflicte.",
-       "edit-no-change": "Vòstra modificacion es estada ignorada perque cap de cambiament es pas estat fach dins lo tèxte.",
+       "edit-no-change": "Vòstra modificacion es estada ignorada perque cap de cambiament es pas estat fait dins lo tèxte.",
        "postedit-confirmation-created": "La pagina es estada creada.",
        "postedit-confirmation-restored": "La pagina es estada restablida.",
        "postedit-confirmation-saved": "Vòstra modificacion es estada salvada.",
        "content-failed-to-parse": "Fracàs de l'analisi del contengut de $2 pel modèl $1: $3",
        "invalid-content-data": "Donadas del contengut invalidas",
        "content-not-allowed-here": "Lo contengut \"$1\" es pas autorizat sus la pagina [[$2]]",
-       "editwarning-warning": "Quitar aquesta pagina vos farà pèrdre totas las modificacions qu'avètz fachas.\nSe sètz connectat, podètz desactivar aqueste avertiment dins la seccion « {{int:prefs-editing}} » de vòstras preferéncias.",
+       "editwarning-warning": "Quitar aquesta pagina vos farà pèrdre totas las modificacions qu'avètz faitas.\nSe sètz connectat, podètz desactivar aqueste avertiment dins la seccion « {{int:prefs-editing}} » de vòstras preferéncias.",
        "editpage-notsupportedcontentformat-title": "Format de contengut pas pres en carga",
        "editpage-notsupportedcontentformat-text": "Lo format de contengut $1 es pas pres en carga pel modèl de contengut $2 .",
        "content-model-wikitext": "wikitèxte",
        "expensive-parserfunction-category": "Paginas amb tròp d’apèls dispendioses de foncions parsaires",
        "post-expand-template-inclusion-warning": "Atencion : Aquesta pagina conten tròp d'inclusions de modèls.\nD'unas inclusions seràn pas efectuadas.",
        "post-expand-template-inclusion-category": "Paginas que contenon tròp d'inclusions de modèls",
-       "post-expand-template-argument-warning": "Atencion : Aquesta pagina conten al mens un paramètre de modèl que l'inclusion es renduda impossibla. Aprèp extension, aqueste auriá produch un resultat tròp long, doncas, es pas estat inclut.",
+       "post-expand-template-argument-warning": "Atencion : Aquesta pagina conten al mens un paramètre de modèl que l'inclusion es renduda impossibla. Aprèp extension, aqueste auriá produit un resultat tròp long, doncas, es pas estat inclús.",
        "post-expand-template-argument-category": "Paginas que contenon al mens un paramètre de modèl pas evaluat",
        "parser-template-loop-warning": "Modèl en bocla detectat : [[$1]]",
        "parser-template-recursion-depth-warning": "Limit de longor de la recursion del modèl depassat ($1)",
        "parser-unstrip-loop-warning": "Bocla pas desmontabla detectada",
        "parser-unstrip-recursion-limit": "Limit de recursion pas desmontable depassat ($1)",
        "converter-manual-rule-error": "Error detectada dins la règla manuala de conversion de lenga",
-       "undo-success": "Aquesta modificacion va èsser desfacha. Confirmatz los cambiaments (visibles en bas d'aquesta pagina), puèi salvatz se sètz d’acòrdi. Mercés de motivar l’anullacion dins la bóstia de resumit.",
-       "undo-failure": "Aquesta modificacion a pas pogut èsser desfacha a causa de conflictes amb de modificacions intermediàrias.",
-       "undo-norev": "La modificacion a pas pogut èsser desfacha perque siá es inexistenta siá es estada suprimida.",
+       "undo-success": "Aquesta modificacion va èsser desfaita. Confirmatz los cambiaments (visibles en bas d'aquesta pagina), puèi salvatz se sètz d’acòrdi. Mercés de motivar l’anullacion dins la bóstia de resumit.",
+       "undo-failure": "Aquesta modificacion a pas pogut èsser desfaita a causa de conflictes amb de modificacions intermediàrias.",
+       "undo-norev": "La modificacion a pas pogut èsser desfaita perque siá es inexistenta siá es estada suprimida.",
        "undo-nochange": "Sembla que la modificacion es ja estada anullada.",
        "undo-summary": "Anullacion de las modificacions $1 de [[Special:Contributions/$2|$2]] ([[User talk:$2|discutir]] | [[Special:Contributions/$2|{{MediaWiki:Contribslink}}]])",
        "undo-summary-username-hidden": "Anullar la revision $1 per un utilizaire amagat",
        "pagehist": "Istoric de la pagina",
        "deletedhist": "Istoric de las supressions",
        "revdelete-hide-current": "Error al moment de la supression de l'element datat del $1 e $2 : es la revision correnta.\nPòt pas èsser suprimit.",
-       "revdelete-show-no-access": "Error al moment de l'afichatge de l'element datat del $1 e $2 : es marcat coma « restrench ».\nI avètz pas accès.",
-       "revdelete-modify-no-access": "Error al moment de la modificacion de l'element datat del $1 a $2 : es marcat coma « restrench ».\nI avètz pas accès.",
-       "revdelete-modify-missing": "Error al moment de la modificacion de l'element amb l'ID $1 : es mancant dins la banca de donadas !",
+       "revdelete-show-no-access": "Error al moment de l'afichatge de l'element datat del $1 e $2 : es marcat coma « restrent ».\nI avètz pas accès.",
+       "revdelete-modify-no-access": "Error al moment de la modificacion de l'element datat del $1 a $2 : es marcat coma « restrent ».\nI avètz pas accès.",
+       "revdelete-modify-missing": "Error al moment de la modificacion de l'element amb l'ID $1 : es mancant dins la basa de donadas !",
        "revdelete-no-change": "'''Atencion :''' l'element datat del $1 a $2 ja a los paramètres de visibilitat demandats.",
        "revdelete-concurrent-change": "Error al moment de la modificacion de l'element datat del $1 a $2 : son estatut es estat cambiat per qualqu'un mai pendent qu'o modificatz.\nVerificatz los jornals.",
        "revdelete-only-restricted": "Error al moment de la supression de l'entrada datada del $1 a $2 : podètz pas suprimir aqueles elements als administrators sens seleccionar tanben d'opcions de supression mai.",
-       "revdelete-reason-dropdown": "* Rasons correntas de supression\n** Violacion dels dreches d'autors\n** Entresenhas personalas inapropriadas\n** Nom d'utilizaire inapropriat\n** Informacions potencialament difamatòrias.",
+       "revdelete-reason-dropdown": "* Rasons correntas de supression\n** Violacion dels dreits d'autors\n** Entresenhas personalas inapropriadas\n** Nom d'utilizaire inapropriat\n** Informacions potencialament difamatòrias.",
        "revdelete-otherreason": "Autra rason / rason suplementària :",
        "revdelete-reasonotherlist": "Autra rason",
        "revdelete-edit-reasonlist": "Modifica los motius de la supression",
        "powersearch-remember": "Se remembrar de la seleccion per las recèrcas venentas",
        "search-external": "Recèrca extèrna",
        "searchdisabled": "La recèrca sus {{SITENAME}} es desactivada.\nEn esperant la reactivacion, podètz efectuar una recèrca via Google.\nAtencion, lor indexacion de contengut {{SITENAME}} benlèu es pas a jorn.",
-       "search-error": "Una error s'es producha en recercant : $1",
+       "search-error": "Una error s'es produita en recercant : $1",
        "preferences": "Preferéncias",
        "mypreferences": "Preferéncias",
        "prefs-edits": "Nombre d’edicions :",
        "prefs-custom-css": "CSS personalizat",
        "prefs-custom-js": "JS personalizat",
        "prefs-common-css-js": "JavaScript e CSS partejat per totes los abilhatges :",
-       "prefs-reset-intro": "Podètz utilizar aquesta pagina per restablir vòstras preferéncias a las valors per defaut del site. Aquò pòt pas èsser desfach.",
+       "prefs-reset-intro": "Podètz utilizar aquesta pagina per restablir vòstras preferéncias a las valors per defaut del site. Aquò pòt pas èsser desfait.",
        "prefs-emailconfirm-label": "Confirmacion del corrièr electronic :",
        "youremail": "Adreça de corrièr electronic :",
        "username": "{{GENDER:$1|Nom d'utilizaire|Nom d'utilizaira}}:",
        "prefs-help-signature": "Los comentaris sus las paginas de discussion devon èsser signats amb « <nowiki>~~~~</nowiki> », que serà convertit en vòstra signatura e un orodatament.",
        "badsig": "Signatura bruta incorrècta, verificatz vòstras balisas HTML.",
        "badsiglength": "Vòstra signatura es tròp longa.\nDeu aver, al maximum $1 caractèr{{PLURAL:$1||s}}.",
-       "yourgender": "Cossí vos agrada mai èsser descrich ?",
+       "yourgender": "Cossí vos agrada mai d'èsser descrit ?",
        "gender-unknown": "M'agrada mai sens detalh",
        "gender-male": "Modifica de pagina del wiki",
        "gender-female": "Modifica de paginas del wiki",
        "prefs-tokenwatchlist": "Geton",
        "prefs-diffs": "Diferéncias",
        "prefs-help-prefershttps": "Aquesta preferéncia serà efectiva al moment de vòstra connexion que ven.",
-       "prefs-tabs-navigation-hint": "Astúcia : Podètz utilizar las flèchas d'esquèrra e de drecha per navigar entre los onglets.",
-       "userrights": "Gestion dels dreches d'utilizaire",
-       "userrights-lookup-user": "Gestion dels dreches d'utilizaire",
+       "prefs-tabs-navigation-hint": "Astúcia : Podètz utilizar las sagetas d'esquèrra e de dreita per navigar entre los onglets.",
+       "userrights": "Gestion dels dreits d'utilizaire",
+       "userrights-lookup-user": "Gestion dels dreits d'utilizaire",
        "userrights-user-editname": "Entrar un nom d’utilizaire :",
        "editusergroup": "Modificacion dels gropes d’{{GENDER:$1|utilizaires}}",
-       "editinguser": "Modificacion dels dreches de l’{{GENDER:$1|utilizaire|utilizaira}} <strong>[[User:$1|$1]]</strong> $2",
+       "editinguser": "Modificacion dels dreits de l’{{GENDER:$1|utilizaire|utilizaira}} <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "Modificar los gropes de l’utilizaire",
        "saveusergroups": "Enregistrar los gropes de l’{{GENDER:$1|utilizaire|utilizaira}}",
        "userrights-groupsmember": "Membre de :",
        "userrights-groupsmember-auto": "Membre implicit de :",
        "userrights-groups-help": "Podètz modificar los gropes alsquals aparten aqueste utilizaire.\n* Una casa marcada significa que l'utilizaire se tròba dins aqueste grop.\n* Una casa pas marcada significa, al contrari, que s’i tròba pas.\n* Una * indica que podretz pas levar aqueste grop un còp que l'auretz apondut e vice-versa.",
        "userrights-reason": "Motiu :",
-       "userrights-no-interwiki": "Sètz pas abilitat per modificar los dreches dels utilizaires sus d'autres wikis.",
-       "userrights-nodatabase": "La banca de donadas « $1 » existís pas o es pas en local.",
-       "userrights-nologin": "Vos cal [[Special:UserLogin|vos connectar]] amb un compte d'administrator per balhar los dreches d'utilizaire.",
-       "userrights-notallowed": "Avètz pas la permission d'apondre o suprimir de dreches d'utilizaire.",
+       "userrights-no-interwiki": "Sètz pas abilitat per modificar los dreits dels utilizaires sus d'autres wikis.",
+       "userrights-nodatabase": "La basa de donadas « $1 » existís pas o es pas en local.",
+       "userrights-nologin": "Vos cal [[Special:UserLogin|vos connectar]] amb un compte d'administrator per balhar los dreits d'utilizaire.",
+       "userrights-notallowed": "Avètz pas la permission d'apondre o suprimir de dreits d'utilizaire.",
        "userrights-changeable-col": "Los gropes que podètz cambiar",
        "userrights-unchangeable-col": "Los gropes que podètz pas cambiar",
-       "userrights-conflict": "Conflicte de modificacion de dreches d'utilizaire ! Relegissètz e confirmatz vòstras modificacions.",
-       "userrights-removed-self": "Avètz suprimit vòstres pròpris dreches corrèctament. Del còp, podètz pas mai accedir a aquela pagina.",
+       "userrights-conflict": "Conflicte de modificacion de dreits d'utilizaire ! Relegissètz e confirmatz vòstras modificacions.",
+       "userrights-removed-self": "Avètz suprimit vòstres pròpris dreits. Del còp, podètz pas mai accedir a aquesta pagina.",
        "group": "Grop :",
        "group-user": "Utilizaires",
        "group-autoconfirmed": "Utilizaires enregistrats",
        "right-editmyusercss": "Modificar vòstres pròpris fichièrs CSS utilizaire",
        "right-editmyuserjs": "Modificar vòstres pròpris fichièrs JavaScript utilizaire",
        "right-viewmywatchlist": "Afichar vòstra pròpria lista de seguiment",
-       "right-editmywatchlist": "Modificar vòstra pròpria lista de seguiment. Remarcatz que certanas accions apondràn encara de paginas sens aqueste drech.",
+       "right-editmywatchlist": "Modificar vòstra pròpria lista de seguiment. Remarcatz que certanas accions apondràn encara de paginas sens aqueste dreit.",
        "right-viewmyprivateinfo": "Veire vòstras donadas personalas (exemple adreça, nom vertadièr)",
        "right-editmyprivateinfo": "Modificar vòstras donadas personalas (exemple adreça, nom vertadièr)",
        "right-editmyoptions": "Modificar vòstras preferéncias",
        "right-patrolmarks": "Veire los marcatges de susvelhança dins los darrièrs cambiaments",
        "right-unwatchedpages": "Veire la lista de las paginas pas seguidas",
        "right-mergehistory": "Fusionar los istorics de las paginas",
-       "right-userrights": "Modificar totes los dreches d'un utilizaire",
-       "right-userrights-interwiki": "Modificar los dreches d'utilizaires que son sus un autre wiki",
-       "right-siteadmin": "Varrolhar e desvarrolhar la banca de donadas",
+       "right-userrights": "Modificar totes los dreits d'un utilizaire",
+       "right-userrights-interwiki": "Modificar los dreits d'utilizaires que son sus un autre wiki",
+       "right-siteadmin": "Verrolhar e desverrolhar la basa de donadas",
        "right-override-export-depth": "Exportar las paginas en incluent las paginas ligadas fins a una prigondor de 5 nivèls",
        "right-sendemail": "Mandar un corrièl als autres utilizaires",
        "right-passwordreset": "Veire los corrièrs electronics de reïnicializacion dels senhals",
        "right-applychangetags": "Aplicar [[Special:Tags|las balisas]] amb sas pròprias modificacions",
-       "grant-generic": "ensemble de dreches « $1 »",
+       "grant-generic": "ensemble de dreits « $1 »",
        "grant-blockusers": "Blocar e desblocar d'utilizaires",
        "grant-patrol": "Marcar de paginas coma patrolhadas",
        "newuserlogpage": "Istoric de las creacions de comptes",
        "action-autopatrol": "aver vòstra modificacion marcada coma patrolhada",
        "action-unwatchedpages": "veire la lista de las paginas pas susvelhadas",
        "action-mergehistory": "fusionar l’istoric d'aquesta pagina",
-       "action-userrights": "modificar totes los dreches d’utilizaire",
-       "action-userrights-interwiki": "modificar los dreches d’utilizaire e los sus d’autres wikis",
-       "action-siteadmin": "varrolhar o desvarrolhar la banca de donadas",
+       "action-userrights": "modificar totes los dreits d’utilizaire",
+       "action-userrights-interwiki": "modificar los dreits d’utilizaire e los sus d’autres wikis",
+       "action-siteadmin": "verrolhar o desverrolhar la basa de donadas",
        "action-sendemail": "mandar corrièrs electronics",
        "action-editmywatchlist": "modificar vòstra lista de seguiment",
        "action-viewmywatchlist": "afichar vòstra pròpria lista de seguiment",
        "filedesc": "Descripcion",
        "fileuploadsummary": "Resumit :",
        "filereuploadsummary": "Modificacions del fichièr :",
-       "filestatus": "Estatut dels dreches d'autor :",
+       "filestatus": "Estatut dels dreits d'autor :",
        "filesource": "Font :",
        "ignorewarning": "Ignorar l’avertiment e salvar lo fichièr",
        "ignorewarnings": "Ignorar los avertiments al moment de l’impòrt",
        "hookaborted": "La modificacion qu'avètz ensajat de realizar es estada anullada per un croquet d'extension.",
        "illegal-filename": "Lo nom del fichièr es pas autorizat.",
        "overwrite": "Espotir un fichièr existent es pas autorizat.",
-       "unknown-error": "Una error desconeguda s'es producha.",
+       "unknown-error": "Una error desconeguda s'es produita.",
        "tmp-create-error": "Impossible de crear lo fichièr temporari.",
        "tmp-write-error": "Error d'escritura del fichièr temporari.",
        "large-file": "Los fichièrs importats deurián pas èsser mai gros que $1 ; aqueste fichièr fa $2.",
        "copyuploaddisabled": "Mandadís de fichièr per URL desactivat.",
        "uploaddisabledtext": "L'impòrt de fichièrs cap al servidor es desactivat.",
        "php-uploaddisabledtext": "Lo telecargament de fichièrs es estat desactivat dins PHP. Verificatz l'opcion de configuracion file_uploads.",
-       "uploadscripted": "Aqueste fichièr conten de còde HTML o un escript que poiriá èsser interpretat d'un biais incorrècte per un navigador Internet.",
+       "uploadscripted": "Aqueste fichièr conten de còdi HTML o un escript que poiriá èsser interpretat d'un biais incorrècte per un navigador Internet.",
        "uploadscriptednamespace": "Aqueste fichièr SVG conten un espaci de noms '$1' pas autorizat.",
        "uploadinvalidxml": "Lo XML dins lo fichièr importat a pas pogut èsser analisat.",
        "uploadvirus": "Aqueste fichièr conten un virús ! Per mai de detalhs, consultatz : $1",
        "upload-proto-error": "Protocòl incorrècte",
        "upload-proto-error-text": "L’impòrt requerís d'URLs començant per <code>http://</code> o <code>ftp://</code>.",
        "upload-file-error": "Error intèrna",
-       "upload-file-error-text": "Una error intèrna s'es producha en volent crear un fichièr temporari sul servidor. Contactatz un [[Special:ListUsers/sysop|administrator del sistèma]].",
+       "upload-file-error-text": "Una error intèrna s'es produita en volent crear un fichièr temporari sul servidor. Contactatz un [[Special:ListUsers/sysop|administrator del sistèma]].",
        "upload-misc-error": "Error d’impòrt desconeguda",
-       "upload-misc-error-text": "Una error desconeguda s'es producha pendent l’impòrt.\nVerificatz que l’URL es valida e accessibla, puèi ensajatz tornamai.\nSe lo problèma persistís, contactatz un [[Special:ListUsers/sysop|administrator del sistèma]].",
+       "upload-misc-error-text": "Una error desconeguda s'es produita pendent l’impòrt.\nVerificatz que l’URL es valida e accessibla, puèi ensajatz tornamai.\nSe lo problèma persistís, contactatz un [[Special:ListUsers/sysop|administrator del sistèma]].",
        "upload-too-many-redirects": "L'URL conten tròp de redireccions",
        "upload-http-error": "Una error HTTP es intervenguda : $1",
        "upload-copy-upload-invalid-domain": "La còpia dels telecargaments es pas disponibla dempuèi aqueste domeni.",
        "backend-fail-readonly": "Lo supòrt d'emmagazinatge \"$1\" es actualament en lectura sola. La rason indicada es : \"$2\"",
        "backend-fail-synced": "Lo fichièr \"$1\" es dins un estat incoerent dins los supòrts d'emmagazinatge intèrnes",
        "backend-fail-connect": "Impossible de se connectar al supòrt d'emmagazinatge \"$1\".",
-       "backend-fail-internal": "Una error desconeguda s'es producha dins lo supòrt d'emmagazinatge \"$1\".",
+       "backend-fail-internal": "Una error desconeguda s'es produita dins lo supòrt d'emmagazinatge \"$1\".",
        "backend-fail-contenttype": "Impossible de determinar lo tipe de contengut del fichièr d'emmagazinar en \"$1\".",
        "backend-fail-batchsize": "Lo supòrt d'emmagazinatge a provesit un lòt de $1 {{PLURAL:$1|operacion|operacions}} de fichièr ; lo limit es de $2 {{PLURAL:$2|operacion|operacions}}.",
-       "backend-fail-usable": "Impossible de legir o d'escriure lo fichièr « $1 » en rason de dreches insufisents o repertòris/contenidors mancants.",
-       "filejournal-fail-dbconnect": "Impossible de se connectar a la banca de donadas del jornal pel terminal d'emmagazinatge \"$1\".",
-       "filejournal-fail-dbquery": "Impossible de metre a jorn la banca de donadas del jornal pel terminal d'emmagazinatge \"$1\".",
-       "lockmanager-notlocked": "Impossible de desvarrolhar « $1 » ; es pas varrolhada.",
-       "lockmanager-fail-closelock": "Impossible de tampar lo fichièr de varrolh per « $1 ».",
-       "lockmanager-fail-deletelock": "Impossible de suprimir lo fichièr de varrolh per « $1 ».",
-       "lockmanager-fail-acquirelock": "Impossible d'obténer lo fichièr de varrolh per « $1 ».",
-       "lockmanager-fail-openlock": "Impossible de dobrir lo fichièr de varrolh per « $1 ».",
-       "lockmanager-fail-releaselock": "Impossible de daissar anar lo fichièr de varrolh per « $1 ».",
-       "lockmanager-fail-db-bucket": "Impossible de contactar pro de bancas de donadas de varrolhatge dins lo godet $1.",
-       "lockmanager-fail-db-release": "Impossible de daissar anar los varrolhs sus la banca de donadas $1.",
-       "lockmanager-fail-svr-acquire": "Impossible d'aquerir de varrolhs sul servidor $1.",
-       "lockmanager-fail-svr-release": "Impossible de daissar anar los varrolhs sul servidor $1.",
-       "zip-file-open-error": "Una error s'es producha al moment de la dobertura del fichièr ZIP per contraròtle.",
+       "backend-fail-usable": "Impossible de legir o d'escriure lo fichièr « $1 » en rason de dreits insufisents o repertòris/contenidors mancants.",
+       "filejournal-fail-dbconnect": "Impossible de se connectar a la basa de donadas del jornal pel terminal d'emmagazinatge \"$1\".",
+       "filejournal-fail-dbquery": "Impossible de metre a jorn la basa de donadas del jornal pel terminal d'emmagazinatge \"$1\".",
+       "lockmanager-notlocked": "Impossible de desverrolhar « $1 » ; es pas verrolhada.",
+       "lockmanager-fail-closelock": "Impossible de tampar lo fichièr de verrolh per « $1 ».",
+       "lockmanager-fail-deletelock": "Impossible de suprimir lo fichièr de verrolh per « $1 ».",
+       "lockmanager-fail-acquirelock": "Impossible d'obténer lo fichièr de verrolh per « $1 ».",
+       "lockmanager-fail-openlock": "Impossible de dobrir lo fichièr de verrolh per « $1 ».",
+       "lockmanager-fail-releaselock": "Impossible de daissar anar lo fichièr de verrolh per « $1 ».",
+       "lockmanager-fail-db-bucket": "Impossible de contactar pro de basas de donadas de verrolhatge dins lo godet $1.",
+       "lockmanager-fail-db-release": "Impossible de daissar anar los verrolhs sus la basa de donadas $1.",
+       "lockmanager-fail-svr-acquire": "Impossible d'aquerir de verrolhs sul servidor $1.",
+       "lockmanager-fail-svr-release": "Impossible de daissar anar los verrolhs sul servidor $1.",
+       "zip-file-open-error": "Una error s'es produita al moment de la dobertura del fichièr ZIP per contraròtle.",
        "zip-wrong-format": "Lo fichièr especificat es pas un archiu ZIP.",
        "zip-bad": "Lo fichièr es un archiu ZIP corromput o illegible.\nPòt pas èsser verificat corrèctament per la seguretat.",
        "zip-unsupported": "Lo fichièr es un archiu ZIP qu'utiliza de caracteristicas pas suportadas per MediaWiki. \nSa seguretat pòt pas èsser verificada corrèctament.",
-       "uploadstash": "Escondedor d'impòrt",
-       "uploadstash-clear": "Escafar los fichièrs en escondedor",
-       "uploadstash-nofiles": "Avètz pas de fichièrs en escondedor d'impòrt.",
+       "uploadstash": "Cache d'impòrt",
+       "uploadstash-clear": "Escafar los fichièrs en cache",
+       "uploadstash-nofiles": "Avètz pas de fichièrs en cache d'impòrt.",
        "uploadstash-errclear": "L'escafament dels fichièrs a fracassat.",
        "uploadstash-refresh": "Actualizar la lista dels fichièrs",
        "invalid-chunk-offset": "Offset de segment invalid",
        "img-auth-isdir": "Ensajatz d'accedir al repertòri « $1 ».\nSol l'accès als fichièrs es permesa.",
        "img-auth-streaming": "Lectura en continú de « $1 ».",
        "img-auth-public": "La foncion d'img_auth.php es d'afichar de fichièrs d'un wiki privat.\nAqueste wiki es configurat coma un wiki public.\nPer una seguretat optimala, img_auth.php es desactivat.",
-       "img-auth-noread": "L'utilizaire a pas lo drech en lectura sus « $1 ».",
+       "img-auth-noread": "L'utilizaire a pas lo dreit en lectura sus « $1 ».",
        "http-invalid-url": "URL incorrècta : $1",
        "http-invalid-scheme": "Las URLs amb l\"esquèma « $1 » son pas suportadas",
        "http-request-error": "Error desconeguda al moment del mandadís de la requèsta.",
        "filedelete-nofile-old": "Existís pas cap de version archivada de '''$1''' amb los atributs indicats.",
        "filedelete-otherreason": "Rason diferenta/suplementària :",
        "filedelete-reason-otherlist": "Autra rason",
-       "filedelete-reason-dropdown": "*Motius de supression costumièrs\n** Violacion de drech d’autor\n** Fichièr duplicat",
+       "filedelete-reason-dropdown": "*Motius de supression costumièrs\n** Violacion de dreit d’autor\n** Fichièr duplicat",
        "filedelete-edit-reasonlist": "Modifica los motius de la supression",
        "filedelete-maintenance": "La supression e lo restabliment de fichièrs es temporàriament desactivada pendent la mantenença.",
        "filedelete-maintenance-title": "Impossible de suprimir lo fichièr",
        "statistics-edits-average": "Modificacions mejanas per pagina",
        "statistics-users": "[[Special:ListUsers|Utilizaires]] enregistrats",
        "statistics-users-active": "Utilizaires actius",
-       "statistics-users-active-desc": "Utilizaires qu'an fach al mens una accion durant {{PLURAL:$1|lo darrièr jorn|los $1 darrièrs jorns}}",
+       "statistics-users-active-desc": "Utilizaires qu'an fait al mens una accion pendent {{PLURAL:$1|lo darrièr jorn|los $1 darrièrs jorns}}",
        "pageswithprop": "Paginas amb una proprietat de pagina",
        "pageswithprop-legend": "Paginas amb una proprietat de pagina",
        "pageswithprop-text": "Aquesta pagina fa la lista de las paginas qu'utilizan una proprietat de pagina particulara.",
        "doubleredirects": "Redireccions doblas",
        "doubleredirectstext": "Vaquí una lista de las paginas que redirigisson cap a de paginas que son elas-meteissas de paginas de redireccion.\nCada entrada conten de ligams cap a la primièra e la segonda redireccions, e mai la primièra linha de tèxte de la segonda pagina, çò que provesís, de costuma, la « vertadièra » pagina cibla, cap a la quala la primièra redireccion deuriá redirigir.\nLas entradas <del>barradas</del> son estadas resolgudas.",
        "double-redirect-fixed-move": "[[$1]] es estat desplaçat.\nEs estat mes a jorn automaticament e redirigís ara cap a [[$2]].",
-       "double-redirect-fixed-maintenance": "Correccion automatica de la dobla redireccion de [[$1]] cap a [[$2]] dins un prètzfach de mantenença.",
+       "double-redirect-fixed-maintenance": "Correccion automatica de la dobla redireccion de [[$1]] cap a [[$2]] dins un prètzfait de mantenença.",
        "double-redirect-fixer": "Corrector de redireccion",
        "brokenredirects": "Redireccions copadas",
        "brokenredirectstext": "Aquestas redireccions mènan cap a de paginas qu'existisson pas :",
        "wantedpages-summary": "Aquesta pagina compta totes los ligams, encluses los inserits via de modèls de navigacion. Per una lista dels articles mai demandats, vejatz articles mai demandats, que comptabiliza pas que las referéncias que provenon de l'espaci de nom dels articles. Vejatz tanben lo '''articles mai demandats'''.",
        "wantedpages-badtitle": "Títol invalid dins los resultats : $1",
        "wantedfiles": "Fichièrs desirats",
-       "wantedfiletext-cat": "Los fichièrs seguents son utilizats, mas existisson pas localament. Se se tròban sus un depaus partejat, pòdon èsser listats aicí, mentre que sián, de fach, ja disponibles. Totes aqueles falses positius seràn <del>raiats</del>. Amai, las paginas qu'intègran de fichièrs qu'existisson pas son repertoriadas dins [[:$1]].",
+       "wantedfiletext-cat": "Los fichièrs seguents son utilizats, mas existisson pas localament. Se se tròban sus un depaus partejat, pòdon èsser listats aicí, mentre que sián, de fait, ja disponibles. Totes aqueles falses positius seràn <del>raiats</del>. Amai, las paginas qu'intègran de fichièrs qu'existisson pas son repertoriadas dins [[:$1]].",
        "wantedfiletext-cat-noforeign": "Los fichièrs seguents son utilizats mas existisson pas. Amai, las paginas qu'intègran los fichièrs qu'existisson pas son listats dins [[:$1]].",
-       "wantedfiletext-nocat": "Los fichièrs seguents son utilizats, mas existisson pas localament. Se se tròban sus un depaus partejat, pòdon èsser listats aicí, mentre que sián, de fach, ja disponibles. Totes aqueles falses positius seràn <del>raiats</del>.",
+       "wantedfiletext-nocat": "Los fichièrs seguents son utilizats, mas existisson pas localament. Se se tròban sus un depaus partejat, pòdon èsser listats aicí, mentre que sián, de fait, ja disponibles. Totes aqueles falses positius seràn <del>raiats</del>.",
        "wantedfiletext-nocat-noforeign": "Los fichièrs seguents son utilizats mas existisson pas.",
        "wantedtemplates": "Modèls demandats",
        "mostlinked": "Paginas mai ligadas",
        "booksources-isbn": "ISBN :",
        "booksources-search": "Recercar",
        "booksources-text": "Vaquí una lista de ligams cap a d’autres sites que vendon de libres nòus e d’ocasion e suls quals trobaretz benlèu d'entresenhas suls obratges que cercatz. {{SITENAME}} es pas ligada a cap d'aquestas societats, a pas l’intencion de ne far la promocion.",
-       "booksources-invalid-isbn": "Lo numèro ISBN balhat sembla pas èsser valid ; verificatz s'avètz fach una error al moment de la còpia dempuèi la font.",
+       "booksources-invalid-isbn": "Lo numèro ISBN balhat sembla pas èsser valid ; verificatz s'avètz fait una error al moment de la còpia dempuèi la font.",
        "specialloguserlabel": "Autor :",
        "speciallogtitlelabel": "Cibla (títol o utilizaire):",
        "log": "Jornals",
        "allpagesbadtitle": "Lo títol rensenhat per la pagina es incorrècte o possedís un prefix reservat. Conten segurament un o mantun caractèr especial que pòt pas èsser utilizats dins los títols.",
        "allpages-bad-ns": "{{SITENAME}} a pas d’espaci de noms « $1 ».",
        "allpages-hide-redirects": "Amagar las redireccions",
-       "cachedspecial-viewing-cached-ttl": "Visualizatz una version d'aquesta pagina mesa en escondedor, que pòt èsser datada d’al mai $1.",
+       "cachedspecial-viewing-cached-ttl": "Visualizatz una version d'aquesta pagina mesa en cache, que pòt èsser datada d’al mai $1.",
        "cachedspecial-refresh-now": "Veire lo mai recent.",
        "categories": "Categorias",
        "categoriespagetext": "{{PLURAL:$1|La categoria seguenta es utilizada|Las categorias seguentas son utilizadas}} per de paginas o de fichièrs.\n[[Special:UnusedCategories|Las categorias inutilizadas]] son pas afichadas aicí.\nVejatz tanben [[Special:WantedCategories|las categorias demandadas]].",
        "activeusers-hidebots": "Amagar los robòts",
        "activeusers-hidesysops": "Amagar los administrators",
        "activeusers-noresult": "Cap d'utilizaire pas trobat.",
-       "listgrouprights": "Dreches dels gropes d'utilizaires",
-       "listgrouprights-summary": "Aquesta pagina conten una lista de gropes definits sus aqueste wiki e mai los dreches d'accès qu'i son associats.\nI pòt aver [[{{MediaWiki:Listgrouprights-helppage}}|d'entresenhas complementàrias]] a prepaus dels dreches.",
-       "listgrouprights-key": "Legenda :\n*<span class=\"listgrouprights-granted\">Drech autrejat</span>\n*<span class=\"listgrouprights-revoked\">Drech revocat</span>",
+       "listgrouprights": "Dreits dels gropes d'utilizaires",
+       "listgrouprights-summary": "Aquesta pagina conten una lista de gropes definits sus aqueste wiki e mai los dreits d'accès qu'i son associats.\nI pòt aver [[{{MediaWiki:Listgrouprights-helppage}}|d'entresenhas complementàrias]] a prepaus dels dreits.",
+       "listgrouprights-key": "Legenda :\n*<span class=\"listgrouprights-granted\">Dreit autrejat</span>\n*<span class=\"listgrouprights-revoked\">Dreit revocat</span>",
        "listgrouprights-group": "Grop",
-       "listgrouprights-rights": "Dreches associats",
+       "listgrouprights-rights": "Dreits associats",
        "listgrouprights-helppage": "Help:Dreches dels gropes",
        "listgrouprights-members": "(lista dels membres)",
        "listgrouprights-addgroup": "Pòt apondre $2 {{PLURAL:$2|grop|gropes}} : $1",
        "listgrouprights-removegroup-self-all": "Se pòt levar totes los gropes de son compte pròpri",
        "listgrouprights-namespaceprotection-header": "Restriccions d'espaci de noms",
        "listgrouprights-namespaceprotection-namespace": "Espaci de noms",
-       "listgrouprights-namespaceprotection-restrictedto": "Drech(s) que permet(on) a l'utilizaire de modificar",
+       "listgrouprights-namespaceprotection-restrictedto": "Dreit(s) que permet(on) a l'utilizaire de modificar",
        "trackingcategories": "Categorias de seguiment",
        "trackingcategories-msg": "Categoria de seguiment",
        "trackingcategories-name": "Nom del messatge",
        "watchlist-options": "Opcions de la lista de seguiment",
        "watching": "Seguit...",
        "unwatching": "Fin del seguit...",
-       "watcherrortext": "Una error s'es producha al moment de la modificacion dels paramètres de vòstra lista de seguiment per « $1 ».",
+       "watcherrortext": "Una error s'es produita al moment de la modificacion dels paramètres de vòstra lista de seguiment per « $1 ».",
        "enotif_reset": "Marcar totas las paginas coma visitadas",
        "enotif_impersonal_salutation": "Utilizaire de {{SITENAME}}",
        "enotif_subject_deleted": "La pagina $1 sus {{SITENAME}} es estada suprimida per {{GENDER:$2|$2}}",
        "deletecomment": "Motiu :",
        "deleteotherreason": "Motius suplementaris o autres :",
        "deletereasonotherlist": "Autre motiu",
-       "deletereason-dropdown": "* Motius de supression los mai corrents\n** Corrièrs indesirables\n** Vandalisme\n** Violacion dels dreches d’autor\n** Demanda de l’autor\n** Redireccion copada",
+       "deletereason-dropdown": "* Motius de supression los mai corrents\n** Corrièrs indesirables\n** Vandalisme\n** Violacion dels dreits d’autor\n** Demanda de l’autor\n** Redireccion copada",
        "delete-edit-reasonlist": "Modifica los motius de la supression",
        "delete-toobig": "Aquesta pagina dispausa d'un istoric important, depassant {{PLURAL:$1|revision|revisions}}.\nLa supression de talas paginas es estada limitada per evitar de perturbacions accidentalas de {{SITENAME}}.",
        "delete-warning-toobig": "Aquesta pagina dispausa d'un istoric important, depassant {{PLURAL:$1|revision|revisions}}.\nLa suprimir pòt perturbar lo foncionament de la banca de donada de {{SITENAME}}.\nD'efectuar amb prudéncia.",
        "protectexpiry": "Expiracion (expira pas per defaut)",
        "protect_expiry_invalid": "Lo temps d’expiracion es invalid",
        "protect_expiry_old": "Lo temps d’expiracion ja es passat.",
-       "protect-unchain-permissions": "Desvarrolhar ancara mai d'opcions de proteccion",
+       "protect-unchain-permissions": "Desverrolhar ancara mai d'opcions de proteccion",
        "protect-text": "Podètz consultar e modificar lo nivèl de proteccion de la pagina «$1».",
        "protect-locked-blocked": "Podètz pas modificar los nivèls de proteccion tant que sètz bloca{{GENDER:||t|ada}}.. Vaquí los reglatges actuals de la pagina <strong>$1</strong> :",
-       "protect-locked-dblock": "Lo nivèl de proteccion pòt pas èsser modificat perque la banca de donadas es varrolhada.\nVaquí los reglatges actuals de la pagina <strong>$1</strong> :",
-       "protect-locked-access": "Avètz pas los dreches necessaris per modificar los nivèls de proteccion de las paginas.\nVaquí los reglatges actuals de la pagina <strong>$1</strong> :",
+       "protect-locked-dblock": "Lo nivèl de proteccion pòt pas èsser modificat perque la basa de donadas es verrolhada.\nVaquí los reglatges actuals de la pagina <strong>$1</strong> :",
+       "protect-locked-access": "Avètz pas los dreits necessaris per modificar los nivèls de proteccion de las paginas.\nVaquí los reglatges actuals de la pagina <strong>$1</strong> :",
        "protect-cascadeon": "Aquesta pagina es protegida perque es inclusa dins {{PLURAL:$1|la pagina seguenta qu'es estada protegida|las paginas seguentas que son estadas protegidas}}, amb l’opcion « proteccion en cascada » activada. Podètz cambiar lo nivèl de proteccion d'aquesta pagina sens qu'aquò afècte la proteccion en cascada.",
        "protect-default": "Autorizar totes los utilizaires",
-       "protect-fallback": "Autorizar unicament los utilizaires amb lo drech « $1 »",
+       "protect-fallback": "Autorizar unicament los utilizaires amb lo dreit « $1 »",
        "protect-level-autoconfirmed": "Autorizar unicament los utilizaires autoconfirmats",
        "protect-level-sysop": "Autorizar unicament los administrators",
        "protect-summary-cascade": "proteccion en cascada",
        "undelete-filename-mismatch": "Impossible de restablir lo fichièr datat del $1 : fichièr introbable",
        "undelete-bad-store-key": "Impossible de restablir lo fichièr datat del $1 : lo fichièr èra absent abans la supression.",
        "undelete-cleanup-error": "Error al moment de la supression de l’archiu inutilizada « $1 ».",
-       "undelete-missing-filearchive": "Impossible de restablir lo fichièr amb l’ID $1 perque es pas dins la banca de donadas. Benlèu ja i es estat restablit.",
+       "undelete-missing-filearchive": "Impossible de restablir lo fichièr amb l’ID $1 perque es pas dins la basa de donadas. Benlèu ja i es estat restablit.",
        "undelete-error": "Pagina d'error d'anullacion",
        "undelete-error-short": "Error al moment del restabliment del fichièr : $1",
        "undelete-error-long": "D'errors son estadas rencontradas al moment del restabliment del fichièr :\n\n$1",
        "sp-contributions-uploads": "impòrts",
        "sp-contributions-logs": "jornals",
        "sp-contributions-talk": "Discutir",
-       "sp-contributions-userrights": "gerir los dreches",
+       "sp-contributions-userrights": "gerir los dreits",
        "sp-contributions-blocked-notice": "Aqueste utilizaire es actualament blocat. La darrièra entrada del jornal dels blocatges es indicada çaijós a títol d’informacion :",
        "sp-contributions-blocked-notice-anon": "Aquesta adreça IP es actualament blocada.\nLa darrièra intrada del jornal dels blocatges es indicada çaijós a títol d’informacion :",
        "sp-contributions-search": "Cercar las contribucions",
        "proxyblockreason": "Vòstra ip es estada blocada perque s’agís d’un proxy dobèrt. Mercé de contactar vòstre fornidor d’accès internet o vòstre supòrt tecnic e de l’informar d'aqueste problèma de seguretat.",
        "sorbsreason": "Vòstra adreça IP es listada en tant que mandatari (proxy) dobèrt DNSBL per {{SITENAME}}.",
        "sorbs_create_account_reason": "Vòstra adreça IP es listada en tant que mandatari (proxy) dobèrt DNSBL per {{SITENAME}}.\nPodètz pas crear un compte",
-       "cant-see-hidden-user": "L'utilizaire qu'ensajatz de blocar es ja estat blocat e amagat. Sens lo drech hideuser, podètz pas veire o modificar lo blocatge de l'utilizaire.",
+       "cant-see-hidden-user": "L'utilizaire qu'ensajatz de blocar es ja estat blocat e amagat. Sens lo dreit hideuser, podètz pas veire o modificar lo blocatge de l'utilizaire.",
        "ipbblocked": "Podètz pas blocar o desblocar d'autres utilizaire, perque vos {{GENDER:|meteis|meteissa|meteis}} sètz {{GENDER:|blocat|blocada|blocat}}.",
        "ipbnounblockself": "Sètz pas autorizat a vos desblocar vos meteis",
-       "lockdb": "Varrolhar la banca",
-       "unlockdb": "Desvarrolhar la banca",
-       "lockdbtext": "Lo clavatge de la banca de donadas empacharà totes los utilizaires de modificar las paginas, de salvar lors preferéncias, de modificar lor lista de seguiment e d'efectuar totas las autras operacions necessitant de modificacions dins la banca de donadas.\nConfirmatz qu'es plan çò que volètz far e que desblocaretz la banca tre que vòstra operacion de mantenença serà acabada.",
-       "unlockdbtext": "Lo desclavatge de la banca de donadas permetrà a totes los utilizaires de modificar tornarmai de paginas, de metre a jorn lors preferéncias e lor lista de seguiment, e mai d'efectuar las autras operacions que necessitan de modificacions dins la banca de donadas.\nConfirmatz qu'es plan çò que volètz far.",
-       "lockconfirm": "Òc, confirmi que desiri varrolhar la banca de donadas.",
-       "unlockconfirm": "Òc, confirmi que desiri desvarrolhar la banca de donadas.",
-       "lockbtn": "Varrolhar la banca",
-       "unlockbtn": "Desvarrolhar la banca",
+       "lockdb": "Verrolhar la banca",
+       "unlockdb": "Desverrolhar la banca",
+       "lockdbtext": "Lo clavatge de la basa de donadas empacharà totes los utilizaires de modificar las paginas, de salvar lors preferéncias, de modificar lor lista de seguiment e d'efectuar totas las autras operacions necessitant de modificacions dins la basa de donadas.\nConfirmatz qu'es plan çò que volètz far e que desblocaretz la banca tre que vòstra operacion de mantenença serà acabada.",
+       "unlockdbtext": "Lo desclavatge de la basa de donadas permetrà a totes los utilizaires de modificar tornamai de paginas, de metre a jorn lors preferéncias e lor lista de seguiment, e mai d'efectuar las autras operacions que necessitan de modificacions dins la basa de donadas.\nConfirmatz qu'es plan çò que volètz far.",
+       "lockconfirm": "Òc, confirmi que desiri verrolhar la basa de donadas.",
+       "unlockconfirm": "Òc, confirmi que desiri desverrolhar la basa de donadas.",
+       "lockbtn": "Verrolhar la banca",
+       "unlockbtn": "Desverrolhar la basa",
        "locknoconfirm": "Avètz pas marcat la casa de confirmacion.",
-       "lockdbsuccesssub": "Varrolhatge de la banca capitat.",
-       "unlockdbsuccesssub": "Banca desvarrolhada.",
-       "lockdbsuccesstext": "La banca de donadas de {{SITENAME}} es varrolhada.\n\nDoblidetz pas de la desvarrolhar quand auretz acabat vòstra operacion de mantenença.",
-       "unlockdbsuccesstext": "La banca de donadas de {{SITENAME}} es desvarrolhada.",
-       "lockfilenotwritable": "Lo fichièr de blocatge de la banca de donadas es pas inscriptible. Per blocar o desblocar la banca de donadas, vos cal poder escriure sul servidor web.",
-       "databasenotlocked": "La banca de donadas es pas varrolhada.",
+       "lockdbsuccesssub": "Verrolhatge de la basa capitat.",
+       "unlockdbsuccesssub": "Basa desverrolhada.",
+       "lockdbsuccesstext": "La basa de donadas de {{SITENAME}} es varrolhada.\n\nDoblidetz pas de la desverrolhar quand auretz acabat vòstra operacion de mantenença.",
+       "unlockdbsuccesstext": "La basa de donadas de {{SITENAME}} es desverrolhada.",
+       "lockfilenotwritable": "Lo fichièr de blocatge de la basa de donadas es pas inscriptible. Per blocar o desblocar la basa de donadas, vos cal poder escriure sul servidor web.",
+       "databasenotlocked": "La basa de donadas es pas verrolhada.",
        "lockedbyandtime": "(per $1 lo $2 a $3)",
        "move-page": "Renomenar $1",
        "move-page-legend": "Tornar nomenar una pagina",
        "imageinvalidfilename": "Lo nom del fichièr cibla es incorrècte",
        "fix-double-redirects": "Metre a jorn las redireccions que puntant cap al títol ancian",
        "move-leave-redirect": "Daissar una redireccion darrièr",
-       "protectedpagemovewarning": "'''ATENCION:''' Aquesta pagina es estada protegida per que sonque los utilizaires qu'an los dreches d'administrators la pòscan tornar nomenar. La darrièra entrada del jornal es afichada çaijós per referéncia :",
+       "protectedpagemovewarning": "'''ATENCION:''' Aquesta pagina es estada protegida per que sonque los utilizaires qu'an los dreits d'administrators la pòscan renomenar. La darrièra entrada del jornal es afichada çaijós per referéncia :",
        "semiprotectedpagemovewarning": "'''Nòta :''' Aquesta pagina es estada blocada per que sonque los utilizaires enregistrats la pòscan tornar nomenar. La darrièra entrada del jornal es afichada çaijós per referéncia :",
        "move-over-sharedrepo": "== Lo fichièr existís ==\n[[:$1]] existís ja sus un depaus partejat. Tornar nomenar aqueste fichièr farà lo fichièr sul depaus partatge inaccessible.",
        "file-exists-sharedrepo": "Lo nom causit es ja utilizat per un fichièr sus un depaus partejat.\nCausissètz un autre nom.",
        "importuploaderrortemp": "Lo telecargament del fichièr d'importar a pas capitat. Un dorsièr temporari es mancant.",
        "import-parse-failure": "Ruptura dins l'analisi de l'impòrt XML",
        "import-noarticle": "Pas de pagina d'importar !",
-       "import-nonewrevisions": "Cap de revision pas importada (totas èran ja presentas, o ignoradas del fach d’errors).",
+       "import-nonewrevisions": "Cap de revision pas importada (totas èran ja presentas, o ignoradas del fait d’errors).",
        "xml-error-string": "$1 a la linha $2, col $3 (octet $4) : $5",
        "import-upload": "Impòrt d'un fichier XML",
        "import-token-mismatch": "Pèrda de las donadas de sesilha. Tornatz ensajar.",
        "pageinfo-magic-words": "{{PLURAL:$1|Mot magic|Mots magics}} ($1)",
        "pageinfo-hidden-categories": "{{PLURAL:$1|Categoria amagada|Categorias amagadas}} ($1)",
        "pageinfo-templates": "{{PLURAL:$1|Modèl inclús|Modèls incluses}} ($1)",
-       "pageinfo-transclusions": "{{PLURAL:$1|Pagina traducha|Paginas traduchas}} sus ($1)",
+       "pageinfo-transclusions": "{{PLURAL:$1|Pagina traduita|Paginas traduitas}} sus ($1)",
        "pageinfo-toolboxlink": "Informacion sus la pagina",
        "pageinfo-redirectsto": "Redirigir cap a",
        "pageinfo-redirectsto-info": "info",
        "rcpatroldisabledtext": "La foncionalitat de relectura dels darrièrs cambiaments es actualament desactivada.",
        "markedaspatrollederror": "Pòt pas èsser marcat coma pas vandalizat",
        "markedaspatrollederrortext": "Vos cal seleccionar una version per poder la marcar coma pas vandalizada.",
-       "markedaspatrollederror-noautopatrol": "Avètz pas lo drech de marcar vòstras pròprias modificacions coma susvelhadas.",
+       "markedaspatrollederror-noautopatrol": "Avètz pas lo dreit de marcar vòstras pròprias modificacions coma susvelhadas.",
        "markedaspatrollednotify": "Aquesta modificacion de $1 es estada marcada coma relegida.",
        "markedaspatrollederrornotify": "Fracàs del marcatge coma contrarotlat.",
        "patrol-log-page": "Istoric de las versions patrolhadas",
        "filedeleteerror-short": "Error al moment de la supression del fichièr : $1",
        "filedeleteerror-long": "D'errors son estadas rencontradas al moment de la supression del fichièr :\n\n$1",
        "filedelete-missing": "Lo fichièr « $1 » pòt pas èsser suprimit perque existís pas.",
-       "filedelete-old-unregistered": "La revision del fichièr especificat « $1 » es pas dins la banca de donadas.",
-       "filedelete-current-unregistered": "Lo fichièr especificat « $1 » es pas dins la banca de donadas.",
+       "filedelete-old-unregistered": "La revision del fichièr especificat « $1 » es pas dins la basa de donadas.",
+       "filedelete-current-unregistered": "Lo fichièr especificat « $1 » es pas dins la basa de donadas.",
        "filedelete-archive-read-only": "Lo dorsièr d’archivatge « $1 » es pas modificable pel servidor.",
        "previousdiff": "← Cambiament precedent",
        "nextdiff": "Cambiament seguent →",
-       "mediawarning": "<strong>Atencion :</strong> Aqueste tipe de fichièr pòt conténer de còde malvolent.\nSe l'executatz, vòstre sistèma pòt èsser compromés.",
+       "mediawarning": "<strong>Atencion :</strong> Aqueste tipe de fichièr pòt conténer de còdi malvolent.\nSe l'executatz, vòstre sistèma pòt èsser compromés.",
        "imagemaxsize": "Format maximal dels imatges :<br />''(per las paginas de descripcion d’imatges)''",
        "thumbsize": "Talha de la miniatura :",
        "widthheightpage": "$1 × $2, $3 {{PLURAL:$3|pagina|paginas}}",
        "exif-keywords": "Mots claus",
        "exif-worldregioncreated": "Region del mond dins la quala la fòto es estada presa",
        "exif-countrycreated": "País dins lo qual la fòto es estada presa",
-       "exif-countrycodecreated": "Còde del país dins lo qual la fòto es estada presa",
+       "exif-countrycodecreated": "Còdi del país dins lo qual la fòto es estada presa",
        "exif-provinceorstatecreated": "Província o Estat dins lo qual la fòto es estada presa",
        "exif-citycreated": "Vila dins la quala la fòto es estada presa",
        "exif-sublocationcreated": "Partida de la vila dins la quala la fòto es estada presa",
        "exif-worldregiondest": "Region del mond representada",
        "exif-countrydest": "País representat",
-       "exif-countrycodedest": "Còde del país representat",
+       "exif-countrycodedest": "Còdi del país representat",
        "exif-provinceorstatedest": "Província o Estat representat",
        "exif-citydest": "Vila representada",
        "exif-sublocationdest": "Partida de la vila representada",
        "exif-urgency": "Urgéncia",
        "exif-fixtureidentifier": "Nom element recurrent",
        "exif-locationdest": "Luòc representat",
-       "exif-locationdestcode": "Còde del luòc representat",
+       "exif-locationdestcode": "Còdi del luòc representat",
        "exif-objectcycle": "Moment de la jornada al qual aqueste mèdia es destinat",
        "exif-contact": "Informacions de contacte",
        "exif-writer": "Autor",
        "exif-iimsupplementalcategory": "Categorias suplementàrias",
        "exif-datetimeexpires": "Utilizar pas aprèp",
        "exif-datetimereleased": "Paregut lo",
-       "exif-originaltransmissionref": "Còde de localizacion de la transmission originala",
+       "exif-originaltransmissionref": "Còdi de localizacion de la transmission originala",
        "exif-identifier": "Identificant",
        "exif-lens": "Lentilha utilizada",
        "exif-serialnumber": "Numèro de seria de l'aparelh de fòto",
        "exif-datetimemetadata": "Data de la darrièra modificacion de las metadonadas",
        "exif-nickname": "Nom informal de l'imatge",
        "exif-rating": "Nòta (sus 5)",
-       "exif-rightscertificate": "Certificat de gestion dels dreches",
-       "exif-copyrighted": "Estatut del drech d'autor",
-       "exif-copyrightowner": "Detentor del drech d'autor",
+       "exif-rightscertificate": "Certificat de gestion dels dreits",
+       "exif-copyrighted": "Estatut del dreit d'autor",
+       "exif-copyrightowner": "Detentor del dreit d'autor",
        "exif-usageterms": "Condicions d'utilizacion",
-       "exif-webstatement": "Declaracion de dreches d'autor en linha",
+       "exif-webstatement": "Declaracion de dreits d'autor en linha",
        "exif-originaldocumentid": "Identificant unic del document original",
        "exif-licenseurl": "URL de la licéncia",
        "exif-morepermissionsurl": "Informacions sus las licéncias alternativas",
        "exif-contentwarning": "Avertiment sul contengut",
        "exif-giffilecomment": "Comentari de fichièr GIF",
        "exif-intellectualgenre": "Tipe d'element",
-       "exif-subjectnewscode": "Còde del subjècte",
-       "exif-scenecode": "Còde de scèna IPTC",
+       "exif-subjectnewscode": "Còdi del subjècte",
+       "exif-scenecode": "Còdi de scèna IPTC",
        "exif-event": "Eveniment representat",
        "exif-organisationinimage": "Organizacion representada",
        "exif-personinimage": "Persona representada",
        "exif-compression-2": "CCITT Grop 3 Longor de l'encodatge Huffman modificat de dimension 1",
        "exif-compression-3": "CCITT Grop 3 encodatge del fax",
        "exif-compression-4": "CCITT Grop 4 encodatge del fax",
-       "exif-copyrighted-true": "Somés al drech d'autor",
-       "exif-copyrighted-false": "Estat dels dreches d’autor pas definit",
+       "exif-copyrighted-true": "Somés al dreit d'autor",
+       "exif-copyrighted-false": "Estat dels dreits d’autor pas definit",
        "exif-unknowndate": "Data desconeguda",
        "exif-orientation-1": "Normala",
        "exif-orientation-2": "Inversada orizontalament",
        "exif-exposureprogram-4": "Prioritat a l’obturacion",
        "exif-exposureprogram-5": "Programa de creacion (preferéncia a la prigondor de camp)",
        "exif-exposureprogram-6": "Programa d'accion (preferéncia a la velocitat d’obturacion)",
-       "exif-exposureprogram-7": "Mòde retrach (per clichats de prèp amb rèireplan fosc)",
+       "exif-exposureprogram-7": "Mòde retrait (per clichats de prèp amb rèireplan fosc)",
        "exif-exposureprogram-8": "Mòde païsatge (per de clichats de païsatges nets)",
        "exif-subjectdistance-value": "{{PLURAL:$1|$1 mètre|$1 mètres}}",
        "exif-meteringmode-0": "Desconegut",
        "exif-whitebalance-1": "Balança dels blancs manuala",
        "exif-scenecapturetype-0": "Estandard",
        "exif-scenecapturetype-1": "Païsatge",
-       "exif-scenecapturetype-2": "Retrach",
+       "exif-scenecapturetype-2": "Retrait",
        "exif-scenecapturetype-3": "Scèna nuechenca",
        "exif-gaincontrol-0": "Cap",
        "exif-gaincontrol-1": "Augmentacion febla de l’aquisicion",
        "exif-dc-date": "Data(s)",
        "exif-dc-publisher": "Editor",
        "exif-dc-relation": "Mèdias connèxes",
-       "exif-dc-rights": "dreches",
+       "exif-dc-rights": "Dreits",
        "exif-dc-source": "Mèdia font",
        "exif-dc-type": "Tipe de mèdia",
        "exif-rating-rejected": "Regetat",
        "exif-isospeedratings-overflow": "Mai grand que 65535",
        "exif-iimcategory-ace": "Arts, cultura e lésers",
-       "exif-iimcategory-clj": "Crime e drech",
+       "exif-iimcategory-clj": "Crime e dreit",
        "exif-iimcategory-dis": "Catastròfas e accidents",
        "exif-iimcategory-fin": "Economia e afars",
        "exif-iimcategory-edu": "Educacion",
        "monthsall": "totes",
        "confirmemail": "Confirmar l'adreça de corrièr electronic",
        "confirmemail_noemail": "L’adreça de corrièr electronic configurada dins vòstras [[Special:Preferences|preferéncias]] es pas valida.",
-       "confirmemail_text": "{{SITENAME}} necessita la verificacion de vòstra adreça de corrièr electronic abans de poder utilizar tota foncion de messatjariá. Utilizatz lo boton çaijós per mandar un corrièr electronic de confirmacion a vòstra adreça. Lo corrièr contendrà un ligam contenent un còde, cargatz aqueste ligam dins vòstre navigador per validar vòstra adreça.",
-       "confirmemail_pending": "Un còde de confirmacion ja vos es estat mandat per corrièr electronic ;\nse venètz de crear vòstre compte, esperatz qualques minutas que l’e-mail arribe abans de demandar un còde novèl.",
-       "confirmemail_send": "Mandar un còde de confirmacion",
+       "confirmemail_text": "{{SITENAME}} necessita la verificacion de vòstra adreça de corrièr electronic abans de poder utilizar tota foncion de messatjariá. Utilizatz lo boton çaijós per mandar un corrièr electronic de confirmacion a vòstra adreça. Lo corrièr contendrà un ligam contenent un còdi, cargatz aqueste ligam dins vòstre navigador per validar vòstra adreça.",
+       "confirmemail_pending": "Un còdi de confirmacion ja vos es estat mandat per corrièr electronic ;\nse venètz de crear vòstre compte, esperatz qualques minutas que l’e-mail arribe abans de demandar un còdi novèl.",
+       "confirmemail_send": "Mandar un còdi de confirmacion",
        "confirmemail_sent": "Corrièr electronic de confirmacion mandat.",
-       "confirmemail_oncreate": "Un còde de confirmacion es estat mandat a vòstra adreça de corrièr electronic.\nAqueste còde es pas requerit per se connectar, mas n'aurètz besonh per activar las foncionalitats ligadas als corrièrs electronics sus aqueste wiki.",
+       "confirmemail_oncreate": "Un còdi de confirmacion es estat mandat a vòstra adreça de corrièr electronic.\nAqueste còdi es pas requesit per se connectar, mas n'auretz besonh per activar las foncionalitats ligadas als corrièrs electronics sus aqueste wiki.",
        "confirmemail_sendfailed": "{{SITENAME}} pòt pas mandar lo corrièr de confirmacion.\nVerificatz se vòstra adreça conten pas de caractèrs interdiches.\n\nRetorn del programa de corrièr : $1",
-       "confirmemail_invalid": "Còde de confirmacion incorrècte. Benlèu lo còde a expirat.",
+       "confirmemail_invalid": "Còdi de confirmacion incorrècte. Benlèu que lo còdi a expirat.",
        "confirmemail_needlogin": "Vos cal vos $1 per confirmar vòstra adreça de corrièr electronic.",
        "confirmemail_success": "Vòstra adreça de corrièr electronic es confirmada. Ara, vos podètz connectar e aprofechar del wiki.",
        "confirmemail_loggedin": "Ara, vòstra adreça es confirmada",
        "confirmemail_subject": "Confirmacion d’adreça de corrièr electronic per {{SITENAME}}",
-       "confirmemail_body": "Qualqu’un, probablament vos,e amb l’adreça IP $1, a enregistrat un compte « $2 » amb aquesta adreça de corrièr electronic sul site {{SITENAME}}.\n\nPer confirmar qu'aqueste compte vos aparten vertadièrament e activar las foncions de messatjariá sus {{SITENAME}}, seguissètz lo ligam çaijós dins vòstre navigador :\n\n$3\n\nSe s’agís pas de vos, dobriscatz pas lo ligam.\nAqueste còde de confirmacion expirarà lo $4, seguissètz l’autre ligam çaijós dins vòstre navigador :\n\n$5\n\nAqueste còde de confirmacion expirarà lo $4.",
-       "confirmemail_body_changed": "Qualqu’un, probablament vos, a partir de l’adreça IP $1,\na modificat l’adreça de corrièr associada al compte « $2 » de {{SITENAME}}\nen aquesta adreça.\n\nPer confirmar qu'aqueste compte vos aparten vertadièrament e per tal\nde reactivar las foncions de messatjariá sus {{SITENAME}},\nseguissètz aqueste ligam dins vòstre navigador :\n\n$3\n\nS'aqueste compte vos aparten *pas*, dobriscatz pas aqueste ligam ;\npodètz seguir l’autre ligam çaijós per anullar la\nconfirmacion de vòstra adreça de corrièl :\n\n$5\n\nAqueste còde de confirmacion expirarà lo $4.",
-       "confirmemail_body_set": "Qualqu’un, probablament vos, dempuèi l’adreça IP $1, a modificat l'adreça de corrièr electronic del compte « $2 » amb aquesta sul site {{SITENAME}}.\n\nPer confirmar qu'aqueste compte vos aparten vertadièrament e reactivar las foncions de messatjariá sus {{SITENAME}}, seguissètz lo ligam çaijós dins vòstre navigador :\n\n$3\n\nAqueste còde de confirmacion expirarà lo $4.\n\nSe s’agís *pas* de vòstre compte, seguissètz aqueste ligam per anullar la confirmacion de l'adreça de corrièr electronic :\n\n$5",
+       "confirmemail_body": "Qualqu’un, probablament vos,e amb l’adreça IP $1, a enregistrat un compte « $2 » amb aquesta adreça de corrièr electronic sul site {{SITENAME}}.\n\nPer confirmar qu'aqueste compte vos aparten vertadièrament e activar las foncions de messatjariá sus {{SITENAME}}, seguissètz lo ligam çaijós dins vòstre navigador :\n\n$3\n\nSe s’agís pas de vos, dobriscatz pas lo ligam.\nAqueste còdi de confirmacion expirarà lo $4, seguissètz l’autre ligam çaijós dins vòstre navigador :\n\n$5\n\nAqueste còdi de confirmacion expirarà lo $4.",
+       "confirmemail_body_changed": "Qualqu’un, probablament vos, a partir de l’adreça IP $1,\na modificat l’adreça de corrièr associada al compte « $2 » de {{SITENAME}}\nen aquesta adreça.\n\nPer confirmar qu'aqueste compte vos aparten vertadièrament e per tal\nde reactivar las foncions de messatjariá sus {{SITENAME}},\nseguissètz aqueste ligam dins vòstre navigador :\n\n$3\n\nS'aqueste compte vos aparten *pas*, dobriscatz pas aqueste ligam ;\npodètz seguir l’autre ligam çaijós per anullar la\nconfirmacion de vòstra adreça de corrièl :\n\n$5\n\nAqueste còdi de confirmacion expirarà lo $4.",
+       "confirmemail_body_set": "Qualqu’un, probablament vos, dempuèi l’adreça IP $1, a modificat l'adreça de corrièr electronic del compte « $2 » amb aquesta sul site {{SITENAME}}.\n\nPer confirmar qu'aqueste compte vos aparten vertadièrament e reactivar las foncions de messatjariá sus {{SITENAME}}, seguissètz lo ligam çaijós dins vòstre navigador :\n\n$3\n\nAqueste còdi de confirmacion expirarà lo $4.\n\nSe s’agís *pas* de vòstre compte, seguissètz aqueste ligam per anullar la confirmacion de l'adreça de corrièr electronic :\n\n$5",
        "confirmemail_invalidated": "Confirmacion de l’adreça de corrièr electronic anullada",
        "invalidateemail": "Anullar la confirmacion del corrièr electronic",
        "scarytranscludedisabled": "[La transclusion interwiki es desactivada]",
        "version-poweredby-others": "autres",
        "version-poweredby-translators": "traductors de translatewiki.net",
        "version-software": "Logicial installat",
-       "version-software-product": "Produch",
+       "version-software-product": "Produit",
        "version-software-version": "Version",
        "version-entrypoints": "URL dels punts d'entrada",
        "version-entrypoints-header-entrypoint": "Punt d'entrada",
        "fileduplicatesearch-noresults": "Cap de fichièr nomenat « $1 » es pas estat trobat.",
        "specialpages": "Paginas especialas",
        "specialpages-note-top": "Legenda",
-       "specialpages-note": "* Paginas especialas normalas.\n* <span class=\"mw-specialpagerestricted\">Paginas especialas restrenchas.</span>",
+       "specialpages-note": "* Paginas especialas normalas.\n* <span class=\"mw-specialpagerestricted\">Paginas especialas restrentas.</span>",
        "specialpages-group-maintenance": "Rapòrts de mantenença",
        "specialpages-group-other": "Autras paginas especialas",
        "specialpages-group-login": "S'identificar / s'inscriure",
        "specialpages-group-changes": "Darrièrs cambiaments e jornals",
        "specialpages-group-media": "Rapòrts dels fichièrs de mèdias e dels impòrts",
-       "specialpages-group-users": "Utilizaires e dreches estacats",
+       "specialpages-group-users": "Utilizaires e dreits estacats",
        "specialpages-group-highuse": "Utilizacion intensa de las paginas",
        "specialpages-group-pages": "Listas de paginas",
        "specialpages-group-pagetools": "Aisinas per las paginas",
        "compare-revision-not-exists": "La revision qu'avètz especificada existís pas.",
        "dberr-problems": "O planhèm ! Aqueste site rencontra de dificultats tecnicas.",
        "dberr-again": "Ensajatz d'esperar qualques minutas e tornatz cargar.",
-       "dberr-info": "(Accès a la banca de donadas impossible : $1)",
-       "dberr-info-hidden": "(Accès a la banca de donadas impossible)",
+       "dberr-info": "(Accès a la basa de donadas impossible : $1)",
+       "dberr-info-hidden": "(Accès a la basa de donadas impossible)",
        "dberr-usegoogle": "Podètz ensajar de cercar amb Google pendent aqueste temps.",
        "dberr-outofdate": "Notatz que lors indèxes de nòstre contengut pòdon èsser depassats.",
        "dberr-cachederror": "Aquò es una còpia amagada de la pagina demandada e pòt èsser depassada.",
        "feedback-bugcheck": "Remirable ! Verificatz simplament qu'es pas un dels [$1 bugs ja coneguts].",
        "feedback-bugnew": "Ai verificat. Senhalar un bug novèl",
        "feedback-cancel": "Anullar",
-       "feedback-close": "Fach",
+       "feedback-close": "Fait",
        "feedback-external-bug-report-button": "Senhalar un bug tecnic",
        "feedback-dialog-title": "Sometre un comentari",
        "feedback-error-title": "Error",
        "api-error-publishfailed": "Error intèrna: Lo servidor a pas pogut publicar lo fichièr temporari.",
        "api-error-stasherror": "Una error s'es produsida al moment del telecargament del fichièr per lo dissimular.",
        "api-error-timeout": "Lo servidor a pas respondut dins lo relambi pervist.",
-       "api-error-unclassified": "Una error desconeguda s'es producha.",
+       "api-error-unclassified": "Una error desconeguda s'es produita.",
        "api-error-unknown-code": "Error desconeguda : « $1 »",
        "api-error-unknown-error": "Error intèrna : Quicòm a mal virat al moment del mandadís de vòstre fichièr.",
        "api-error-unknown-warning": "Avertiment desconegut : $1",
        "limitreport-expansiondepth": "Mai granda prigondor d’espandiment",
        "limitreport-expensivefunctioncount": "Nombre de foncions d’analisi costosas",
        "expandtemplates": "Espandiment dels modèls",
-       "expand_templates_intro": "Aquesta pagina especiala accèpta un tèxte wiki source e permet de realizar recursivament l’espandiment dels modèls que conten.\nRealiza tanben l’espandiment de las foncions del parser talas coma\n<code><nowiki>{{</nowiki>#language:...}}</code> e de variablas coma\n<code><nowiki>{{</nowiki>CURRENTDAY}}</code>.\nEn fach, realiza l'espandiment de gaireben tot çò qu'es enquadrat per d'acoladas doblas.",
-       "expand_templates_title": "Títol de la pagina, se lo còde utiliza {{FULLPAGENAME}}, etc. :",
+       "expand_templates_intro": "Aquesta pagina especiala accèpta un tèxte wiki source e permet de realizar recursivament l’espandiment dels modèls que conten.\nRealiza tanben l’espandiment de las foncions del parser talas coma\n<code><nowiki>{{</nowiki>#language:...}}</code> e de variablas coma\n<code><nowiki>{{</nowiki>CURRENTDAY}}</code>.\nEn fait, realiza l'espandiment de gaireben tot çò qu'es enquadrat per d'acoladas doblas.",
+       "expand_templates_title": "Títol de la pagina, se lo còdi utiliza {{FULLPAGENAME}}, etc. :",
        "expand_templates_input": "Picatz vòstre tèxte aicí :",
        "expand_templates_output": "Visualizatz lo resultat :",
        "expand_templates_xml_output": "Sortida XML",
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 1085b31..aa31c5c 100644 (file)
@@ -29,6 +29,7 @@
        "tog-hideminor": "ਤਾਜ਼ਾ ਤਬਦੀਲੀਆਂ ਵਿੱਚੋਂ ਛੋਟੀਆਂ ਸੋਧਾਂ ਲੁਕਾਓ",
        "tog-hidepatrolled": "ਤਾਜ਼ਾ ਤਬਦੀਲੀਆਂ ਵਿੱਚੋਂ ਜਾਂਚੀਆਂ ਸੋਧਾਂ ਲੁਕਾਓ",
        "tog-newpageshidepatrolled": "ਨਵੀਂ ਸਫ਼ਾ ਸੂਚੀ ਵਿੱਚੋਂ ਜਾਂਚੇ ਸਫ਼ੇ ਲੁਕਾਓ",
+       "tog-hidecategorization": "ਸਫ਼ਿਆਂ ਦਾ ਸ਼੍ਰੇਣੀਕਰਨ ਲੁਕਾਓ",
        "tog-extendwatchlist": "ਸਿਰਫ਼ ਤਾਜ਼ਾ ਹੀ ਨਹੀਂ, ਸਗੋਂ ਸਾਰੀਆਂ ਤਬਦੀਲੀਆਂ ਨੂੰ ਵਖਾਉਣ ਲਈ ਨਿਗਰਾਨੀ-ਲਿਸਟ ਨੂੰ ਵਧਾਓ",
        "tog-usenewrc": "ਹਾਲੀਆ ਤਬਦੀਲੀਆਂ ਅਤੇ ਨਿਗਰਾਨੀ-ਲਿਸਟ ਵਿੱਚ ਸਫ਼ੇ ਮੁਤਾਬਕ ਤਬਦੀਲੀਆਂ ਦੇ ਗਰੁੱਪ ਬਣਾਓ (ਜਾਵਾਸਕਰਿਪਟ ਲੋੜੀਂਦੀ ਹੈ)",
        "tog-numberheadings": "ਆਟੋ-ਨੰਬਰ ਸਿਰਨਾਵੇਂ",
        "password-change-forbidden": "ਇਸ ਵਿਕੀ ਤੇ ਤੁਸੀਂ ਪਾਸਵਰਡ ਨਹੀਂ ਬਦਲ ਸਕਦੇ।",
        "externaldberror": "ਜਾਂ ਤਾਂ ਪ੍ਰਮਾਣਕੀ ਡਾਟਾਬੇਸ ਦੋਸ਼ ਆਇਆ ਹੈ ਜਾਂ ਤੁਹਾਨੂੰ ਆਪਣੇ ਬਾਹਰੀ ਖਾਤੇ ਨੂੰ ਅੱਪਡੇਟ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ।",
        "login": "ਲਾਗਇਨ",
+       "login-security": "ਆਪਣੀ ਪਛਾਣ ਦੀ ਪੜਤਾਲ ਕਰਵਾਉ",
        "nav-login-createaccount": "ਲਾਗਇਨ/ਖਾਤਾ ਬਣਾਓ",
        "userlogin": "ਲਾਗਇਨ/ਖਾਤਾ ਬਣਾਓ",
        "userloginnocreate": "ਲਾਗਇਨ",
        "noname": "ਤੁਸੀਂ ਇੱਕ ਸਹੀ ਯੂਜ਼ਰ-ਨਾਂ ਨਹੀਂ ਦਿੱਤਾ।",
        "loginsuccesstitle": "ਲਾਗਇਨ ਸਫ਼ਲ",
        "loginsuccess": "'''ਤੁਸੀਂ {{SITENAME}} ਉੱਤੇ \"$1\" ਵਜੋਂ ਲਾਗਇਨ ਹੋ ਚੁੱਕੇ ਹੋ।'''",
-       "nosuchuser": "!\"$1\" ਨਾਂ ਨਾਲ਼ ਕੋਈ ਵਰਤੋਂਕਾਰ ਨਹੀਂ ਹੈ। ਵੱਡੇ ਅਤੇ ਛੋਟੇ ਅੱਖਰ ਵਰਤਣ ਨਾਲ ਫ਼ਰਕ ਪੈਂਦਾ ਹੈ।\nਆਪਣੇ ਸਪੈਲਿੰਗ ਨੂੰ ਧਿਆਨ ਨਾਲ ਚੈੱਕ ਕਰੋ ਜਾਂ [[Special:CreateAccount|ਨਵਾਂ ਖਾਤਾ ਬਣਾਓ]]",
+       "nosuchuser": "!\"$1\" ਨਾਂ ਨਾਲ ਕੋਈ ਵਰਤੋਂਕਾਰ ਨਹੀਂ ਹੈ।\nਵੱਡੇ ਅਤੇ ਛੋਟੇ ਅੱਖਰ ਵਰਤਣ ਨਾਲ ਫ਼ਰਕ ਪੈਂਦਾ ਹੈ।\nਆਪਣੇ ਸ਼ਬਦਜੋੜ ਧਿਆਨ ਨਾਲ ਜਾਂਚੋ ਜਾਂ [[Special:CreateAccount|ਨਵਾਂ ਖਾਤਾ ਬਣਾਉ]]",
        "nosuchusershort": "\"$1\" ਨਾਂ ਨਾਲ ਕੋਈ ਵੀ ਵਰਤੋਂਕਾਰ ਨਹੀਂ ਹੈ। ਆਪਣੇ ਸਪੈਲਿੰਗ ਧਿਆਨ ਨਾਲ ਚੈੱਕ ਕਰੋ।",
        "nouserspecified": "ਤੁਹਾਨੂੰ ਇੱਕ ਯੂਜ਼ਰ-ਨਾਂ ਦੇਣਾ ਪਵੇਗਾ।",
        "login-userblocked": "ਇਹ ਯੂਜ਼ਰ-ਨਾਂ ਪਾਬੰਦੀਸ਼ੁਦਾ ਹੈ। ਲਾਗਇਨ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ।",
        "accmailtext": "[[User talk:$1|$1]] ਲਈ ਰਲ਼ਵੇਂ ਤੌਰ ’ਤੇ ਬਣਿਆ ਪਾਸਵਰਡ $2 ਨੂੰ ਭੇਜਿਆ ਜਾ ਚੁੱਕਾ ਹੈ।\nਇਸ ਨਵੇਂ ਖਾਤੇ ਲਈ ਲਾਗਇਨ ਕਰਨ ਤੋਂ ਬਾਅਦ ''[[Special:ChangePassword|ਪਾਸਵਰਡ ਬਦਲੋ]]'' ’ਤੇ ਜਾ ਕੇ ਪਾਸਵਰਡ ਬਦਲਿਆ ਜਾ ਸਕਦਾ ਹੈ।",
        "newarticle": "(ਨਵਾਂ)",
        "newarticletext": "ਤੁਸੀਂ ਕਿਸੇ ਅਜਿਹੇ ਸਫ਼ੇ ਦੇ ਕੜੀ ’ਤੇ ਹੋ ਜੋ ਹਾਲੇ ਬਣਾਇਆ ਨਹੀਂ ਗਿਆ।\nਸਫ਼ਾ ਬਣਾਉਣ ਲਈ ਹੇਠ ਦਿੱਤੇ ਖਾਨੇ ਵਿਚ ਲਿਖਣਾ ਸ਼ੁਰੂ ਕਰੋ। (ਹੋਰ ਮਦਦ ਲਈ [$1 ਮਦਦ ਸਫ਼ਾ] ਵੇਖੋ।)\nਜੇ ਤੁਸੀਂ ਗ਼ਲਤੀ ਨਾਲ ਇੱਥੇ ਆਏ ਹੋ ਤਾਂ ਆਪਣੇ ਬ੍ਰਾਊਜ਼ਰ ਦੇ '''ਪਿੱਛੇ''' ਬਟਨ ’ਤੇ ਕਲਿੱਕ ਕਰੋ।",
-       "anontalkpagetext": "----''à¨\87ਹ à¨\87à¨\95 à¨\97à©\81ਮਨਾਮ à¨®à©\88à¨\82ਬਰ à¨²à¨\88 à¨\87à¨\95 à¨\9aਰà¨\9aਾ à¨¸à¨«à¨¼à¨¾ à¨¹à©\88 à¨\9cਿਸਨà©\87 à¨¹à¨¾à¨²à©\87 à¨\96ਾਤਾ à¨¨à¨¹à©\80 à¨¬à¨£à¨¾à¨\87à¨\86 à¨\9cਾà¨\82 à¨\89ਸਨà©\82à©° à¨µà¨°à¨¤ à¨¨à¨¹à©\80à¨\82 à¨°à¨¿à¨¹à¨¾à¥¤\nà¨\87ਸ à¨µà¨¾à¨¸à¨¤à©\87 à¨¸à¨¾à¨¡à©\87 à¨\95à©\8bਲ à¨\89ਸਨà©\82à©° à¨ªà¨\9bਾਨਣ à¨²à¨\88 IP à¨ªà¨¤à¨¾ à¨¹à©\88।\nà¨\87à¨\95 IP à¨ªà¨¤à¨¾ à¨\95à¨\88 à¨µà¨°à¨¤à¨£ à¨µà¨¾à¨²à¨¼à¨¿à¨\86à¨\82 à¨¦à©\81à¨\86ਰਾ à¨¸à¨¾à¨\82à¨\9dਾ à¨\95à©\80ਤਾ à¨\9cਾ à¨¸à¨\95ਦਾ à¨¹à©\88।\nà¨\9cà©\87 à¨¤à©\81ਸà©\80à¨\82 à¨\87ੱà¨\95 à¨\97à©\81ਮਨਾਮ à¨®à©\88à¨\82ਬਰ à¨¹à©\8b à¨\85ਤà©\87 à¨¸à¨®à¨\9dਦà©\87 à¨¹à©\8b à¨\95ਿ à¨\87ਹ à¨\9fਿੱਪਣà©\80à¨\86à¨\82 à¨¤à©\81ਹਾਡà©\87 à¨²à¨\88 à¨¹à¨¨ à¨¤à¨¾à¨\82 à¨®à¨¿à¨¹à¨°à¨¬à¨¾à¨¨à©\80 à¨\95ਰà¨\95à©\87 à¨¹à©\8bਰਾà¨\82 à¨\97à©\81ਮਨਾਮ à¨®à©\88à¨\82ਬਰਾà¨\82 à¨¨à¨¾à¨²à¨¼ à¨ªà©\88ਦਾ à¨¹à©\8bਣ à¨µà¨¾à¨²à¨¼à©\80 à¨\89ਲà¨\9dਣ à¨¤à©\8bà¨\82 à¨¬à¨\9aਣ à¨²à¨\88 [[Special:CreateAccount|à¨\96ਾਤਾ à¨¬à¨£à¨¾à¨\93]] ਜਾਂ [[Special:UserLogin|ਲਾਗਇਨ ਕਰੋ]]।''",
+       "anontalkpagetext": "----''à¨\87ਹ à¨\95ਿਸà©\87 à¨\97à©\81ਮਨਾਮ à¨®à©\88à¨\82ਬਰ à¨²à¨\88 à¨\87à¨\95 à¨\9aਰà¨\9aਾ à¨¸à¨«à¨¼à¨¾ à¨¹à©\88 à¨\9cਿਸਨà©\87 à¨¹à¨¾à¨²à©\87 à¨\96ਾਤਾ à¨¨à¨¹à©\80à¨\82 à¨¬à¨£à¨¾à¨\87à¨\86 à¨\9cਾà¨\82 à¨\9cਿਹà©\9cਾ à¨\87ਸਨà©\82à©° à¨µà¨°à¨¤à¨¦à¨¾ à¨¨à¨¹à©\80à¨\82 à¨¹à©\88।\nà¨\87ਸ à¨µà¨¾à¨¸à¨¤à©\87 à¨¸à¨¾à¨¡à©\87 à¨\95à©\8bਲ à¨\89ਸਨà©\82à©° à¨ªà¨\9bਾਨਣ à¨²à¨\88 IP à¨ªà¨¤à¨¾ à¨¹à©\88।\nà¨\85à¨\9cਿਹਾ à¨\95à©\8bà¨\88 IP à¨ªà¨¤à¨¾ à¨\95à¨\88 à¨µà¨°à¨¤à¨£ à¨µà¨¾à¨²à¨¿à¨\86à¨\82 à¨µà©±à¨²à©\8bà¨\82 à¨¸à¨¾à¨\82à¨\9dਾ à¨\95à©\80ਤਾ à¨\9cਾ à¨¸à¨\95ਦਾ à¨¹à©\88।\nà¨\9cà©\87 à¨¤à©\81ਸà©\80à¨\82 à¨\87ੱà¨\95 à¨\97à©\81ਮਨਾਮ à¨®à©\88à¨\82ਬਰ à¨¹à©\8b à¨\85ਤà©\87 à¨¸à¨®à¨\9dਦà©\87 à¨¹à©\8b à¨\95ਿ à¨¤à©\81ਹਾਡà©\87 à¨²à¨\88 à¨¬à©\87ਮਤਲਬ à¨\9fਿੱਪਣà©\80à¨\86à¨\82 à¨¹à©\8b à¨°à¨¹à©\80à¨\86à¨\82 à¨¹à¨¨ à¨¤à¨¾à¨\82 à¨®à¨¿à¨¹à¨°à¨¬à¨¾à¨¨à©\80 à¨\95ਰà¨\95à©\87 à¨¹à©\8bਰਾà¨\82 à¨\97à©\81ਮਨਾਮ à¨®à©\88à¨\82ਬਰਾà¨\82 à¨¨à¨¾à¨² à¨ªà©\88ਦਾ à¨¹à©\8bਣ à¨µà¨¾à¨²à¨¼à©\80 à¨\89ਲà¨\9dਣ à¨¤à©\8bà¨\82 à¨¬à¨\9aਣ à¨²à¨\88 [[Special:CreateAccount|à¨\96ਾਤਾ à¨¬à¨£à¨¾à¨\89]] ਜਾਂ [[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}}}} ਚਿੱਠੇ] ਖੋਜ ਸਕਦੇ ਹੋ ਜਾਂ [{{fullurl:{{FULLPAGENAME}}|action=edit}} ਇਸ ਪੰਨੇ ਵਿੱਚ ਲਿਖ] ਸਕਦੇ ਹੋ।</span>",
        "userpage-userdoesnotexist": "ਵਰਤੋਂਕਾਰ ਖਾਤਾ \"$1\" ਰਜਿਸਟਰ ਨਹੀਂ ਹੈ।\nਜੇ ਤੁਸੀਂ ਇਸਨੂੰ ਬਣਾਉਣਾ/ਸੋਧਣਾ ਚਾਹੁੰਦੇ ਹੋ ਤਾਂ ਮਿਰਬਾਨੀ ਕਰਕੇ ਜਾਂਚ ਕਰ ਲਓ।",
        "undelete-show-file-submit": "ਹਾਂ",
        "namespace": "ਨਾਂ-ਥਾਂ:",
        "invert": "ਉਲਟ ਚੋਣ",
+       "tooltip-invert": "ਚੁਣੇ ਗਏ ਨਾਮਸਥਾਨ ਵਿੱਚ ਮੌਜੂਦ ਸਫ਼ਿਆਂ ਵਿੱਚ ਹੋਈਆਂ ਤਬਦੀਲੀਆਂ ਨੂੰ ਲੁਕਾਉਣ ਲਈ ਇਸ ਡੱਬੇ ਉੱਤੇ ਨਿਸ਼ਾਨ ਲਗਾਓ।",
        "namespace_association": "ਸਬੰਧਤ ਨਾਂ-ਥਾਂ",
+       "tooltip-namespace_association": "ਚੁਣੇ ਗਏ ਨਾਮਸਥਾਨ ਨਾਲ ਸੰਬੰਧਿਤ ਗੱਲਬਾਤ ਜਾਂ ਵਿਸ਼ਾ ਨਾਮਸਥਾਨ ਨੂੰ ਸ਼ਾਮਲ ਕਰਨ ਲਈ ਇਸ ਡੱਬੇ ਨੂੰ ਚੁਣੋ",
        "blanknamespace": "(ਮੁੱਖ)",
        "contributions": "{{GENDER:$1|ਮੈਂਬਰ}} ਯੋਗਦਾਨ",
        "contributions-title": "$1 ਲਈ ਵਰਤੋਂਕਾਰ ਯੋਗਦਾਨ",
        "mycontris": "ਯੋਗਦਾਨ",
+       "anoncontribs": "ਯੋਗਦਾਨ",
        "contribsub2": "{{GENDER:$3|$1}} ($2) ਲਈ",
        "uctop": "(ਮੌਜੂਦਾ)",
        "month": "ਇਸ (ਅਤੇ ਪਿਛਲੇ) ਮਹੀਨੇ ਤੋਂ :",
        "whatlinkshere-prev": "{{PLURAL:$1|ਪਿਛਲਾ|ਪਿਛਲੇ $1}}",
        "whatlinkshere-next": "{{PLURAL:$1|ਅਗਲਾ|ਅਗਲੇ $1}}",
        "whatlinkshere-links": "← ਕੜੀਆਂ",
-       "whatlinkshere-hideredirs": "ਅਸਿੱਧੇ ਰਾਹ $1",
+       "whatlinkshere-hideredirs": "$1 ਰੀਡਾਇਰੈਕਟ",
        "whatlinkshere-hidetrans": "$1 ਇੱਥੇ ਕੀ ਕੀ ਜੁੜਦਾ ਹੈ।",
        "whatlinkshere-hidelinks": "$1 ਲਿੰਕ",
        "whatlinkshere-hideimages": "ਫ਼ਾਈਲ ਲਿੰਕ $1",
        "tooltip-pt-logout": "ਸਾਈਟ ਤੋਂ ਬਾਹਰ ਆਉ",
        "tooltip-pt-createaccount": "ਤੁਹਾਨੂੰ ਖਾਤਾ ਬਣਾਉਣ ਤੋਂ ਬਾਅਦ ਲਾਗ ਇਨ ਕਰਨ ਦੀ ਸਲਾਹ ਦਿੱਤੀ ਜਾਂਦੀ ਹੈ; ਹਾਲਾਂਕਿ ਇਹ ਲਾਜ਼ਮੀ ਨਹੀਂ",
        "tooltip-ca-talk": "ਸਮਗੱਰੀ ਸਫ਼ੇ ਬਾਰੇ ਚਰਚਾ",
-       "tooltip-ca-edit": "ਤà©\81ਸà©\80à¨\82 à¨\87ਹ à¨¸à¨«à¨¼à¨¾ à¨¸à©\8bਧ à¨¸à¨\95ਦà©\87 à¨¹à©\8b। à¨\95ਿਰਪਾ à¨\95ਰà¨\95à©\87 à¨¤à¨¬à¨¦à©\80ਲà©\80 à¨¸à¨¾à¨\82ਭਣ à¨¤à©\8bà¨\82 à¨ªà¨¹à¨¿à¨²à¨¾à¨\82 à¨\9dਲà¨\95 à¨µà©\87à¨\96à©\8b।",
+       "tooltip-ca-edit": "à¨\87ਹ à¨¸à¨«à¨¼à¨¾ à¨¸à©\8bਧà©\8b",
        "tooltip-ca-addsection": "ਨਵਾਂ ਭਾਗ ਸ਼ੁਰੂ ਕਰੋ",
        "tooltip-ca-viewsource": "ਇਹ ਸਫ਼ਾ ਸੁਰੱਖਿਅਤ ਹੈ।\nਤੁਸੀਂ ਇਹਦਾ ਸਰੋਤ ਵੇਖ ਸਕਦੇ ਹੋ।",
        "tooltip-ca-history": "ਇਸ ਸਫ਼ੇ ਦੇ ਪਿਛਲੇ ਰੀਵਿਜਨ",
        "tooltip-t-recentchangeslinked": "ਇਸ ਸਫ਼ੇ ਤੋਂ ਲਿੰਕ ਕੀਤੇ ਸਫ਼ਿਆਂ ਵਿਚ ਤਾਜ਼ਾ ਤਬਦੀਲੀਆਂ",
        "tooltip-feed-rss": "ਇਸ ਸਫ਼ੇ ਲਈ RSS ਫ਼ੀਡ",
        "tooltip-feed-atom": "ਇਸ ਸਫ਼ੇ ਦੀ ਐਟਮ ਫ਼ੀਡ",
-       "tooltip-t-contributions": "à¨\87ਸ à¨µà¨°à¨¤à©\8bà¨\82à¨\95ਾਰ à¨¦à©\87 à¨¯à©\8bà¨\97ਦਾਨ à¨¦à©\80 ਸੂਚੀ",
+       "tooltip-t-contributions": "à¨\87ਸ à¨µà¨°à¨¤à©\8bà¨\82à¨\95ਾਰ à¨¦à©\80 à¨¯à©\8bà¨\97ਦਾਨ ਸੂਚੀ",
        "tooltip-t-emailuser": "ਇਸ ਵਰਤੋਂਕਾਰ ਨੂੰ ਈ-ਮੇਲ ਭੇਜੋ",
        "tooltip-t-upload": "ਫ਼ਾਈਲਾਂ ਅਪਲੋਡ ਕਰੋ",
        "tooltip-t-specialpages": "ਸਾਰੇ ਖ਼ਾਸ ਸਫ਼ਿਆਂ ਦੀ ਲਿਸਟ",
        "anonusers": "{{SITENAME}} ਬੇਨਾਮ {{PLURAL:$2|ਵਰਤੋਂਕਾਰ|ਵਰਤੋਂਕਾਰ}} $1",
        "creditspage": "ਸਫ਼ੇ ਬਾਬਤ ਕਰਜ਼",
        "spamprotectiontitle": "Spam ਸੁਰੱਖਿਆ ਫਿਲਟਰ",
+       "simpleantispam-label": "ਸਪੈਮ ਵਿਰੋਧੀ ਚੈੱਕ।\nਇਸ ਨੂੰ <strong>ਨਾ</strong> ਭਰੋ!",
        "pageinfo-title": "\"$1\" ਵਾਸਤੇ ਜਾਣਕਾਰੀ",
        "pageinfo-not-current": "ਅਫ਼ਸੋਸ, ਪੁਰਾਣੀਆਂ ਸੁਧਾਈਆਂ ਵਾਸਤੇ ਇਹ ਜਾਣਕਾਰੀ ਦੇਣੀ ਅਸੰਭਵ ਹੈ।",
        "pageinfo-header-basic": "ਮੁੱਢਲੀ ਜਾਣਕਾਰੀ",
        "confirm-watch-top": "ਇਸ ਸਫ਼ੇ ਨੂੰ ਨਿਗਰਾਨੀ-ਲਿਸਟ ਵਿਚ ਜੋੜਨਾ ਹੈ?",
        "confirm-unwatch-button": "ਠੀਕ ਹੈ",
        "confirm-unwatch-top": "ਇਸ ਸਫ਼ੇ ਨੂੰ ਨਿਗਰਾਨੀ-ਲਿਸਟ ਤੋਂ ਹਟਾਉਣਾ ਹੈ?",
+       "confirm-rollback-button": "ਠੀਕ ਹੈ",
        "quotation-marks": "\"$1\"",
        "imgmultipageprev": "← ਪਿਛਲਾ ਸਫ਼ਾ",
        "imgmultipagenext": "ਅਗਲਾ ਸਫ਼ਾ →",
        "special-characters-group-khmer": "ਖ਼ਮੇਰ",
        "special-characters-title-endash": "ਅੰਗਰੇਜ਼ੀ ਡੈਸ਼",
        "special-characters-title-emdash": "em ਡੈਸ਼",
-       "special-characters-title-minus": "ਘਟਾਓ ਦਾ ਨਿਸ਼ਾਨ"
+       "special-characters-title-minus": "ਘਟਾਓ ਦਾ ਨਿਸ਼ਾਨ",
+       "authmanager-password-help": "ਪ੍ਰਮਾਣਿਕਤਾ ਲਈ ਪਛਾਣ-ਸ਼ਬਦ।",
+       "authmanager-email-label": "ਈਮੇਲ",
+       "authmanager-email-help": "ਈਮੇਲ ਪਤਾ",
+       "authmanager-realname-label": "ਅਸਲੀ ਨਾਂ",
+       "authprovider-resetpass-skip-label": "ਛੱਡ ਦਿਉ",
+       "specialpage-securitylevel-not-allowed-title": "ਇਜਾਜ਼ਤ ਨਹੀਂ",
+       "cannotauth-not-allowed-title": "ਪ੍ਰਵਾਨਗੀ ਨਹੀਂ ਮਿਲੀ",
+       "credentialsform-account": "ਖਾਤੇ ਦਾ ਨਾਂ:"
 }
index b00ef21..1a34a01 100644 (file)
        "password-change-forbidden": "Nie można zmieniać haseł na tej wiki.",
        "externaldberror": "Wystąpił błąd autentyfikacyjnej bazy danych lub nie posiadasz uprawnień koniecznych do aktualizacji zewnętrznego konta.",
        "login": "Zaloguj się",
+       "login-security": "Potwierdź swoją tożsamość",
        "nav-login-createaccount": "Logowanie i rejestracja",
        "userlogin": "Logowanie i rejestracja",
        "userloginnocreate": "Zaloguj się",
        "userlogin-resetpassword-link": "Nie pamiętasz hasła?",
        "userlogin-helplink2": "Pomoc przy logowaniu",
        "userlogin-loggedin": "Zalogowano jako {{GENDER:$1|$1}}.\nUżyj poniższego formularza, aby zalogować się jako inny użytkownik.",
+       "userlogin-reauth": "Musisz się ponownie zalogować, aby potwierdzić, że jesteś {{GENDER:$1|$1}}.",
        "userlogin-createanother": "Załóż nowe konto",
        "createacct-emailrequired": "Adres e‐mail",
        "createacct-emailoptional": "Adres e-mail (opcjonalnie)",
        "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}}",
        "createacct-another-realname-tip": "Wpisanie imienia i nazwiska nie jest obowiązkowe.\nJeśli zdecydujesz się je podać, zostaną użyte, by udokumentować Twoje autorstwo.",
        "pt-login": "Zaloguj się",
        "pt-login-button": "Zaloguj się",
+       "pt-login-continue-button": "Kontynuuj logowanie",
        "pt-createaccount": "Utwórz konto",
        "pt-userlogout": "Wyloguj",
        "php-mail-error-unknown": "Wystąpił nieznany błąd w funkcji PHP mail()",
        "botpasswords-restriction-failed": "Logowanie nie powiodło się z powodu ograniczeń na hasło bota.",
        "botpasswords-not-exist": "Użytkownik \"$1\" nie ma hasła dla bota o nazwie \"$2\".",
        "resetpass_forbidden": "Hasła nie mogą zostać zmienione",
+       "resetpass_forbidden-reason": "Hasła nie mogą zostać zmienione: $1",
        "resetpass-no-info": "Musisz być zalogowany, by uzyskać bezpośredni dostęp do tej strony.",
        "resetpass-submit-loggedin": "Zmień hasło",
        "resetpass-submit-cancel": "Anuluj",
        "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ę.",
        "gender-female": "kobieta",
        "prefs-help-gender": "Podanie płci nie jest obowiązkowe. Jeśli zdecydujesz się ją określić, oprogramowanie dostosuje do niej interfejs. Informacja o Twojej płci będzie widoczna dla wszystkich.",
        "email": "E‐mail",
-       "prefs-help-realname": "Imię i nazwisko jest opcjonalne.\nJeśli zdecydujesz się je podać, zostaną użyte, by udokumentować Twoje autorstwo.",
+       "prefs-help-realname": "Imię i nazwisko jest opcjonalne.\nJeśli zdecydujesz się je podać, zostaną użyte, by udokumentować twoje autorstwo.",
        "prefs-help-email": "Podanie adresu e‐mail nie jest obowiązkowe, lecz jest konieczne do zresetowania zapomnianego hasła.",
        "prefs-help-email-others": "Możesz również umożliwić innym użytkownikom wysłanie do Ciebie e‐maila poprzez Twoją stronę użytkownika lub stronę dyskusji (bez ujawniania Twojego adresu).",
        "prefs-help-email-required": "Wymagany jest adres e‐mail.",
        "trackingcategories-msg": "Śledzenie kategorii",
        "trackingcategories-name": "Nazwa komunikatu",
        "trackingcategories-desc": "Kryteria włączenia kategorii",
+       "restricted-displaytitle-ignored": "Strony z ignorowanym formatowaniem tytułu",
+       "restricted-displaytitle-ignored-desc": "Strona ma ignorowany <code><nowiki>{{DISPLAYTITLE}}</nowiki></code> ponieważ nie pasuje on do tytułu aktualnej strony.",
        "noindex-category-desc": "Ta strona nie jest indeksowana przez roboty, ponieważ ma wpisane magiczne słowo <code><nowiki>__NOINDEX__</nowiki></code> i znajduje się w przestrzeni nazw, w której ta flaga jest dozwolona.",
        "index-category-desc": "Na stronie znajduje się magiczne słowo <code><nowiki>__INDEX__</nowiki></code> (i strona znajduje się w przestrzeni nazw, w której jest ono dozwolone), więc jest indeksowana przez wyszukiwarki nawet wtedy, gdy normalnie by się to nie działo.",
        "post-expand-template-inclusion-category-desc": "Rozmiar tej strony jest większy niż <code>$wgMaxArticleSize</code> po rozszerzeniu wszystkich szablonów, więc część szablonów nie jest rozszerzonych.",
        "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",
        "tooltip-ca-nstab-category": "Zobacz stronę kategorii",
        "tooltip-minoredit": "Oznacz zmianę jako drobną",
        "tooltip-save": "Zapisz zmiany",
+       "tooltip-publish": "Opublikuj swoje zmiany",
        "tooltip-preview": "Obejrzyj efekt swojej edycji przed zapisaniem zmian!",
        "tooltip-diff": "Pokaż zmiany wykonane w tekście.",
        "tooltip-compareselectedversions": "Pokazuje różnice między dwiema wybranymi wersjami tej strony.",
        "confirm-watch-top": "Dodać tę stronę do listy obserwowanych?",
        "confirm-unwatch-button": "OK",
        "confirm-unwatch-top": "Usunąć tę stronę z listy obserwowanych?",
+       "confirm-rollback-button": "OK",
        "percent": "$1%",
        "quotation-marks": "„$1”",
        "imgmultipageprev": "← poprzednia strona",
        "api-error-stashfilestorage": "Wystąpił błąd podczas przesyłania pliku do archiwum.",
        "api-error-stashzerolength": "Serwer nie może zapisać pliku zapasowego do archiwum, gdyż ma on zerową długość.",
        "api-error-stashnotloggedin": "Musisz się zalogować, aby móc zapisać plik zapasowy do archiwum.",
-       "api-error-stashwrongowner": "Plik w archiwum, do którego próbujesz uzyskać dostęp, nie należy do ciebie.",
-       "api-error-stashnosuchfilekey": "Klucz zbioru w archiwum, do którego próbujesz uzyskać dostęp, nie należy do ciebie.",
+       "api-error-stashwrongowner": "Plik w archiwum, do którego próbujesz uzyskać dostęp, nie należy do Ciebie.",
+       "api-error-stashnosuchfilekey": "Klucz zbioru w archiwum, do którego próbujesz uzyskać dostęp, nie należy do Ciebie.",
        "api-error-timeout": "Serwer nie odpowiedział w oczekiwanym czasie.",
        "api-error-unclassified": "Wystąpił nieznany błąd",
        "api-error-unknown-code": "Błąd nieznany – „$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-failed-title": "Zmiana hasła nie powiodła się",
+       "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-username-help": "Nazwa użytkownika dla uwierzytelniania.",
+       "authmanager-password-help": "Hasło do uwierzytelniania.",
+       "authmanager-retype-help": "Ponownie hasło w celu potwierdzenia.",
+       "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-password-domain": "Uwierzytelnianie na podstawie hasła i domeny",
+       "authmanager-provider-temporarypassword": "Hasło tymczasowe",
+       "authprovider-resetpass-skip-label": "Pomiń",
+       "authprovider-resetpass-skip-help": "Pomiń resetowanie hasła.",
+       "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.",
+       "authpage-cannot-create": "Nie można rozpocząć tworzenie konta.",
+       "cannotauth-not-allowed-title": "Brak dostępu",
+       "cannotauth-not-allowed": "Nie masz uprawnień, aby skorzystać z tej strony",
+       "changecredentials-submit": "Zmień poświadczenia",
+       "removecredentials-submit": "Usuń poświadczenia",
+       "credentialsform-account": "Nazwa konta:"
 }
index 68b47a3..3d32f5b 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.''",
-       "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>.",
+       "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 bin [{{fullurl:{{FULLPAGENAME}}|action=edit}} creé 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}}}}].",
        "userpage-userdoesnotexist": "Lë stranòm «<nowiki>$1</nowiki>» a l'é pa registrà. Për piasì ch'a varda se da bon a veul creé o modifiché costa pàgina.",
        "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",
        "tooltip-t-recentchangeslinked": "Ùltime modìfiche dle pàgine andoa as peul andesse da costa.",
        "tooltip-feed-rss": "Fluss RSS për costa pàgina",
        "tooltip-feed-atom": "Fluss Atom për costa pàgina.",
-       "tooltip-t-contributions": "Vardé la lista dle contribussion ëd cost utent",
+       "tooltip-t-contributions": "Vardé la lista dle contribussion ëd {{GENDER:$1|cost utent}}",
        "tooltip-t-emailuser": "Mandeje un mëssagi ëd pòsta a st'utent",
        "tooltip-t-info": "Pi d'anformassio su costa pàgina",
        "tooltip-t-upload": "Carié n'archivi ëd figure ò son.",
index 21de22e..5fc0b77 100644 (file)
                        "Amire80",
                        "Obaid Raza",
                        "Macofe",
-                       "Matma Rex"
+                       "Matma Rex",
+                       "Saanvel"
                ]
        },
        "tog-underline": "حوڑ تھلے لین:",
        "tog-hideminor": "چھوٹیاں تبدیلیاں چھپاؤ",
        "tog-hidepatrolled": "ویکھیاں تبدیلیاں لکاؤ",
        "tog-newpageshidepatrolled": "نویاں صفیاں توں ویکھیاں تبدیلیاں لکاؤ",
+       "tog-hidecategorization": "صفحیاں دی گٹھ لکائو۔",
        "tog-extendwatchlist": "نظر تھلے رکھے صفحے نوں ودھاو, تاں جے اوہ تبدیلیاں جیڑیاں کم دے قابل نیں ویکھیاں جا سکن",
        "tog-usenewrc": "تھوڑا خر پہلے کیتیاں گیاں تبدیلیاں ورتو",
        "tog-numberheadings": "آپ نمبر دین والیاں سرخیاں",
        "tog-showtoolbar": "ایڈٹ ٹولبار وکھاؤ",
        "tog-editondblclick": "صفیاں تے ڈبل کلک کرن تے تبدیلیاں لیاؤ",
-       "tog-editsectiononrightclick": "سÛ\8cÚ©Ø´Ù\86 Ø³Ø±Ø®Û\8c ØªÛ\92 ØªØ¨Ø¯Û\8cÙ\84Û\8c Ù\84Û\8cاؤ Ø³Ø¬Û\8c کلک نال",
+       "tog-editsectiononrightclick": "سÛ\8cÚ©Ø´Ù\86 Ø³Ø±Ø®Û\8c ØªÛ\92 ØªØ¨Ø¯Û\8cÙ\84Û\8c Ù\84Û\8cاؤ Ø³Ø¬Û\92 کلک نال",
        "tog-watchcreations": "جیہڑے صفے میں بناندا واں اوہ میری اکھ تھلے لسٹ چ کر دیو",
        "tog-watchdefault": "جیہڑے صفے میں لکھداں اوہ میری اکھ تھلے لسٹ چ کر دیو",
        "tog-watchmoves": "جیڈے صفحے میں لے چلداں اوہ میری اکھ تھلے کر دیو",
index cc3f168..08a6c89 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": "دې مخ ته د لاسرسي لپاره بايد غونډال کې ورننوځۍ.",
        "whatlinkshere-next": "{{PLURAL:$1|راتلونکی|راتلونکي $1}}",
        "whatlinkshere-links": "← تړنې",
        "whatlinkshere-hideredirs": "مخ گرځونې $1",
-       "whatlinkshere-hidetrans": "پاÙ\8aÙ\84ې $1",
+       "whatlinkshere-hidetrans": "Ù\88رگÚ\89Û\90دÙ\86ې $1",
        "whatlinkshere-hidelinks": "تړنې $1",
        "whatlinkshere-hideimages": "د دوتنې تړنې $1",
        "whatlinkshere-filters": "چاڼگرونه",
        "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 شمېره",
        "confirm-watch-top": "همدا مخ خپل کتنلړ کې ورگډوې؟",
        "confirm-unwatch-button": "ښه",
        "confirm-unwatch-top": "همدا مخ خپل کتنلړ څخه لرې کوې؟",
+       "confirm-rollback-button": "هوکې",
        "percent": "$1%",
        "parentheses": "($1)",
        "brackets": "[$1]",
        "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": "بدلول",
+       "removecredentials-submit": "غورځول",
+       "credentialsform-account": "گڼون نوم:"
 }
index de3a243..2a3f404 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 arquivos",
        "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..9479ec8 100644 (file)
        "rollbacklinkcount": "reverter $1 {{PLURAL:$1|edição|edições}}",
        "rollbacklinkcount-morethan": "reverter mais do que $1 {{PLURAL:$1|edição|edições}}",
        "rollbackfailed": "A reversão falhou",
+       "rollback-missingparam": "Faltam parâmetros obrigatórios no pedido.",
        "cantrollback": "Não foi possível reverter a edição; o último contribuidor é o único autor desta página",
        "alreadyrolled": "Não foi possível reverter as edições de [[:$1]] por [[User:$2|$2]] ([[User talk:$2|discussão]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]);\nalguém editou ou já reverteu a página.\n\nA última edição foi de [[User:$3|$3]] ([[User talk:$3|discussão]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "editcomment": "O resumo da edição era: <em$1</em>.",
        "revertpage": "Foram revertidas as edições de [[Special:Contributions/$2|$2]] ([[User talk:$2|disc]]) para a última revisão de [[User:$1|$1]]",
        "revertpage-nouser": "Foram revertidas as edições de um utilizador oculto para a última revisão de {{GENDER:$1|[[User:$1|$1]]}}",
        "rollback-success": "Foram revertidas as edições de $1, com o conteúdo passando a estar como na última edição de $2.",
+       "rollback-success-notify": "Foram revertidas as edições de $1 para a última revisão de $2. [$3 Mostrar alterações]",
        "sessionfailure-title": "Erro de sessão",
        "sessionfailure": "Foram detectados problemas com a sua sessão;\na operação foi cancelada como medida de proteção contra a interceptação de sessões.\nVolte à página anterior, recarregue-a e tente novamente.",
        "changecontentmodel": "Editar o modelo de conteúdo de uma página",
        "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",
        "confirm-watch-top": "Adicionar esta página à lista de páginas vigiadas?",
        "confirm-unwatch-button": "OK",
        "confirm-unwatch-top": "Remover esta página da lista de páginas vigiadas?",
+       "confirm-rollback-button": "OK",
+       "confirm-rollback-top": "Reverter as edições desta página?",
        "quotation-marks": "\"$1\"",
        "imgmultipageprev": "← página anterior",
        "imgmultipagenext": "página seguinte →",
index 7a6a253..ad9a372 100644 (file)
                        "Conquistador",
                        "Frigory",
                        "Psychoslave",
-                       "Guycn2"
+                       "Guycn2",
+                       "2axterix2",
+                       "Ата"
                ]
        },
        "sidebar": "{{notranslate}}",
        "passwordreset-emailsent-capture": "Used in [[Special:PasswordReset]].\n\nSee also:\n* {{msg-mw|Passwordreset-emailsentemail}}\n* {msg-mw|Passwordreset-emailsentusername}}\n* {{msg-mw|Passwordreset-emailerror-capture}}",
        "passwordreset-emailerror-capture": "Error message displayed in [[Special:PasswordReset]] when sending an email fails. Parameters:\n* $1 - error message\n* $2 - username, used for GENDER\nSee also:\n* {{msg-mw|Passwordreset-emailsentemail}}\n* {msg-mw|Passwordreset-emailsentusername}}\n* {{msg-mw|Passwordreset-emailsent-capture}}",
        "passwordreset-emailsent-capture2": "Used in [[Special:PasswordReset]].\n\nParameters:\n* $1 - number of accounts notified\n\nSee also:\n* {{msg-mw|Passwordreset-emailsentemail}}\n* {msg-mw|Passwordreset-emailsentusername}}\n* {{msg-mw|Passwordreset-emailerror-capture}}",
-       "passwordreset-emailerror-capture2": "Error message displayed in [[Special:PasswordReset]] when sending an email fails. Parameters:\n* $1 - error message\n* $2 - username, used for GENDER\n* $3 - number of accounts notified\n\nSee also:\n* {{msg-mw|Passwordreset-emailsentemail}}\n* {msg-mw|Passwordreset-emailsentusername}}\n* {{msg-mw|Passwordreset-emailsent-capture}}",
+       "passwordreset-emailerror-capture2": "Error message displayed in [[Special:PasswordReset]] when sending an email fails. Parameters:\n* $1 - error message\n* $2 - username, used for GENDER\n* $3 - number of accounts notified\n\nSee also:\n* {{msg-mw|Passwordreset-emailsentemail}}\n* {{msg-mw|Passwordreset-emailsentusername}}\n* {{msg-mw|Passwordreset-emailsent-capture}}\n* {{msg-mw|Passwordreset-emailerror-capture}}",
        "passwordreset-nocaller": "Shown when a password reset was requested but the caller was not provided. This is an internal error.",
        "passwordreset-nosuchcaller": "Shown when a password reset was requested but the username of the caller could not be resolved to a user. This is an internal error.\n\nParameters:\n* $1 - username of the caller",
        "passwordreset-ignored": "Shown when password reset was unsuccessful due to configuration problems.",
        "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}}",
        "grant-group-customization": "{{Related|Grant-group}}",
        "grant-group-administration": "{{Related|Grant-group}}",
        "grant-group-other": "{{Related|Grant-group}}",
-       "grant-blockusers": "Name for grant \"blockusers\".\n{{Related|grant}}",
+       "grant-blockusers": "Name for grant \"blockusers\".\n{{Related|Grant}}",
        "grant-createaccount": "Name for grant \"createaccount\".\n{{Related|grant}}",
        "grant-createeditmovepage": "Name for grant \"createeditmovepage\".\n{{Related|grant}}",
        "grant-delete": "Name for grant \"delete\".\n{{Related|grant}}",
        "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}}\n* {{msg-mw|restricted-displaytitle}}",
        "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}}",
        "emailsubject": "Field in [[Special:EmailUser]].\n\n{{Identical|Subject}}",
        "emailmessage": "Field in [[Special:EmailUser]].\n\n{{Identical|Message}}",
        "emailsend": "Button name in [[Special:EmailUser]].\n\n{{Identical|Send}}",
-       "emailccme": "Used at [[Special:Preferences]] > E-mail",
+       "emailccme": "Used at [[Special:EmailUser]]",
        "emailccsubject": "Used in [[Special:EmailUser]].\n\nSubject of the carbon-copied email for the sender sent through MediaWiki.\n\nParameters:\n* $1 - target username\n* $2 - email subject",
        "emailsent": "Title of [[Special:EmailUser]] when it says you it sent an email",
        "emailsenttext": "Confirmation page: when you send an email, [[Special:EmailUser]] says you this (Your email has been sent).\n\nParameters:\n* $1 - (Optional) the recipient's username, for local customizations",
        "rollbacklinkcount": "{{doc-actionlink}}\nText of the rollback link showing the number of edits to be rolled back. See also {{msg-mw|rollbacklink}}.\n\nParameters:\n* $1 - the number of edits that will be rolled back. If $1 is over the value of <code>$wgShowRollbackEditCount</code> (default: 10) {{msg-mw|rollbacklinkcount-morethan}} is used.\n\nThe rollback link is displayed with a tooltip {{msg-mw|Tooltip-rollback}}",
        "rollbacklinkcount-morethan": "{{doc-actionlink}}\nText of the rollback link when a greater number of edits is to be rolled back. See also {{msg-mw|rollbacklink}}.\n\nWhen the number of edits rolled back is smaller than [[mw:Special:MyLanguage/Manual:$wgShowRollbackEditCount|$wgShowRollbackEditCount]], {{msg-mw|rollbacklinkcount}} is used instead.\n\nParameters:\n* $1 - number of edits",
        "rollbackfailed": "{{Identical|Rollback}}",
-       "cantrollback": "Used as error message when rolling back.\n\nSee also:\n* {{msg-mw|Notvisiblerev}}\n{{Identical|Revert}}\n{{Identical|Rollback}}",
+       "rollback-missingparam": "Used as error message rollback is accessed without the required parameters\n\nSee also:\n* {{msg-mw|Rollbackfailed}}",
+       "cantrollback": "Used as error message when rollback fails due to there not being a valid revision to revert back to.\n\nSee also:\n* {{msg-mw|Notvisiblerev}}\n{{Identical|Revert}}\n{{Identical|Rollback}}",
        "alreadyrolled": "Appear when there's rollback and/or edit collision.\n\nRefers to:\n* {{msg-mw|Pipe-separator}}\n* {{msg-mw|Contribslink}}\nParameters:\n* $1 - the page to be rolled back\n* $2 - the editor to be rolled-back of that page\n* $3 - the editor that cause collision\n{{Identical|Rollback}}",
        "editcomment": "Only shown if there is an edit {{msg-mw|Summary}}. Parameters:\n* $1 - the edit summary",
        "revertpage": "Parameters:\n* $1 - username 1\n* $2 - username 2\n* $3 - (Optional) revision ID of the revision reverted to\n* $4 - (Optional) timestamp of the revision reverted to\n* $5 - (Optional) revision ID of the revision reverted from\n* $6 - (Optional) timestamp of the revision reverted from\nSee also:\n* {{msg-mw|Revertpage-nouser}}\n{{Identical|Revert}}",
        "revertpage-nouser": "This is a confirmation message a user sees after reverting, when the username of the version is hidden with RevisionDelete.\n\nIn other cases the message {{msg-mw|Revertpage}} is used.\n\nParameters:\n* $1 - username 1, can be used for GENDER\n* $2 - (Optional) username 2\n* $3 - (Optional) revision ID of the revision reverted to\n* $4 - (Optional) timestamp of the revision reverted to\n* $5 - (Optional) revision ID of the revision reverted from\n* $6 - (Optional) timestamp of the revision reverted from",
        "rollback-success": "This message shows up on screen after successful revert (generally visible only to admins). $1 describes user whose changes have been reverted, $2 describes user which produced version, which replaces reverted version.\n{{Identical|Revert}}\n{{Identical|Rollback}}",
+       "rollback-success-notify": "Notification shown after a successful revert.\n* $1 - User whose changes have been reverted\n* $2 - User that made the edit that was restored\n* $3 - Url to the diff of the rollback\nSee also:\n* {{msg-mw|showdiff}}\n{{Identical|rollback-success}}\n{{Format|jquerymsg}}",
        "sessionfailure-title": "Used as title of the error message {{msg-mw|Sessionfailure}}.",
        "sessionfailure": "Used as error message.\n\nThe title for this error message is {{msg-mw|Sessionfailure-title}}.",
        "changecontentmodel": "Title of the change content model special page",
        "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]].\n\nParameters:\n* $1 - {{msg-mw|hide}}/{{msg-mw|show}}",
        "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}}",
        "tooltip-ca-nstab-category": "Tooltip shown when hovering over the {{msg-mw|Nstab-category}} tab.\n\nSee also:\n* {{msg-mw|Nstab-category}}\n* {{msg-mw|Accesskey-ca-nstab-category}}\n* {{msg-mw|Tooltip-ca-nstab-category}}",
        "tooltip-minoredit": "Tooltip shown when hovering over the \"{{msg-mw|Minoredit}}\" link below the edit form.\n\nSee also:\n* {{msg-mw|Minoredit}}\n* {{msg-mw|Accesskey-minoredit}}\n* {{msg-mw|Tooltip-minoredit}}",
        "tooltip-save": "This is the text that appears when you hover the mouse over {{msg-mw|Savearticle}} button on the edit page.\n\nSee also:\n* {{msg-mw|Savearticle}}\n* {{msg-mw|Accesskey-save}}\n* {{msg-mw|Tooltip-save}}",
-       "tooltip-publish": "This is the text that appears when you hover the mouse over {{msg-mw|publishpage}} button on the edit page.\n\nNote: This i18n is being introduced in advance of usage to provide extra time for translators.\n\nSee also:\n* {{msg-mw|publishpage}}\n* {{msg-mw|Accesskey-publish}}\n{{Identical|Publish page}}",
+       "tooltip-publish": "This is the text that appears when you hover the mouse over {{msg-mw|publishpage}} button on the edit page.\n\nNote: This i18n is being introduced in advance of usage to provide extra time for translators.\n\nSee also:\n* {{msg-mw|publishpage}}\n* {{msg-mw|Accesskey-publish}}",
        "tooltip-preview": "Tooltip shown when hovering over {{msg-mw|Showpreview}} button.\n\nIf the length of the translated message is over 60 characters (including spaces) then the end of the message will be cut off when using Firefox 2.0.0.7 browser, Linux operating system and the Monobook skin.\n\nSee also:\n* {{msg-mw|Showpreview}}\n* {{msg-mw|Accesskey-preview}}\n* {{msg-mw|Tooltip-preview}}",
        "tooltip-diff": "This is the text (tooltip) that appears when you hover the mouse over {{msg-mw|Showdiff}} button on the edit page.\n\nSee also:\n* {{msg-mw|Showdiff}}\n* {{msg-mw|Accesskey-diff}}\n* {{msg-mw|Tooltip-diff}}",
        "tooltip-compareselectedversions": "Tooltip of {{msg-mw|Compareselectedversions}} (which is used as button in history pages).\n\nSee also:\n* {{msg-mw|Compareselectedversions}}\n* {{msg-mw|Accesskey-compareselectedversions}}\n* {{msg-mw|Tooltip-compareselectedversions}}",
        "confirm-watch-top": "Used as confirmation message.",
        "confirm-unwatch-button": "Used as Submit button text.\n{{Identical|OK}}",
        "confirm-unwatch-top": "Used as confirmation message.",
+       "confirm-rollback-button": "Used as Submit button text.\n{{Identical|OK}}",
+       "confirm-rollback-top": "Used as confirmation message.",
        "semicolon-separator": "{{optional}}",
        "comma-separator": "{{optional}}\n\nWarning: languages have different usages of punctuation, and sometimes they are swapped (e.g. openining and closing quotation marks, or full stop and colon in Armenian), or change their form (the full stop in Chinese and Japanese, the prefered \"colon\" in Armenian used in fact as the regular full stop, the comma in Arabic, Armenian, and Chinese...)\n\nTheir spacing (before or after) may also vary across languages (for example French requires a non-breaking space, preferably narrow if the browser supports NNBSP, on the inner side of some punctuations like quotation/question/exclamation marks, colon, and semicolons).",
        "colon-separator": "{{optional}}\nChange it only if your language uses another character for ':' or it needs an extra space before the colon.",
        "timezone-local": "Label to indicate that a time is in the user's local timezone.\n{{Identical|Local}}",
        "duplicate-defaultsort": "See definition of [[w:Sorting|sort key]] on Wikipedia. Parameters:\n* $1 - old default sort key\n* $2 - new default sort key",
        "duplicate-displaytitle": "Warning shown when a page has its display title set multiple times. Parameters:\n* $1 - old display title\n* $2 - new display title",
-       "restricted-displaytitle": "Warning shown a display title is ignored because it is not equivalent to its actual title. Parameters:\n* $1 - the ignored display title",
+       "restricted-displaytitle": "Warning shown when a display title is ignored because it is not equivalent to its actual title. Parameters:\n* $1 - the ignored display title",
        "invalid-indicator-name": "Warning shown when the [https://www.mediawiki.org/wiki/Help:Page_status_indicators &lt;indicator name=\"''unique-identifier''\">''content''&lt;/indicator>] parser tag is used incorrectly.",
        "version": "{{doc-special|Version}}\n{{Identical|Version}}",
        "version-summary": "{{doc-specialpagesummary|version}}",
        "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-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-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]].",
        "credentialsform-provider": "Shown on [[Special:ChangeCredentials]]/[[Special:RemoveCredentials]] as the label for the authentication type (e.g. \"password\", \"English Wikipedia via OAuth\")",
index cecb1be..9c40740 100644 (file)
@@ -47,6 +47,7 @@
        "tog-watchdefault": "Adaugă paginile și fișierele pe care le modific la lista mea de urmărire",
        "tog-watchmoves": "Adaugă paginile și fișierele pe care le redenumesc la lista mea de urmărire",
        "tog-watchdeletion": "Adaugă paginile și fișierele pe care le șterg la lista mea de urmărire",
+       "tog-watchuploads": "Adaugă în lista de pagini urmărite fișierele noi pe care le încarc",
        "tog-watchrollback": "Adaugă în lista mea de pagini urmărite acele pagini asupra cărora am efectuat o revenire",
        "tog-minordefault": "Marchează din oficiu toate modificările ca fiind minore",
        "tog-previewontop": "Arată previzualizarea deasupra căsuței de modificare",
        "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",
        "userlogin-resetpassword-link": "V-ați uitat parola?",
        "userlogin-helplink2": "Ajutor la autentificare",
        "userlogin-loggedin": "Sunteți deja {{GENDER:$1|autentificat|autentificată}} ca {{GENDER:$1|$1}}.\nUtilizați formularul de mai jos pentru a vă autentifica cu alt nume de utilizator.",
+       "userlogin-reauth": "Trebuie să vă autentificați din nou pentru a confirma că sunteți {{GENDER:$1|$1}}.",
        "userlogin-createanother": "Creează un alt cont",
        "createacct-emailrequired": "Adresă de e-mail",
        "createacct-emailoptional": "Adresă de e-mail (opțională)",
        "createacct-email-ph": "Introduceți adresa dumnevoastră de e-mail",
        "createacct-another-email-ph": "Introduceți adresa de e-mail",
        "createaccountmail": "Utilizează o parolă temporară aleasă la întâmplare și o trimite la adresa de e-mail indicată",
+       "createaccountmail-help": "Poate fi folosit pentru a crea un cont pentru o altă persoană fără a cunoaște parola.",
        "createacct-realname": "Nume real (opțional)",
        "createaccountreason": "Motiv:",
        "createacct-reason": "Motiv",
        "createacct-reason-ph": "De ce creați un alt cont",
+       "createacct-reason-help": "Mesaj care apare în jurnalul de creare a conturilor",
        "createacct-submit": "Creați-vă contul",
        "createacct-another-submit": "Creează contul",
+       "createacct-continue-submit": "Continuă crearea contului",
+       "createacct-another-continue-submit": "Continuă crearea contului",
        "createacct-benefit-heading": "{{SITENAME}} este un proiect clădit de oameni ca dumneavoastră.",
        "createacct-benefit-body1": "{{PLURAL:$1|modificare|modificări|de modificări}}",
        "createacct-benefit-body2": "{{PLURAL:$1|pagină|pagini|de pagini}}",
        "nocookiesnew": "Contul a fost creat, dar nu sunteți autentificat{{GENDER:||ă|}}. {{SITENAME}} folosește module cookie pentru a reține utilizatorii autentificați. Navigatorul dumneavoastră are aceste module cookie dezactivate. Vă rugăm să le activați și să vă reautentificați folosind noul nume de utilizator și noua parolă.",
        "nocookieslogin": "{{SITENAME}} folosește module cookie pentru a autentifica utilizatorii. Browser-ul dvs. are cookie-urile dezactivate. Vă rugăm să le activați și să incercați din nou.",
        "nocookiesfornew": "Contul de utilizator nu a fost creat, deoarece nu am putut confirma sursa.\nAsigurați-vă că aveți cookie-urile activate, reîncărcați pagina și încercați din nou.",
+       "createacct-loginerror": "Contul a fost creat cu succes, dar nu s-a putut efectua autentificarea automată. Vă rugăm să vă [[Special:UserLogin|autentificați manual]].",
        "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ă.",
        "createacct-another-realname-tip": "Numele real este opțional.\nDacă decideți furnizarea sa, acesta va fi folosit pentru a atribui utilizatorului munca sa.",
        "pt-login": "Autentificare",
        "pt-login-button": "Autentificare",
+       "pt-login-continue-button": "Continuă autentificarea",
        "pt-createaccount": "Creare cont",
        "pt-userlogout": "Închide sesiunea",
        "php-mail-error-unknown": "Eroare necunoscută în funcția PHP mail()",
        "passwordreset-emailsentusername": "Dacă există o adresă de e-mail asociată acestui nume de utilizator, atunci se va trimite un e-mail de resetare a parolei.",
        "passwordreset-emailsent-capture": "Un mesaj de resetare a parolei a fost trimis, fiind afișat mai jos.",
        "passwordreset-emailerror-capture": "Un mesaj de resetare a parolei a fost generat (fiind afișat mai jos), dar trimiterea sa către {{GENDER:$2|utilizator}} a eșuat: $1",
+       "passwordreset-invalideamil": "Adresă de e-mail nevalidă",
+       "passwordreset-nodata": "Nu au fost furnizate un nume de utilizator sau o adresă de e-mail",
        "changeemail": "Modificare sau înlăturare adresă de e-mail",
        "changeemail-header": "Completați acest formular pentru a vă schimba adresa de e-mail. Dacă doriți să înlăturați orice asociere a unei adrese de e-mail cu contul dumneavoastră, lăsați necompletat câmpul pentru introducerea unei noi adrese de e-mail atunci când trimiteți formularul.",
        "changeemail-passwordrequired": "Va trebui să introduceți parola pentru a confirma această schimbare.",
        "minoredit": "Aceasta este o modificare minoră",
        "watchthis": "Urmărește această pagină",
        "savearticle": "Salvare pagină",
+       "publishpage": "Publică pagina",
        "preview": "Previzualizare",
        "showpreview": "Previzualizare",
        "showdiff": "Afișare diferențe",
        "revdelete-unsuppress": "Anulează restricțiile la versiunile restaurate",
        "revdelete-log": "Motivul ștergerii:",
        "revdelete-submit": "Aplică {{PLURAL:$1|versiunii selectate|versiunilor selectate}}",
-       "revdelete-success": "'''Vizibilitatea versiunilor a fost schimbată cu succes.'''",
+       "revdelete-success": "Vizibilitatea versiunilor a fost schimbată.",
        "revdelete-failure": "'''Nu s-a putut modifica vizibilitatea versiunii:'''\n$1",
-       "logdelete-success": "'''Jurnalul vizibilității a fost configurat cu succes.'''",
+       "logdelete-success": "Vizibilitatea jurnalului modificată.",
        "logdelete-failure": "'''Vizibilitatea jurnalului nu poate fi definită:'''\n$1",
        "revdel-restore": "Schimbă vizibilitatea",
        "pagehist": "Istoricul paginii",
        "mergehistory-fail-bad-timestamp": "Ora și data nu sunt valide.",
        "mergehistory-fail-invalid-source": "Pagina sursă nu este validă.",
        "mergehistory-fail-invalid-dest": "Pagina de destinație nu este validă.",
+       "mergehistory-fail-no-change": "Unificarea istoricului nu a unit nicio versiune. Verificați din nou pagina și parametrii temporali.",
+       "mergehistory-fail-permission": "Permisiuni insuficiente pentru a uni istoricul.",
+       "mergehistory-fail-self-merge": "Paginile sursă și destinație sunt identice.",
        "mergehistory-fail-toobig": "Nu s-a putut efectua unirea istoricelor întrucât s-ar fi depășit limita de $1 {{PLURAL:$1|versiune|versiuni|de versiuni}} mutat{{PLURAL:$1|ă|e}}.",
        "mergehistory-no-source": "Pagina sursă $1 nu există.",
        "mergehistory-no-destination": "Pagina de destinație $1 nu există.",
        "prefs-personal": "Informații personale",
        "prefs-rc": "Schimbări recente",
        "prefs-watchlist": "Listă de urmărire",
-       "prefs-editwatchlist": "Modifică lista de pagini urmărite",
+       "prefs-editwatchlist": "Modificare listă de pagini urmărite",
        "prefs-editwatchlist-label": "Modificați titluri din lista dumneavoastră de pagini urmărite:",
-       "prefs-editwatchlist-edit": "Vizualizați și eliminați titluri din lista dumneavoastră de pagini urmărite",
+       "prefs-editwatchlist-edit": "Vizualizare și eliminare titluri din lista dumneavoastră de pagini urmărite",
        "prefs-editwatchlist-raw": "Modifică lista brută de pagini urmărite",
-       "prefs-editwatchlist-clear": "Goliți-vă lista de pagini urmărite",
+       "prefs-editwatchlist-clear": "Golește-mi lista de pagini urmărite",
        "prefs-watchlist-days": "Numărul de zile care apar în lista paginilor urmărite:",
        "prefs-watchlist-days-max": "Maxim $1 {{PLURAL:$1|zi|zile}}",
        "prefs-watchlist-edits": "Numărul de modificări care apar în lista extinsă a paginilor urmărite:",
        "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”",
        "ipb-unblock": "Deblocați un nume de utilizator sau o adresă IP",
        "ipb-blocklist": "Vezi blocările existente",
        "ipb-blocklist-contribs": "Contribuțiile {{GENDER:$1|utilizatorului $1|utilizatoarei $1}}",
+       "ipb-blocklist-duration-left": "$1 a mai rămas",
        "unblockip": "Deblochează adresă IP",
        "unblockiptext": "Folosiți formularul de mai jos pentru a restaura permisiunea de scriere pentru adrese IP sau nume de utilizator blocate anterior.",
        "ipusubmit": "Elimină blocarea",
        "lockdbsuccesstext": "Baza de date a fost blocată.<br />\nNu uitați să o [[Special:UnlockDB|deblocați]] la terminarea operațiilor administrative.",
        "unlockdbsuccesstext": "Baza de date a fost deblocată.",
        "lockfilenotwritable": "Fișierul bazei de date închise nu poate fi scris.\nPentru a închide sau deschide baza de date, acesta trebuie să poată fi scris de serverul web.",
+       "databaselocked": "Baza de date este deja blocată.",
        "databasenotlocked": "Baza de date nu este blocată.",
        "lockedbyandtime": "(de $1, pe $2, la $3 )",
        "move-page": "Redenumire $1",
        "confirm-watch-top": "Adăugați această pagină la lista de pagini urmărite?",
        "confirm-unwatch-button": "OK",
        "confirm-unwatch-top": "Eliminați această pagină din lista de pagini urmărite?",
+       "confirm-rollback-button": "OK",
        "quotation-marks": "„$1”",
        "imgmultipageprev": "← pagina anterioară",
        "imgmultipagenext": "pagina următoare →",
        "tags-edit-revision-legend": "Adaugă sau înlătură etichete din {{PLURAL:$1|această versiune|toate cele $1 versiuni|toate cele $1 de versiuni}}",
        "tags-edit-logentry-legend": "Adaugă sau înlătură etichete din {{PLURAL:$1|această intrare din jurnal|toate cele $1 intrări din jurnal|toate cele $1 de intrări din jurnal}}",
        "tags-edit-existing-tags": "Etichete existente:",
-       "tags-edit-existing-tags-none": "''Niciuna''",
+       "tags-edit-existing-tags-none": "<em>Niciuna</em>",
        "tags-edit-new-tags": "Etichete noi:",
        "tags-edit-add": "Se adaugă aceste etichete:",
        "tags-edit-remove": "Se șterg aceste etichete:",
        "tags-edit-reason": "Motiv:",
        "tags-edit-revision-submit": "Aplică modificările {{PLURAL:$1|acestei versiuni|celor $1 versiuni|celor $1 de versiuni}}",
        "tags-edit-logentry-submit": "Aplică modificările {{PLURAL:$1|acestei intrări din jurnal|celor $1 intrări din jurnal|celor $1 de intrări din jurnal}}",
-       "tags-edit-success": "Modificările au fost aplicate cu succes.",
+       "tags-edit-success": "Modificările au fost aplicate.",
        "tags-edit-failure": "Modificările nu au putut fi aplicate:\n$1",
        "tags-edit-nooldid-title": "Versiune-țintă nevalidă",
        "tags-edit-nooldid-text": "Fie nu ați indicat nicio versiune-țintă pe care să aplicați această funcție, fie versiunea indicată nu există.",
        "logentry-protect-protect-cascade": "$1 {{GENDER:$2|a protejat}} $3 $4 [protecție în cascadă]",
        "logentry-protect-modify": "$1 {{GENDER:$2|a modificat}} nivelul protecției pentru $3 $4",
        "logentry-protect-modify-cascade": "$1 {{GENDER:$2|a modificat}} nivelul protecției pentru $3 $4 [protecție în cascadă]",
-       "logentry-rights-rights": "$1 {{GENDER:$2|a schimbat}} apartenența la grup pentru $3 de la $4 la $5",
+       "logentry-rights-rights": "$1 {{GENDER:$2|a schimbat}} apartenența la grup pentru {{GENDER:$6|$3}} de la $4 la $5",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|a schimbat}} apartenența la grup pentru $3",
        "logentry-rights-autopromote": "$1 {{GENDER:$2|a fost promovat|a fost promovată}} în mod automat de la $4 la $5",
        "logentry-upload-upload": "$1 {{GENDER:$2|a încărcat}} $3",
        "feedback-useragent": "Agent utilizator:",
        "searchsuggest-search": "Căutare",
        "searchsuggest-containing": "conținând...",
+       "api-error-autoblocked": "Adresa dumnevoastră IP a fost blocată automat, pentru că a fost folosită de un utilizator blocat.",
        "api-error-badaccess-groups": "Nu aveți dreptul să încărcați fișiere pe acest wiki.",
        "api-error-badtoken": "Eroare internă: jeton greșit.",
+       "api-error-blocked": "Vi s-a blocat accesul la modificări.",
        "api-error-copyuploaddisabled": "Încărcarea prin URL este dezactivată pe acest server.",
        "api-error-duplicate": "Există {{PLURAL:$1|un alt fișier deja încărcat|alte fișiere deja încărcate}} cu același conținut.",
        "api-error-duplicate-archive": "{{PLURAL:$1|A existat un alt fișier|Au existat alte fișiere}} cu același conținut pe site, dar {{PLURAL:$1|a fost|au fost}} șterse.",
        "api-error-nomodule": "Eroare internă: niciun modul de încărcare setat.",
        "api-error-ok-but-empty": "Eroare internă: niciun răspuns de la server.",
        "api-error-overwrite": "Nu este permisă suprascrierea unui fișier existent.",
+       "api-error-ratelimited": "Ați încercat să încărcați într-un interval de timp scurt mai multe fișiere decât permite acest wiki.\nÎncercați din nou peste câteva minute.",
        "api-error-stashfailed": "Eroare internă: serverul nu a putut stoca fișierul temporar.",
        "api-error-publishfailed": "Eroare internă: serverul nu a putut publica fișierul temporar.",
        "api-error-stasherror": "A apărut o eroare la încărcarea fișierului în depozitul temporar.",
        "api-error-unknownerror": "Eroare necunoscută: „$1”.",
        "api-error-uploaddisabled": "Încărcarea este dezactivată pe acest wiki.",
        "api-error-verification-error": "Acest fișier ar putea fi corupt sau poate avea extensia greșită.",
+       "api-error-was-deleted": "Un fișier cu același nume a fost deja încărcat în trecut și ulterior șters.",
        "duration-seconds": "$1 {{PLURAL:$1|secundă|secunde|de secunde}}",
        "duration-minutes": "$1 {{PLURAL:$1|minut|minute|de minute}}",
        "duration-hours": "$1 {{PLURAL:$1|oră|ore|de ore}}",
        "expand_templates_generate_xml": "Arată arborele de analiză XML",
        "expand_templates_generate_rawhtml": "Arată HTML brut",
        "expand_templates_preview": "Previzualizare",
-       "expand_templates_preview_fail_html": "<em>Întrucât la {{SITENAME}} este activat HTML brut și a avut loc o pierdere a sesiunii de date, previzualizarea a fost ascunsă ca măsură de precauție împotriva atacurilor prin JavaScript.</em>\n\n<strong>Dacă aceasta este o încercare legitimă de a previzualiza, încercați din nou.</strong>\nDacă nici astfel nu funcționează, încercați să [[Special:UserLogout|închideţi sesiunea]] şi să vă autentificaţi din nou.",
+       "expand_templates_preview_fail_html": "<em>Întrucât la {{SITENAME}} este activat HTML brut și a avut loc o pierdere a sesiunii de date, previzualizarea a fost ascunsă ca măsură de precauție împotriva atacurilor prin JavaScript.</em>\n\n<strong>Dacă aceasta este o încercare legitimă de a previzualiza, încercați din nou.</strong>\nDacă nici astfel nu funcționează, încercați să [[Special:UserLogout|închideţi sesiunea]] şi să vă autentificaţi din nou și să verificați dacă navigatorul dumneavoastră permite module cookie pentru acest site.",
        "expand_templates_preview_fail_html_anon": "<em>Întrucât la {{SITENAME}} este activat HTML brut și nu v-ați autentificat, previzualizarea a fost ascunsă ca măsură de precauție împotriva atacurilor prin JavaScript.</em>\n\n<strong>Dacă aceasta este o încercare legitimă de a previzualiza, [[Special:UserLogin|autentificați-vă]] și încercați din nou.</strong>",
        "expand_templates_input_missing": "Trebuie să furnizați cel puțin un text ca date de intrare.",
        "pagelanguage": "Modificare limbă pagină",
index 2e0be53..704b86e 100644 (file)
        "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": "\nМожет использоваться, чтобы создать учетную запись для другого лица, не узнавая пароль.",
        "createacct-realname": "Настоящее имя (необязательно)",
        "createaccountreason": "Причина:",
        "createacct-reason": "Причина",
        "createacct-reason-ph": "Зачем вы создаёте другую учетную запись",
+       "createacct-reason-help": "Сообщение, отображаемое в журнале создания учётных записей",
        "createacct-submit": "Создать учётную запись",
        "createacct-another-submit": "Создать учётную запись",
+       "createacct-continue-submit": "Продолжить создание учётной записи",
+       "createacct-another-continue-submit": "Продолжить создание учётной записи",
        "createacct-benefit-heading": "{{SITENAME}} — совместный труд таких же людей, как вы.",
        "createacct-benefit-body1": "{{PLURAL:$1|правка|правки|правок}}",
        "createacct-benefit-body2": "{{PLURAL:$1|статья|статьи|статей}}",
        "nocookiesnew": "Участник зарегистрирован, но не представлен. {{SITENAME}} использует «cookies» для представления участников. У вас «cookies» запрещены. Пожалуйста, разрешите их, а затем представьтесь со своиим новым именем участника и паролем.",
        "nocookieslogin": "{{SITENAME}} использует «cookies» для представления участников. Вы их отключили. Пожалуйста, включите их и попробуйте снова.",
        "nocookiesfornew": "Учётная запись участника не была создана из-за невозможности проверить её источник. \nУбедитесь, что включены «cookies», обновите страницу и попробуйте ещё раз.",
+       "createacct-loginerror": "Учётная запись была успешно создана, но вы не смогли войти в систему автоматически. Пожалуйста, [[Special:UserLogin|авторизуйтесь вручную]].",
        "noname": "Вы не указали допустимого имени участника.",
        "loginsuccesstitle": "Вход произведён",
        "loginsuccess": "Теперь вы работаете под именем $1.",
        "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|было отправлено|были отправлены}}. {{PLURAL:$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",
        "confirm-watch-top": "Добавить эту страницу в ваш список наблюдения?",
        "confirm-unwatch-button": "ОК",
        "confirm-unwatch-top": "Удалить эту страницу из вашего списка наблюдения?",
+       "confirm-rollback-button": "ОК",
+       "confirm-rollback-top": "Откатить правки на этой странице?",
        "pipe-separator": "&#32;|&#32;",
        "word-separator": "&#32;",
        "ellipsis": "…",
        "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-create-disabled": "Создание учётных записей отключено.",
+       "authmanager-authplugin-setpass-failed-title": "Ошибка изменения пароля",
+       "authmanager-authplugin-setpass-bad-domain": "Неверный домен.",
+       "authmanager-autocreate-exception": "Автоматическое создание учётной записи временно отключено из-за предыдущих ошибок.",
+       "authmanager-userdoesnotexist": "Не зарегистрировано учётной записи «$1».",
+       "authmanager-domain-help": "Домен для внешней аутентификации.",
+       "authmanager-email-label": "Электронная почта",
+       "authmanager-email-help": "Адрес электронной почты",
+       "authmanager-realname-label": "Настоящее имя",
+       "authmanager-realname-help": "Настоящее имя участника",
+       "authmanager-provider-password": "Аутентификация на основе пароля",
+       "authmanager-provider-temporarypassword": "Временный пароль",
+       "authprovider-resetpass-skip-label": "Пропустить",
+       "authprovider-resetpass-skip-help": "Пропустить сброс пароля.",
+       "cannotauth-not-allowed-title": "Доступ запрещён",
+       "cannotauth-not-allowed": "Вы не можете использовать эту страницу",
+       "changecredentials": "Изменение учётных данных",
+       "changecredentials-submit": "Изменить учётные данные",
+       "changecredentials-invalidsubpage": "$1 является недопустимым типом учётных данных.",
+       "changecredentials-success": "Ваши учётные данные были изменены.",
+       "removecredentials": "Удалить учётные данные",
+       "removecredentials-submit": "Удалить учётные данные",
+       "removecredentials-success": "Ваши учётные данные были удалены.",
+       "credentialsform-provider": "Тип учётных данных:",
+       "credentialsform-account": "Имя учётной записи:",
+       "linkaccounts": "Связать учётные записи",
+       "linkaccounts-success-text": "Учетная запись была связана.",
+       "linkaccounts-submit": "Связать учётные записи",
+       "unlinkaccounts": "Отвязать учётные записи",
+       "unlinkaccounts-success": "Учетная запись была отвязан."
 }
index deaa0d6..8d41d66 100644 (file)
        "newarticle": "(Саҥа ыстатыйа)",
        "newarticletext": "Эн суох сирэйгэ киирэ сатаатыҥ.\nМаннык ааттаах саҥа ыстатыйаны оҥорор буоллаххына, аллара баар түннүккэ суруй\n(сиһ. [$1 көмөнү] көрүөххүн сөп).\nӨскө манна сыыһа киирбит буоллаххына интэриниэтиҥ бырагыраамматын \"төнүн\" диэххин сөп.",
        "anontalkpagetext": "----''Бу аатын эппэтэх кыттааччы ырытар сирэйэ.\nIP-аадырыһа эрэ көстөр.\nБиир IP-аадырыс хас да киһиэхэ бэриллиэн сөп. Өскө атын киһиэхэ суруллубут суругу алҕас туппут буоллаххына, бэйэҥ [[Special:CreateAccount|ааккын билиһиннэр]] эбэтэр [[Special:UserLogin|киир]], оччоҕо кэлин да булкуур тахсыа суоҕа.''",
-       "noarticletext": "Ð\91илигин Ð±Ñ\83 Ñ\81иÑ\80Ñ\8dй ÐºÑ\83Ñ\80аанаÑ\85.\nÐ\91Ñ\83 Ð°Ð°Ñ\82 Ð°Ñ\82Ñ\8bн Ñ\8bÑ\81Ñ\82аÑ\82Ñ\8bйалга Ñ\82Ñ\83Ñ\82Ñ\82Ñ\83ллаÑ\80Ñ\8bн [[Special:Search/{{PAGENAME}}|бÑ\83лÑ\83оÑ\85Ñ\85Ñ\83н Ñ\81өп]],\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} Ñ\81Ñ\83Ñ\80Ñ\83нааллаÑ\80га ÐºÓ©Ñ\80дүөÑ\85Ñ\85үн Ñ\81өп],\nÑ\8dбÑ\8dÑ\82Ñ\8dÑ\80 [{{fullurl:{{FULLPAGENAME}}|action=edit}} Ð¼Ð°Ð½Ð½Ñ\8bк Ð°Ð°Ñ\82Ñ\82ааÑ\85 Ñ\81аҥа Ñ\8bÑ\81Ñ\82аÑ\82Ñ\8bйанÑ\8b Ñ\81Ñ\83Ñ\80Ñ\83йÑ\83оÑ\85Ñ\85Ñ\83н] Ñ\81өп</span>.",
+       "noarticletext": "Ð\91илигин Ð±Ñ\83 Ñ\81иÑ\80Ñ\8dй ÐºÑ\83Ñ\80аанаÑ\85.\nÐ\91Ñ\83 Ð°Ð°Ñ\82 Ð°Ñ\82Ñ\8bн Ñ\8bÑ\81Ñ\82аÑ\82Ñ\8bйалаÑ\80га Ñ\82Ñ\83Ñ\82Ñ\82Ñ\83ллаÑ\80Ñ\8bн [[Special:Search/{{PAGENAME}}|бÑ\83лÑ\83оÑ\85Ñ\85Ñ\83н Ñ\81өп]],\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} Ñ\81Ñ\83Ñ\80Ñ\83нааллаÑ\80га ÐºÓ©Ñ\80дүөÑ\85Ñ\85үн Ñ\81өп],\nÑ\8dбÑ\8dÑ\82Ñ\8dÑ\80 [{{fullurl:{{FULLPAGENAME}}|action=edit}} Ð¼Ð°Ð½Ð½Ñ\8bк Ð°Ð°Ñ\82Ñ\82ааÑ\85 Ñ\81аҥа Ñ\8bÑ\81Ñ\82аÑ\82Ñ\8bйанÑ\8b Ñ\81Ñ\83Ñ\80Ñ\83йÑ\83оÑ\85Ñ\85Ñ\83н Ñ\81өп]</span>.",
        "noarticletext-nopermission": "Билигин бу сирэй кураанах.\nБу [[Special:Search/{{PAGENAME}}|ааты атын сирэйдэргэ көрдөөн көрүөххүн]] сөп,\nэбэтэр <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} сурунаалларга манна сыһыаннаах суруктары булуоххун сөп].</span> Бу сирэйи айар кыаҕыҥ суох.",
        "missing-revision": "«{{FULLPAGENAME}}» сирэй $1 барыла суох.\n\nМаннык үксүн хайыы-үйэ сотуллубут билэҕэ эргэрбит сигэнэн бардахха буолааччы.\nСиһилии баҕар [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} сотуу сурунаалыгар] баара буолуо.",
        "userpage-userdoesnotexist": "\"<nowiki>$1</nowiki>\" аат бэлиэтэммэтэх. Бу сирэйи оҥорор/уларытар баҕалааххын дуо?",
        "whatlinkshere-links": "← ыйынньыктар",
        "whatlinkshere-hideredirs": "$1 утаарыы",
        "whatlinkshere-hidetrans": "$1 киллэриилэр",
-       "whatlinkshere-hidelinks": "$1 сигэ (ыйынньык)",
+       "whatlinkshere-hidelinks": "$1 сигэ",
        "whatlinkshere-hideimages": "$1 билэ сигэтэ",
        "whatlinkshere-filters": "Фильтрдар",
        "whatlinkshere-submit": "Толор",
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",
index 61607db..f8fa354 100644 (file)
        "exception-nologin": "Nesat prėsėjongis",
        "exception-nologin-text": "Ka galietomiet ton padėrbtė, Tamstā būtėnā rēk prėsėjongtė.",
        "exception-nologin-text-manual": "Ka galietomiet ton padėrbtė, Tamstā būtėnā rēk $1.",
-       "logouttext": "'''Daba Tamsta esat atsėjongė̄s.'''\n\nGalat ė tuoliau nauduotė {{SITENAME}} anuonėmėškā aba <span class='plainlinks'>[$1 prėsėjonkat]</span> ėš naujė tuo patio aba kėto nauduotuojė vardo.\nAtėduos: katrūs nakatrūs poslapiūs ė tuoliau gal ruodītė būktā būtomiet prėsėjongis lėgė tuol, kumet ėšvalīsat sava naršīklės dietovė (''cache'').",
+       "logouttext": "<strong>Daba Tamsta esat atsėjongė̄s.</strong>\n\nAtėduos: katrūs nakatrūs poslapiūs ė tuoliau gal ruodītė būktā būtomėt prėsėjongė̄s lėg tuol, kūmet ėšvalīsėt sava naršīklės dietovė (''cache'').",
        "cannotlogoutnow-title": "Nēn atsijongtė",
        "welcomeuser": "Svēks, $1!",
        "welcomecreation-msg": "Tamstas paskīra jau padėrbta.\nNūnā galat pakeistė sava {{SITENAME}} [[Special:Preferences|nustatīmus]], jēgo tėktās nuorat.",
        "createaccounterror": "Nė̄šiejė padėrbtė paskīruos: $1",
        "nocookiesnew": "Nauduotuojė paskīra bova sokurta, bat Tamsta nēsot prėsėjongis. {{SITENAME}} nauduo pakavukus (''cookies''), ka prėkergtom nauduotuojus. Tamsta esot ėšjongis anūs. Prašuom ijongtė pakavukus, tumet prisėjonkat so sava naujo nauduotuojė vardo ė slaptažuodio.",
        "nocookieslogin": "{{SITENAME}} nauduo pakavukus (''cookies''), ka prėkergtom nauduotuojus. Tamsta esat ėšjongis anūs. Prašuom ijongtė pakavukus ė pamiegītė apent.",
-       "loginsuccesstitle": "Gerā prėsėjongiet",
+       "loginsuccesstitle": "Prisijongiet gerā",
        "loginsuccess": "'''Dabā Tamsta esat prėsėjongis prī {{SITENAME}} kāp „$1“.'''",
-       "nosuchuser": "Nier anėjuokė nauduotuojė pavadėnta „$1“.\nPatikrinkat rašība, aba [[Special:CreateAccount|padėrbkat naujė paskīra]].",
+       "nosuchuser": "Nier anėjuokė nauduotuojė, katrou vards būtom „$1“ (dėdliuosės rādės svarbo ī).\nPatikrinkėt rašība aba [[Special:CreateAccount|padėrbkėt naujė paskīra]].",
        "nosuchusershort": "Nier juokė nauduotuojė, pavadėnta „$1“. Patėkrinkat rašība.",
        "nouserspecified": "Tamstā rēk nuruodītė nauduotuojė varda.",
        "login-userblocked": "Nauduotuos ožgints īr. Pakliūtė nie galama.",
        "wrongpasswordempty": "Slaptažuodis dīks īr. Pamiegīkat apent.",
        "passwordtooshort": "Tamstas slaptažuodis nier tinkoms aba par tromps īr. Ons tor būtė nuors {{PLURAL:$1|1 sėmbuolė|$1 sėmbuoliu}} ėlgoma.",
        "passwordtoolong": "Slaptažuodis negal būtė ėlgesnis kāp {{PLURAL:$1|1 znuoks|$1 znuokā|$1 znuoku}}.",
+       "passwordtoopopular": "Tonkē nauduojami slaptažuodē natink. Somīslėkėt kuoki tās godresni slaptažuodi.",
        "password-name-match": "Tamstas slaptažuodis tor skirtėis nu Tamstas nauduotuojė varda.",
        "password-login-forbidden": "Tuo nauduotuojė varda ė slaptažuodė nauduojėms nie galėms.",
        "mailmypassword": "Atgamintė slaptažuodi",
        "noemail": "Nier anėjuokė el. pašta adresa ivesta nauduotuojō „$1“.",
        "noemailcreate": "Tamsta nuruodīkat elektruonėni pašta, katros vēk",
        "passwordsent": "Naus slaptažuodis bova nusiōsts i el. pašta adresa,\nožregėstrouta nauduotuojė „$1“.\nPrašuom prisėjongtė vielē, kumet Tamsta gausėt anū.",
-       "blocked-mailpassword": "Tamstas IP adresos īr ožblokouts nū redagavėma, tudie neleidama nauduotė slaptažuodė priminėma funkcėjės, kū apsėsauguotomė nū pėktnaudžēvėma.",
+       "blocked-mailpassword": "Tamstas IP adresos ožgints ī, ka negalietomiet nieka čė dirbtė. Ka būtom apsisauguota nūg pėktnaudiavėma, slaptažuodė atgamėnėms ėšjongts ī.",
        "eauthentsent": "Patvėrtėnėma gruomata bova nusiōsta i paskėrta el. pašta adresa.\nPrīš ėšsiontiant kėta gruomata i Tamstas diežote, Tamsta torėt vīkdītė nuruodīmus gruomatuo, kū patvėrtėntomiet, kū diežotė tėkrā īr Tamstas.",
        "throttled-mailpassword": "Slaptažuodžė priminims jau bova ėšsiōsts, par paskotėnės {{PLURAL:$1|adīna|$1 adīnas}}. Nuorint apsėsauguotė nū pėktnaudēvėma, slaptažuodė priminėms gal būt ėšsiōsts tėk kas {{PLURAL:$1|adīna|$1 adīnas}}.",
        "mailerror": "Bieda siontiont gromata: $1",
        "emailnotauthenticated": "Tamstas el. pašta adresos da nier patvėrtėnts. Anėjuokės gruomatas\nnebus siontamas ni vėinam žemiau ėšvardėntam puoslaugiō.",
        "noemailprefs": "Nuruodėkīt el. pašta adresa, kū vėiktu šėtos funkcėjės.",
        "emailconfirmlink": "Patvėrtinkėt sava el. pašta adresa",
+       "invalidemailaddress": "Alektruonėnė pašta adresos nagal būtė prijėmts, ba ėšruod kap natinkamas skvarmas. Da sīk pamieginkėt ivestė tou adresa aba palikėt laukali dīka.",
        "accountcreated": "Nauduotuos padėrbts īr",
        "accountcreatedtext": "Paskīra nauduotojō [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|aptarėms]]) bova padėrbta.",
        "createaccount-title": "{{SITENAME}} paskīruos kūrėms",
        "createaccount-text": "Kažkastā svetainie {{SITENAME}} ($4) padėrba nauduotojė poslapi, katros vadėnas \"$2\" ė katruo slaptažuodis ī \"$3\", so Tamstas el. pašta adreso.\nDaba galat prėsėjongtė ė pasėkeistė slaptažuodi.\n\nJēgo tat ī kuokistā soklīdėms, tumet Jumis nieka darītė nerēk.",
        "login-throttled": "Tamsta nuognē daug sīkiu miegėnat prėsėjongtė.\nPalaukat $1 prīš miegėnont apent.",
+       "login-abort-generic": "Tamstas prisijongėms napavīka. Ons bova atšaukts.",
        "loginlanguagelabel": "Kalba: $1",
+       "createacct-another-realname-tip": "Viernos vards nie būtėns. \nJēb anou ožrašīsėt, tap ons būs ruodoms prī Tamstas darbū pamėnavuojėma.",
        "pt-login": "Prėsėjongtė",
        "pt-login-button": "Prėsėjongtė",
+       "pt-login-continue-button": "Tuoliau prisijongėnietė",
        "pt-createaccount": "Pasėdėrbtė paskīra",
        "pt-userlogout": "Atsėjongtė",
        "changepassword": "Pakeistė slaptažuodė",
        "newpassword": "Naus slaptažuodis:",
        "retypenew": "Apent ožrašīkat naujė slaptažuodi:",
        "resetpass_submit": "Nostatītė slaptažuodi ė prėsėjongtė",
-       "changepassword-success": "Tamstas slaptažuodis pakeists siekmėngā!",
+       "changepassword-success": "Tamstas slaptažuodis pamainīts gerā!",
        "changepassword-throttled": "Baisē daug čiesu mieginot prisėjongtė.\nDaba palaukėt $1 prīš mieginant vie.",
        "resetpass-submit-loggedin": "Keistė slaptažuodi",
        "resetpass-submit-cancel": "Pabengtė",
        "resetpass-temp-password": "Laikėns slaptažuodis:",
+       "resetpass-expired": "Tamstas slaptažuodis bengė vēktė. Padirbkėt nauja slaptažuodi, ka prisijongtomiet.",
        "passwordreset": "Apent padėrbtė slaptažuodi",
        "passwordreset-username": "Nauduotuojė vards:",
        "passwordreset-domain": "Domens:",
        "passwordreset-email": "El. pašta adresos:",
+       "passwordreset-emailtext-ip": "Kažėkas (mosietās Tamsta, ėš IP adresa $1) ožprašė pamainītė slaptažuodi tinklapie {{SITENAME}} ($4). Tou nauduotuojė {{PLURAL:$3|poslapis|poslapio|poslapē|poslapiu}}\nsorištė so tou al. pašta adreso ī:\n\n$2\n\n{{PLURAL:$3|Tas čiesėškos slaptažuodis|čiesėški slaptažuodē}} bengs vēktė pu {{PLURAL:$5|dėinuos|$5 dėinū}}.\nTamsta prisijonkėt ė pamainīkėt sava slaptažuodi. Jēb kas tā kėts padirba tou prašīma, aba jēb atminiet sava sena slaptažuodi, ta galėt nakrēptė atėdies i tou gromata ė jongtėis so sava seno slaptažuodio.",
        "passwordreset-emailelement": "Nauduotuos:\n$1\n\nČiesėšks slaptažuodis:\n$2",
        "changeemail": "Keistė aba trintė el. pašta adresa",
        "changeemail-oldemail": "Vielībs el. pašta adresosː",
        "newarticle": "(Naus)",
        "newarticletext": "Tamsta pakliovat poslapin, katros dā nie padėrbts.\nJēgo nuorat anon padėrbtė, rašīkat laukė, katros ī apatiuo\n(veiziekat [$1 pagelbas poslapi]).\nJēgo pakliovat čė netīčiuom, paprastiausē paspauskat naršīklės mīgtoka '''atgal'''.",
        "anontalkpagetext": "----''Tas īr anonimėnė nauduotuojė, katros nier sosėkūrės aba nenauduo paskīruos, aptarėmu poslapis.\nDielē tuo nauduojams IP adresos anuo atpažėnėmō.\nTas IP adresos gal būtė dalinams keletō nauduotuoju.\nJēgo Tamsta esat anonimėnis nauduotuos ėr veizėt, kū kuomentarā nier skėrtė Tamstā, [[Special:CreateAccount|sokorkėt paskīra]] aba [[Special:UserLogin|prisėjonkėt]], ė nebūsėt maišuoms so kėtās anonimėnēs nauduotuojās.''",
-       "noarticletext": "Nūnā tamė poslapie nie nė juokė teksta.\nTamsta galat [[Special:Search/{{PAGENAME}}|ėiškuotė ton poslapė pavadėnėma]] terp kėtū poslapiū,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ėiškuotė prėgolontiu īrašu],\naba [{{fullurl:{{FULLPAGENAME}}|action=edit}} keistė ton poslapi]</span>.",
+       "noarticletext": "Nūnā tamė poslapie nie nijuokė teksta.\nTamsta galat [[Special:Search/{{PAGENAME}}|ėiškuotė tou poslapė pavadėnėma]] terp kėtū poslapiu,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ėiškuotė prėgolontiu īrašu],\naba [{{fullurl:{{FULLPAGENAME}}|action=edit}} keistė tou poslapi]</span>.",
        "noarticletext-nopermission": "Nūnā tamė poslapie nier anėjuokė teksta.\nTamsta galat [[Special:Search/{{PAGENAME}}|ėiškuotė šėtuo poslapė pavadėnėma]] kėtūs poslapiūs,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ėiškuotė prėgolontiūm ragėstru]</span>.",
        "userpage-userdoesnotexist": "Nauduotuojė paskīra „<nowiki>$1</nowiki>“ nier ožregėstrouta. Prašuom patikrėntė, a Tamsta nuorėt kortė/keistė ta poslapi.",
        "userpage-userdoesnotexist-view": "Nie nauduotuojė vardo „$1“",
        "right-upload": "Ikeltė failus",
        "right-writeapi": "Nauduotė API rašīmō",
        "right-delete": "Trintė poslapius",
+       "right-browsearchive": "Ėiškuotė ėštrintū poslapiu",
+       "right-undelete": "Tou poslapi padėrbtė apent",
        "newuserlogpage": "Nauduotuojė kūrėma sārošos",
        "rightslog": "Nauduotuoju teisiu istuorėjė",
        "rightslogtext": "Pateikiams nauduotuoju teisiu pakeitėmu sārašos.",
        "pager-older-n": "{{PLURAL:$1|paskesnis|paskesnė|paskesniū}}",
        "booksources": "Kningu šaltėnē",
        "booksources-search-legend": "Kningu šaltėniu paėiška",
+       "booksources-search": "Ėiškuotė",
        "specialloguserlabel": "Nauduotuos:",
        "speciallogtitlelabel": "Pavadėnims:",
        "log": "Specēliūju vīksmū istuorėjė",
        "whatlinkshere-prev": "$1 {{PLURAL:$1|pėrmesnis|pėrmesnė|pėrmesniū}}",
        "whatlinkshere-next": "$1 {{PLURAL:$1|kėts|kėtė|kėtū}}",
        "whatlinkshere-links": "← nūruodas",
-       "whatlinkshere-hideredirs": "$1 nusokėmus",
+       "whatlinkshere-hideredirs": "$1 nūsokėmus",
        "whatlinkshere-hidetrans": "$1 itraukėmus",
        "whatlinkshere-hidelinks": "$1 nūruodas",
        "whatlinkshere-hideimages": "$1 abruozdieliu nūruodas",
        "tooltip-t-recentchangeslinked": "Paskotėnē pakeitėmā straipsniūs, pasėikiamūs nug šėta straipsnė",
        "tooltip-feed-rss": "Šėta poslapė RSS šaltėnis",
        "tooltip-feed-atom": "Ton poslapė Atom šaltėnis",
-       "tooltip-t-contributions": "Ruodītė tou nauduotuojė duovi",
+       "tooltip-t-contributions": "Ruodītė tou {{GENDER:$1|nauduotuojė}} duovi",
        "tooltip-t-emailuser": "Siōstė gromata šėtom prietėliō",
        "tooltip-t-upload": "Ožkrautė abruozdielius",
        "tooltip-t-specialpages": "Specēliūju poslapiu sārašos",
diff --git a/languages/i18n/shn.json b/languages/i18n/shn.json
new file mode 100644 (file)
index 0000000..68aea42
--- /dev/null
@@ -0,0 +1,1560 @@
+{
+       "@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": "ၸိူဝ်းပႅၵ်ႇပိူင်ႈ",
+       "longpageerror": "<strong>လွင်ႈၽိတ်းပိူင်ႈ : လိၵ်ႈၸိူဝ်းဢၼ်ၸဝ်ႈၵဝ်ႇ မၵ်းမၼ်ႈသႂ်ႇပၼ်မႃးၼၼ်ႉ တၢင်းယၢဝ်းမၼ်း မီး {{PLURAL:$1|ၼိုင်ႈ kilobyte|$1 kilobytes}}, မၼ်းတိူဝ်းယၢဝ်ၢးလိူဝ်သေ  {{PLURAL:$2|ၼိုင်ႈ kilobyte|$2 kilobytes}}.</strong>\nမၼ်းတေဢမ်ႇၸၢင်ႈ သိမ်းဝႆႉပၼ်လႆႈ။",
+       "readonlywarning": "<strong>ၽၢင်ႉ : ယွင်ၶေႃႈမုၼ်းၼႆႉ ထုၵ်ႇၶတ်းဝႆႉ တွၼ်ႈတႃႇ ၵၢၼ်မူၼ်ႉ​​မေး၊ ယွၼ်ႉၼၼ်လႄႈ ၸဝ်ႈၵဝ်ႇ တေဢမ်ႇၸၢင်ႈ သိမ်းဝႆႉ ၵၢၼ်လႅၵ်ႈလၢႆႈ ၸဝ်ႈၵဝ်ႇ ယၢမ်းလဵဝ်</strong>\nၸဝ်ႈဝ်ႇ တေလူဝ်ႇ ထုတ်ႇ ၵေႃႇပီႇ သေ ပႃႉသႂ်ႇ ၽဵတ်ႉသႂ်ႇဝႆႉ တီႈၼႂ်း ၾၢႆႇလိၵ်ႈ သေ သိမ်းဝႆႉ တွၼ်ႈတႃႇၶိုၼ်းၸႂ်ႉဝၢႆးလင်။\nၵေႃႉၵုမ်းထိင်ပိူင်သၢင်ႈ ၵေႃႉဢၼ်ၶတ်းဝႆႉၼႆႉ မၼ်းပၼ်လွင်ႈတၢင်းမၼ်းဝႆႉဝႃႈ : $1",
+       "protectedpagewarning": "<strong>ၽၢင်ႉ : ၼႃႈလိၵ်ႈၼႆႉ ထုၵ်ႇႁႄႉၵင်ႈဝႆႉ၊ ယွၼ်ႉၼၼ်လႄႈ ၸိူဝ်းပဵၼ် ၽူႈၸႂ်ႉတိုဝ်း ၽူႈၵုမ်းၵၢၼ် ၶဝ်ၵူၺ်းတေၸၢင်ႈမီး သုၼ်ႇမႄးထတ်းလႆႈ။</strong>\nသဵၼ်ႈမၢႆၵမ်းလိုၼ်းၸိူဝ်းၼႆႉ ပၼ်ဝႆႉၽၢႆႇတႂ်ႈၼႆႉ တွၼ်ႈတႃႇႁႂ်ႈပဵၼ် ၵၢၼ်ဢိင် :",
+       "semiprotectedpagewarning": "<strong>မၢႆတွင်း:</strong> ၼႃႈလိၵ်ႈၼႆႉ ထုၵ်ႇႁႄႉၵင်ႈဝႆႉ၊ ယွၼ်ႉၼၼ်လႄႈ ၸိူဝ်းပဵၼ် ၽူႈၸႂ်ႉတိုဝ်း ဢၼ်တၢင်ႇမၢႆၽၢင်ဝႆႉၼၼ်ႉၵူၺ်း တေၸၢင်ႈ မႄးထတ်းလႆႈ။ \nသဵၼ်ႈမၢႆၵမ်းလိုၼ်းၸိူဝ်းၼႆႉ ပၼ်ဝႆႉၽၢႆႇတႂ်ႈၼႆႉ တွၼ်ႈတႃႇႁႂ်ႈပဵၼ် ၵၢၼ်ဢိင် :",
+       "cascadeprotectedwarning": "<strong>ၽၢင်ႉ :</strong> ၼႃႈလိၵ်ႈၼႆႉ ထုၵ်ႇႁႄႉၵင်ႈဝႆႉလႄႈ ၸိူဝ်းပဵၼ် ၽူႈၸႂ်ႉတိုဝ်း ၽူႈၵုမ်းၵၢၼ်ၶဝ်ၵူၺ်း တေမီးသုၼ်ႇ မႄးထတ်းလႆႈ၊ ယွၼ်ႉပိူဝ်ႈဝႃႈ မၼ်းၶဝ်ႈပႃးဝႆႉ ၼႂ်းၵိင်ႇၽႄ ၸိူဝ်းပဵၼ် ဢၼ်ထုၵ်ႇႁႄႉၵင်ႈဝႆႉ {{PLURAL:$1|page|pages}}:",
+       "titleprotectedwarning": "<strong>ၽၢင်ႉ : ၼႃႈလိၵ်ႈၼႆႉ ထုၵ်ႇႁႄႉၵင်ႈဝႆႉ ယွၼ်ႉၼၼ် [[Special:ListGroupRights|specific rights]] ၸိူဝ်းၼႆႉ ထုၵ်ႇၵေႃႇသၢင်ႈဝႆႉ။</strong>\nသဵၼ်ႈမၢႆၵမ်းလိုၼ်းၸိူဝ်းၼႆႉ ပၼ်ဝႆႉၽၢႆႇတႂ်ႈၼႆႉ တွၼ်ႈတႃႇႁႂ်ႈပဵၼ် ၵၢၼ်ဢိင် :",
+       "templatesused": "{{PLURAL:$1|Template|ပိူင်တမ်း}} ၸႂ်ႉဝႆႉတီႈၼႃႈလိၵ်ႈၼႆႉ:",
+       "templatesusedpreview": "{{PLURAL:$1|ပိူင်တမ်း|ပိူင်တမ်း၊}} ၸႂ်ႉဝႆႉတီႈၼႂ်း ၵၢၼ်တူၺ်းလူင်ႈၼႃႈ :",
+       "templatesusedsection": "{{PLURAL:$1|ပိူင်တမ်း|ပိူင်တမ်း၊}} ၸႂ်ႉဝႆႉ တီႈၼႂ်း ၵၼ်ၼႆႉ :",
+       "template-protected": "ႁႄႉၵင်ႈဝႆႉ",
+       "template-semiprotected": "(ႁႄႉၵၼ်ႈဝႆႉ ၵမ်ႈၽွင်ႈ)",
+       "hiddencategories": "ၼႃႈလိၵ်ႈဢၼ်ၼႆႉ မၼ်းပဵၼ် ၼႃႈလိၵ်ႈၶဝ်ႈၸုမ်း {{PLURAL:$1|1 hidden category|$1 ၵၼ်သိူင်ႇဝႆႉ}}:",
+       "nocreate-loggedin": "ၸဝ်ႈၵဝ်ႇ ဢမ်ႇလႆႈမီးသုၼ်ႇ တွၼ်ႈတႃႇတေၵေႃႇသၢင်ႈ ၼႃႈလိၵ်ႈဢၼ်မႂ်ႇ။",
+       "sectioneditnotsupported-title": "ၵၢၼ်မႄးထတ်း တွၼ်ႈၵၼ် ဢမ်ႇလႆႈ ၵမ်ႉထႅမ်ဝႆႉပၼ်။",
+       "sectioneditnotsupported-text": "ၵၢၼ်မႄးထတ်း တွၼ်ႈၵၼ် ဢမ်ႇလႆႈ ၵမ်ႉထႅမ်ဝႆႉပၼ် တီႈၼႃႈလိၵ်ႈၼႆ့။",
+       "permissionserrors": "ၵၢၼ်လူတ်းပွႆႇ ၽိတ်းပိူင်ႈ",
+       "permissionserrorstext": "ၸဝ်ႈၵဝ်ႇဢမ်ႇမီးသုၼ်ႇ တႃႇႁဵတ်းဢၼ်ၼၼ်ႉ၊ ယွၼ်ႉပိူဝ်ႈဝႃႈ {{PLURAL:$1|လွင်ႈတၢင်း|လွင်ႈတၢင်းၸိူဝ်း}} ၼႆႉ:",
+       "permissionserrorstext-withaction": "ၸဝ်ႈၵဝ်ႇဢမ်ႇမီးသုၼ်ႇ တႃႇ $2, တွၼ်ႈတႃႇ ၸိူဝ်း ဢၼ်ပဵၼ် {{PLURAL:$1|reason|လွင်ႈတၢင်း}}:",
+       "contentmodelediterror": "ၸဝ်ႈၵဝ်ႇတေဢမ်ႇၸၢင်ႈ မႄးထတ်း ၵၢၼ်ၶူၼ်ႉလူဢၼ်ၼႆႉ၊ ယွၼ်ႉပိူဝ်ႈဝႃႈ ၽၢင်တူဝ် ၶေႃႈၶဝ်ႈပႃး မၼ်းၼႆႉပဵၼ်  <code>$1</code>, ဢၼ် ပႅၵ်ႇပိူင်ႈၵၼ်တၢင်း ၽၢင်တူဝ် ၶေႃႈၶဝ်ႈပႃး ၶွင်ႈၼႃႈလိၵ်ႈ <code>$2</code> ၼႆႉ။",
+       "recreate-moveddeleted-warn": "<strong>ၶေႃႈၽၢင်ႉပၼ် : ၸဝ်ႈၵဝ်ႇ ၶိုၼ်းၵေႃႇသၢင်ႈ ၼႃႈလိၵ်ႈ ဢၼ်လႆႈ မွတ်ႇပႅတ်ႈၵႂႃႇဝႆႉၼၼ်ႉ။</strong>\n\nၸဝ်ႈၵဝ်ႇ ထုၵ်ႇလီဝူၼ်ႉတူၺ်းဝႃႈ ၸွင်ႇမၼ်းသၢင်ႇထုၵ်ႇ တွၼ်ႈတႃႇတေသိုပ်ႇ မႄးထတ်း ၼႃႈလိၵ်ႈၼႆႉဢၼ်ဝႃႈၼၼ်ႉ။\nသဵၼ်ႈလၢႆ မွတ်ႇပႅတ်ႈလႄႈ ၶၢႆႉဢွင်ႈ တွၼ်ႈတႃႇၼႃႈလိၵ်ႈၼႆႉ ၵမ်ႉထႅမ်ဝႆႉပၼ် ၵႃႈတီႈၼႆႈ တွၼ်ႈတႃႇ ႁႂ်းငၢႆႈလူမ်ၸႂ် :",
+       "moveddeleted-notice": "ၼႃႈလိၵ်ႈၼႆႉ မွတ်ႇပႅတ်ႈၵႂႃႇယဝ်ႉ။ လွင်ႈမွတ်ႇပႅတ်ႈလႄႈ လွင်ႈၶၢႆႉသၢႆမၢႆ တွၼ်ႈတႃႇ ၼႃႈလိၵ်ႈၼႆႉ ၵမ်ႉထႅမ်ဝႆႉပၼ် ၼင်ႇပႃႈတႂ်ႈၼႆႉယူႇ။ မၼ်းပဵၼ် တွၼ်ႈတႃႇ ႁဵတ်းၽိုၼ်ဢိင်ယဝ်ႉ။",
+       "moveddeleted-notice-recent": "ယိၼ်းၶီၸွမ်ႈယူႇ၊ ၼႃႈလိၵ်ႈၼႆႉ တိုၵ်ႉႁႃထုၵ်ႇမွတ်ႇပႅတ်ႈ (ၼႂ်းၶၢဝ်းတၢင်း မိူဝ်ႈပူၼ်ႉမႃး 24 ၸူဝ်ႈမူင်း) ၼႆႉၵူၺ်း။ သဵၼ်ႈမၢႆ မွတ်ႇပႅတ်ႈ လႄႈ ၶၢႆႉဢွင်ႈတီႈ ၸိူဝ်းၼၼ်ႉ လႆႈၵမ်ႉထႅမ်ဝႆႉပၼ်ၼင်ႇၽၢႆႇတႂ်ႈ ႁႂ်ႈၸၢင်ႈပဵၼ် ၵၢၼ်ၽိုၼ်ဢိင်။",
+       "log-fulllog": "တူၺ်း သဵၼ်ႈမၢႆဢၼ်တဵမ်ထူၼ်ႈ",
+       "edit-hook-aborted": "ၵၢၼ်မႄးထတ်း ထုၵ်ႇလူတ်းပႅတ်တင်းၶေႃၵွင်ႉ။\nမၼ်းဢမ်ႇပၼ်ဝႆႉ ၶေႃႈသပ်းလႅင်းသင်။",
+       "edit-gone-missing": "ဢမ်ႇၸၢင်ႈႁဵတ်း ဢၢပ်ႉတိတ်ႉၼႃႈလိၵ်ႈ။\nမၼ်းဢၢပ်ႇ မွတ်ႇပႅတ်ႇဝႆႉယဝ်ႉ။",
+       "edit-conflict": "မႄးထတ်း လွင်ႈယုင်ႈယၢင်ႈ",
+       "edit-no-change": "ၵၢၼ်မႄးထတ်းၸဝ်ႈၵဝ်ႇၼၼ်ႉ ထုၵ်ႇၶၢမ်ႈပႅတ်ႈၵႂႃႇ။ ယွၼ်ႉပိူဝ်ႈဝႃႈ တီႈလိၵ်ႈၸိူဝ်းၼႆႉ ဢမ်ႇလႆႈႁၼ် မီးလွင်ႈလႅၵ်ႈလၢႆႈသင်။",
+       "postedit-confirmation-created": "ၼႃႈလိၵ်ႈၼႆႉ ထုၵ်ႇၵေႃႇသၢင်ႈယဝ်ႉယဝ်ႈ။",
+       "postedit-confirmation-restored": "ၼႃႈလိၵ်ႈၼႆႉ ထုၵ်ႇဢဝ်ၶိုၼ်းယဝ်ႉယဝ်ႈ။",
+       "postedit-confirmation-saved": "လွင်ႈမႄးထတ်းၸဝ်ႈၵဝ်ႇ သိမ်းပၼ်ယဝ်ႉယဝ်ႈ။",
+       "edit-already-exists": "ဢမ်ႇၸၢင်ႈ ၵေႃႇသၢင်ႈ ၼႃႈလိၵ်ႈဢၼ်မႂ်ႇ။\nမၼ်းမီးဝႆႉထႃႈယဝ်ႈ။",
+       "defaultmessagetext": "လိၵ်ႈၶေႃႈၶၢဝ်ႇ ပိူင်ႇၵႅဝ်ႈ",
+       "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ပိူင်မၢင်ၼႃႈတေဢမ်ႇႁူမ်ႈပႃးၸွမ်း။",
+       "cantcreateaccounttitle": "ဢမ်ႇၸၢင်ႈၵေႃႇသၢင်ႈ ဢၶွင်ႉ",
+       "viewpagelogs": "တူၺ်းသၢႆမၢႆ တွၼ်ႈတႃႇၼႃႈလိၵ်ႈၼႆႉ",
+       "nohistory": "တီႈၼႆႈ ဢမ်ႇမီး ပိုၼ်းထတ်းသၢင်ႈ တွၼ်ႈတႃႇၼႃႈလိၵ်ႈၼႆႉ",
+       "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-otherreason": "တၢင်ႇၸိူဝ်း / လွင်ႈတၢင်း ထႅမ်သႂ်ႇထႅင်ႈ",
+       "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-fail-self-merge": "ၼႃႈလိၵ်ႈငဝ်ႈငႃႇလႄႈ ၼႃႈလိၵ်ႈယိူင်းၸူးၼႆႉ မိူၼ်ၵၼ်။",
+       "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\"",
+       "titlematches": "ႁူဝ်ၶေႃႈ ၼႃႈလိၵ်ႈ ၶူပ်းၵၼ်ယူႇ",
+       "textmatches": "လိၵ်ႈၼႂ်းၼႃႈလိၵ်ႈ ၶူပ်းၵၼ်ယူႇ",
+       "notextmatches": "လိၵ်ႈၼႂ်းၼႃႈလိၵ်ႈ ဢမ်ႇၶူပ်းၵၼ်",
+       "prevn": "ပႃႈၼႃႈ {{PLURAL:$1|$1}}",
+       "nextn": "တေႃႇထႅင်ႈ {{PLURAL:$1|$1}}",
+       "prev-page": "ၼႃႈလိၵ်ႈဢၼ်ပူၼ်ႉမႃး",
+       "next-page": "ၼႃႈလိၵ်ႈတေမႃး",
+       "prevn-title": "သိုပ်ႇၵႂႃႇၸူး $1 {{PLURAL:$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-category": "(တွၼ်ႈၵၼ် $1)",
+       "search-suggest": "ၶႂ်ႈဝႃႈ $1 - ၼႆႁႃႉ",
+       "search-interwiki-caption": "ၼႃႈၵၢၼ် ပီႈၼွင်ႉၵၼ်",
+       "search-interwiki-default": "ၽွၼ်းလႆႈ ၵႃႈတီႈ $1 :",
+       "search-interwiki-more": "(လိူဝ်)",
+       "search-relatedarticle": "ၸိူဝ်းၵပ်းၵၢႆႇ",
+       "searchrelated": "ၸိူဝ်းၵပ်းၵၢႆႇ",
+       "searchall": "တင်းမူတ်း",
+       "search-showingresults": "{{PLURAL:$4|ၽွၼ်းလႆႈ <strong>$1</strong> တႃႇ <strong>$3</strong>|ၽွၼ်းလႆႈ <strong>$1 - $2</strong> တႃႇ <strong>$3</strong>}}",
+       "search-nonefound": "ဢမ်ႇမီးၽွၼ်းလႆႈ ၼိူဝ်ၵၢၼ် လွင်ႈသွၵ်ႈႁႃ",
+       "search-nonefound-thiswiki": "ဢမ်ႇမီးၽွၼ်းလႆႈ ဢၼ်ၶူပ်းၵၼ်တင်း​ ၶေႃႈသွၵ်ႈႁႃႈၵႃႈတီႈၼႂ်းသၢႆႉဢၼ်ၼႆႉ။",
+       "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": "တူၺ်းလူင်ႈၼႃႈ",
+       "datedefault": "ဢမ်ႇမီး ငဝ်ႈၵုမ်းပိူင်",
+       "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": "ႁဵင်းလိၵ်ႈ ဢီးမေးလ်ၵေႃႈ ၵေႃႈ ပဵၼ်ဢဝ်ၸႂ်ဝႃႈၵူၺ်း။ ၵူၺ်းၵႃႈဝႃႈ ပေႃးဝႃႈ ​ၸဝ်ႈၵဝ်ႇ လိုမ်းၶေႃႈလပ်ႉလႄႈ တေၶႂ်ႈတင်ႈၶိုၼ်း ၶေႃႈလပ်ႉမႂ်ႇၼႆတႄႉ တေလူဝ်ႇ ႁဵင်းလိၵ်ႈဢီးမေးလ်ယဝ်ႉ။",
+       "prefs-help-email-required": "တေလူဝ်ႇႁဵင်းလိၵ်ႈဢီးမေးလ်",
+       "prefs-info": "လွၼ်ႉၶၢဝ်ႈ ပိုၼ်ႉထၢၼ်",
+       "prefs-i18n": "ၵၢၼ်ၵူႈမိူင်းမိူင်း",
+       "prefs-signature": "လၢႆးမိုဝ်း",
+       "prefs-dateformat": "ပိူင်ဝၼ်း",
+       "prefs-timeoffset": "ၶူပ်းၶၢဝ်းယၢမ်း",
+       "prefs-advancedediting": "ၵၢၼ်လၵ်ႈသၢင်ႈ ၵူႈလွင်ႈ",
+       "prefs-editor": "ၽူႈမႄးထတ်း",
+       "prefs-preview": "တူၺ်းလူင်ႈၼႃႈ",
+       "prefs-advancedrc": "ၵၼ်လိူၵ်ႈသၢင်ႈ ၶိုၵ်ႉတွၼ်း",
+       "prefs-advancedrendering": "ၵၢၼ်လိူၵ်ႈသၢင်ႈ ၶိုၵ်ႉတွၼ်း",
+       "prefs-advancedsearchoptions": "ၵၢၼ်လိူၵ်ႈသၢင်ႈ ၶိုၵ်ႉတွၼ်း",
+       "prefs-advancedwatchlist": "ၵၼ်လိူၵ်ႈသၢင်ႈ ၶိုၵ်ႉတွၼ်း",
+       "prefs-displayrc": "ၼႄပၼ် ၵၢၼ်လိူၵ်ႈသၢင်ႈ",
+       "prefs-displaywatchlist": "ၼႄပၼ် ၵၢၼ်လိူၵ်ႈသၢင်ႈ",
+       "prefs-tokenwatchlist": "မၢႆၶပ်ႉ",
+       "prefs-diffs": "လွင်ႈပႅၵ်ႇပိူင်ႈ",
+       "prefs-help-prefershttps": "ငဝ်ႈၵုမ်းၵၢၼ်ၼႆႉ ပေႃးဝႃႈ ၶိုၼ်းၶဝ်ႈလွၵ်ႉဢိၼ်ႇထႅင်ႈၵမ်းၼင်ႇ ၸင်ႇတေလႅၵ်ႈလၢႆႈ။",
+       "userrights": "လွင်ႈၸတ်းၵၢၼ်သုၼ်ႈလႆႈ ၽူႈၸႂ်ႉတိုတ်း",
+       "userrights-lookup-user": "ၸတ်းၵၢၼ် ၸုမ်းၽူႈၸႂ်ႉတိုဝ်း",
+       "userrights-user-editname": "ပေႃႇသႂ်ႇပၼ် ၸိုဝ်ႈၽူႈၸႂ်ႉတိုဝ်း :",
+       "editusergroup": "မႄးထတ်း {{GENDER:$1|ၽူႈၸႂ်ႉတိုဝ်း}} ၸုမ်း",
+       "editinguser": "လႅၵ်ႈလၢႆႈသုၼ်ႇလႆႈ ၽူႈၸႂ်ႉတိုဝ်း ၶွင် {{GENDER:$1|ၽူႈၸႂ်ႉတိုဝ်း}} <strong>[[User:$1|$1]]</strong> $2",
+       "userrights-editusergroup": "မႄးထတ်းၸိူဝ်းၸုမ်း ၽူႈၸႂ်ႉတိုဝ်း",
+       "saveusergroups": "သိမ်း  ၸိူဝ်းၸုမ်း {{GENDER:$1|ၽူႈၸႂ်ႉတိုဝ်း}}",
+       "userrights-groupsmember": "ၽူႈၶဝ်ႈၸုမ်း ၶွင် :",
+       "userrights-groupsmember-auto": "ၽူႈၶဝ်ႈၸုမ်းပႃးဝႆႉ ၶွင် :",
+       "userrights-reason": "လွင်ႈတၢင်း :",
+       "userrights-no-interwiki": "ၸဝ်ႈၵဝ်ႇ ဢမ်ႇမီးသုၼ်ႇၶႂၢင်းပၼ် တွၼ်ႈတႃႇ မႄးထတ်း သုၼ်ႇၽူႈၸႂ်ႉတိုဝ်းၵႃႈတီႈဝီႇၶီႇ တၢင်ႇဢၼ်။",
+       "userrights-nodatabase": "ယွင်ၶေႃႈမုၼ်း $1 ၼႆႉဢမ်ႇမီး ဢမ်ႇၼၼ် မၼ်းဢမ်ႇၸႂ်ႈ လူဝ်ႇၵႄႇ။",
+       "userrights-notallowed": "ၸဝ်ႈၵဝ်ႇဢမ်ႇလႆႈမီးသုၼ်ႇၶႂၢင်းပၼ် တွၼ်ႈတႃႇ တေထႅမ်သႂ်ႇ ဢမ်ႇၼၼ် ထွၼ်ပႅတ်ႈ သုၼ်ႇလႆႈ ၽူႈၸႂ်ႉတိုဝ်း",
+       "userrights-changeable-col": "ၸုမ်း ၸိူဝ်းၸဝ်ႈၵဝ်ႇ ၸၢင်ႈလႅၵ်ႈလၢႆႈ",
+       "userrights-unchangeable-col": "ၸုမ်း ၸိူဝ်းၸဝ်ႈၵဝ်ႇ ဢမ်ႇၸၢင်ႈလႅၵ်ႈလၢႆႈ",
+       "userrights-conflict": "လွင်ႈလႅၵ်ႈလၢႆႈ သုၼ်ႇၽူႈၸႂ်ႉတိုဝ်းၼၼ်ႉ မီးလွင်ႈယုင်ႈယၢင်ႈဝႆႉ။ ၶႅၼ်းတေႃႈ ၶိုၼ်းထတ်းတူၺ်းပၼ် သေ ၶိုၼ်းၼႄႉၼွၼ်းပၼ် လွင်ႈလႅၵ်ႈလၢႆႈၸဝ်ႈၵဝ်ႇလႄႈ။",
+       "userrights-removed-self": "ၸဝ်ႈၵဝ်ႇထွၼ်ပႅတ်ႇ သုၼ်ႇလႆႈတူဝ်ၸဝ်ႈၵဝ်ႇ။ ယွၼ်ႉၼၼ်လႄႈ ၸဝ်ႈၵဝ်ႇ တေဢမ်ႇၸၢင်ႈၶဝ်ႈၸႂ်ႉ ၼႃႈလိၵ်ႈၼႆႉလႆႈယဝ်ႉ။",
+       "group": "ၸုမ်း :",
+       "group-user": "ၽူႈၸႂ်ႉတိုဝ်း",
+       "group-autoconfirmed": "ၽူႈၸႂ်ႉတိုဝ်း ၸိူဝ်းၼႄႉၼွၼ်းတူဝ်ႁင်းၵူၺ်း",
+       "group-bot": "ပွတ်ႉ",
+       "group-sysop": "ၽူႈၵုမ်းၵၢၼ်ၶဝ်",
+       "group-bureaucrat": "ၸဝ်ႈၼႃႈတီႈၶဝ်",
+       "group-suppress": "ၽူႈတဵၵ်းတဵင်ၶဝ်",
+       "group-all": "(တင်းမူတ်း)",
+       "group-user-member": "{{GENDER:$1|ၽူႈၸႂ်ႉတိုဝ်း}}",
+       "group-autoconfirmed-member": "{{GENDER:$1|ၽူႈၸႂ်ႉတိုဝ်း ၸိူဝ်းၼႄႉၼွၼ်းတူဝ်ႁင်းၵူၺ်း}}",
+       "group-bot-member": "{{GENDER:$1|ပွတ်ႉ}}",
+       "group-sysop-member": "{{GENDER:$1|ၽူႈၵုမ်းၵၢၼ်}}",
+       "group-bureaucrat-member": "{{GENDER:$1|ၸဝ်ႈၼႃႈတီႈ}}",
+       "group-suppress-member": "{{GENDER:$1|ၽူႈတဵၵ်းတဵင်}}",
+       "grouppage-user": "{{ns:project}}:ၽူႈၸႂ်ႉတိုဝ်းၶဝ်",
+       "grouppage-autoconfirmed": "{{ns:project}}:ၽူႈၸႂ်ႉတိုဝ်း ၸိူဝ်းၼႄႉၼွၼ်းတူဝ်ႁင်းၵူၺ်း",
+       "grouppage-bot": "{{ns:project}}:ပွတ်ႉၶဝ်",
+       "grouppage-sysop": "{{ns:project}}:ၽူႈၵုမ်းၵၢၼ်ၶဝ်",
+       "grouppage-bureaucrat": "{{ns:project}}:ၸဝ်ႈၼႃႈတီႈၶဝ်",
+       "grouppage-suppress": "{{ns:project}}:တဵၵ်းတဵင်",
+       "right-read": "လူ ၼႃႈလိၵ်ႈ",
+       "right-edit": "မႄးထတ်း ၼႃႈလိၵ်ႈ",
+       "right-createpage": "ၵေႃႇသၢင်ႈ ၼႃႈလိၵ်ႈ (ၸိူဝ်းဢၼ်ဢမ်ႇၸႂ်ႈ ၼႃးလိၵ်ႈဢုပ်ႇဢူဝ်းၵၼ်)",
+       "right-createtalk": "ၵေႃႇသၢင်ႈ ၼႃႈလိၵ်ႈ ဢုပ်ႇဢူဝ်းၵၼ်",
+       "right-createaccount": "ၵေႃႇသၢင်ႈ ဢၶွင်ႉ ၽူႈၸႂ်ႉတိုဝ်း ဢၼ်မႂ်ႇ",
+       "right-autocreateaccount": "ဢဝ် ဢၶွင်ႉၽူႈၸႂ်ႉတိုဝ်း ၽၢႆႇၼွၵ်ႈသေ ၶဝ်ႈလွၵ်ႉဢိၼ်ႇႁင်း​တူဝ်",
+       "right-minoredit": "မၢႆၵၢၼ်မႄးထတ်း ၼင်ႇ ၵၢၼ်ၼွႆႉ",
+       "right-move": "ၶၢႆႉ ၼႃႈလိၵ်ႈ",
+       "right-move-subpages": "ၶၢႆ့ၼႃႈလိၵ်ႈ ဢိၵ်ႇ ၼႃႈလိၵ်ႈၽႄၶဝ်",
+       "right-move-rootuserpages": "ၶၢႆ့ၼႃႈလိၵ်ႉ ၽူႈၸႂ်ႉတိုဝ်း ငဝ်ႈႁၢၵ်ႈ",
+       "right-move-categorypages": "ၶၢႆ့ၼႃႈလိၵ်ႈ တွၼ်ႈၵၼ်",
+       "right-movefile": "ၶၢႆ့ၾၢႆႇ",
+       "right-suppressredirect": "ၽွင်းတိုၵ်ႉၶၢႆ့ၼႃႈလိၵ်ႈယူႇၼၼ်ႉ ​တေဢမ်ႇသၢင်ႈ တူဝ်ပိၼ်ႇၸီႉ ၵႃႈတီႈ ၼႃႈလိၵ်ႈ ငဝ်ႈငႃႇ",
+       "right-upload": "လူတ်ႇၶိုၼ်ႈ ၾၢႆႇ",
+       "right-reupload": "သႂ်ႇတဵင်ၵႂႃႇ ၼိူဝ် ၾၢႆႇဢၼ်မီးဝႆႉၼၼ်ႉ",
+       "right-reupload-own": "ဢဝ် ဢၼ်သေၵေႃႉၵေႃႉ လူတ်ႇၶိုၼ်ႈမႃးၼၼ်ႉ သႂ်ႇတဵင်ၵႂႃႇၼိူဝ်ၾၢႆႇ ဢၼ်မီးဝႆ့",
+       "right-upload_by_url": "လုၵ်ႉတီႈ URL သေ လူတ်ႇၶိုၼ်ႈ ၾၢႆႇ",
+       "right-purge": "ၽဵဝ်ႈလၢင်ႈ ၶေႃႈမုၼ်းသၢႆႉ တွၼ်ႈတႃႇ ၼႃႈလိၵ်ႈၼႆႉ ဢမ်ႇတၢပ်ႇလူဝ်ႇ ၶေႃႈၼႄႉၼွၼ်း။",
+       "right-writeapi": "ၸႂ်ႉတိုဝ်း လွင်ႈတႅမ်ႈ API",
+       "right-delete": "မွတ်ႇပႅတ်ႈ ၼႃႈလိၵ်ႈ",
+       "right-bigdelete": "မွတ်ႇပႅတ်ႈၼႃႈ ဢၼ်ၸိူၵ်းမီးဝႆႉ ပိုၼ်းယႂ်ႇၵႂၢင်ႈ",
+       "right-deletelogentry": "မွတ်ႇပႅတ်ႈ လႄႈ ဢမ်ႇမွတ်ႇပႅတ်ႈ သဵၼ်ႈမၢႆသႂ်ႇသေ မၵ်းမၼ်ႈဝႆႉ",
+       "right-deleterevision": "မွတ်ႇပႅတ်ႈ လႄႈ ဢမ်ႇမွတ်ႇပႅတ်ႈ ပိူဝ်းသျိၼ်းၼႃႈလိၵ်ႈ ၸိူဝ်းမၵ်းမၼ်ႈဝႆႉ",
+       "right-deletedhistory": "တူၺ်း ပိုၼ်းၸိူဝ်းသႂ်ႇဝႆႉ ဢၼ်လႆႈမွတ်ႇပႅတ်ႈၵႂႃႇ၊ ဢမ်ႇတၢပ်ႈလူဝ်ႇ လိၵ်ႈဢၼ်ၵွင်ႉၵၢႆႇ ၶဝ်ဝႆႉ။",
+       "right-deletedtext": "တူၺ်း လိၵ်ႈၸိူဝ်းမွတ်ႇပႅတ်ႈဝႆႉ​လႄႈ လႅၵ်ႈလၢႆႈပၼ် ၼႂ်းၵႄႈ ပိူဝ်းသျိၼ်း ၸိူဝ်းမွတ်ႇပႅတ်ႈဝႆႉ။",
+       "right-browsearchive": "ၶူၼ်ႉႁႃ ၼႃႈလိၵ်ႈ ၸိူဝ်းမွတ်ႇပႅတ်ႈၵႂႃႇ",
+       "right-undelete": "ဢဝ်ၶိုၼ်း ၼႃႈလိၵ်ႈ",
+       "right-suppressrevision": "တူၺ်း၊ သိူင်ႇလပ်ႉ လႄႈ ၼႄၶိုၼ်း ၶေႃႈၶူၼ်ႉလူ ၼႃႈလိၵ်ႈၸိူဝ်းမၵ်းမၼ်ႈဝႆႉ ၵႃႈတီႈ ၽူႈၸႂ်ႉတိုဝ်း သေၵေႃႉၵေႃႉ",
+       "right-viewsuppressed": "တူၺ်း ၶေႃႈၶူၼ်ႉလူ ဢၼ်သိူင်ႇဝႆႉ ၵႃႈတီႈ ၽူႈၸႂ်ႉတိုဝ်း သေၵေႃႉၵေႃႉ",
+       "right-suppressionlog": "တူၺ်း သဵၼ်ႈမၢႆႇ သုၼ်ႇတူဝ်",
+       "right-block": "​ႁႄႉတတ်း ၽူႈၸႂ်ႉတိုဝ်းတၢင်ႇၸိူဝ်း ၵႃႈတီႈ ၵၢၼ်မႄးထတ်း",
+       "right-blockemail": "ႁႄႉတတ်း ၽူႈၸႂ်ႉတိုဝ်း ၵႃႈတီႈ သူင်ႇဢီးမေးလ်",
+       "right-hideuser": "ႁႄႉတတ်း ၸိုဝ်ႈၽူႈၸႂ်ႉတိုဝ်း၊ လပ်ႉမၼ်းဝႆႉ ၵႃႈတီႈ ၵူၼ်ႈတၢင်းၼမ်",
+       "right-unblockself": "ၶိုၼ်းပိုတ်ႇႁႄႉတတ်း ပၼ် ႁင်းၸဝ်ႈၵဝ်ႇ",
+       "right-editprotected": "မႄးထတ်း ၼႃႈလိၵ်ႈၸိူဝ်း ႁႄႉၵင်ႈဝႆႉ ၼင်ႇ \"{{int:protect-level-sysop}}\"",
+       "right-editsemiprotected": "မႄးထတ်းၼႃႈလိၵ်ႈၸိူဝ်း ႁႄႉၵင်ႈဝႆႉၼင်ႇ \"{{int:protect-level-autoconfirmed}}\"",
+       "right-editcontentmodel": "မႄးထတ်း ၽၢင်ႁၢင်ႈတူဝ်ၶဝ်ႈပႃး ၶွင်ၼႃႈလိၵ်ႈ",
+       "right-editinterface": "မႄးထတ်း ယူင်ႉႁၢင်ႈ ၽူႈၸႂ်ႉတိုဝ်း",
+       "right-editusercssjs": "မႄးထတ်းၾၢႆႇ CSS လႄႈ JavaScript ၶွင် ၽူႈၸႂ်ႉတိုဝ်းတၢင်ႇၸိူဝ်း",
+       "right-editusercss": "မႄးထတ်း ၾၢႆႇ CSS ၶွင် ၽူႈၸႂ်ႉတိုဝ်းတၢင်ႇၸိူဝ်း",
+       "right-edituserjs": "မႄးထတ်း ၾၢႆႇ JavaScript ၶွင် ၽူႈၸႂ်ႉတိုဝ်း တၢင်ႇၸိူဝ်း",
+       "right-editmyusercss": "မႄးထတ်း ၾၢႆႇ CSS ၶွင်ႁင်းၸဝ်ႈၵဝ်ႇ",
+       "right-editmyuserjs": "မႄးထတ်း ၾၢႆႇ JavaScript ၶွင်ႁင်းၸဝ်ႈၵဝ်ႇ",
+       "right-viewmywatchlist": "တူၺ်း သဵၼ်ႈမၢႆပႂ်ႉတူၺ်း ႁင်းၶွင်ၵဝ်ႇ",
+       "right-editmywatchlist": "မႄးထတ်း သဵၼ်ႈမၢႆပႂ်ႉတူၺ်း ႁင်းတူဝ်ၵဝ်ႇ။ မၢႆတွင်းဝႆႉဝႃႈ လွင်ႈႁဵတ်းသၢင်ႈ ၵမ်ႈၽွင်ႈၼႆႉ ႁူမ်ႈဝႃႈဢမ်ႇမီးသုၼ်ႇၵေႃႈ တိုၵ်ႉတေထႅမ်သႂ်ႇ ၼႃႈလိၵ်ႈၵႂႃႇယူႇ။",
+       "right-viewmyprivateinfo": "တူၺ်း ၶေႃႈမုၼ်း သုၼ်ႇတူဝ် ၸဝ်ႈၵဝ်ႇ (တူဝ်ယၢင်ႇ ႁဵင်းလိၵ်ႈ ဢီးမေးလ်၊ ၸိုဝ်ႈ​တေႉတေႉ)",
+       "right-editmyprivateinfo": "မႄးထတ်း ၶေႃႈမုၼ်းသုၼ်ႇတူဝ် ၸဝ်ႈၵဝ်ႇ (တူဝ်ယၢင်ႇ ႁဵင်းလိၵ်ႈ ဢီးမေးလ်၊ ၸိုဝ်ႈတေႉတေႉ)",
+       "right-editmyoptions": "မႄးထတ်း ငဝ်ႈၵုမ်းပိူင် ၶွင်တူဝ်ၵဝ်ႇ",
+       "right-import": "ဢဝ်ၼႃႈလိၵ်ႈ ၸိူဝ်းလုၵ်ႉၵႃႈတီႈ ဝီႇၶီႇတၢင်ႇၸိူဝ်း သႂ်ႇၶဝ်ႈ",
+       "right-importupload": "ဢဝ်ၼႃႈလိၵ်ႈၸိူဝ်း ၵႃႈတီႈၾၢႆႇလူတ်ႇၶိုၼ်ႈၼၼ်ႉ သႂ်ႇၶဝ်ႈ",
+       "right-unwatchedpages": "တူၺ်းသဵၼ်ႈမၢႆ ၼႃႈလိၵ်ႈတူၺ်း ဢမ်ႇပႆႇလႆႈတူၺ်းဝႆႉၼၼ်ႉ",
+       "right-mergehistory": "ဢဝ်ပိုၼ်းၶွင်ၼႃႈလိၵ်ႈ ႁူမ်ႈၵၼ်",
+       "right-userrights": "မႄးထတ်းသုၼ်ႇလႆႈ တႃႇၽူႈၸႂ်ႉတိုဝ်း တင်းသဵင်ႈ",
+       "right-userrights-interwiki": "မႄးထတ်း သုၼ်ႇလႆႈ ၽူႈၸႂ်ႉတိုဝ်း ၸိူဝ်းပဵၼ် ၽူႈၸႂ်ႉတိုဝ်း ဢၼ်မီးဝႆႉယူႇ ၵႃႈတီႈၼိူဝ် ဝီႇၶီႇတၢင်ႇၸိူဝ်း",
+       "right-siteadmin": "ၶတ်းသေႃး လႄႈ ဢမ်ႇၶတ်းသေႃး ယွင်ၶေႃႈမုၼ်း",
+       "right-sendemail": "သူင်ႇဢီးမေးလ်ၸူး ၽူႈၸႂ်ႉတိုဝ်း တၢင်ႇၸိူဝ်း",
+       "right-passwordreset": "တူၺ်း ဢီးမေး တင်ႈၶိုၼ်း ၶေႃႈလပ်ႉ",
+       "right-managechangetags": "ၵေႃႇသၢင်ႈ လႄႈ (ဢမ်ႇ) တူင်ႉတိုၼ်ႇ  [[Special:Tags|tags]]",
+       "right-deletechangetags": "မွတ်ႇပႅတ်ႈ  [[Special:Tags|tags]] ၵႃႈတီႈ ယွင်ၶေႃႈမုၼ်း",
+       "grant-generic": "\"$1\" ထုပ်ႉႁေႃႇ သုၼ်ႇလႆႈ",
+       "grant-group-page-interaction": "ႁႂ်ႈမီးၽွၼ်းလီတင်း ၼႃႈလိၵ်ႈ",
+       "grant-group-file-interaction": "ႁႂ်ႈမီးၽွင်းလီတင်း သိုဝ်ႇၶၢဝ်ႇ",
+       "grant-group-watchlist-interaction": "ႁႂ်းမီးၽွၼ်းလီတင်း သဵၼ်ႈမၢႆပႂ်ႉတူၺ်းၸဝ်ႈၵဝ်ႇ",
+       "grant-group-email": "သူင်ႇ ဢီးမေးလ်",
+       "grant-group-high-volume": "ႁဵၼ်းၵၢၼ်တူင်ႉၼိုင် ဢၼ်ႁႅင်းယႂ်ႇ",
+       "grant-blockusers": "ၽူႈၸႂ်ႉတိုဝ်း ၸိူဝ်းႁႄႉတတ်း လႄႈ ဢမ်ႇႁႄႉတတ်း",
+       "grant-createaccount": "ၵေႃႇသၢင်ႈဢၶွင်ႉ",
+       "grant-createeditmovepage": "ၵေႃႇသၢင်ႈ၊ မႄးထတ်း လႄႈ ၶၢႆႉဢွင်ႈ ၼႃႈလိၵ်ႈ",
+       "grant-delete": "မွတ်ႇ ၼႃႈလိၵ်ႈ၊ ၶူၼ်ႉလူ လႄ သဵၼ်ႈမၢႆ သႂ်ႇၶဝ်ႈ",
+       "grant-editinterface": "မႄးထတ်း လွၵ်းၸိုဝ်ႈ သိုဝ်ႇၶၢဝ်ႇဝီႇၶီႇ လႄႈ ၽူႈၸႂ်ႉတိုဝ်း CSS/JavaScript",
+       "grant-editmycssjs": "မႄးထတ်း ၽူႈၸႂ်ႉတိုဝ်း CSS/JavaScript ၸဝ်ႈၵဝ်ႇ",
+       "grant-editmyoptions": "မႄးထတ်း ငဝ်ႈၵုမ်းပိူင် ၽူႈၸႂ်ႉတိုဝ်း ၶွင်ၸဝ်ႈၵဝ်ႇ",
+       "grant-editmywatchlist": "မႄးထတ်း သဵၼ်ႈမၢႆပႂ်ႉတူၺ်းၸဝ်ႈၵဝ်ႇ",
+       "grant-editpage": "မႄးထတ်း ၼႃႈလိၵ်ႈ မီးယူႇ ယၢမ်းလဵဝ်ၼႆႉ",
+       "grant-editprotected": "မႄးထတ်း ၼႃႈလိၵ်ႈၸိူဝ်း ႁႄႉၵင်ႈဝႆႉ",
+       "grant-highvolume": "ၵၢၼ်မႄးထတ်း ဢၼ်ယႂ်ႇၵႂၢင်ႈ",
+       "grant-oversight": "လပ်ႉဝႆႉ ၽူႈၸႂ်ႉတိုဝ်း လႄႈ တဵၵ်းတဵင် ၶေႃႈၶူၼ်ႉလူ",
+       "grant-sendemail": "သူင်ႇဢီးမေးလ်ၸူး ၽူႈၸႂ်ႉတိုဝ်း တၢင်ႇၸိူဝ်း",
+       "grant-uploadeditmovefile": "လူတ်ႇၶိုၼ်ႈ၊  တၢင်တီႈ လႄႈ ၶၢႆႉၾၢႆႇ",
+       "grant-uploadfile": "လူတ်ႇၶိုၼ်ႈ ၾၢႆႇဢၼ်မႂ်ႇ",
+       "grant-basic": "သုၼ်ႇပိုၼ်ႉထၢၼ်",
+       "grant-viewdeleted": "တူၺ်း ၾၢႆႇလႄႈ ၼႃႈလိၵ်ႈ ၸိူဝ်းမွတ်ႇပႅတ်ႈယဝ်ႉ။",
+       "grant-viewmywatchlist": "တူၺ်း သဵၼ်ႈမၢႆပႂ်ႉတူၺ်း ႁင်းၶွင်ၵဝ်ႇ",
+       "newuserlogpage": "သၢႆမၢႆလွင်ႈၵေႃႇသၢင်ႈ ၽူႈၸႂ်ႉတိုဝ်း",
+       "newuserlogpagetext": "ဢၼ်ၼႆႉပဵၼ် သဵၼ်ႈမၢႆ လွင်ႈၵေႃႇသၢင်ႈ ၽူႈၸႂ်ႉတိုဝ်း။",
+       "rightslog": "သဵၼ်ႈမၢႆ သုၼ်ႇလႆႈ ၽူႈၸႂ်ႉတိုဝ်း",
+       "rightslogtext": "ဢၼ်ၼႆႉပဵၼ် သဵၼ်ႈမၢႆ လွင်ႈလႅၵ်ႈလၢႆႈ သုၼ်ႈလႆႈ ၽူႈၸႂ်ႉတိုဝ်း",
+       "action-read": "လူၼႃႈလိၵ်ႈၼႆႉ",
+       "action-edit": "မူၼ်ႉမႄး ၼႃႈလိၵ်ႈၼႆႉ",
+       "action-createpage": "ၵေႃႈသၢင်ႈ ၼႃႈလိၵ်ႈ",
+       "action-createtalk": "ၵေႃႇသၢင်ႈ ၼႃႈလိၵ်ႈ ဢုပ်ႇဢူဝ်းၵၼ်",
+       "action-createaccount": "ၵေႃႇသၢင်ႈ ဢၶွင်ႉၽူႈၸႂ်ႉတိုဝ်း ဢၼ်ၼႆႉ",
+       "action-autocreateaccount": "ၵေႃႇသၢင်ႈ ဢၶွင်ႉၽူႈၸႂ်ႉတိုဝ်း ၽၢႆႇၼွၵ်ႈ ႁင်းတူဝ်",
+       "action-history": "တူၺ်း ပိုၼ်းၼႃႈလိၵ်ႈဢၼ်ၼႆႉ",
+       "action-minoredit": "မၢႆလွင်ႈမႄးထတ်း ဢၼ်ၼႆႉ ႁႂ်ႈပဵၼ် ၵၢၼ်ၼွႆႉ",
+       "action-move": "ၶၢႆႉဢွင်ႈ ၼႃႈလိၵ်ႈၼႆႉ",
+       "action-move-subpages": "ၶၢႆႉဢွင်ႈ ၼႃႈလိၵ်ႈၼႆႉ လႄႈ ဢိၵ်ႇတင်း ၼႃႈလိၵ်ႈၽႄမၼ်း",
+       "action-move-rootuserpages": "ၶၢႆ့ၼႃႈလိၵ်ႉ ၽူႈၸႂ်ႉတိုဝ်း ငဝ်ႈႁၢၵ်ႈ",
+       "action-move-categorypages": "ၶၢႆ့ၼႃႈလိၵ်ႈ တွၼ်ႈၵၼ်",
+       "action-movefile": "ၶၢႆႉဢွင်ႈ ၾၢႆႇဢၼ်ၼႆႉ",
+       "action-upload": "လူတ်ႇၶိုၼ်ႈ ၾၢႆႇဢၼ်ၼႆႉ",
+       "action-reupload": "သႂ်ႇတဵင်ၵႂႃႇ ၼိူဝ် ၾၢႆႇဢၼ်မီးဝႆႉၼၼ်ႉ",
+       "action-reupload-shared": "ဢဝ်ၾၢႆႇၼႆႉ သႂ်ႇတဵင်ၵႂႃႇ ၵႃႈတီႈၼိူဝ် ယွင်ဢၼ်ၽႄႈၸႂ်ႉဝႆႉၼၼ်ႉ",
+       "action-upload_by_url": "လုၵ်ႉၵႃႈတီႈ URL သေ လူတ်ႇၶိုၼ်ႈ ၾၢႆႇဢၼ်ၼႆႉ",
+       "action-writeapi": "ၸႂ်ႉတိုဝ်း လွင်ႈတႅမ်ႈ API",
+       "action-delete": "မွတ်ႇပႅတ်ႈၼႃႈလိၵ်ႈၼႆႉ",
+       "action-deleterevision": "မွတ်ႇပႅတ်ႈ ၶေႃႈၶူၼ်ႉလူဢၼ်ၼႆႉ",
+       "action-deletedhistory": "တူၺ်း ပိုၼ်းၸိူဝ်းမွတ်ႇပႅတ်ႈ ၶွင်ၼႃႈလိၵ်ႈၼႆႉ",
+       "action-browsearchive": "ၶူၼ်ႉႁႃ ၼႃႈလိၵ်ႈ ၸိူဝ်းမွတ်ႇပႅတ်ႈၵႂႃႇ",
+       "action-undelete": "ဢဝ်ၶိုၼ်း ၼႃႈလိၵ်ႈၼႆ့",
+       "action-suppressrevision": "တူၺ်းထတ်းၶိုၼ်း လႄႈ ၶိုၼ်းဢဝ် ၶေႃႈၶူၼ်ႉႁႃဢၼ်လပ်ႉသိူင်ႇဝႆႉ",
+       "action-suppressionlog": "တူၺ်း သဵၼ်ႈမၢႆ သုၼ်ႇတူဝ်",
+       "action-block": "​ႁႄႉတတ်း ၽူႈၸႂ်ႉတိုဝ်းတၢင်ႇၸိူဝ်း ၵႃႈတီႈ ၵၢၼ်မႄးထတ်း",
+       "action-protect": "လႅၵ်ႈလၢႆႈၸၼ်ႉထၢၼ်ႈ ၵၢၼ်ႁႄႉၵင်ႈ တွၼ်ႈတႃႇ ၼႃႈလိၵ်ႈၼႆႉ",
+       "action-import": "ဢဝ်ၼႃႈလိၵ်ႈ ၸိူဝ်းလုၵ်ႉၵႃႈတီႈ ဝီႇၶီႇတၢင်ႇၸိူဝ်း သႂ်ႇၶဝ်ႈ",
+       "action-importupload": "ဢဝ်ၼႃႈလိၵ်ႈၸိူဝ်း ၵႃႈတီႈၾၢႆႇလူတ်ႇၶိုၼ်ႈၼၼ်ႉ သႂ်ႇၶဝ်ႈ",
+       "action-unwatchedpages": "တူၺ်းသဵၼ်ႈမၢႆ ၼႃႈလိၵ်ႈတူၺ်း ဢမ်ႇပႆႇလႆႈတူၺ်းဝႆႉၼၼ်ႉ",
+       "action-mergehistory": "ဢဝ်ပိုၼ်းၶွင်ၼႃႈလိၵ်ႈ ႁူမ်ႈၵၼ်",
+       "action-userrights": "မႄးထတ်းသုၼ်ႇလႆႈ တႃႇၽူႈၸႂ်ႉတိုဝ်း တင်းသဵင်ႈ",
+       "action-userrights-interwiki": "မႄးထတ်း သုၼ်ႇလႆႈ ၽူႈၸႂ်ႉတိုဝ်း ၸိူဝ်းပဵၼ် ၽူႈၸႂ်ႉတိုဝ်း ဢၼ်မီးဝႆႉယူႇ ၵႃႈတီႈၼိူဝ် ဝီႇၶီႇတၢင်ႇၸိူဝ်း",
+       "action-siteadmin": "ၶတ်းသေႃး လႄႈ ဢမ်ႇၶတ်းသေႃး ယွင်ၶေႃႈမုၼ်း",
+       "action-sendemail": "သူင်ႇ ဢီးမေးလ်",
+       "action-editmywatchlist": "မႄးထတ်း သဵၼ်ႈမၢႆပႂ်ႉတူၺ်းၸဝ်ႈၵဝ်ႇ",
+       "action-viewmywatchlist": "တူၺ်း သဵၼ်ႈမၢႆပႂ်ႉတူၺ်း ႁင်းၶွင်ၵဝ်ႇ",
+       "action-viewmyprivateinfo": "တူၺ်း လွၼ်ႉၶၢဝ်ႇသုၼ်ႇတူဝ် ၸဝ်ႈၵဝ်ႇ",
+       "action-editmyprivateinfo": "မႄးထတ်း လွၼ်ႉၶၢဝ်ႇသုၼ်ႇတူဝ် ၸဝ်ႈၵဝ်ႇ",
+       "action-editcontentmodel": "မႄးထတ်း ၽၢင်ႁၢင်ႈတူဝ်ၶဝ်ႈပႃး ၶွင်ၼႃႈလိၵ်ႈ",
+       "action-managechangetags": "ၵေႃႇသၢင်ႈ လႄႈ (ဢမ်ႇ)တူင်ႉတိုၼ်ႇ တူဝ်တိင်",
+       "action-applychangetags": "တိင်ၸပ်းၸွမ်းၼင်ႇ လွင်ႈလႅၵ်ႈလၢႆႈၸဝ်ႈၵဝ်ႇ",
+       "action-deletechangetags": "မွတ်ႇပႅတ်ႈ တိင်ႇၸိူဝ်းမီးယူႇ ၵႃႈတီႈ ယွင်ၶေႃႈမုၼ်း",
+       "nchanges": "$1 {{PLURAL:$1|လႅၵ်ႈလၢႆႈ|ၸိူဝ်းလႅၵ်ႈလၢႆႈ}}",
+       "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|ၸဵမ်မိူဝ်ႈ ၵႂႃႇဢႅတ်ႇပွၵ်ႈၵမ်းလိုၼ်း}}",
+       "enhancedrc-history": "ပိုၼ်း",
+       "recentchanges": "မီးလွင်ႈလႅၵ်ႈလၢႆႈပႆႇႁိုင်",
+       "recentchanges-legend": "ၵၼ်လိူၵ်ႈသၢင်ႈ လွင်ႈလႅၵ်ႈလၢႆႈဢၼ်ပူၼ်ႉမႃး",
+       "recentchanges-summary": "ၸွမ်းတူၺ်းႁွႆး ဢၼ်ပဵၼ်ၵၢၼ် တိုၵ်ႉႁႃလႅၵ်ႈလၢႆႈၵႂႃႇ တွၼ်ႈတႃႇၼႃႈလိၵ်ႈ ဝီႇၶီႇၼႆႉ။",
+       "recentchanges-feed-description": "ၸွမ်းတူၺ်းႁွႆး ဢၼ်ပဵၼ်ၵၢၼ် တိုၵ်ႉႁႃလႅၵ်ႈလၢႆႈၵႂႃႇ တွၼ်ႈတႃႇၼႃႈလိၵ်ႈ ဝီႇၶီႇၼႆႉ။",
+       "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|သဵၼ်ႈမၢႆ ၼႃႈလိၵ်ႈဢၼ်မႂ်ႇ]])",
+       "recentchanges-submit": "ၼႄ",
+       "rclistfrom": "ၼႄ လွင်ႈ​လႅၵ်ႈလၢႆႈဢၼ်မႂ်ႇ တႄႇတီႈ $2, $3",
+       "rcshowhideminor": "$1 လွင်ႈမူၼ်ႉမႄး ဢိတ်းဢီႈ",
+       "rcshowhideminor-show": "ၼႄ",
+       "rcshowhideminor-hide": "သိူင်ႇ",
+       "rcshowhidebots": "$1 ၿွတ်ႉ",
+       "rcshowhidebots-show": "ၼႄ",
+       "rcshowhidebots-hide": "သိူင်ႇ",
+       "rcshowhideliu": "$1 ၽူႈၸႂ်ႉ ဢၼ်တၢင်ႇမၢႆၽၢင်ဝႆႉ",
+       "rcshowhideliu-show": "ၼႄ",
+       "rcshowhideliu-hide": "သိူင်ႇ",
+       "rcshowhideanons": "$1 ၽူႈၸႂ်ႉတိုဝ်းဢမ်ႇသႂ်ႇၸိုဝ်ႈ",
+       "rcshowhideanons-show": "ၼႄ",
+       "rcshowhideanons-hide": "သိူင်ႇ",
+       "rcshowhidepatr-show": "ၼႄ",
+       "rcshowhidepatr-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",
+       "number_of_watching_users_pageview": "[$1 ပႂ်ႉတူၺ်း {{PLURAL:$1|ၽူႈၸႂ်ႉတိုဝ်း|ၽူႈၸႂ်ႉတိုဝ်းၶဝ်}}]",
+       "rc_categories_any": "လိူၵ်ႈသေဢၼ်ဢၼ်",
+       "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} ဝၢႆးသေလႅၵ်ႈလၢႆႈ",
+       "newsectionsummary": "/* $1 */ ၵၼ်ဢၼ်မႂ်ႇ",
+       "rc-enhanced-expand": "ၼႄပၼ် ႁူဝ်ယွႆႈမၼ်း",
+       "rc-enhanced-hide": "သိူင်ႇဝႆႉ ႁူဝ်ယွႆႈမၼ်း",
+       "rc-old-title": "ၵေႃႇသၢင်ႈဝႆႉၼင်ႇ ငဝ်ႈတိုၼ်းမၼ်း \"$1\"",
+       "recentchangeslinked": "တၢင်း​လႅၵ်ႈ​လၢႆႈ ဢၼ်​ၵဵဝ်ႇ​ၵွင်ႉ",
+       "recentchangeslinked-feed": "တၢင်း​လႅၵ်ႈ​လၢႆႈ ဢၼ်​ၵဵဝ်ႇ​ၵွင်ႉ",
+       "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]] ထႅမ်သႂ်ႇဝႆႉယဝ်ႉ တီႈၼႂ်းတွၼ်ႈၵၼ်, [[Special:WhatLinksHere/$1|ၼႃႈလိၵ်ႈၼႆႉ မၼ်းၶဝ်ႈပႃးဝႆႉ ၵႃႈတီႈၼႂ်း ၼႃႈလိၵ်ႈ တၢင်ႇၸိူဝ်း]]",
+       "recentchanges-page-removed-from-category": "[[:$1]] ဢဝ်ဢွၵ်ႇတမ်ႈတီႈ ပၢႆး",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]]ထွၼ်ပႅတ်ႈယဝ်ႉ ၵႃႈတီႈ တွၼ်ႈၵၼ်, [[Special:WhatLinksHere/$1|ၼႃႈလိၵ်ႈၼႆႉ မၼ်းၶဝ်ႈပႃးဝႆႉ ၵႃႈတီႈၼႂ်း ၼႃႈလိၵ်ႈ တၢင်ႇၸိူဝ်း]]",
+       "autochange-username": "သိုဝ်ႇၶၢဝ်ႇဝီႇၶီႇ လႅၵ်ႈလၢႆႈ ႁင်းတူဝ်",
+       "upload": "လူတ်ႇၶိုၼ်ႈၾၢႆႇ",
+       "uploadbtn": "လူတ်ႇၶိုၼ်ႈၾၢႆႇ",
+       "reuploaddesc": "ယႃႉပႅတ်ႈ ၵၢၼ်လူတ်ႇၶိုၼ်ႈသေ ၶိုၼ်းဝၢႆပွၵ်ႈၸူး ၼႃးလိၵ်ႈ လူတ်ႇၶိုၼ်ႈ",
+       "uploadnologin": "ဢမ်ႇလႆႈၶဝ်ႈလွၵ်ႉဢိၼ်ႇဝႆ့",
+       "uploadnologintext": "ၶႅၼ်းတေႃႈ  $1 တႃႇလူတ်ႇၶိုၼ်ႈ ၾၢႆႇ။",
+       "upload_directory_missing": "ၾူဝ်ႇတိူဝ်ႇ လူတ်ႇၶိုၼ်ႈဢၼ် ($1) ၼႆႉၼႆႉ မၼ်းႁၢႆဝႆႉ​လႄႈ မၼ်းတေဢမ်ႇၸၢင်ႈၵႂႃႇ ၵေႃႇသၢင်ႈလႆႈတီႈ သႃႇပိူဝ်ႇဝႅပ်ႉ။",
+       "upload_directory_read_only": "ၾူဝ်ႇတိူဝ်ႇလူတ်ႇၶိုၼ်ႈ ($1) ဢၼ်ၼႆႉၼႆႉ မၼ်းတေဢမ်ႇၸၢင်ႈတႅမ်ႈ တင်း သႃႇပိူဝ်ႇဝႅပ်ႉ",
+       "uploaderror": "ၵၢၼ်လူတ်ႇၶိုၼ်ႈ ၽိတ်းပိူင်ႈ",
+       "upload-recreate-warning": "<strong>ၽၢင်ႉ : ၾၢႆႇဢၼ်ၼင်ႇၸိုဝ်ႈၼၼ်ႉ ထုၵ်ႇမွတ်ႇပႅတ်ႈ ဢမ်ႇ ထုၵ်ႇၶၢႆႉဢွင်ႈတီႈယဝ်ႉ။</strong>\n\nသဵၼ်ႈမၢႆ မွတ်ႇပႅတ်ႈ လႄ သဵၼ်ႈမၢႆ ၶၢႆႉတီႈတွၼ်ႈတႃႇ ၼႃႈလိၵ်ႈၼႆႉ လႆႈၵမ်ႉထႅမ်ဝႆႉပၼ် တီးၼႆႉသေ ယိူင်းဢၢၼ်းႁႂ်ႈ ငၢႆႈလူမ်ၸႂ် :",
+       "uploadlogpage": "သဵၼ်ႈမၢႆ လူတ်ႇၶိုၼ်ႈ",
+       "filename": "ၸိုဝ်ႈၾၢႆႇ",
+       "filedesc": "ႁူဝ်ႁုပ်ႈ",
+       "fileuploadsummary": "ႁူဝ်ႁုပ်ႈ",
+       "filereuploadsummary": "လွင်ႈလႅၵ်ႈလၢႆႈ ၾၢႆႇ :",
+       "filestatus": "သၢႆငၢႆ သုၼ်ႇထုတ်ႇၸႂ်ႉ :",
+       "filesource": "ငဝ်ႈငႃႇ :",
+       "ignorewarning": "ၶၢမ်ႈပႅတ်ႈ ၶေႃႈၽၢင်ႉသေ ပဵၼ်ႁိုဝ်ၵေႃႈ သိမ်းၾၢႆႇဝႆႉ",
+       "ignorewarnings": "ၶၢမ်ႈပႅတ်ႈ ၶေႃႈၽၢင်ႉ ၵူႈဢၼ်ဢၼ်",
+       "minlength1": "ၸိုဝ်ႈၾၢႆႇ ၼႆႉ တီႈဢေႇသုတ်းတေလႆႈပႃး လိၵ်ႈၼိုင်ႈတူဝ်",
+       "filename-toolong": "ၸိုဝ်ႈၾၢႆႇၼႆႉ တေဢမ်ႇလႆႈယၢဝ်းပူၼ်ႉလိူဝ် 240 bytes",
+       "badfilename": "ၸိုဝ်ႈၾၢႆႇၼႆႉ ထုၵ်ႇလႅၵ်ႈလၢႆႈပဵၼ်ၸူး \"$1\" ယဝ်ႈ။",
+       "filetype-missing": "ၾၢႆႇၼႆႉဢမ်ႇမီးယွႆးလင် (မိူၼ်ၼင်ႇ \".jpg\")",
+       "empty-file": "ၾၢႆႇဢၼ်ၸဝ်ႈၵဝ်ႇ မၵ်းမၼ်ႈယိုၼ်ႈမႃးၼၼ်ႉ မၼ်းပဝ်ႇဝႆႉ။",
+       "file-too-large": "ၾၢႆႇဢၼ်ၸဝ်ႈၵဝ်ႇ မၵ်းမၼ်ႈယိုၼ်ႈမႃးၼၼ်ႉ မႂ်းယႂ်ႇႁႅင်းၼႃႇ။",
+       "filename-tooshort": "ၸိုဝ်ႈၾၢႆႇၼႆႉ ပွတ်းႁႅင်းၼႃႇၽႅဝ်။",
+       "filetype-banned": "လိူင်ႈၾၢႆႇမဵဝ်းၼႆႉ ၼႆႉ ထုၵ်ႇဢိုတ်းတတ်းဝႆႉ။",
+       "verification-error": "ၾၢႆႇဢၼ်ၼႆႉၼႆႉ မၼ်းဢမ်ႇၶၢမ်ႈပူၼ်ႉလႆႈ ၵၢၼ်ၼႄႉၼွၼ်း။",
+       "illegal-filename": "ၸိုဝ်ႈၾၢႆႇဢၼ်ၼႆႉ မၼ်းဢမ်ႇၶႂၢင်းပၼ်ႁႂ်ႈၸႂ်ႉ။",
+       "overwrite": "လွင်ဢဝ်တဵင်သႂ်ႇ ၾၢႆႇဢၼ်မီးဝႆႉၼႆႉၵေႃႈ ဢမ်ႇလႆႈၶႂၢင်ႈပၼ်ဝႆႉ။",
+       "unknown-error": "လွင်ႈၽိတ်းပိူင်ႈ ဢၼ်ဢမ်ႇလၢမ်းလႆႈၼၼ်ႉ ဢွၵ်ႇပဵၼ်ဝႆႉ။",
+       "tmp-create-error": "ဢမ်ႇၸၢင်ႈၵေႃႇသၢင်ႈ ၾၢႆႇတိုဝ်းၸူဝ်ႈၵႅပ်ႉ။",
+       "tmp-write-error": "ၵၢၼ်တႅမ်ႈ ၾၢႆႇၸႂ်ႉတိုဝ်း ၸူဝ်ႈၵႅပ်ႉၼႆႉ ၽိတ်းပိူင်ႈဝႆႉ။",
+       "windows-nonascii-filename": "ဝီႇၶီႇၼႆႉ မၼ်းဢမ်ႇၵမ်ႉထႅမ်ဝႆႉပၼ် ၸိုဝ်ႈၾၢႆႇ ဢၼ်ၸႂ်ႉပႃးတင်း တူဝ်လိၵ်ႈၶိုၵ်ႉတွၼ်း။",
+       "uploadwarning": "ၶေႃႈၽၢင်ႉတႃႇ ၵၢၼ်လူတ်ႇၶိုၼ်ႈ",
+       "uploadwarning-text": "ၶႅၼ်းတေႃႈ မႄးပၼ်ၶိုၼ်း ၶေႃႈသပ်းလႅင်း ၾၢႆႇ ဢၼ်ၽၢႆႇတႂ်ႈၼႆႉသေ ၶိုၼ်းၶတ်းၸႂ်တူၺ်းထႅင်ႈလႄႈ။",
+       "savefile": "သိမ်း ၾၢႆႇ",
+       "uploaddisabled": "ၵၢၼ်လူတ်ႇၶိုၼ်ႈ ထုၵ်ႇဢိုတ်းဝႆႉ။",
+       "copyuploaddisabled": "ၵၢၼ်လူတ်ႇၶိုၼ်ႈၵႃႈတီႈ URL ၼႆႉ ထုၵ်ႇဢိုတ်းဝႆႉ။",
+       "uploaddisabledtext": "ၵၢၼ်လူတ်ႇၾၢႆႇၶိုၼ်ႈၼႆႉ ထုၵ်ႇဢိုတ်းဝႆႉ။",
+       "php-uploaddisabledtext": "ၵၢၼ်လူတ်ႇၾၢႆႇၶိုၼ်ႈၼႆႉ ထုၵ်ႇဢိုတ်းဝႆႉ ၵႃႈတီႈၼႂ်း PHP ။\nၶႅၼ်းတေႃႇ ၵႂႃႇၵူတ်ႇတူၺ်း ၵၢၼ်တင်ႈတႃႈ ၵၢၼ်လူတ်ႇၶိုၼ်ႈၾၢႆႇ။",
+       "upload-source": "ၾၢႆႇငဝ်ႈငႃႇ",
+       "sourcefilename": "ၸိုဝ်ႈၾၢႆႇငဝ်ႈငႃႇ :",
+       "sourceurl": "URL ငဝ်ႈငႃႈ :",
+       "destfilename": "ၸိုဝ်ႈၾၢႆႇ ယိူင်းၸူး :",
+       "upload-maxfilesize": "သႅၼ်းၾၢႆ ဢၼ်ယႂ်ႇသုတ်း : $1",
+       "upload-description": "ၶေႃႈသပ်းလႅင်း ၾၢႆႇ",
+       "upload-options": "ၵၼ်လိူၵ်ႈသၢင်ႈ ၵၢၼ်လူတ်ႇၶိုၼ်ႈ",
+       "watchthisupload": "ပႂ်ႉတူၺ်းၾၢႆႇဢၼ်ၼႆႉ",
+       "upload-dialog-title": "လူတ်ႇၶိုၼ်ႈၾၢႆႇ",
+       "upload-dialog-button-cancel": "ဢမ်ႇႁဵတ်း",
+       "upload-dialog-button-done": "ယဝ်ႉ",
+       "upload-dialog-button-save": "ၵဵပ်းသိမ်း",
+       "upload-dialog-button-upload": "လူတ်ႇၶိုၼ်ႈ",
+       "upload-form-label-infoform-title": "ႁူဝ်ယွႆႈ",
+       "upload-form-label-infoform-name": "ၸိုဝ်ႈ",
+       "upload-form-label-infoform-description": "ၶေႃႈသပ်းလႅင်း",
+       "upload-form-label-usage-title": "ၶေႃႈၸႂ်ႉ",
+       "upload-form-label-usage-filename": "ၸိုဝ်ႈၾၢႆႇ",
+       "upload-form-label-own-work": "ဢၼ်ၼႆႉပဵၼ် ၼႃႈၵၢၼ်တူဝ်ၶႃႈ။",
+       "upload-form-label-infoform-categories": "လိူင်ႈ",
+       "upload-form-label-infoform-date": "ဝၼ်းထီႉ",
+       "lockmanager-notlocked": "ဢမ်ႇၸၢင်ႈ ပိုတ်ႇသေႃး \"$1\"; ၼၼ်ႉမၼ်းဢမ်ႇလႆႈ ၶတ်းဝႆႉ။",
+       "lockmanager-fail-closelock": "ဢမ်ႇၸၢင်ႈဢိုတ်း ၾၢႆႇဢၼ်ၶတ်းဝႆႉ တွၼ်ႈတႃႇ \"$1\" ။",
+       "lockmanager-fail-deletelock": "ဢမ်ႇၸၢင်ႈမွတ်ႇပႅတ်ႈ ၾၢႆႇဢၼ်ၶတ်းဝႆႉ တွၼ်ႈတႃႈ \"$1\".",
+       "lockmanager-fail-acquirelock": "ဢမ်ႇၸၢင်ႈဢဝ် ၶတ်းတွၼ်ႈတႃႇ \"$1\" ။",
+       "lockmanager-fail-openlock": "ဢမ်ႇၸၢင်ႈဢိုတ်း ၾၢႆႇဢၼ်ၶတ်းဝႆႉ တွၼ်ႈတႃႇ \"$1\" ။",
+       "lockmanager-fail-releaselock": "ဢမ်ႇၸၢင်ႈပွႆႇပၼ် ဢၼ်ၶတ်း တွၼ်ႈတႃႈ \"$1\" ။",
+       "lockmanager-fail-db-release": "ဢမ်ႇၸၢင်ႈပွႆႇပၼ်ၵၢၼ်ၶတ်း ၵႃႈတီႈ ယွင်ၶေႃႈမုၼ်း $1 ။",
+       "lockmanager-fail-svr-acquire": "ဢမ်ႇၸၢင်ႈဢဝ်လႆႈ ၵၢၼ်ၶတ်း ၵႃႈတီႈၼိူဝ် သႃႇပိူဝ်ႇ $1 ။",
+       "lockmanager-fail-svr-release": "ဢမ်ႇၸၢင်ႈပွႆႇပၼ် ၵၢၼ်ၶတ်း ၵႃႈတီႈၼိူဝ် သႃႇပိူဝ်ႇ $1 ။",
+       "zip-wrong-format": "ၾၢႆႇဢၼ်မၵ်းမၼ်ႈဝႆႉပၼ်ၼၼ်ႉ မၼ်းဢမ်ႇၸႂ်ႈ ၾၢႆႇ ZIP ။",
+       "zip-bad": "ၾၢႆႇၼႆႉ မၼ်းၵွႆဝႆႉ ဢမ်ႇၼၼ် မၼ်းပဵၼ် ၾၢႆႇ ZIP ဢၼ်ဢမ်ႇလူႇလႆႈ။\nမၼ်းဢမ်ႇၸၢင်ႈ ၵူတ်ႇတူၺ်း တွၼ်ႈတႃႇ ပၢႆးႁူမ်ႇလူမ်ႈ လႆႈလီလီ။",
+       "zip-unsupported": "ၾၢႆႇၼႆႉပဵၼ် ZIP ၾၢႆႇ ဢၼ်ၸႂ်ႉဝႆႉ ၽၢင်ႁၢင်ႈၵၢၼ် ZIP ဢၼ် သိူဝ်ႇၶၢဝ်ႇဝီႇၶီႇ ဢမ်ႇၵမ်ႉထႅမ်ဝႆႉ။  မၼ်းဢမ်ႇၸၢင်ႈ ၵူတ်ႇတူၺ်း တွၼ်ႈတႃႇ ပၢႆးႁူမ်ႇလူမ်ႈ လႆႈလီလီ။",
+       "uploadstash": "လူတ်ႇၶိုၼ်ႈ ၵၢၼ်သိူင်ႇ",
+       "uploadstash-clear": "ၽဵဝ်ႈလၢင်ႈ ၾၢႆႇၸိူဝ်းသိူင်ႇသိမ်းဝႆႉ",
+       "uploadstash-nofiles": "တီႈၸဝ်ႈၵဝ်ႇ ဢမ်ႇမီးၾၢႆႇသိူင်ႇသိမ်းသင်။",
+       "uploadstash-errclear": "လွင်ႈၽဵဝ်ႈလၢင်ႉၾၢႆႇဢမ်ႇၶႅမ်ႉလႅပ်ႈ။",
+       "uploadstash-refresh": "သၢႆႇၶိုၼ်း သဵၼ်ႈမၢႆၾၢႆႇ",
+       "uploadstash-thumbnail": "တူၺ်းၼင်ႇ ႁၢင်ႈလဵၵ်ႉ",
+       "img-auth-accessdenied": "ၵၢၼ်ၸႂ်ႉတိုဝ်း ထုၵ်ႇထဵင်ၶိုၼ်း။",
+       "img-auth-nologinnWL": "ၸဝ်ႈၵဝ်ႇ ဢမ်ႇလႆႈၶဝ်ႈ လွၵ်ႉဢိၼ်ဝႆႉသေ \"$1\" ၼႆႉ မၼ်းဢမ်ႇမီးဝႆႉ တီႈၼႂ်း သဵၼ်ႈမၢႆၶၢဝ်။",
+       "img-auth-nofile": "ၾၢႆႇ \"$1\" ၼႆႉ မၼ်းဢမ်ႇမီးဝႆႉ။",
+       "img-auth-isdir": "ၸဝ်ႈၵဝ်ႇ တိုၵ်ႉၶတ်းၸႂ်ႉ ၶဝ်ႈၸႂ်ႉ ၾူဝ်ႇတိူဝ်ႇ \"$1\" ယူႇ။\nၶႂၢင်းဝႆႉပၼ် ၵၢၼ်ၸႂ်ႉတိုဝ်းၾၢႆႇၵူၺ်း။",
+       "img-auth-streaming": "သၢႆလႆ \"$1\" ။",
+       "img-auth-noread": "ၽူႈၸႂ်ႉတိုဝ်းၼႆႉဢမ်ႇမီးသုၼ်ႇၸႂ်ႉ တႃႇတေလူ \"$1\" ။",
+       "http-invalid-url": "URL ပိူင်ႈဝႆႉ : $1",
+       "http-invalid-scheme": "ပိူင် URLs တင်း \"$1\" ၼႆႉ မၼ်းဢမ်ႇလႆႈ ၵမ်ႉထႅမ်ပၼ်ဝႆႉ။",
+       "http-request-error": "ၶေႃႈတုၵ်းယွၼ်း HTTP ၼၼ်ႉ ဢမ်ႇၶႅမ်ႉလႅပ်ႈ လွင်ႈလူၺ်ႈ ပဵၼ်လွင်ႈၽိတ်းပိူင်ႈ ဢၼ်ဢမ်ႇႁူႉၸွမ်းလႆႈ။",
+       "http-read-error": "ၵၢၼ်လူ HTTP ၽိတ်းပိူင်ႈ ။",
+       "http-timed-out": "ၵၢၼ်တုၵ်းယွၼ်း HTTP ယၢမ်းသုတ်းၵႂႃႇ။",
+       "http-curl-error": "URL ဢၼ်တိုၵ်ႉႁွင်ႉ ၵၢၼ်ၽိတ်းပိူင်ႈ : $1",
+       "http-bad-status": "ၽွင်းမိူဝ်ႈတိုၵ်ႉ တုၵ်းယွၼ်း HTTP ၼၼ်ႉ လႆႈပဵၼ်လွင်ႈၽိတ်းပိူင်ႈဝႆႉ : $1 $2",
+       "upload-curl-error6": "ဢမ်ႇၸၢင်ႈ ၽဵဝ်ၸူးၵႃႈတီႈ URL",
+       "upload-curl-error6-text": "URL ဢၼ်ၵမ်ႉထႅမ်ဝႆႉပၼ်ၼႆႉ ဢမ်ႇၸၢင်ႈၽႅဝ်ထိုင်ၸူး။\nၶႅၼ်းတေႃႈ ၶိုၼ်းၵူတ်ႇတူၺ်းပွၵ်ႈသွင်ဝႃႈ URL ၼၼ်ႉ မႅၼ်ႈယူႇၼႆသေ သၢႆႉၵေႃႈ ၶိုၼ်ႈမီးဝႆႉ။",
+       "upload-curl-error28": "ၶၢဝ်းယၢမ်း ၵၢၼ်လူတ်ႇၶိုၼ်ႈ သုတ်းၵႂႃႇ",
+       "upload-curl-error28-text": "သၢႆႉဢၼ်ၼႆႉ တႃႇတေတူင်ႉတွပ်ႇၶိုၼ်းၼႆႉ မၼ်းႁိုင်ႁႅင်းၼႃႇ။\nၶႅၼ်းတေႃႇ ၵူတ်ႇတူၺ်းဝႃႈ သၢႆႉၼႆႉ ၶိုၼ်ႈယူႇႁႃႉ၊ ၽွင်းမိူဝ်ႈ တိုၵ်ႉၶိုၼ်းၶတ်းၸႂ်တူၺ်း ၼၼ်ႉ ပႂ်ႉပၼ် ၸူဝ်ၶၢဝ်း။ ၸဝ်ႈၵဝ်ႇတေလႅပ်ႈၶႂ်ႈ ၶိုၼ်းႁဵတ်းတူၺ်း ၽွင်းမိူဝ်ႈ ဢမ်ႇပေႃး ၵၢၼ်သုၵ်ႉၼၼ်ႉ။",
+       "license": "ဝႂ်ၶႂၢင်း :",
+       "license-header": "ဝႆၶႂၢင်း",
+       "nolicense": "ဢမ်ႇလႆႈလိူၵ်ႈသင်ဝႆႉ",
+       "licenses-edit": "မႄးထတ်း ၵၢၼ်လိူၵ်ႈသၢင်ႈ ဝႂ်ၶႂၢင်း",
+       "upload_source_url": "(ၾၢႆႇဢၼ်ၸဝ်ႈၵဝ်ႇလိူၵ်ႈဝႆႉၵႃႈတီႈ ဢၼ်မၢၼ်ႇမႅၼ်ႈ၊ URL ဢၼ်ၵူၼ်းတၢင်းၼမ် ၸၢင်ႈၸႂ်ႉလႆႈ )",
+       "upload_source_file": "(ၸဝ်ႈၵဝ်ႇလႆႈလိူၵ်ႈဝႆႉၾၢႆႇ ၵႃႈတီႈ ၶွမ်ႇပိဝ်ႇတႃႇ ၸဝ်ႈၵဝ်ႇ)",
+       "listfiles-delete": "မွတ်ႇပႅတ်ႈ",
+       "listfiles-summary": "ၼႃႈလိၵ်ႈၶိုၵ်ႉတွၼ်းဢၼ်ၼႆႉ မၼ်းၼႄပၼ် ၾၢႆႇ ၸိူဝ်းလူတ်ႇၶိုၼ်ႈဝႆႉ တင်းသဵင်ႈ။",
+       "listfiles_search_for": "ၶူၼ်ႉႁႃတႃႇ ၸိုဝ်ႈသိုဝ်ႇၶၢဝ်ႇ :",
+       "listfiles-userdoesnotexist": "ဢၶွင်ႉ ၽူႈၸႂ်ႉတိုဝ်း \"$1\" ၼႆႉ ဢမ်ႇပႆႇလႆႈ တၢင်ႇမၢႆၽၢင်ဝႆႉ။",
+       "imgfile": "ၾၢႆႇ",
+       "listfiles": "သဵၼ်ႈမၢႆၾၢႆႇ",
+       "listfiles_thumb": "ႁၢင်ႈလဵၵ်ႉ",
+       "listfiles_date": "ဝၼ်းထီႉ",
+       "listfiles_name": "ၸိုဝ်ႈ",
+       "listfiles_user": "ၽူႈၸႂ်ႉတိုဝ်း",
+       "listfiles_size": "သႅၼ်း",
+       "listfiles_description": "ၶေႃႈသပ်းလႅင်း",
+       "listfiles_count": "မၢႆဢွၵ်ႇ",
+       "listfiles-show-all": "ၶဝ်ႈပႃးဝႆႉ ၶႅပ်းႁႃင်ႈၸိူဝ်း ပဵၼ်မၢႆဢွၵ်ႇၵဝ်ႇ။",
+       "listfiles-latestversion": "မၢႆဢွၵ်ႇ ယၢမ်းလဵဝ်",
+       "listfiles-latestversion-yes": "ၸႂ်ႈယဝ်ႉ",
+       "listfiles-latestversion-no": "ဢမ်ႇ",
+       "file-anchor-link": "ၾၢႆႇ",
+       "filehist": "ပိုၼ်းၾၢႆႇ",
+       "filehist-help": "တဵၵ်းၼိူဝ် ဝၼ်းထိ/ၶၢဝ်းယၢမ်း တႃႇႁၼ်ၾၢႆႇ ၼႂ်းဝၼ်းၼၼ်ႉ",
+       "filehist-deleteall": "မွတ်ႇပႅတ်ႈမူတ်း",
+       "filehist-deleteone": "မွတ်ႇပႅတ်ႈ",
+       "filehist-revert": "ပိၼ်ႇပွၵ်ႈၶိုၼ်း",
+       "filehist-current": "ယၢမ်းလဵဝ်",
+       "filehist-datetime": "ဝၼ်းထီႉ/ၶၢဝ်းယၢမ်း",
+       "filehist-thumb": "ႁၢင်ႈလဵၵ်ႉ",
+       "filehist-thumbtext": "ၽၢင်ယဵမ်ႈ တွၼ်ႈတႃႇ ပိူဝ်းသျိၼ်းၼင်ႇ  $1",
+       "filehist-nothumb": "ဢမ်ႇမီး ႁၢင်ႈလဵၵ်ႉ",
+       "filehist-user": "ၽူႈၸႂ်ႉတိုဝ်း",
+       "filehist-dimensions": "သႅၼ်းမၼ်း",
+       "filehist-filesize": "သႅၼ်းၾၢႆႇ",
+       "filehist-comment": "တၢင်းႁၼ်ထိုင်",
+       "imagelinks": "လွင်ႈၸႂ်ႉတိုဝ်း ၾၢႆႇ",
+       "linkstoimage": "{{PLURAL:$1|ၼႃႈလိၵ်ႈ|$1 ၼႃႈလိၵ်ႈ}} ၵွင်ႉမႃးၸူးၾၢႆႇၼႆႉ:",
+       "nolinkstoimage": "ဢမ်ႇမီးၼႃႈလိၵ်ႈဢၼ်ၵွင်ႉၸူး ၾၢႆႇဢၼ်ၼႆႉ",
+       "morelinkstoimage": "တူၺ်း [[Special:WhatLinksHere/$1|ႁဵင်းၵွင်ႉတၢင်ႇၸိူဝ်း]] ၸူး ၾၢႆႇဢၼ်ၼႆႉ။",
+       "linkstoimage-redirect": "$1 (ပိၼ်ႇၸီႉ ၾၢႆႇၸူး) $2",
+       "sharedupload": "ၾၢႆႇဢၼ်ၼႆႉ လုၵ်ႉၵႃႈတီႈ $1 မႃးသေ ၼႃႈၵၢၼ်တၢင်ႇၸိူဝ်းၵေႃႈ ဢၢပ်ႈတေဢဝ်ၸႂ်ႉဝႆႉ။",
+       "sharedupload-desc-there": "ၾၢႆႇဢၼ်ၼႆႉ လုၵ်ႉၵႃႈတီႈ $1 မႃးသေ ၼႃႈၵၢၼ်တၢင်ႇၸိူဝ်းၵေႃႈ ဢၢပ်ႈတေဢဝ်ၸႂ်ႉဝႆႉ။\nၶႅၼ်းတေႃႈ တူၺ်းပၼ်  [$2 ၼႃႈလိၵ်ႈၶေႃႈသပ်းလႅင်းၾၢႆႇ] တွၼ်ႈတႃႇ လွၼ်ႉၶၢဝ်ႇ တၢင်ႇၸိူဝ်း။",
+       "sharedupload-desc-here": "ၾၢႆႇဢၼ်ၼႆႉ လုၵ်ႉတီႈ $1 သေ တေၸၢင်ႈၵႂႃႇၸႂ်ႉ တီႈပရေႃးၵျႅၵ်ႉတၢင်ႇဢၼ်။\nဢၼ်တႅမ်ႈၼႄ တီႈၼႂ်း [$2 file description page] ၼၼ်ႉ တေၼႄပၼ် တီႈတႂ်ႈၼႆႉ။",
+       "sharedupload-desc-edit": "ၾၢႆႇဢၼ်ၼႆႉ လုၵ်ႉၵႃႈတီႈ $1 မႃးသေ ၼႃႈၵၢၼ်တၢင်ႇၸိူဝ်းၵေႃႈ ဢၢပ်ႈတေဢဝ်ၸႂ်ႉဝႆႉ။\nၸဝ်ႈၵဝ်ႇ ဢၢပ်ႈတေၶႂ်ႈ မႄးထတ်း​ ၶေႃႈသပ်းလႅင်း ၵႃႈတီႈ [$2 ၼႃႈလိၵ်ႈ ၶေႃႈသပ်းလႅင်း ၾၢႆႇ] ၼႆႉ။",
+       "sharedupload-desc-create": "ၾၢႆႇဢၼ်ၼႆႉ လုၵ်ႉၵႃႈတီႈ $1 မႃးသေ ၼႃႈၵၢၼ်တၢင်ႇၸိူဝ်းၵေႃႈ ဢၢပ်ႈတေဢဝ်ၸႂ်ႉဝႆႉ။\nၸဝ်ႈၵဝ်ႇ ဢၢပ်ႈတေၶႂ်ႈ မႄးထတ်း​ ၶေႃႈသပ်းလႅင်း ၵႃႈတီႈ [$2 ၼႃႈလိၵ်ႈ ၶေႃႈသပ်းလႅင်း ၾၢႆႇ] ၼႆႉ။",
+       "filepage-nofile": "ၾၢႆႇဢၼ်ပဵၼ်ၸိုဝ်ႈၼႆႉ မၼ်းဢမ်ႇမီးဝႆႉ။",
+       "filepage-nofile-link": "ၾၢႆႇဢၼ်ပဵၼ်ၸိုဝ်ႈၼႆႉ မၼ်းဢမ်ႇမီးဝႆႉ၊ ၵူၺ်းၵႃႈ ၸဝ်ႈၵဝ်ႇ ၸၢင်ႈ [$1 လူတ်ႇၶိုၼ်ႈ မၼ်း] လႆႈ။",
+       "uploadnewversion-linktext": "လူတ်ႇၶိုၼ်ႈပၼ် မၢႆဢွၵ်ႇဢၼ်မႂ်ႇ တွၼ်ႈတႃႇ ၾၢႆႇဢၼ်ၼႆႉ",
+       "shared-repo-from": "လုၵ်ႉတီႈ $1",
+       "shared-repo": "ယွင်ဢၼ်ၽႄႈၸႂ်ႉဝႆႉ",
+       "upload-disallowed-here": "ၸဝ်ႈၵဝ်ႇတေဢမ်ႇၸၢင်ႈ တႅမ်တၢင်သႂ်ႇၼိူဝ် ၾၢႆႇဢၼ်ၼႆႉ",
+       "filerevert": "ၶူၼ်ႉပိၼ်ၸူး $1",
+       "filerevert-legend": "ၶူၼ်ႉပိၼ်ႇၾၢႆႇ",
+       "filerevert-intro": "ၸဝ်ႈၵဝ်ႇ ၶူၼ်ႉပိၼ်ႇတေၶူၼ်ႉပိၼ်ႇ ၾၢႆႇ <strong>[[Media:$1|$1]]</strong> ၸူး  [$4 မၢႆဢွၵ်ႇ ၼင်ႇ $3, $2].",
+       "filerevert-comment": "လွင်ႈတၢင်း :",
+       "filerevert-defaultcomment": "ၶူၼ်ႉပိၼ်ႇ ၸူး မၢႆဢွၵ်ႇ ၼင်ႇ $2, $1 ($3)",
+       "filerevert-submit": "ၶူၼ်ႉပိၼ်ႇ",
+       "filerevert-success": "<strong>[[Media:$1|$1]]</strong>ၼႆႉထုၵ်ႇၶူၼ်ႉပိၼ်ႇၸူး [$4 မၢႆဢွၵ်ႇၼင်ႇ ၶွင် $3, $2].",
+       "filedelete": "မွတ်ႇပႅတ်ႈ $1",
+       "filedelete-legend": "မွတ်ႇပႅတ်ႈ ၾၢႆႇ",
+       "filedelete-intro": "ၸဝ်ႈၵဝ်ႇ တေမွတ်ႇပႅတ်ႈၾၢႆႇ  <strong>[[Media:$1|$1]]</strong> ဢၼ်ၵိုၵ်းဝႆႉ ပိုၼ်းမၼ်းတင်းသဵင်ႈတင်းမူတ်း။",
+       "filedelete-intro-old": "ၸဝ်ႈၵဝ်ႇတိုၵ်ႉမွတ်ႇ မၢႆဢွၵ်ႇ ၶွင် <strong>[[Media:$1|$1]]</strong> ၼင်ႇၶွင် [$4 $3, $2].",
+       "filedelete-comment": "လွင်ႈတၢင်း :",
+       "filedelete-submit": "မွတ်ႇပႅတ်ႈ",
+       "filedelete-success": "<strong>$1</strong> ၼႆႉ ထုၵ်ႇမွတ်ႇပႅတ်ႈၵႂႃႇယဝ်ႉ။",
+       "filedelete-success-old": "မၢႆဢွၵ်ႇၶွင် <strong>[[Media:$1|$1]]</strong> ၼင်ႇၶွင် $3, $2 ၼႆႉ ထုၵ်ႇမွတ်ႇပႅတ်ႈယဝ်ႉ။",
+       "filedelete-nofile": "<strong>$1</strong> ၼႆႉ ဢမ်ႇမီးဝႆႉ။",
+       "filedelete-otherreason": "တၢင်ႇၸိူဝ်း / လွင်ႈတၢင်း ထႅမ်သႂ်ႇထႅင်ႈ",
+       "filedelete-reason-otherlist": "လွင်ႈတၢင်းတၢင်ႇၸိူဝ်း",
+       "filedelete-reason-dropdown": "*လွင်ႈတၢင်း ၽုင်ႇ ၵၢၼ်ႇမွတ်ႇပႅတ်ႈ\n** လွင်ႈပူၼ်ႉပႅၼ် သုၼ်ႇထုတ်ႇ Copyright\n** မီးၾၢႆႇ မိူၼ်ၵၼ်ဝႆႉ",
+       "filedelete-edit-reasonlist": "မႄးထတ်း လွင်ႈတၢင်း တႃႇမွတ်ႇ",
+       "filedelete-maintenance": "ၽွင်းမိူဝ်ႈ တိုၵ်ႉမႄးၵုမ်းယူႇၼႆႉ ၵၢၼ်မွတ်ႇပႅတ်ႈလႄႈ ၵၢၼ်ဢဝ်ၶိုၼ်း ၾၢႆႇၸိူဝ်းၼႆႉ တေဢမ်ႇၸႂ်ႉလႆႈ ၸူဝ်ႈၶၢဝ်း။",
+       "filedelete-maintenance-title": "ဢမ်ႇၸၢင်ႈမွတ်ႇပႅတ်ႈ ၾၢႆႇ",
+       "mimesearch": "ၶူၼ်ႉႁႃ MIME",
+       "mimetype": "လိူင်ႈ MIME :",
+       "download": "လူတ်ႇလူင်း",
+       "unwatchedpages": "ၼႃႈလိၵ်ႈ ၸိူဝ်းဢမ်ႇပႆႇလႆႈတူၺ်း။",
+       "listredirects": "သဵၼ်ႈမၢႆ ၸိူဝ်းပိၼ်ႇၸီႉ",
+       "listduplicatedfiles": "သဵၼ်ႈမၢႆၾၢႆႇ ၸိူဝ်းမိူၼ်ၵၼ်ဝႆႉ",
+       "listduplicatedfiles-entry": "[[:File:$1|$1]] ၼႆႉမၼ်း [[$3|{{PLURAL:$2|a မိူၼ်ၵၼ်|$2 မိူၼ်ၵၼ်}}]].",
+       "unusedtemplates": "လွၵ်းပိူင် ဢၼ်ဢမ်ႇၸႂ်ႉဝႆႉ",
+       "unusedtemplateswlh": "ႁဵင်းၵွင်ႉ တၢင်ႇၸိူဝ်း",
+       "randompage": "ဢဝ်ၼႃႈလိၵ်ႈသၢင်ႇထုၵ်ႇဝႃႈ",
+       "randompage-nopages": "ၸွမ်းၼင်ႇပႃႈတႂ်ႈၼႆႉ မၼ်းဢမ်ႇမီး ဝႆႉ ၼႃႈလိၵ်ႈသင်\n{{PLURAL:$2|လွၵ်းၸိုဝ်ႈ|လွၵ်းၸိုဝ်ႈ}}: $1.",
+       "randomincategory": "ၼႃႈလိၵ်ႈၵမ်ႉသၢင်ႇတေႃႇ ၵႃႈတီႈၼႂ်း လိူင်ႈ",
+       "randomincategory-invalidcategory": "\"$1\" ၼႆႉ ပဵၼ်ၸိုဝ်ႈလိူင်ႈ ဢၼ်ဢမ်ႇပဵၼ်လႆႈ။",
+       "randomincategory-nopages": "မၼ်းဢမ်ႇမီးဝႆ ၼႃႈလိၵ်ႈသင် ၵႃႈတီႈၼႂ်း [[:Category:$1|$1]] လိူင်ႈ။",
+       "randomincategory-category": "လိူင်ႈ",
+       "randomincategory-legend": "ၼႃႈလိၵ်ႈၵမ်ႉသၢင်ႇတေႃႇ ၵႃႈတီႈၼႂ်း လိူင်ႈ",
+       "randomincategory-submit": "သိုပ်ႇၵႂႃႇ",
+       "randomredirect": "တူဝ်ပိၼ်ႇၸီႉ ၵမ်ႉသၢင်ႇတေႃႇ",
+       "randomredirect-nopages": "မၼ်းဢမ်ႇမီးဝႆႉ တူဝ်ပိၼ်ႇၸီႈ ၼင်ႇလွၵ်းၸိုဝ်ႈ ဝႃႈ \"$1\" ။",
+       "statistics": "သဵၼ်ႈမၢႆ",
+       "statistics-header-pages": "ၼႃႈလိၵ်ႈ သဵၼ်ႈမၢႆ",
+       "statistics-header-edits": "မႄးထတ်း သဵၼ်ႈမၢႆ",
+       "statistics-header-users": "သဵၼ်ႈမၢႆ ၽူႈၸႂ်ႉတိုဝ်း",
+       "statistics-header-hooks": "သဵၼ်ႈမၢႆ တၢင်ႇၸိူဝ်း",
+       "statistics-articles": "ၼႃႈလိၵ်ႈ ၼမ်းၼႂ်း",
+       "statistics-pages": "ၼႃႈလိၵ်ႈ",
+       "statistics-pages-desc": "ၼႃႈလိၵ်ႈတင်းသဵင်ႈ ၵႃႈတီႈၼႂ်း ဝီႇၶီႇ၊ ဢိၵ်ႇၶဝ်ႈပႃး ၼႃႈလိၵ်ႈ ဢုပ်ႇဢူဝ်း၊ တူဝ်ပိၼ်ႇၸီႉ ၸၵႂႃႇၸိူဝ်းၼႆႉ။",
+       "statistics-files": "လူတ်ႇၶိုၼ်ႈ ၾၢႆႇ",
+       "statistics-edits": "မႄးထတ်းၼႃႈလိၵ်ႈ ၸဵမ်မိူဝ်ႈ {{SITENAME}} လႆႈတင်ႈတေႃႇမႃး",
+       "statistics-edits-average": "ၽတ်ႉၽဵင်ႇၵၢၼ်မႄးထတ်း ႁူဝ်ၼႃႈလိၵ်ႈ",
+       "statistics-users": "တၢင်ႇမၢႆၽၢင်ဝႆႉယဝ်ႉ [[Special:ListUsers|users]]",
+       "statistics-users-active": "ၽူႈၸႂ်ႉတိုဝ်း ၸိူဝ်းတူင်ႉတိုၼ်ႇဝႆႉ",
+       "statistics-users-active-desc": "ၽူႈၸႂ်ႉတိုဝ်း ၸိူဝ်းႁဵတ်း လွင်ႈတူင်ႉၼိုင်ဝႆႉ ၼႂ်းၵႃႈဝၼ်းလိုၼ်းသုတ်း {{PLURAL:$1|ဝၼ်း|$1 ဝၼ်း}}။",
+       "pageswithprop": "ၼႃႈလိၵ်ႈၸိူဝ်းမီး ၶွင်တူဝ်ၼႃႈလိၵ်ႈ",
+       "pageswithprop-legend": "ၼႃႈလိၵ်ႈၸိူဝ်းမီး ၶွင်တူဝ်ၼႃႈလိၵ်ႈ",
+       "pageswithprop-text": "ၼႃႈလိၵ်ႈၼႆႉ ႁဵတ်းသဵၼ်ႈမၢႆၼႃႈလိၵ်ႈၸိူဝ်း ၸႂ်ႉဝႆႉ ၶွင်တူဝ်ၼႃႈလိၵ်ႈ ဢၼ်လႂ်ဢၼ်ၼၼ်ႉ။",
+       "pageswithprop-prop": "ၸိုဝ်ႈ ၶွင်တူဝ် :",
+       "pageswithprop-submit": "သိုပ်ႇၵႂႃႇ",
+       "pageswithprop-prophidden-long": "လပ်ႉဝႆႉ ၵႃႈၶၼ်လိၵ်ႈၶူဝ်တူဝ်ဢၼ်ယၢဝ်း ($1)",
+       "pageswithprop-prophidden-binary": "လပ်ႉဝႆႉ ၵႃႈၶၼ် ၶွင်တူဝ်ပဵၼ်ၸုမ်ႇ ($1)",
+       "doubleredirects": "တူဝ်ပိၼ်ႇၸီႉ သွင်ၸၼ်ႉ",
+       "double-redirect-fixed-move": "[[$1]] ထုၵ်ႇၶၢႆႉတီႈဝႆႉယဝ်ႉ။\nမၼ်ႈႁဵတ်းဢၢပ်ႉတိတ်ႉၵႂႃႇ ႁင်းတူဝ်မၼ်းသေ ယၢမ်းလဵဝ် ပိၼ်ႇၸီႉၸူး [[$2]]။",
+       "double-redirect-fixed-maintenance": "မႄးပၼ် တူဝ်ပိၼ်ႇၸီႉသွင်ၸၼ်ႉ ႁင်းတူဝ် ၵႃႈတီႈ [[$1]] ၸူး [[$2]] ၼႂ်း ၼႃႈၵၢၼ် မူၼ်ႉမေး။",
+       "double-redirect-fixer": "တူဝ်မေးပၼ် ၵၢၼ်ပိၼ်ႇၸီႉ",
+       "brokenredirects": "တူဝ်ပိၼ်ႇၸီႉ ၸိူဝ်းလူႉလႅဝ်ဝႆႉ",
+       "brokenredirectstext": "တူဝ်ပိၼ်ႇၸီႉ ၸိူဝ်းပႃႈတႂ်ႈၼႆႉ ၵွင်ႉၸူး ၼႃႈလိၵ်ႈၸိူဝ်းဢမ်ႇမီးဝႆႉ :",
+       "brokenredirects-edit": "မႄးထတ်း",
+       "brokenredirects-delete": "မွတ်ႇပႅတ်ႈ",
+       "withoutinterwiki": "ၼႃႈလိၵ်ႈၸိူဝ်းဢမ်ႇမီးဝႆႉ ႁဵင်းၵွင်ႉ ၽႃႇသႃႇၵႂၢမ်း",
+       "withoutinterwiki-summary": "ၼႃႈလိၵ်ႈၸိူဝ်းပႃႈတႂ်ႈၼႆႉ မၼ်းဢမ်ႇၵွင်ႉဝႆႉၸူး မၢႆဢွၵ်ႇၽႃႇသႃႇၵႂၢမ်း တၢင်ႇၸိူဝ်း",
+       "withoutinterwiki-legend": "တူဝ်ၼမ်းၼႃႈ",
+       "withoutinterwiki-submit": "ၼႄ",
+       "fewestrevisions": "ၼႃႈလိၵ်ႈၸိူဝ်းမီး ၶေႃႈၶူၼ်ႉႁႃ ဢၼ်ဢေႇသေပိူၼ်ႈ",
+       "nbytes": "$1 {{PLURAL:$1|ၿႆႉ|ၿႆႉ}}",
+       "ncategories": "{{PLURAL:$1|လိူင်ႈ|လိူင်ႈတင်းလၢႆ}}",
+       "ninterwikis": "$1 {{PLURAL:$1|ဝီႇၶီႇၽၢႆႇၼႂ်း|ဝီႇၶီႇၸိူဝ်းၽၢႆႇၼႂ်း}}",
+       "nlinks": "$1 {{PLURAL:$1|ႁဵင်းၵွင်ႉ|ႁဵင်းၵွင်ႉ}}",
+       "nmembers": "$1 {{PLURAL:$1|member|ၽူႈၶဝ်ႈၸုမ်း}}",
+       "nmemberschanged": "$1 → $2 {{PLURAL:$2|ၽူႈၶဝ်ႈၸုမ်း|ၽူႈၶဝ်ႈၸုမ်း}}",
+       "nrevisions": "$1 {{PLURAL:$1|​ၶေႃႈၶူၼ်ႉလူ|ၶေႃႈၶူၼ်ႉလူ}}",
+       "nimagelinks": "ၸႂ်ႉဝႆႉၵႃႈတီႈၼိူဝ် $1 {{PLURAL:$1|ၼႃႈလိၵ်ႈ|ၼႃႈလိၵ်ႈ}}",
+       "ntransclusions": "ၸႂ်ႉဝႆႉၵႃႈတီႈၼိူဝ် $1 {{PLURAL:$1|ၼႃႈလိၵ်ႈ|ၼႃႈလိၵ်ႈ}}",
+       "specialpage-empty": "တွၼ်ႈတႃႇ ၶေႃႈပွင်ႇၼႄ ဢၼ်ၼႆႉၼႆႉ မၼ်းဢမ်ႇမီး ၽွၼ်းလႆႈ။",
+       "lonelypages": "ၼႃႈလိၵ်ႈ ႁၢမ်းႁိူၼ်း",
+       "lonelypagestext": "ၼႃႈလိၵ်ႈၸိူဝ်းပႃႈတႂ်ႈၼႆႉ မၼ်းဢမ်ႇလႆႈ ၵွင်ႉဝႆႉ ဢမ်ႇၼၼ် ဢမ်ႇလႆႈၶဝ်ႈပႃႈဝႆႉ တႂ်ႈၼႂ်း ၼႃႈလိၵ်ႈတႃႇၸိူဝ်း ၼင်ႇ  {{SITENAME}} ၼႆႉ။",
+       "uncategorizedpages": "ၼႃႈလိၵ်ႈၸိူဝ်းဢမ်ႇမီးလိူင်ႈ",
+       "uncategorizedcategories": "လိူင်ႈ ၸိူဝ်းဢမ်ႇၶပ်ႉလိူင်ႈဝႆႉ",
+       "uncategorizedimages": "ၽၢႆႇၸိူဝ်း ဢမ်ႇမီးလိူင်ႈ",
+       "uncategorizedtemplates": "လွၵ်းပိူင် ၸိူဝ်းဢမ်ႇမီးလိူင်ႈ",
+       "unusedcategories": "လိူင်ႈၸိူဝ်း ဢမ်ႇၸႂ်ႉဝႆႉ",
+       "unusedimages": "ၾၢႆႇ ၸိူဝ်းဢမ်ႇၸႂ်ႉဝႆႉ",
+       "wantedcategories": "လိူင်ႈၸိူဝ်း ၶႂ်ႈလႆႈမႃး",
+       "wantedpages": "ၼႃႈလိူၵ်ႈ ၸိူဝ်းၶႂ်ႈလႆႈမႃး",
+       "wantedpages-badtitle": "ႁူဝ်ၶေႃႈၽိတ်းပိူင်ႈ ၵႃႈတႂ်ႈၼႂ်း ၽွၼ်းလႆႈ မၵ်းသႂ်ႇဝႆႉ : $1",
+       "wantedfiles": "ၾၢႆႇ ၸိူဝ်းၶႂ်ႈလႆႈမႃး",
+       "wantedfiletext-cat-noforeign": "ၾၢႆႇၸိူဝ်းပႃႈတႂ်ႈၼႆႉ ထုၵ်ႇၸႂ်ႉဝႆႉယူႇ သေတႃႉ မၼ်းဢမ်ႇမီးဝႆႉယဝ်ႉ။ လိူဝ်သေၼၼ်ႉ၊ ၼႃႈလိၵ်ႈၸိူဝ်း ဢဝ်ၾၢႆႇၽင်ဝႆႉသေ ၸိူဝ်းဢမ်ႇမီးဝႆႉၼၼ်ႉ ႁဵတ်းသဵၼ်ႈမၢႆဝႆႉ ၵႃႈတီႈၼႂ်း  [[:$1]] ။",
+       "wantedfiletext-nocat-noforeign": "ၾၢႆႇၸိူဝ်းပႃႈတႂ်ႈၼႆႉ ၸႂ်ႉဝႆႉသေတႃႉ မၼ်းဢမ်ႇမီးဝႆႉယဝ်ႉ။",
+       "wantedtemplates": "လွၵ်းပိူင် ဢၼ်ၶႂ်ႈလႆႈမႃး",
+       "mostlinked": "ၼႃႈလိၵ်ႈၸိူဝ်း မီးႁဵင်းၵွင်ႉၸူး ၼမ်သေပိူၼ်ႈ",
+       "mostlinkedcategories": "လိူင်ႈ ၸိူဝ်းမီး ႁဵင်းၵွင်ႉၼမ်သေပိူၼ်ႈ",
+       "mostlinkedtemplates": "ၼႃႈလိၵ်ႈ ၸိူဝ်းမီးၵဵင်ႇၽႄ ၼမ်သေပိူၼ်ႈ",
+       "mostcategories": "ၼႃႈလိၵ်ႈၸိူဝ်း မီးလိူင်ႈၼမ်သေပိူၼ်ႈ",
+       "mostimages": "ၾၢႆႇ ၸိူဝ်းမီး ႁဵင်းၵွင်ႉၸူး ၼမ်သေပိူၼ်ႈ",
+       "mostinterwikis": "ၼႃႈလိၵ်ႈ ၸိူဝ်းမီး ဝီႇၶီႇၼႂ်ႈ ၼမ်သေပိူၼ်ႈ",
+       "mostrevisions": "ၼႃႈလိၵ်ႈၸိူဝ်းမီး ၶေႃႈၶူၼ်ႉလူ ဢၼ်ၼမ်သေပိူၼ်ႈ",
+       "prefixindex": "ၼႃႈလိၵ်ႈတင်းသဵင်ႈ ၸိူဝ်းဢၼ်ပႃး တူဝ်ၼမ်းၼႃႈ",
+       "prefixindex-namespace": "ၼႃႈလိၵ်ႈတင်းသဵင်ႈ ဢၼ်ပႃး တူဝ်ၼမ်းၼႃႈ ($1 လွၵ်းၸိုဝ်ႈ)",
+       "prefixindex-submit": "ၼႄ",
+       "shortpages": "ၼႃႈလိၵ်ႈ ၸိူဝ်းဢၼ်ပွတ်း",
+       "longpages": "ၼႃႈလိၵ်ႈၸိူဝ်း ဢၼ်ယၢဝ်း",
+       "deadendpages": "ၼႃႈလိၵ်ႈ ၸိူဝ်းသုတ်း",
+       "deadendpagestext": "ၼႃႈလိၵ်ႈၸိူဝ်းပႃႈတႂ်ႈၼႆႉ ဢမ်ႇလႆႈၵွင်ႉၸူး ၼႃႈလိၵ်ႈတၢင်ႇၸိူဝ်း တီႈၼႂ်း {{SITENAME}}။",
+       "protectedpages": "ၼႃႈလိၵ်ႈၸိူဝ်းႁႄႉၵင်ႈဝႆႉ",
+       "protectedpages-noredirect": "သိူင်ႇ တူဝ်ပိၼ်ႇၸီႉ",
+       "protectedpagesempty": "ဢမ်ႇမီးၼႃႈလိၵ်ႈ ၸႂ်ႉၽၢင်ၵိုၵ်းသေ ႁႄႉၵင်ႈဝႆႉ ယၢမ်းလဵဝ်",
+       "protectedpages-timestamp": "ၸုမ်ႈၶၢဝ်းယၢမ်း",
+       "protectedpages-page": "ၼႃႈလိၵ်ႈ",
+       "protectedpages-expiry": "ဢႃႇယုသဵင်ႈ",
+       "protectedpages-performer": "ၽူႈၸႂ်ႉတိုဝ်း ဢၼ်ႁႄႉၵင်ႈ",
+       "protectedpages-params": "ၽၢင်ၵိုၵ်း ႁႄႉၵၼ်ႈ",
+       "protectedpages-reason": "လွင်ႈတၢင်း",
+       "protectedpages-submit": "ၼႃႈလိၵ်ႈ ၸိူဝ်းဢွၵ်ႇၼႄ",
+       "protectedpages-unknown-timestamp": "ဢမ်ႇႁူႉၸွမ်း",
+       "protectedpages-unknown-performer": "ၽူႈၸႂ်ႉတိုဝ်း ဢၼ်ဢမ်ႇႁူႉ",
+       "protectedtitles": "ၼႃႈလိၵ်ႈၸိူဝ်းႁႄႉၵင်ႈဝႆႉ",
+       "protectedtitlesempty": "ဢမ်ႇမီးႁူဝ်ၶေႃႈ ၸိူဝ်းၸႂ်ႉၽၢင်ၵိုၵ်းၼႆႉသေ ႁႄႉၵင်ႈဝႆႉ ယၢမ်းလဵဝ်",
+       "protectedtitles-submit": "ဢွၵ်ႇၼႄ ႁူဝ်ၶေႃႈ",
+       "listusers": "သဵၼ်ႈမၢႆ ၽူႈၸႂ်ႉတိုဝ်း",
+       "listusers-editsonly": "ၼႄပၼ် ၽူႈၸႂ်ႉတိုဝ်း ၸိူဝ်းမႄးထတ်းၼၼ်ႉၵူၺ်း",
+       "listusers-creationsort": "ၶပ်ႉၸႅၼ်ၸွမ်း ဝၼ်းထီႉ ၵေႃႇသၢင်ႈ",
+       "listusers-desc": "ၶပ်ႉၸႅၼ်ႇၸွမ်း မၢႆၶပ်ႉတူဝ်လဵၵ်ႉ",
+       "usereditcount": "$1 {{PLURAL:$1|မႄးထတ်း|မႄးထတ်း}}",
+       "usercreated": "{{GENDER:$3|ၵေႃႇသၢင်ႈယဝ်ႉ}} မိူဝ်ႈ $1 မိူဝ်ႈ$2",
+       "newpages": "ၼႃႈလိၵ်ႈမႂ်ႇ",
+       "newpages-submit": "ၼႄ",
+       "newpages-username": "ၸိုဝ်ႈၽူႈၸႂ်ႉတိုဝ်း :",
+       "ancientpages": "ၼႃႈလိၵ်ႈ ၵဝ်ႇမွၼ်ႇ",
+       "move": "ၶၢႆႉ",
+       "movethispage": "ၶၢႆႉဢွင်ႈ ၼႃႈလိၵ်ႈၼႆႉ",
+       "unusedcategoriestext": "ၼႃႈလိၵ်ႈလိူင်ႈ ၸိူဝ်းပႃႈတႂ်ႈၼႆႉ မီးဝႆႉယူႇ၊ ႁူမ်ႈဝႃႈ ဢမ်ႇမီး ၼႃႈလိၵ်ႈတၢင်ႇၸိူဝ်း ဢမ်ႇၼၼ်ႉ လိူင်ႈ ဢၼ်ၸႂ်ႉၶဝ်ဝႆႉ။",
+       "notargettitle": "ဢမ်ႇမီး တီႈယိူင်း",
+       "notargettext": "ၸဝ်ႈၵဝ်ႇ ဢမ်ႇလႆႈမၵ်းမၼ်ႈဝႆႉ ၼႃႈလိၵ်ႈတီႈယိူင်း ဢမ်ႇၼၼ် ၽူႈၸႂ်ႉတိုဝ်း တွၼ်ႈတႃႇႁဵတ်း ၼႃႈၵၢၼ်ၼႆႉ။",
+       "nopagetitle": "ဢမ်ႇမီး ၼႃႈလိၵ်ႈ တီႈယိူင်းၸူး",
+       "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..dda489d 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",
        "api-error-badtoken": "Gabim i brendshëm: Shenjë e keqe.",
        "api-error-copyuploaddisabled": "Ngarkimi nga URL-ja është çaktivizuar në këtë server.",
        "api-error-duplicate": "{{PLURAL:$1|Ekziston një skedë tjetër|Ekzistojnë disa skeda të tjera}} me të njëjtën përmbajtje.",
-       "api-error-duplicate-archive": "{{Ekzistonte një skedë tjetër|Ekzistonin disa skeda të tjera}} me të njëjtën përmbajtje, por {{PLURAL:$1|ajo është|ato janë}} fshirë.",
+       "api-error-duplicate-archive": "{{PLURAL:$1|Ekzistonte një skedë tjetër|Ekzistonin disa skeda të tjera}} me të njëjtën përmbajtje, por {{PLURAL:$1|ajo është|ato janë}} fshirë.",
        "api-error-empty-file": "Skeda që paraqitët ishte bosh.",
        "api-error-emptypage": "Nuk lejohet krijimi i faqeve të reja bosh.",
        "api-error-fetchfileerror": "Gabim i brendshëm: Diçka shkoi keq gjatë marrjes së skedës.",
index 59e50e2..a4a883b 100644 (file)
@@ -30,7 +30,8 @@
                        "Srdjan m",
                        "Macofe",
                        "Сербијана",
-                       "Xð"
+                       "Xð",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "Подвлачење веза:",
@@ -73,7 +74,7 @@
        "tog-ccmeonemails": "Пошаљи ми копије имејлова које пошаљем другим корисницима",
        "tog-diffonly": "Не приказуј садржај странице испод разлика",
        "tog-showhiddencats": "Прикажи скривене категорије",
-       "tog-norollbackdiff": "Ð\98зоÑ\81Ñ\82ави разлику након извршеног враћања",
+       "tog-norollbackdiff": "Ð\9dе Ð¿Ñ\80иказÑ\83Ñ\98 разлику након извршеног враћања",
        "tog-useeditwarning": "Упозори ме када напуштам страницу са несачуваним променама",
        "tog-prefershttps": "Увек користи сигурну конекцију када сам пријављен.",
        "underline-always": "увек подвлачи",
        "category_header": "Странице у категорији „$1“",
        "subcategories": "Поткатегорије",
        "category-media-header": "Датотеке у категорији „$1“",
-       "category-empty": "<div style=\"margin:2em 1em 0 1em; padding:0.5em; border:1px solid #AAA; text-align:center;\">''Ова категорија тренутно не садржи странице или датотеке.''</div>",
+       "category-empty": "<em>Ова категорија тренутно не садржи странице или датотеке.</em>",
        "hidden-categories": "{{PLURAL:$1|Сакривена категорија|Сакривене категорије}}",
        "hidden-category-category": "Скривене категорије",
        "category-subcat-count": "{{PLURAL:$2|1=Ова категорија садржи само следећу поткатегорију.|Ова категорија има {{PLURAL:$1|1=следећу поткатегорију|следеће $1 поткатегорије|следећих $1 поткатегорија}}, од укупно $2.}}",
        "newwindow": "(отвара се у новом прозору)",
        "cancel": "Откажи",
        "moredotdotdot": "Више…",
-       "morenotlisted": "Ова листа није комплетна.",
+       "morenotlisted": "Овај списак није комплетан.",
        "mypage": "Страница",
        "mytalk": "Разговор",
        "anontalk": "Разговор",
        "perfcachedts": "Следећи подаци су кеширани и последњи пут су ажурирани $2 у $3. У кешу {{PLURAL:$4|1=је доступан највише један резултат|су доступна највише $4 резултата|је доступно највише $4 резултата}}.",
        "querypage-no-updates": "Ажурирање ове странице је тренутно онемогућено.\nПодаци који се овде налазе могу бити застарели.",
        "viewsource": "Изворни код",
-       "viewsource-title": "Ð\9fÑ\80иказ Ð¸Ð·Ð²Ð¾Ñ\80а странице $1",
+       "viewsource-title": "Ð\98звоÑ\80ни Ñ\82екÑ\81Ñ\82 странице $1",
        "actionthrottled": "Радња је успорена",
        "actionthrottledtext": "У циљу борбе против непожељних порука, ограничене су вам измене у одређеном времену, а управо сте прешли то ограничење. Покушајте поново за неколико минута.",
        "protectedpagetext": "Ова страница је закључана за измене и друге радње.",
        "viewsourcetext": "Можете читати и копирати садржај ове странице.",
-       "viewyourtext": "Можете да погледате и копирате извор <strong>ваших измена</strong> на овој страници.",
+       "viewyourtext": "Можете да погледате и копирате изворни текст <strong>ваших измена</strong> на овој страници.",
        "protectedinterface": "Ова страница садржи текст корисничког окружења за софтвер на овом викију и заштићена је ради спречавања злоупотребе.\nДа бисте додали или изменили преводе свих викија, посетите [//translatewiki.net/ Транслејтвики], пројекат за локализацију Медијавикија.",
        "editinginterface": "<strong>Упозорење:</strong> уређујете страницу која се користи за приказивање текста корисничког окружења.\nИзмене на овој страници ће утицати на све кориснике овог викија.",
        "translateinterface": "Да додате или промените преводе за све викије, посетите [//translatewiki.net/ Транслејтвики], пројекат за локализацију Медијавикија.",
        "accmailtext": "Лозинка за {{GENDER:$1|корисника|корисницу}} [[User talk:$1|$1]] је послата на $2. Након пријаве, лозинка се може променити [[Special:ChangePassword|овде]].",
        "newarticle": "(нови)",
        "newarticletext": "Дошли сте на страницу која још не постоји.\nДа бисте је направили, почните да куцате у прозор испод овог текста (погледајте [$1 страницу за помоћ]).\nАко сте овде дошли грешком, вратите се на претходну страницу.",
-       "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}}}} претражити сродне извештаје] или [{{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}}}} дневнику брисања].",
        "right-override-export-depth": "извоз страница укључујући и повазене странице до дубине од пет веза",
        "right-sendemail": "слање имејла другим корисницима",
        "right-passwordreset": "прегледање порука за обнављање лозинке",
-       "right-managechangetags": "прављење и/или брисање [[Special:Tags|ознака]] из базе података",
+       "right-managechangetags": "прављење и (де)активирање [[Special:Tags|ознака]]",
        "right-applychangetags": "примењивање [[Special:Tags|ознака]] на нечије измене",
        "right-changetags": "додавање и уклањање разних [[Special:Tags|ознака]] на појединачним изменама и уносима у дневницима",
        "grant-group-page-interaction": "Уређивање страница",
        "action-viewmyprivateinfo": "прегледање ваших личних података",
        "action-editmyprivateinfo": "уређивање ваших личних података",
        "action-editcontentmodel": "мењање модела садржаја странице",
-       "action-managechangetags": "прављење и/или брисање ознака из базе података",
+       "action-managechangetags": "прављење и (де)активирање ознака",
        "action-applychangetags": "додавање ознака на ваше измене",
        "action-changetags": "додавање и уклањање разних ознака на појединачним изменама и уносима у дневницима",
        "nchanges": "$1 {{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": "Иди",
        "import-nonewrevisions": "Измене нису увезене (све су већ биле или присутне или прескочене због грешки).",
        "xml-error-string": "$1 у реду $2, колона $3 (бајт $4): $5",
        "import-upload": "Отпремање XML података",
-       "import-token-mismatch": "Губитак података о сесији.\nПокушајте поново.",
+       "import-token-mismatch": "Губитак података о сесији.\n\nМожда сте одјављени.\n<strong>Молимо Вас проверите да ли сте још увек пријављени и покушајте поново<strong>.\n\nАко и даље не ради, покушајте се [[Special:UserLogout|одјавити]] и поново пријавити и проверите да ли Ваш веб-пртраживач дозвољава колачиће са овог сајта.",
        "import-invalid-interwiki": "Не могу да увозим с наведеног викија.",
        "import-error-edit": "Страница „$1“ није увезена јер вам није дозвољено да је уређујете.",
        "import-error-create": "Страница „$1“ није увезена јер вам није дозвољено да је направите.",
        "tooltip-ca-talk": "Разговор о страници са садржајем",
        "tooltip-ca-edit": "Уреди ову страницу",
        "tooltip-ca-addsection": "Започните нови одељак",
-       "tooltip-ca-viewsource": "Ова страница је закључана. Можете да видите изворни код.",
+       "tooltip-ca-viewsource": "Ова страница је закључана. \nМожете погледати изворни текст.",
        "tooltip-ca-history": "Претходне верзије ове странице",
        "tooltip-ca-protect": "Заштитите ову страницу",
        "tooltip-ca-unprotect": "Промени заштиту ове странице",
        "variantname-gan": "gan",
        "variantname-sr-ec": "Ћирилица",
        "variantname-sr-el": "Latinica",
-       "variantname-sr": "ћир/lat",
+       "variantname-sr": "Ћир./lat.",
        "variantname-kk-kz": "kk-kz",
        "variantname-kk-tr": "kk-tr",
        "variantname-kk-cn": "kk-cn",
index e786f12..bb0adb6 100644 (file)
@@ -21,7 +21,8 @@
                        "Srdjan m",
                        "Macofe",
                        "Сербијана",
-                       "Xð"
+                       "Xð",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "Podvlačenje veza:",
        "perfcachedts": "Sledeći podaci su keširani i poslednji put su ažurirani $2 u $3. U kešu {{PLURAL:$4|1=je dostupan najviše jedan rezultat|su dostupna najviše $4 rezultata|je dostupno najviše $4 rezultata}}.",
        "querypage-no-updates": "Ažuriranje ove stranice je trenutno onemogućeno.\nPodaci koji se ovde nalaze mogu biti zastareli.",
        "viewsource": "Izvorni kod",
-       "viewsource-title": "Prikaz izvora stranice $1",
+       "viewsource-title": "Izvorni tekst stranice $1",
        "actionthrottled": "Radnja je usporena",
        "actionthrottledtext": "U cilju borbe protiv nepoželjnih poruka, ograničene su vam izmene u određenom vremenu, a upravo ste prešli to ograničenje. Pokušajte ponovo za nekoliko minuta.",
        "protectedpagetext": "Ova stranica je zaključana za izmene i druge radnje.",
-       "viewsourcetext": "Možete čitati i kopirati sadržaj ove stranice:",
-       "viewyourtext": "Možete da pogledate i umnožite izvor '''vaših izmena''' na ovoj stranici:",
+       "viewsourcetext": "Možete čitati i kopirati sadržaj ove stranice.",
+       "viewyourtext": "Možete da pogledate i kopirate izvorni tekst <strong>vaših izmena</strong> na ovoj stranici.",
        "protectedinterface": "Ova stranica sadrži tekst korisničkog okruženja za softver na ovom vikiju i zaštićena je radi sprečavanja zloupotrebe.\nDa biste dodali ili izmenili prevode svih vikija, posetite [//translatewiki.net/ Translejtviki], projekat za lokalizaciju Medijavikija.",
        "editinginterface": "<strong>Upozorenje:</strong> uređujete stranicu koja se koristi za prikazivanje teksta korisničkog okruženja.\nIzmene na ovoj stranici će uticati na sve korisnike ovog vikija.",
        "translateinterface": "Da dodate ili promenite prevode za sve vikije, posetite [//translatewiki.net/ Translejtviki], projekat za lokalizaciju Medijavikija.",
        "right-override-export-depth": "izvoz stranica uključujući i povazene stranice do dubine od pet veza",
        "right-sendemail": "slanje e-poruka drugim korisnicima",
        "right-passwordreset": "pregledanje poruka za obnavljanje lozinke",
-       "right-managechangetags": "pravljenje i/ili brisanje [[Special:Tags|oznaka]] iz baze podataka",
+       "right-managechangetags": "pravljenje i (de)aktiviranje [[Special:Tags|oznaka]]",
        "grant-group-page-interaction": "Uređivanje stranica",
        "grant-group-file-interaction": "Uređivanje datoteka",
        "grant-group-watchlist-interaction": "Uređivanje vašeg spiska nadgledanja",
        "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",
        "tooltip-ca-talk": "Razgovor o stranici sa sadržajem",
        "tooltip-ca-edit": "Uredi ovu stranicu",
        "tooltip-ca-addsection": "Započnite novi odeljak",
-       "tooltip-ca-viewsource": "Ova stranica je zaključana. Možete da vidite izvorni kod.",
+       "tooltip-ca-viewsource": "Ова страница је закључана. \nМожете погледати изворни текст.",
        "tooltip-ca-history": "Prethodne verzije ove stranice",
        "tooltip-ca-protect": "Zaštitite ovu stranicu",
        "tooltip-ca-unprotect": "Promeni zaštitu ove stranice",
        "variantname-gan": "gan",
        "variantname-sr-ec": "Ćirilica",
        "variantname-sr-el": "Latinica",
-       "variantname-sr": "ћир/lat",
+       "variantname-sr": "Ћир./lat.",
        "variantname-kk-kz": "kk-kz",
        "variantname-kk-tr": "kk-tr",
        "variantname-kk-cn": "kk-cn",
index 50a8700..615ae7b 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-nocaller": "En användare måste anges",
+       "passwordreset-nosuchcaller": "Användare finns inte: $1",
+       "passwordreset-ignored": "Lösenordsåterställningen hanterades inte. Kanske ingen leverantör har konfigurerats?",
+       "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].",
        "trackingcategories-msg": "Spårningskategori",
        "trackingcategories-name": "Meddelandenamn",
        "trackingcategories-desc": "Inklusionskriterier för kategori",
+       "restricted-displaytitle-ignored": "Sidor med ignorerade visningstitlar",
+       "restricted-displaytitle-ignored-desc": "Sidan har ignorerat <code><nowiki>{{DISPLAYTITLE}}</nowiki></code> eftersom den inte överensstämmer med sidans riktiga titel.",
        "noindex-category-desc": "Sidan innehåller det magiska ordet <code><nowiki>__NOINDEX__</nowiki></code> (och är i en namnrymd där denna flagga tillåts), och indexeras därför inte av robotar.",
        "index-category-desc": "Denna sidan innehåller ett <code><nowiki>__INDEX__</nowiki></code> (och är i en namnrymd där denna flagga tillåts), och indexeras därför av robotar även där detta normalt inte skulle ske.",
        "post-expand-template-inclusion-category-desc": "Sidan är större än <code>$wgMaxArticleSize</code> efter att alla mallar har expanderats, därför har vissa mallar inte expanderats.",
        "rollbacklinkcount": "rulla tillbaka $1 {{PLURAL:$1|redigering|redigeringar}}",
        "rollbacklinkcount-morethan": "rulla tillbaka mer än $1 {{PLURAL:$1|redigering|redigeringar}}",
        "rollbackfailed": "Tillbakarullning misslyckades",
+       "rollback-missingparam": "Nödvändiga parametrar i begäran saknas.",
        "cantrollback": "Det gick inte att rulla tillbaka, då sidan endast redigerats av en användare.",
        "alreadyrolled": "Det gick inte att rulla tillbaka den senaste redigeringen av [[User:$2|$2]] ([[User talk:$2|diskussion]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) på sidan [[:$1|$1]]. Någon annan har redan rullat tillbaka eller redigerat sidan.\n\nSidan ändrades senast av [[User:$3|$3]] ([[User talk:$3|diskussion]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]).",
        "editcomment": "Redigeringskommentaren var: <em>$1</em>.",
        "revertpage": "Återställde redigeringar av  [[Special:Contributions/$2|$2]] ([[User talk:$2|användardiskussion]]) till senaste versionen av [[User:$1|$1]]",
        "revertpage-nouser": "Återställde redigeringar av en dold användare till den senaste versionen av {{GENDER:$1|[[User:$1|$1]]}}",
        "rollback-success": "Återställde ändringar av $1;\nändrade tillbaka till senaste version av $2.",
+       "rollback-success-notify": "Återställde ändringar av $1;\nändrade tillbaka till senaste version av $2. [$3 Visa ändringar]",
        "sessionfailure-title": "Sessionsfel",
        "sessionfailure": "Något med din session som inloggad är på tok. Din begärda åtgärd har avbrutits, för att förhindra att någon kapar din session. Klicka på \"Tillbaka\" i din webbläsare och ladda om den sida du kom ifrån. Försök sedan igen.",
        "changecontentmodel": "Ändra innehållsmodell för en sida",
        "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",
        "confirm-watch-top": "Lägg till denna sida till din bevakningslista?",
        "confirm-unwatch-button": "OK",
        "confirm-unwatch-top": "Ta bort denna sida från din bevakningslista?",
+       "confirm-rollback-button": "OK",
+       "confirm-rollback-top": "Återställ redigeringar på denna sida?",
        "quotation-marks": "\"$1\"",
        "imgmultipageprev": "← föregående sida",
        "imgmultipagenext": "nästa sida →",
        "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-not-in-progress": "Autentiseringen pågår inte eller så har sessionsdata förlorats. Var god börja om från början igen.",
+       "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-not-in-progress": "Skapande av konto pågår inte eller så har sessionsdata förlorats. Var god börja om från början igen.",
+       "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-link-not-in-progress": "Kontolänkning pågår inte eller så har sessionsdata förlorats. Var god börja om från början igen.",
+       "authmanager-authplugin-setpass-failed-title": "Kunde inte ändra lösenordet",
+       "authmanager-authplugin-setpass-failed-message": "Insticksmodulen för autentisering nekade lösenordsändringen.",
+       "authmanager-authplugin-create-fail": "Insticksmodulen för autentisering nekade skapande av konto.",
+       "authmanager-authplugin-setpass-denied": "Insticksmodulen för autentisering tillåter inte ändring av lösenord.",
+       "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-userlogin-remembermypassword-help": "Om lösenordet borde kommas ihåg längre än sessionens längd.",
+       "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-confirmlink-ok-help": "Fortsätt efter att felmeddelanden om länkning har visats.",
+       "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",
+       "authform-newtoken": "Nyckel saknas. $1",
+       "authform-notoken": "Nyckel saknas",
+       "authform-wrongtoken": "Fel nyckel",
+       "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.",
+       "authpage-cannot-login": "Det gick inte att starta inloggning.",
+       "authpage-cannot-login-continue": "Det gick inte att fortsätta inloggning. Din session har mest sannolikt gått ut.",
+       "authpage-cannot-create": "Det gick inte att starta kontoskapande.",
+       "authpage-cannot-create-continue": "Det gick inte att fortsätta kontoskapande. Din session har mest sannolikt gått ut.",
+       "authpage-cannot-link": "Det gick inte att starta kontolänkning.",
+       "authpage-cannot-link-continue": "Det gick inte att starta kontolänkning. Din session har mest sannolikt gått ut.",
+       "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 inloggningsuppgifter",
+       "changecredentials-invalidsubpage": "$1 är inte en giltig typ av inloggningsuppgift.",
+       "changecredentials-success": "Dina inloggningsuppgifter har ändrats.",
+       "removecredentials": "Ta bort inloggningsuppgifter",
+       "removecredentials-submit": "Ta bort inloggningsuppgifter",
+       "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 1308537..8ca8832 100644 (file)
                        "Maathavan",
                        "தமிழ்க்குரிசில்",
                        "Nemo bis",
-                       "JAaron95"
+                       "JAaron95",
+                       "Info-farmer"
                ]
        },
-       "tog-underline": "à®\87ணà¯\88பà¯\8dபà¯\81à®\95ளà¯\81à®\95à¯\8dà®\95à¯\81 à®\85à®\9fிà®\95à¯\8dà®\95à¯\8bà®\9fிà®\9fà¯\81",
+       "tog-underline": "à®\85à®\9fிà®\95à¯\8dà®\95à¯\8bà®\9fிà®\9fà¯\8dà®\9fதà¯\8dதà¯\88 à®\87ணà¯\88:",
        "tog-hideminor": "அண்மைய மாற்றங்களில் சிறிய தொகுப்புகளை மறை",
        "tog-hidepatrolled": "அண்மைய மாற்றங்களில் ரோந்திட்ட தொகுப்புகளை மறைக்கவும்",
        "tog-newpageshidepatrolled": "பலமுறை பார்வையிட்ட பக்கங்களைப் புதியபக்கங்களின் பட்டியலில் காட்டவேண்டாம்.",
index 0a71f3f..583c560 100644 (file)
        "unprotectthispage": "ಈ ಪುಟೊತ ರಕ್ಷಣೆನ್ ಬದಲ್‍ಪುಲೆ",
        "newpage": "ಪೊಸ ಪುಟೊ",
        "talkpage": "ಪುಟದ ಬಗ್ಗೆ ಚರ್ಚೆ ಮನ್ಪುಲೆ",
-       "talkpagelinktext": "ಪಾತೆರ್ಲೆ",
+       "talkpagelinktext": "ಪಾತೆರ",
        "specialpage": "ವಿಶೇಷ ಪುಟ",
        "personaltools": "ಸ್ವಂತೊ ಉಪಕರಣೊಲು",
        "articlepage": "ಲೇಖನ ಪುಟೊನು ತೂಲೆ",
        "mainpage-description": "ಮುಖ್ಯ ಪುಟ",
        "policy-url": "Project:ನಿಯಮಾವಳಿ",
        "portal": "ಸಮುದಾಯೊ ಪುಟೊ",
-       "portal-url": "Project:ಸಮುದಾಯೊ ಪುಟೊ",
+       "portal-url": "Project:ಸಮುದಾಯ ಪುಟ",
        "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": "ಪುಟೊ",
        "enterlockreason": "ಡೇಟಬೇಸ್ ಮುಚ್ಚುನ ಕಾರಣೊನು ಬೊಕ್ಕೊ ನಾನೊರೊ ಅಯಿನ್ ದೆಪ್ಪುನ ಅಂದಾಜಿದ ಪೊರ್ತುನು ತೆರಿಪಾಲೆ",
        "missing-article": "\"$1\" $2 ಪುದರ್’ದ ಪುಟ ದೇಟಬೇಸ್’ಡ್ ಇಜ್ಜಿ.\n\nಡಿಲೀಟ್ ಮಲ್ತಿನ ಪುಟೊಕು ಸಂಪರ್ಕ ಕೊರ್ಪುನ ಇತಿಹಾಸ ಲಿಂಕ್ ಅತ್ತ್’ನ್ಡ ವ್ಯತ್ಯಾಸ ಲಿಂಕ್’ನ್ ಒತ್ತುನೆರ್ದಾದ್ ಈ ದೋಷ ಸಾಧಾರಣವಾದ್ ಬರ್ಪುಂಡು.\n\nಒಂಜಿ ವೇಳೆ ಅಂಚ ಆದಿಜ್ಜಿಂಡ, ಉಂದು ಒಂಜಿ ಸಾಫ್ಟ್-ವೇರ್ ದೋಷ ಆದುಪ್ಪು.\nಇಂದೆನ್  [[Special:ListUsers/sysop|ವಿಕಿ-ಅಧಿಕಾರಿಗ್]] ತೆರಿಪಾಲೆ.",
        "missingarticle-rev": "(ಮರು-ಆವೃತ್ತಿ#: $1)",
+       "missingarticle-diff": "(ವ್ಯತ್ಯಾಸೊ: $1, $2)",
+       "readonly_lag": "ಅಡಿಟುಪ್ಪುನ ಡೇಟಾಬೇಸ್ ಸರ್ವರ್‍ಕುಲು ಮೂಲೊ ಸರ್ವರ್‍ದೊಟ್ಟುಗೆ ಸಮಾನತೆಗ್ ಬರ್ಪುನ ಮುಟ್ಟೊ ಡೇಟಾಬೇಸ್‍ನ್ ಯಾಂತ್ರಿಕವಾದ್ ಮುಚ್ಚಿದ್ ಆತ್ಂಡ್",
        "internalerror": "ಆ೦ತರಿಕ ದೋಷ",
        "internalerror_info": "ಆಂತರಿಕ ದೋಷ: $1",
+       "internalerror-fatal-exception": "\"$1\" ಬಗೆತ ಒಂಜಿ ಗಂಭೀರವಾಯಿನ ಆಕ್ಷೇಪಣೆ",
        "filecopyerror": "ಫೈಲ್ \"$1\" ನ್ \"$2\" ಗ್ ನಕಲ್ ಮಲ್ಪೆರೆ ಆಯಿಜಿ",
        "filerenameerror": "\"$1\" ಫೈಲ್ ನ್ \"$2\"ಗ್ ಪುನರ್ನಾಮಕರಣ ಮಲ್ಪೆರೆ ಆಯಿಜಿ.",
        "filedeleteerror": "\"$1\" ಫೈಲ್ ನ್ ದೆತ್ತ್ ಪಾಡೆರೆ ಆವೊ೦ದಿಜ್ಜಿ.",
        "directorycreateerror": "\"$1\" ಡೈರೆಕ್ಟರಿನ್ ಉ೦ಡು ಮಲ್ಪೆರೆ ಆವೊ೦ದಿಜ್ಜಿ.",
+       "directoryreadonlyerror": "\"$1\" ಡೈರೆಕ್ಟರಿ ಓದೆರೆ ಮಾಂತ್ರೊ.",
+       "directorynotreadableerror": "\"$1\" ಡೈರೆಕ್ಟರಿನ್ ಓದೆರೆ ಸಾದ್ಯೊ ಇದ್ದಿ",
        "filenotfound": "\"$1\" ಫೈಲ್ ನ್ ನಾಡಿಯೆರೆ ಆಯಿಜಿ.",
        "unexpected": "ಅನಿರೀಕ್ಷಿತ ಮೌಲ್ಯ: \"$1\"=\"$2\".",
        "formerror": "ದೋಷ: ಅರ್ಜಿನ್ ಕಡಪುಡಿಯೆರ್ ಆಯಿಜಿ",
        "badarticleerror": "ಈ ಪುಟಡ್ ಈರ್ ಪ್ರಯತ್ನಿಸಾನ ಕಾರ್ಯ ಸಾದ್ಯ ಇಜ್ಜಿ",
        "cannotdelete": "ಪುಟ ಅಥವಾ ಹೊತ್ತಗೆ \"$1\" ನ್ ಮಾಜಾವರ ಆಪುಜ್ಜಿ.(ಬೇತೆ ಎರೋ ಮಾಜಾದಿಪ್ಪೆರ್)",
        "cannotdelete-title": "\"$1\" ಮಾಜಾವರೆ ಆಪುಜ್ಜಿ",
+       "delete-hook-aborted": "ಮಾಜಪುನೆನ್ ರದ್ದ್ ಮಲ್ತಿನ ಕೊಂಡಿ. ಅವು ಒವ್ವೇ ಇವರಣೆ ಕೊರ್ತ್‌ಜಿ.",
+       "no-null-revision": "\"$1\" ಪುಟೊದ ಸೊನ್ನೆ ಪುನರಾವರ್ತನೆನ್ ರಚಿಸಯರ್ ಸಾದ್ಯೊ ಇದ್ದಿ",
        "badtitle": "ಸರಿ ಇದ್ಯಾಂದಿನ ಪುದರ್",
        "badtitletext": "ಈರ್ ಕೋರಿನ ಪುಟದ ಶೀರ್ಷಿಕೆ ಸಿಂಧು ಅತ್ತ್ ಅಥವಾ ಕಾಲಿ ಅಥವಾ ಸರಿಯಾಯಿನ ಕೊಂಡಿ ಅತ್ತಾಂದಿನ ಅಂತರ ಬಾಸೆ/ಅಂತರ ವಿಕಿ ಸಂಪರ್ಕೊ.\nಅಯಿಟ್ ಒಂಜಿ ಅತ್ತಂಡ ಸೀರ್ಸಿಕೆಲೆ ಬಳಕೆ ಮಲ್ಪರೆ ನಿಸೇದೊ ಆಯಿನ ಅಕ್ಷರೊಲು ಇಪ್ಪು.",
+       "title-invalid-empty": "ಮನವಿ ಮಾಲ್ತ್‌ನ ಪುಟೊದ ತರೆಬರವು ಕಾಲಿಯಾತ್‍ಂಡ್ ಅತ್ತಂಡ ಕೇವಲೊ ಪುದರ್‍ದ ಜಾಗೆದ ಪುದರ್‍ನ್ ಮಾಂತ್ರೊ ಹೊಂದ್‍ದ್ಂಡ್.",
        "perfcached": "ಈ ತಿರ್ತ್‍ದ ಮಾಹಿತಿಲು cacheದ್ ಬತ್ತ್ಂಡ್ ಬುಕ್ಕೊ ಇತ್ತೆದ ಸ್ತಿತಿನ್ ಬಿಂಬಿಸವೊಂದುಂಡು.  ದಿಂಜ ಪಂಡ {{PLURAL:$1|one result is|$1 ಪಲಿತಾಂಸೊಲು}}cacheಡ್ ತಿಕುಂಡು.",
        "perfcachedts": "ಈ ತಿರ್ತ್‍ದ ಮಾಹಿತಿಲು cacheದ್ ಬತ್ತ್ಂಡ್ ಬುಕ್ಕೊ ಇತ್ತೆದ ಸ್ತಿತಿನ್ ಬಿಂಬಿಸವೊಂದುಂಡು.  ದಿಂಜ ಪಂಡ {{PLURAL:$4|one result is|$4 ಪಲಿತಾಂಸೊಲು}}cacheಡ್ ತಿಕುಂಡು.",
        "querypage-no-updates": "ಈ ಪುಟೊತ್ತ ಆಧುನಿಕ ಮಲ್ಪುನ ಕ್ರಿಯೆನ್ ಸದ್ಯಗ್ ಉಂತಾದ್ಂಡ್. ಮುಲ್ಪ ಉಪ್ಪುನ ಮಾಹಿತಿನ್ ನವೀಕರಣ ಮಲ್ಪರಾಪುಜಿ",
        "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": "ಇರೆನ ಸಂಪಾದನೆ",
        "yourdiff": "ವ್ಯತ್ಯಾಸೊಲು",
        "copyrightwarning": "ದಯಮಲ್ತ್’ದ್ ಗಮನಿಸ್’ಲೆ: {{SITENAME}} ಸೈಟ್’ಡ್ ಇರೆನ ಪೂರಾ ಕಾಣಿಕೆಲುಲಾ $2 ಅಡಿಟ್ ಬಿಡುಗಡೆ ಆಪುಂಡು (ಮಾಹಿತಿಗ್ $1 ನ್ ತೂಲೆ). ಇರೆನ ಸಂಪಾದನೆಲೆನ್ ಬೇತೆಕುಲು ನಿರ್ಧಾಕ್ಷಿಣ್ಯವಾದ್ ಬದಲ್ ಮಲ್ತ್’ದ್ ಬೇತೆ ಕಡೆಲೆಡ್ ಪಟ್ಟೆರ್. ಇಂದೆಕ್ ಇರೆನ ಒಪ್ಪಿಗೆ ಇತ್ತ್’ನ್ಡ ಮಾತ್ರ ಮುಲ್ಪ ಸಂಪಾದನೆ ಮಲ್ಪುಲೆ.<br />\nಅತ್ತಂದೆ ಇರೆನ ಸಂಪಾದನೆಲೆನ್ ಈರ್ ಸ್ವತಃ ಬರೆತರ್, ಅತ್ತ್’ನ್ಡ ಕೃತಿಸ್ವಾಮ್ಯತೆ ಇಜ್ಜಂದಿನ ಕಡೆರ್ದ್ ದೆತೊನ್ದರ್ ಪಂಡ್’ದ್ ಪ್ರಮಾಣಿಸೊಂದುಲ್ಲರ್.\n'''ಕೃತಿಸ್ವಾಮ್ಯತೆದ ಅಡಿಟುಪ್ಪುನಂಚಿನ ಕೃತಿಲೆನ್ ಒಪ್ಪಿಗೆ ಇಜ್ಜಂದೆ ಮುಲ್ಪ ಪಾಡೊಚಿ!'''",
        "templatesused": "ಈ ಪುಟೊಟ್ ಉಪಯೋಗ ಮಲ್ತಿನ {{PLURAL:$1|ಟೆಂಪ್ಲೇಟು|ಟೆಂಪ್ಲೇಟುಗಳು}}:",
-       "templatesusedpreview": "ಈ ಮುನ್ನೋಟೊಡು ಉಪಯೋಗ ಮಲ್ತಿನ ಟೆಂಪ್ಲೇಟ್’ಲು:",
+       "templatesusedpreview": "ಈ ಮುನ್ನೋಟೊಡು ಉಪಯೋಗ ಮಲ್ತಿನ{{PLURAL:$1|Template|Templates}}:",
+       "templatesusedsection": "ಈ ಇಬಾಗೊಡು ಉಪಯೋಗ ಮಲ್ತಿನ {{PLURAL:$1|Template|Templates}}:",
        "template-protected": "(ಸಂರಕ್ಷಿತೊ)",
        "template-semiprotected": "(ಅರೆ-ಸಂರಕ್ಷಿತೊ)",
        "hiddencategories": "ಈ ಪುಟೊ {{PLURAL:$1|೧ ಗುಪ್ತ ವರ್ಗೊಗ್|$1 ಗುಪ್ತ ವರ್ಗೊಲೆಗ್}} ಸೇರ್ದ್‍ನ್ಡ್:",
        "history-fieldset-title": "ಇತಿಹಾಸಡ್ ನಾಡ್ಲೆ",
        "history-show-deleted": "ದೆತ್ತ್ ಪಾಡಿನ",
        "histfirst": "ಬಾರಿ ದುಂಬುದ",
-       "histlast": "ಇಂಚಿಪ್ಪದ",
+       "histlast": "ಪೊಸ",
+       "historysize": "({{PLURAL:$1|೧ ಬೈಟ್|$1 ಬೈಟ್‍ಲು}})",
        "historyempty": "(ಖಾಲಿ)",
        "history-feed-title": "ಬದಲಾವಣೆಲೆನ ಇತಿಹಾಸೊ",
+       "history-feed-description": "ವಿಕಿದ ಈ ಪುಟೊತ ಬದಲಾವಣೆಲೆ ಇತಿಹಾಸೊ",
+       "history-feed-item-nocomment": "$1 $2 ಅಲ್ಪ",
        "rev-delundel": "ತೋಜುನೆನ್ ದೆಂಗಲ",
        "rev-showdeleted": "ತೊಜಾವು",
        "revisiondelete": "ಮಾಜಾಯಿನ/ಮಾಜಾವಂದಿನ ಬದಲಾವಣೆಲು",
        "powersearch-legend": "ಅಡ್ವಾನ್ಸ್’ಡ್ ಸರ್ಚ್",
        "powersearch-ns": "ನೇಮ್-ಸ್ಪೇಸ್’ಲೆಡ್ ನಾಡ್ಲೆ",
        "powersearch-toggleall": "ಮಾತಾ",
+       "powersearch-togglenone": "ಇದ್ದಿ",
+       "search-external": "ಬಾಹ್ಯೊ ಹುಡುಕಾಟೊ",
        "preferences": "ಪ್ರಾಶಸ್ತ್ಯೊಲು",
        "mypreferences": "ಪ್ರಾಸಸ್ತ್ಯೊಲು",
+       "prefs-skin": "ಸ್ಕಿನ್",
+       "skin-preview": "ಮುನ್ನೋಟೊ",
+       "datedefault": "ಒವ್ವೇ ಪ್ರಾಸಸ್ತ್ಯೊ ಇದ್ದಿ",
        "prefs-rc": "ಇಂಚಿಪದ ಬದಲಾವಣೆಲು",
        "prefs-resetpass": "ಪ್ರವೇಶಪದೊನ್ ಬದಲಾವಣೆ ಮಲ್ಪುಲೆ",
-       "prefs-changeemail": "ಇ-ಅಂಚೆ ವಿಳಾಸೊನು ಬದಲಾವಣೆ ಮಲ್ಪುಲೆ",
+       "prefs-changeemail": "ಇ-ಅಂಚೆ ವಿಳಾಸೊನು ಬದಲಾವಣೆ ಮಲ್ಪುಲೆ ಅತ್ತಂಡ ದೆಪ್ಪುಲೆ",
+       "prefs-setemail": "ಇ-ಅಂಚೆ ವಿಳಾಸೊನು ಸ್ತಾಪನೆ ಮಲ್ಪು",
+       "prefs-email": "ಇ-ಅಂಚೆ ಇಚ್ಛೆಲು",
+       "prefs-rendering": "ಗೋಚರೊ",
        "saveprefs": "ಒರಿಪಾಲೆ",
+       "prefs-editing": "ಸಂಪೊಲಿಪು",
        "rows": "ಸಾಲ್‘ಲು",
+       "columns": "ಸಾಲ್‍ಕುಲು:",
        "searchresultshead": " \nನಾಡ್’ಲೆ",
+       "stub-threshold-sample-link": "ಸಾಂಪಲ್",
+       "stub-threshold-disabled": "ಕ್ರಿಯೆ ಉಂತ್‍ದ್ಂಡ್",
+       "recentchangesdays": "ಇಂಚಿಪೊದ ಬದಲಾವಣೆಡ್ ತೋಜ್ಪಾವೊಡಾಯಿನ ದಿನೊಕುಲು:",
+       "timezonelegend": "ಸಮಯೊದ ವಲಯೊ:",
        "localtime": "ಸ್ಥಳೀಯ ಸಮಯ:",
+       "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": "ಕಸ್ಟಮ್ ಸಿಎಸ್ಎಸ್",
+       "prefs-custom-js": "ಕಸ್ಟಮ್ ಜಾವಾಸ್ಕ್ರಿಪ್ಟ್",
+       "prefs-emailconfirm-label": "ಇ-ಮೈಲ್‍ದ ಒಪ್ಪಿಗೆ:",
        "youremail": "ಇ-ಅಂಚೆ",
-       "username": "ಸದಸ್ಯೆರ್ನ ಪುದರ್:",
+       "username": "{{GENDER:$1|ಸದಸ್ಯತ್ವೊದ ಪುದರ್}}:",
+       "prefs-registration": "ನೋಂದಣಿದ ಸಮಯ:",
        "yourrealname": "ನಿಜವಾಯಿನ ಪುದರ್",
        "yourlanguage": "ಭಾಷೆ:",
        "yournick": "ಪೊಸ ಸಹಿ",
-       "badsiglength": "ಇರೆನ ಸಹಿ ಭಾರೀ ಉದ್ದ ಆಂಡ್",
+       "badsiglength": "ಇರೆನ ಸಹಿ ಭಾರೀ ಉದ್ದ ಆಂಡ್.  ಉಂದು ಮಸ್ತ್ ಉದ್ದೊ ಆಯೆರೆ ಬಲ್ಲಿ{{PLURAL:$1|character|characters}}.",
        "yourgender": "ಲಿಂಗೊ",
-       "gender-male": "à²\86ಣà³\8d",
-       "gender-female": "ಪà³\8aಣà³\8dಣà³\81",
+       "gender-male": "à²\86ಯà³\86 à²µà²¿à²\95ಿ à²ªà³\81à²\9fà³\8aನà³\81 à²¸à²\82ಪà³\8aಲಿಪà³\81ವà³\86",
+       "gender-female": "à²\86ಲà³\8d à²µà²¿à²\95ಿ à²ªà³\81à²\9fà³\8aನà³\81 à²¸à²\82ಪà³\8aಲಿಪà³\81ವಲà³\8d",
        "email": "ಇ-ಅಂಚೆ",
+       "prefs-help-email": "ಇ-ಮೈಲ್ ಎಡ್ರಾಸ್ ಕಡ್ಡಾಯೊ ಅತ್ತ್, ಆಂಡ ನಿಕುಲು ಅಯಿನ್ ಕೊರ್ಂಡ ಈರ್ ನಿಕ್ಲೆನ ಪ್ರವೇಸೊ ಪದೊನು ಮರತ್ಂಡ ಅಯಿನ್ ಈರೆಗ್ ಇ-ಮೈಲ್‍ಡ್ದ್ ಕಡಪುಡೊಲಿ.",
+       "prefs-help-email-required": "ಇ-ಮೈಲ್ ಎಡ್ರಾಸ್ ಬೋಡಾತ್ಂಡ್.",
+       "prefs-info": "ಬುಡೊತ ಮಾಹಿತಿ",
+       "prefs-i18n": "ಅಂತರರಾಷ್ಟ್ರೀಕರಣ",
        "prefs-signature": "ಸಹಿ",
+       "prefs-dateformat": "ತಾರೋಕ್‍ದ ಸೈಲಿ",
+       "prefs-advancedediting": "ಸಾಮಾನ್ಯೊ ಆಯ್ಕೆಲು",
+       "prefs-editor": "ಸಂಪಾದಕೆ",
+       "prefs-preview": "ಮುನ್ನೋಟೊ",
+       "prefs-advancedrc": "ಪರಿಣತ ಇಚ್ಛೆಲು",
+       "prefs-advancedrendering": "ಪರಿಣತ ಇಚ್ಛೆಲು",
+       "prefs-advancedsearchoptions": "ಪರಿಣತ ಇಚ್ಛೆಲು",
+       "prefs-advancedwatchlist": "ಪರಿಣತ ಇಚ್ಛೆಲು",
+       "prefs-displayrc": "ಪ್ರದರ್ಸನೊ ಆಯ್ಕೆಲು",
+       "prefs-displaywatchlist": "ಪ್ರದರ್ಸನೊ ಆಯ್ಕೆಲು",
+       "prefs-tokenwatchlist": "ಟೊಕನ್",
+       "userrights-lookup-user": "ಬಳಕೆದಾರೆರೆ ಗುಂಪುಲೆನ್ ನಿರ್ವಹಿಸಲ",
+       "userrights-user-editname": "ಒಂಜಿ ಸದಸ್ಯ ಪುದರ್ ಬರೆಲೆ",
        "group": "ಗುಂಪುಲು:",
        "group-user": "ಬಳಕೆದಾರೆರ್",
        "group-sysop": "ನಿರ್ವಾಹಕೆರ್",
        "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 6450ba1..015cf04 100644 (file)
        "expand_templates_remove_comments": "Ҳазфи тавзеҳот",
        "expand_templates_generate_xml": "Намоиши дарахти таҷзеҳи XML",
        "expand_templates_preview": "Пешнамоиш",
-       "randomrootpage": "Саҳифаи решавии тасодуфӣ"
+       "randomrootpage": "Саҳифаи решавии тасодуфӣ",
+       "changecredentials-submit": "Тағйири ҳисоби корбарӣ",
+       "removecredentials-submit": "Хориҷи эътиборнома"
 }
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 b3bc4dc..6a78e81 100644 (file)
        "actions": "Һәрәкәтон",
        "namespaces": "Номон мәконон",
        "variants": "Вариантон",
+       "navigation-heading": "Naviqasiyə menü",
        "errorpagetitle": "Сәһв",
        "returnto": "Бә сәһифә огәрдеј $1.",
        "tagline": "Материал че {{SITENAME}}",
        "unprotectthispage": "Ын сәһифә мыдофијә дәгиш кардеј",
        "newpage": "Тожә сәһифә",
        "talkpage": "Ым сәһифә мызокирә кардеј",
-       "talkpagelinktext": "Mızokirə",
+       "talkpagelinktext": "Müzakirə",
        "specialpage": "Хысусијә сәһифә",
        "personaltools": "Шәхси диләгон",
        "articlepage": "Мәғолә дијә кардеј",
        "talk": "Mızokirə",
        "views": "Тәмшо кардеј",
-       "toolbox": "Диләгон",
+       "toolbox": "Diləqon",
        "userpage": "Иштирокәкә сәһифә дијә кардеј",
        "projectpage": "Нәхши сәһифә дијә кардеј",
        "imagepage": "Фајли сәһифә дијә кардеј",
        "copyrightpage": "{{ns:project}}:Мыәллифә һуғуғ",
        "currentevents": "Есәтнә һодисон",
        "currentevents-url": "Project: Есәтнә һодисон",
-       "disclaimers": "Çe məsuliyyətiku imtino.",
+       "disclaimers": "Çı məsuliyyətiku imtina",
        "disclaimerpage": "Project:Дејни бә гиј ныгәтеј",
        "edithelp": "Арајиш бо редактә кардеј",
-       "mainpage": "Əsosə səhifə",
+       "mainpage": "Sərlohə",
        "mainpage-description": "Әсосә сәһифә",
        "policy-url": "Project:Ғајдон",
        "portal": "Ҹәмјәт",
        "nstab-image": "Фајл",
        "nstab-template": "Ғәлиб",
        "nstab-category": "Тиспир",
+       "mainpage-nstab": "Sərlohə",
        "error": "Сәһв",
        "readonly": "Бә база нывыште блок быә.",
        "missing-article": "База мәлумотон дыләдә бә ахтар кардә быә саһифон «$1» $2 барәдә мәлумот пәјдо карде ныбе.\nЖыго вәзијјәт бе бәзне бә вахтики, ым сәһифә че рәдд кардә быә сәһифә канә рәвојәте.\nГирәм ым жыго ни, жәгәдә шымә програм тәминатијәдә сәһв пәјдо кардәјоне.\nХаһиш кардәмон че сәһифә URL-и бә [[Special:ListUsers/sysop|администратори]] бывғандәнән.",
        "createaccountreason": "Сәбәб:",
        "mailmypassword": "Нујә парол вығандеј бә Е-номә.",
        "loginlanguagelabel": "Зывон: $1",
+       "pt-login": "Dəşi",
+       "pt-createaccount": "Qeydiyyat",
        "changepassword": "Пароли дәгиш кардеј",
        "resetpass_header": "Иштирокәкә пароли дәгиш карде",
        "oldpassword": "Канә парол:",
        "preview": "Сыфтәнә нишо дој",
        "showpreview": "Сыфтәнә нишо дој",
        "showdiff": "Дәғандә быә дәгишон",
-       "anoneditwarning": "'''Дығғәт.''' Шымә ыштәни едәштәнијоне системәдә.\nШымә IP-унвон бә ым сәһифә дәгишон тарых ғејд бәбе.",
+       "anoneditwarning": "<strong>Diqqət:</strong> Şımə bə sistem dəşənin. Berdəm şımə qıli sərost bıkon çı şımə lP-ünvani harkəs bəvinde. Berdəm <strong>[$1 daxil bıbu]</strong> jaanki <strong>[$2 hesob okə]</strong>, \nşımə sərostəti bə şımə nom nıvışte bəbe, imən bə şımə co üstünlükon bədoe",
        "loginreqlink": "ыштәни едаштеј",
        "newarticle": "(Нујә)",
        "newarticletext": "Шымә давардијон де сәбони бә сәһифә, әмма жыго сәһифә ни.\nБо сәһифә офәјеј мәтн бынывыштән жиннә пенҹәдә (мыффәссәл дијә быкән [$1 араијшә сәһифә]).\nГирәм шымә ијо де сәһви бешијон, һиччекәни ыштә браузери \"думо\" егәтән.",
-       "noarticletext": "Есәт бы сәһифәдә мәтн ни.\nШымә бәзынешон [[Special:Search/{{PAGENAME}}|пәјдо кардеј конҹо ым ном һесте]] бә ҹо мәғолонәдә,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} журналон ујғунә нывыштәјон пәјдо кардеј],\nјаанки '''[{{fullurl:{{FULLPAGENAME}}|action=edit}}де жыго номи сәһифә офәјеј ]'''</span>.",
+       "noarticletext": "Isə bı səhəfədə mətn ni.\nŞımə bəzneyon [[Special:Search/{{PAGENAME}}|peydo kardey konco im nom hıste] bə co səhəfədə,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} bə jurnalon uyğunə nıvıştəyon pedo kardey],\nor [{{fullurl:{{FULLPAGENAME}}|action=edit}} create this page]</span>.",
        "noarticletext-nopermission": "Есәт бы сәһифәдә мәтн ни. \nШымә бәзынејон [[Special:Search/{{PAGENAME}}|пәјдо кардеј конҹо ым ном һесте]] бә ҹо мәғолонәдә,\nјаанки <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} журналон ујғунә нывыштәјон пәјдо кардеј].</span>, интаси шымәку изн ни ым сәһифә офәје.",
        "previewnote": "'''Јодәдә огәтән ки ым һәлә сыфтәнә нишо доје.'''\nШымә дәгишон һәлә огәтә быәнин!",
        "editing": "Редәктә кардеј $1",
        "viewpagelogs": "Бо ым сәһифә журналон нишо дој",
        "currentrev-asof": "Есәтнә рәвојәт бә $1",
        "revisionasof": "Рәвојәт $1",
-       "revision-info": "Рәвојәти мәлумот: $1; $2",
+       "revision-info": "Çı $7 $1 tarixədə kardə sərostəti",
        "previousrevision": "← Навынәни",
        "nextrevision": "Думотоно шә →",
        "currentrevisionlink": "Есәтнә рәвојәт",
        "shown-title": "Нишо дој $1 {{PLURAL:$1|нывыштәј|нывыштәјон}} сәһифәдә",
        "viewprevnext": "Дијә кардеј ($1 {{int:pipe-separator}} $2) ($3)",
        "searchmenu-exists": "'''Бы вики-нәхшәдә һесте сәһифә «[[:$1]]»'''",
-       "searchmenu-new": "'''Сәһифә офәјеј «[[:$1]]» бә ым вики-нахшәдә!'''",
+       "searchmenu-new": "<strong> im vikiədə \"[[:$1]]\" səhifə okəy!</strong> {{PLURAL:$2|0=|Həmçinin bə nəve nəticədə peydo bıə səhifon dekə.| Bə nəve nəticədə peydo bıə nəticon dekə.}}",
        "searchprofile-articles": "Әсосә сәһифон",
        "searchprofile-images": "Мултимедијә",
        "searchprofile-everything": "Һар вырәдә",
        "rclistfrom": "$3 $2 вахтику дәгишон нишо быдә",
        "rcshowhideminor": "$1 гәдәлијә дәгишон",
        "rcshowhidebots": "$1 ботон",
-       "rcshowhideliu": "$1 ыштәни едаштә иштирокәкон",
+       "rcshowhideliu": "$1 qeyd bıə iştirakəkon",
        "rcshowhideanons": "$1 әнәномә иштирокәкон",
        "rcshowhidepatr": "$1 осә кардә быә дәгишон",
        "rcshowhidemine": "$1 ыштә дәгишон",
        "filedelete-comment": "Сәбәб:",
        "filedelete-submit": "Рәдд кардеј",
        "randompage": "Рајрастә мәғолә",
+       "randomincategory-submit": "Давард",
        "statistics": "Статистика",
        "nbytes": "$1 {{PLURAL:$1|бајт|бајтон}}",
        "nmembers": "$1 {{PLURAL:$1|узв|узвон}}",
        "whatlinkshere-prev": "{{PLURAL:$1|навынәни|навынәни $1}}",
        "whatlinkshere-next": "{{PLURAL:$1|думотоно шә|думотоно шә $1}}",
        "whatlinkshere-links": "← сәбонон",
-       "whatlinkshere-hideredirs": "$1 бә тожә унвон вығандеј",
-       "whatlinkshere-hidetrans": "$1 әловон",
-       "whatlinkshere-hidelinks": "$1 сәбонон",
+       "whatlinkshere-hideredirs": "$1 bə tojə ünvan vığande",
+       "whatlinkshere-hidetrans": "$1 əlavon",
+       "whatlinkshere-hidelinks": "$1 səbonon",
        "whatlinkshere-hideimages": "$1 фајлинә сәбонон",
        "whatlinkshere-filters": "Филтрон",
        "ipbreason": "Сәбәб:",
        "allmessages-filter-submit": "Давард",
        "thumbnail-more": "Һејве кардеј",
        "thumbnail_error": "Гәдә шикили туму кардејәдә сәһв: $1",
-       "tooltip-pt-userpage": "ШÑ\8bмÓ\99 Ð¸Ñ\88Ñ\82иÑ\80окÓ\99кÓ\99 Ñ\81Ó\99һиÑ\84Ó\99",
-       "tooltip-pt-mytalk": "ШÑ\8bмÓ\99 Ð¼Ñ\8bзокиÑ\80он Ñ\81Ó\99һиÑ\84Ó\99",
-       "tooltip-pt-preferences": "Шымә кукон",
+       "tooltip-pt-userpage": "Å\9eımÉ\99 sÉ\99hifÉ\99",
+       "tooltip-pt-mytalk": "Å\9eımÉ\99 müzakirÉ\99 sÉ\99hifÉ\99",
+       "tooltip-pt-preferences": "Şımə nizamon",
        "tooltip-pt-watchlist": "Сәһифон сијоһи, конҹо шымә де дығғәти дијә кардејдәјон бә дәгишон",
-       "tooltip-pt-mycontris": "Шымә гәнҹон сијоһи",
+       "tooltip-pt-mycontris": "Şımə səroston siyahi",
        "tooltip-pt-login": "Ијо бәбе ыштәни ғејд кардовнијеј системәдә, интаси ым һукман ни",
        "tooltip-pt-logout": "Системәдә кој орохнијеј",
+       "tooltip-pt-createaccount": "Təklif kardəmon, boştə tojə səhifə okənən və bə sistem dıştə nomi dəşənən, hərçənd ım mütləq ni",
        "tooltip-ca-talk": "Сәһифә мығдори бәрәдә мызокирә",
-       "tooltip-ca-edit": "Ым сәһифә бәбе дагиш кардеј. Быһамијән, огәтеј бә нав, \"сыфтәнә нишо дој\" истифодә быкән",
+       "tooltip-ca-edit": "İm səhifə sərost karde",
        "tooltip-ca-addsection": "Нујә ғысм офәјеј",
        "tooltip-ca-viewsource": "Ым сәһифә мыдофијә быә дагиш кардеку, әммә шымә бәзынешон дијә кардеј ијән сурәт бекардеј әчәј бешемонә мәтни",
        "tooltip-ca-history": "Сәһифә дәгишон журнал",
        "tooltip-t-whatlinkshere": "Бә ым сәһифә сәбон вардә һәммәј вики сәһифон сијоһи",
        "tooltip-t-recentchangeslinked": "Охонә дәгишон сәһифонәдә, бә ком сәһифон сәбон вардә ым сәһифә",
        "tooltip-feed-atom": "Транслјасијә кардеј бә Atom бо ым сәһифә",
-       "tooltip-t-contributions": "Че иштирок кардәкәси дагиш кардә быә сәһифон сијоһи",
+       "tooltip-t-contributions": "Çı iştirak kardəkəsi dəgiş kardə səhifon siyohi",
        "tooltip-t-emailuser": "Бы иштироәкә номә вығәнде",
        "tooltip-t-upload": "Шикилон јаанки мултимедијә фајлон бо жај",
        "tooltip-t-specialpages": "Xıdmətə səhifon siyohi",
        "tooltip-ca-nstab-main": "Мәғолә мығдор",
        "tooltip-ca-nstab-user": "Иштирок кардәкәси сәһифә",
        "tooltip-ca-nstab-media": "Медиа-фајл",
-       "tooltip-ca-nstab-special": "Ым хыдмәтә сәһифәје бычыми горә дәгиш кардеј әбыни",
+       "tooltip-ca-nstab-special": "İm xidmətə səhifəye bəçi qorşo sərost karde əbıni",
        "tooltip-ca-nstab-project": "Нәхши сәһифә",
        "tooltip-ca-nstab-image": "Фајли сәһифә",
        "tooltip-ca-nstab-template": "Ғәлиби сәһифә",
        "tooltip-summary": "Кыртә тәсвир бынывыштән",
        "pageinfo-header-edits": "Дәгиш кардә быә чијон тарых",
        "pageinfo-redirects-value": "$1",
+       "pageinfo-toolboxlink": "Səhifə həxədə məlumaton",
        "previousdiff": "← Навынәни дәгиши",
        "nextdiff": "Думотоно шә дәгиши →",
        "file-info-size": "$1 × $2 пиксел, фајли памјә: $3, MIME тип: $4",
        "file-nohires": "Ән барзә рәвојәт ни.",
        "svg-long-desc": "SVG фајл, номинәләдә $1 × $2 пиксел, фајли памјә: $3",
-       "show-big-image": "Тикәјән јолә кејфијјәтинә шикил",
+       "show-big-image": "Çı fayli əsl",
+       "show-big-image-size": "$1 × $2 piksel",
        "ilsubmit": "Нәве",
        "bad_image_list": "Формат бәпе быбу жыго:\n\nБә һисоб сә быәбен әнҹәх сијоһи әсосон (де * рәмзи бино быә сәтырон).\nСәтыри иминә сәбон бәпе быбу сәбон бә ғәдәғән кардә быә бо дәғанде шикили.\nПешонә сәбонон бә һамонә сәтырәдә бәнә истино дијә кардә бәбен, јәни мәғолон, бә коврә шикил дахыл карде бәзне бе.",
        "metadata": "Метамәлумотон",
        "specialpages": "Хысусијә сәһифон",
        "external_image_whitelist": " #Ым сәтри огәтәнән чокнәј әв һесте<pre>\n#Рә рә истифадә быә фрагментон ијо быдәнән (ә һиссә, че // мијонәдә бедә )\n#Әвон ды харичи шикили URL и дуз бәбен.\n#Дуз омә гылә бәнә шикили нишо бәбе, амандәни бәнә шикили линк нишо бәбе.\n#Сәтрон де # комментариј һисоб бедән.\n#Сәтрон бә регистри һәссос нин.\n\n#Рә рә око доә быә фрагментон че сәтри пентоно ијо быдәнән. Ым сәтри огәтәнән чокнәј һесте.</pre>",
        "tag-filter": "[[Special:Tags|нышонон]] филтр:",
-       "tags-title": "Нышонон"
+       "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Nişon|Nişonon}}]]: $2)",
+       "tags-title": "Нышонон",
+       "logentry-newusers-create": "$1 istifadəmon hesob okarde be",
+       "searchsuggest-search": "Nəve"
 }
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..bf2a862 100644 (file)
        "noname": "Сез кулланучы исемегезне күрсәтергә тиешсез.",
        "loginsuccesstitle": "Керү уңышлы үтте",
        "loginsuccess": "'''Сез {{SITENAME}} проектына $1 исеме белән кердегез.'''",
-       "nosuchuser": "$1 Ð¸Ñ\81емле ÐºÑ\83лланÑ\83Ñ\87Ñ\8b Ñ\8eк.\nÐ\9aÑ\83лланÑ\83Ñ\87Ñ\8b Ð¸Ñ\81еменең Ð´Ó©Ñ\80еÑ\81леге Ñ\80егиÑ\81Ñ\82Ñ\80га бәйле.\nЯзылышыгызны тикшерегез яки [[Special:CreateAccount|яңа хисап язмасы төзегез]].",
+       "nosuchuser": "$1 Ð¸Ñ\81емле ÐºÑ\83лланÑ\83Ñ\87Ñ\8b Ñ\8eк.\nÐ\9aÑ\83лланÑ\83Ñ\87Ñ\8b Ð¸Ñ\81еменең Ð´Ó©Ñ\80еÑ\81леге Ñ\85Ó\99Ñ\80еÑ\84лÓ\99Ñ\80нең Ñ\80егиÑ\81Ñ\82Ñ\80Ñ\8bна бәйле.\nЯзылышыгызны тикшерегез яки [[Special:CreateAccount|яңа хисап язмасы төзегез]].",
        "nosuchusershort": "$1 исемле кулланучы юк. Язылышыгызны тикшерегез.",
        "nouserspecified": "Сез теркәү исмегезне күрсәтергә тиешсез.",
        "login-userblocked": "Бу кулланучы тыелды. Керү тыелган.",
        "accmailtext": "[[User talk:$1|$1]] кулланучысы өчен төзелгән серсүз $2 адресына җибәрелде.\n\nАвторизация узгач, үз хисап язмагызда сез ''[[Special:ChangePassword|серсүзегезне үзгәртә аласыз]]''.",
        "newarticle": "(Яңа)",
        "newarticletext": "Сез әлегә язылмаган биткә кердегез.\nЯңа бит ясау өчен астагы тәрәзәдә мәкалә текстын җыегыз ([$1 ярдәм битен] карый аласыз).\nӘгәр сез бу биткә ялгышлык белән эләккән булсагыз, браузерыгызның '''артка''' төймәсенә басыгыз.",
-       "anontalkpagetext": "----''Бу бәхәс бите системада теркәлмәгән яисә үз исеме белән кермәгән кулланучыныкы.\nАны тану өчен IP адресы файдаланыла.\nӘгәр сез аноним кулланучы һәм сезгә юлланмаган хәбәрләр алдым дип саныйсыз икән (бер IP адресы күп кулланучы өчен булырга мөмкин), башка мондый аңлашылмаучанлыклар килеп чыкмасын өчен [[Special:UserLogin|системага керегез]] яисә [[Special:CreateAccount|теркәлегез]].''",
+       "anontalkpagetext": "----\n<em>Бу бәхәс бите системада теркәлмәгән яисә үз исеме белән кермәгән кулланучыныкы.</em>\nАны тану өчен без санлы IP адресын файдаланырга мәҗбүрбез.\nӘлеге адрес башка аноним кулланучылар тарафыннан да кулланылырга мөмкин.\nӘгәр сез аноним кулланучы һәм сезгә юлланмаган хәбәрләр алдым дип саныйсыз икән (бер IP адресы күп кулланучы өчен булырга мөмкин), башка мондый аңлашылмаучанлыклар килеп чыкмасын өчен [[Special:UserLogin|системага керегез]] яисә [[Special:CreateAccount|теркәлегез]].",
        "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> Сезнең бу битне ясарга хакыгыз юк.",
        "userpage-userdoesnotexist": "«<nowiki>$1</nowiki>» исемле хисап язмасы юк. Сез чынлап та бу битне ясарга яисә үзгәртергә телисезме?",
        "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 16ddb75..1ae4772 100644 (file)
        "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}} використовує куки (''cookies'') для входу до системи.\nВи їх вимкнули.\nБудь ласка, ввімкніть куки і спробуйте знову.",
        "nocookiesfornew": "Обліковий запис користувача не був створений через неможливість перевірити походження даних.\nПереконайтеся, що куки ввімкнено, оновіть сторінку і спробуйте ще раз.",
        "nocookiesforlogin": "{{int:nocookieslogin}}",
+       "createacct-loginerror": "Обліковий запис було успішно створено, але Ви не змогли увійти в систему автоматично. Будь ласка, [[Special:UserLogin|увійдіть вручну]].",
        "noname": "Ви зазначили неправильне ім'я користувача.",
        "loginsuccesstitle": "Вхід виконано",
        "loginsuccess": "'''Тепер ви працюєте в {{grammar:locative|{{SITENAME}}}} під іменем $1.'''",
        "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": "Вам потрібно буде ввести пароль, щоб підтвердити цю зміну.",
        "subject-preview": "Тема буде:",
        "previewerrortext": "Сталася помилка при спробі попереднього перегляду Ваших змін.",
        "blockedtitle": "Користувача заблоковано",
-       "blockedtext": "'''Ваш обліковий запис або IP-адреса заблоковані.'''\n\nБлокування виконане адміністратором $1.\nЗазначена наступна причина: ''$2''.\n\n* Початок блокування: $8\n* Закінчення блокування: $6\n* Блокування виконав: $7\n\nВи можете надіслати листа користувачеві $1 або будь-якому іншому [[{{MediaWiki:Grouppage-sysop}}|адміністратору]], щоб обговорити блокування.\n\nЗверніть увагу, що ви не зможете надіслати листа адміністратору, якщо ви не зареєстровані або не підтвердили свою електронну адресу в [[Special:Preferences|особистих налаштуваннях]], а також якщо вам було заборонено надсилати листи при блокуванні.\n\nВаша поточна IP-адреса — $3, ідентифікатор блокування — #$5. Будь ласка, зазначайте ці дані у своїх запитах.",
+       "blockedtext": "<strong>Ваш обліковий запис або IP-адреса заблоковані.</strong>\n\nБлокування виконане адміністратором $1.\nПричина блокування: <em>$2</em>.\n\n* Початок блокування: $8\n* Закінчення блокування: $6\n* Діапазон блокування: $7\n\nВи можете надіслати листа користувачеві $1 або будь-якому іншому [[{{MediaWiki:Grouppage-sysop}}|адміністратору]], щоб обговорити блокування.\n\nЗверніть увагу, що ви не зможете надіслати листа адміністратору, якщо ви не зареєстровані або не підтвердили свою електронну адресу в [[Special:Preferences|особистих налаштуваннях]], а також якщо вам було заборонено надсилати листи при блокуванні.\n\nВаша поточна IP-адреса — $3, ідентифікатор блокування — #$5. Будь ласка, зазначайте ці дані у своїх запитах.",
        "autoblockedtext": "Ваша IP-адреса автоматично заблокована у зв'язку з тим, що вона раніше використовувалася кимось із заблокованих користувачів. Адміністратор ($1), що її заблокував, зазначив наступну причину блокування:\n\n:''$2''\n\n* Початок блокування: $8\n* Закінчення блокування: $6\n* Блокування виконав: $7\n\nВи можете надіслати листа користувачеві $1 або будь-якому іншому [[{{MediaWiki:Grouppage-sysop}}|адміністратору]], щоб обговорити блокування.\n\nЗверніть увагу, що ви не зможете надіслати листа адміністраторові, якщо ви не зареєстровані у проекті або не підтвердили свою електронну адресу в [[Special:Preferences|особистих налаштуваннях]], а також якщо вам було заборонено надсилати листи при блокуванні.\n\nВаша поточна IP-адреса — $3, ідентифікатор блокування — #$5. Будь ласка, зазначайте його у своїх запитах.",
        "blockednoreason": "не вказано причини",
        "whitelistedittext": "Ви повинні $1, щоб редагувати сторінки.",
        "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}}}} журналу вилучень].",
        "userpage-userdoesnotexist": "Користувач під назвою \"<nowiki>$1</nowiki>\" не зареєстрований. Переконайтеся, що ви хочете створити/редагувати цю сторінку.",
-       "userpage-userdoesnotexist-view": "Обліковий запис користувача „$1“ не зареєстровано.",
+       "userpage-userdoesnotexist-view": "Обліковий запис користувача «$1» не зареєстровано.",
        "blocked-notice-logextract": "Цей користувач наразі заблокований.\nОстанній запис у журналі блокувань такий:",
        "clearyourcache": "<strong>Увага:</strong> Після збереження слід очистити кеш оглядача, щоб побачити зміни.\n* <strong>Firefox / Safari:</strong> тримайте <em>Shift</em>, коли натискаєте <em>Оновити</em>, або натисніть <em>Ctrl-F5</em> чи <em>Ctrl-Shift-R</em> (<em>⌘-R</em> на Apple Mac)\n* <strong>Google Chrome:</strong> натисніть <em>Ctrl-Shift-R</em> (<em>⌘-Shift-R</em> на Apple Mac)\n* <strong>Internet Explorer:</strong> тримайте <em>Ctrl</em>, коли натискаєте <em>Оновити</em>, або натисніть <em>Ctrl-F5</em>\n* <strong>Opera:</strong> очистіть кеш за допомогою <em>Інструменти → Налаштування</em> (<em>Opera → Побажання</em> на Apple Mac) та перейдіть на <em>Привітність & безпека → очистити дані браузера → кеш</em>",
        "usercssyoucanpreview": "'''Підказка:''' використовуйте кнопку «{{int:showpreview}}», щоб протестувати ваш новий css-файл перед збереженням.",
        "right-override-export-depth": "експорт сторінок, включаючи пов'язані сторінки з глибиною до 5",
        "right-sendemail": "надсилання електронної пошти іншим користувачам",
        "right-passwordreset": "Перегляд повідомлень електронної пошти для зміни паролю",
-       "right-managechangetags": "створення та вилучення [[Special:Tags|міток]] з бази даних",
+       "right-managechangetags": "створення та (де)активування [[Special:Tags|міток]]",
        "right-applychangetags": "додавання [[Special:Tags|міток]] разом зі змінами",
        "right-changetags": "додавання або вилучення будь-яких [[Special:Tags|міток]] для певних версій сторінок або записів журналів",
+       "right-deletechangetags": "вилучення [[Special:Tags|міток]] з бази даних",
        "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": "історія",
        "trackingcategories-msg": "Відстежувана категорія",
        "trackingcategories-name": "Ім'я повідомлення",
        "trackingcategories-desc": "Критерій включення в категорію",
+       "restricted-displaytitle-ignored": "Сторінки, де ігноруються відображувані назви",
+       "restricted-displaytitle-ignored-desc": "На цій сторінці ігнорується <code><nowiki>{{DISPLAYTITLE}}</nowiki></code> бо він не відповідає власне назві сторінки.",
        "noindex-category-desc": "Сторінка не індексується пошуковими роботами, тому що на ній є «чарівне слово» <code><nowiki>__NOINDEX__</nowiki></code>, і вона знаходиться в просторі імен, де дозволений цей прапор).",
        "index-category-desc": "На сторінці є «чарівне слово» <code><nowiki>__INDEX__</nowiki></code> (і сторінка знаходиться в просторі назв, де дозволений цей прапор), тому вона індексується пошуковими роботами в тих випадках, коли цього зазвичай не відбувається.",
        "post-expand-template-inclusion-category-desc": "Розмір сторінки стане більший за <code>$wgMaxArticleSize</code> після показу всіх шаблонів, тому деякі з них не були показані повністю.",
        "rollbacklinkcount": "відкинути $1 {{PLURAL:$1|редагування|редагування|редагувань}}",
        "rollbacklinkcount-morethan": "відкинути понад $1 {{PLURAL:$1|редагування|редагування|редагувань}}",
        "rollbackfailed": "Відкинути зміни не вдалося",
+       "rollback-missingparam": "Відсутні обов'язкові параметри за запитом.",
        "cantrollback": "Неможливо відкинути редагування, оскільки останній дописувач сторінки є її автором.",
        "alreadyrolled": "Неможливо відкинути останні редагування [[:$1]], зроблені [[User:$2|$2]] ([[User talk:$2|обговорення]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]), оскільки хтось інший уже змінив чи відкинув редагування цієї статті.\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": "Відкинуті редагування користувача $1; повернення до версії користувача $2.",
+       "rollback-success-notify": "Відкинуті редагування користувача $1; \nповернено до останньої версії користувача $2. [$3 Показати зміни]",
        "sessionfailure-title": "Помилка сеансу",
        "sessionfailure": "Здається, виникли проблеми з поточним сеансом роботи;\nця дія була скасована з метою попередити «захоплення сеансу».\nБудь ласка, натисніть кнопку «Назад» і перезавантажте сторінку, з якої ви прийшли.",
        "changecontentmodel": "Змінити модель вмісту сторінки",
        "whatlinkshere-hideredirs": "$1 перенаправлення",
        "whatlinkshere-hidetrans": "$1 включення",
        "whatlinkshere-hidelinks": "$1 посилання",
-       "whatlinkshere-hideimages": "$1 посилання на зображення",
+       "whatlinkshere-hideimages": "$1 посилання на файли",
        "whatlinkshere-filters": "Фільтри",
        "whatlinkshere-submit": "Виконати",
        "autoblockid": "Автоблокування #$1",
        "blocklist-timestamp": "Часова позначка",
        "blocklist-target": "Мета",
        "blocklist-expiry": "Закінчується",
-       "blocklist-by": "Ð\92иконав Ð±Ð»Ð¾ÐºÑ\83ваннÑ\8f",
+       "blocklist-by": "Ð\90дмÑ\96нÑ\96Ñ\81Ñ\82Ñ\80аÑ\82оÑ\80, Ñ\89о Ð·Ð°Ð±Ð»Ð¾ÐºÑ\83вав",
        "blocklist-params": "Параметри блокування",
        "blocklist-reason": "Причина",
        "ipblocklist-submit": "Пошук",
        "confirm-watch-top": "Додати цю сторінку до списку спостереження?",
        "confirm-unwatch-button": "Гаразд",
        "confirm-unwatch-top": "Вилучити цю сторінку з вашого списку спостереження?",
+       "confirm-rollback-button": "Гаразд",
+       "confirm-rollback-top": "Відкотити редагування цієї сторінки?",
        "semicolon-separator": ";&#32;",
        "comma-separator": ",&#32;",
        "colon-separator": ":&#32;",
        "timezone-local": "Місцеві",
        "duplicate-defaultsort": "Увага. Ключ сортування «$2» перекриває попередній ключ сортування «$1».",
        "duplicate-displaytitle": "<strong>Увага:</strong> Відображений заголовок \"$2\" заміщує раніше відображений заголовок \"$1\".",
+       "restricted-displaytitle": "<strong>Увага:</strong> Відображувану назву «$1» було проігноровано, оскільки воно не відповідає власне назві сторінки.",
        "invalid-indicator-name": "<strong>Помилка:</strong> Сторінка індикатора стану <code>name</code> атрибута не може бути пуста.",
        "version": "Версія MediaWiki",
        "version-extensions": "Установлені розширення",
        "tags-activate": "активувати",
        "tags-deactivate": "вимкнути",
        "tags-hitcount": "$1 {{PLURAL:$1|зміна|зміни|змін}}",
-       "tags-manage-no-permission": "У Ð\92аÑ\81 Ð½ÐµÐ¼Ð° Ð´Ð¾Ð·Ð²Ð¾Ð»Ñ\83 ÐºÐµÑ\80Ñ\83ваÑ\82и Ð·Ð¼Ñ\96нами Ð¼Ñ\96Ñ\82ок.",
+       "tags-manage-no-permission": "У Ð\92аÑ\81 Ð½ÐµÐ¼Ð° Ð´Ð¾Ð·Ð²Ð¾Ð»Ñ\83 ÐºÐµÑ\80Ñ\83ваÑ\82и Ð¼Ñ\96Ñ\82ками Ð·Ð¼Ñ\96н.",
        "tags-manage-blocked": "Не можна змінювати мітки під час блокування.",
        "tags-create-heading": "Створити нову мітку",
        "tags-create-explanation": "За замовчуванням, новостворені мітки будуть доступні для використання користувачами і ботами.",
        "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": "Причина:",
        "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 73e3d6d..03cc6eb 100644 (file)
@@ -25,7 +25,8 @@
                        "عثمان خان شاہ",
                        "Syedalinaqinaqvi",
                        "محمد افضل",
-                       "Macofe"
+                       "Macofe",
+                       "Hindustanilanguage"
                ]
        },
        "tog-underline": "ربط کی خط کشیدگی:",
        "monthsall": "تمام",
        "deletedwhileediting": "انتباہ: آپ کے ترمیم شروع کرنے کے بعد یہ صفحہ حذف کیا جا چکا ہے!",
        "confirm_purge_button": "جی!",
+       "confirm-rollback-button": "ٹھیک ہے",
        "semicolon-separator": "؛&#32;",
        "imgmultipageprev": "← پچھلا",
        "imgmultipagenext": "اگلا →",
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..e2ad34e 100644 (file)
@@ -77,7 +77,7 @@
        "tog-ccmeonemails": "Gửi bản sao cho tôi khi gửi thư điện tử cho người khác",
        "tog-diffonly": "Không hiển thị nội dung trang dưới phần so sánh phiên bản",
        "tog-showhiddencats": "Hiển thị thể loại ẩn",
-       "tog-norollbackdiff": "Không so sánh sau khi lùi sửa",
+       "tog-norollbackdiff": "Bỏ qua bản so sánh sau khi lùi sửa",
        "tog-useeditwarning": "Cảnh báo khi tôi thoát trang sửa đổi mà chưa lưu trang",
        "tog-prefershttps": "Luôn kết nối an toàn khi đăng nhập",
        "underline-always": "Luôn luôn",
        "password-change-forbidden": "Bạn không thể đổi mật khẩu trên wiki này.",
        "externaldberror": "Có lỗi khi xác nhận cơ sở dữ liệu bên ngoài hoặc bạn không được phép cập nhật tài khoản bên ngoài.",
        "login": "Đăng nhập",
+       "login-security": "Xác minh danh tính của bạn",
        "nav-login-createaccount": "Đăng nhập / Mở tài khoản",
        "userlogin": "Đăng nhập / Mở tài khoản",
        "userloginnocreate": "Đăng nhập",
        "userlogin-resetpassword-link": "Quên mật khẩu?",
        "userlogin-helplink2": "Trợ giúp đăng nhập",
        "userlogin-loggedin": "Bạn đã đăng nhập với tên {{GENDER:$1}}$1.\nHãy sử dụng biểu mẫu ở dưới để đăng nhập với tài khoản người dùng khác.",
+       "userlogin-reauth": "Bạn phải đăng nhập lại để xác minh rằng bạn là $1.",
        "userlogin-createanother": "Mở thêm tài khoản",
        "createacct-emailrequired": "Địa chỉ thư điện tử",
        "createacct-emailoptional": "Địa chỉ thư điện tử (tùy chọn)",
        "createacct-email-ph": "Nhập địa chỉ thư điện tử của bạn",
        "createacct-another-email-ph": "Nhập địa chỉ thư điện tử",
        "createaccountmail": "Sử dụng mật khẩu ngẫu nhiên tạm và gửi nó cho địa chỉ thư điện tử được chỉ định",
+       "createaccountmail-help": "Có thể sử dụng để tạo tài khoản cho người khác mà không được biết mật khẩu.",
        "createacct-realname": "Tên thật (tùy chọn)",
        "createaccountreason": "Lý do:",
        "createacct-reason": "Lý do",
        "createacct-reason-ph": "Nhập lý do tạo một tài khoản khác",
+       "createacct-reason-help": "Thông điệp xuất hiện trong nhật trình tạo tài khoản",
        "createacct-submit": "Tạo tài khoản",
        "createacct-another-submit": "Mở tài khoản",
+       "createacct-continue-submit": "Tiếp tục tạo tài khoản",
+       "createacct-another-continue-submit": "Tiếp tục tạo tài khoản",
        "createacct-benefit-heading": "{{SITENAME}} được xây dựng bởi những người như bạn.",
        "createacct-benefit-body1": "{{PLURAL:$1}}lần sửa đổi",
        "createacct-benefit-body2": "{{PLURAL:$1}}trang nội dung",
        "nocookiesnew": "Bạn đã tạo tài khoản thành công, nhưng bạn chưa đăng nhập. {{SITENAME}} sử dụng cookie để đăng nhập vào tài khoản. Bạn đã tắt cookie. Xin hãy bật cookie lên, rồi đăng nhập lại với tên người dùng và mật khẩu mới.",
        "nocookieslogin": "{{SITENAME}} sử dụng cookie để đăng nhập thành viên. Bạn đã tắt cookie. Xin hãy kích hoạt rồi thử lại.",
        "nocookiesfornew": "Không thể mở tài khoản vì không thể xác nhận nguồn yêu cầu nó.\nHãy chắc chắn bạn đã bật lên cookie, làm mới trang này, và thử lại.",
+       "createacct-loginerror": "Bạn đã tạo tài khoản thành công nhưng không thể tự động đăng nhập. Xin hãy [[Special:UserLogin|đăng nhập thủ công]].",
        "noname": "Chưa nhập tên.",
        "loginsuccesstitle": "Đã đăng nhập",
        "loginsuccess": "'''Bạn đã đăng nhập vào {{SITENAME}} với tên “$1”.'''",
        "createacct-another-realname-tip": "Tên thật là không bắt buộc. \n\nNếu bạn đồng ý cung cấp, nó sẽ dùng để ghi nhận công lao của bạn.",
        "pt-login": "Đăng nhập",
        "pt-login-button": "Đăng nhập",
+       "pt-login-continue-button": "Tiếp tục đăng nhập",
        "pt-createaccount": "Mở tài khoản",
        "pt-userlogout": "Đăng xuất",
        "php-mail-error-unknown": "Lỗi không rõ trong hàm PHP mail()",
        "botpasswords-invalid-name": "Tên người dùng đã chỉ định không chứa dấu tách mật khẩu bot (\"$1\").",
        "botpasswords-not-exist": "Người dùng \"$1\" không có mật khẩu bot có tên \"$2\".",
        "resetpass_forbidden": "Không được đổi mật khẩu",
+       "resetpass_forbidden-reason": "Không thể đổi mật khẩu: $1",
        "resetpass-no-info": "Bạn phải đăng nhập mới có thể truy cập trực tiếp trang này.",
        "resetpass-submit-loggedin": "Thay đổi mật khẩu",
        "resetpass-submit-cancel": "Hủy bỏ",
        "passwordreset-emailsentusername": "Nếu một địa chỉ thư điện tử đã gắn với tên người dùng này thì một thư điện tử để đặt lại mật khẩu sẽ được gửi đến.",
        "passwordreset-emailsent-capture": "Thư điện tử để tái tạo mật khẩu đã được gửi, nội dung như sau.",
        "passwordreset-emailerror-capture": "Chúng tôi đã tạo thư tái tạo mật khẩu dưới đây, nhưng không thể gửi đến {{GENDER:$2}}người dùng: $1",
+       "passwordreset-emailsent-capture2": "Đã gửi {{PLURAL:$1|thư điện tử|các thư điện tử}} để đặt lại mật khẩu. {{PLURAL:$1|Tên người dùng và mật khẩu|Các tên người dùng và mật khẩu}} được liệt kê dưới đây.",
+       "passwordreset-emailerror-capture2": "Không gửi được thư điện tử đến {{GENDER:$2}}người dùng: $1 {{PLURAL:$3|Tên người dùng và mật khẩu|Các tên người dùng và mật khẩu}} được liệt kê dưới đây.",
+       "passwordreset-nocaller": "Yêu cầu hàm gọi",
+       "passwordreset-nosuchcaller": "Hàm gọi không tồn tại: $1",
+       "passwordreset-ignored": "Tác vụ đặt lại mật khẩu không được xử lý. Có lẽ trình cung cấp chưa được cấu hình?",
+       "passwordreset-invalideamil": "Địa chỉ thư điện tử không hợp lệ",
+       "passwordreset-nodata": "Cả tên người dùng và địa chỉ thư điện tử bị thiếu",
        "changeemail": "Đổi hoặc gỡ địa chỉ thư điện tử",
        "changeemail-header": "Điền biểu mẫu này để đổi địa chỉ thư điện tử của bạn. Nếu bạn muốn gỡ địa chỉ thư điện tử nào khỏi tài khoản của bạn, để trống hộp địa chỉ thư điện tử mới và lưu biểu mẫu.",
        "changeemail-passwordrequired": "Bạn sẽ cần phải nhập mật khẩu của bạn để xác nhận thay đổi này.",
        "accmailtext": "Một mật khẩu được tạo ngẫu nhiên cho [[User talk:$1|$1]] đã được gửi đến $2. Có thể đổi mật khẩu tại trang ''[[Special:ChangePassword|đổi mật khẩu]]'' sau khi đã đăng nhập.",
        "newarticle": "(Mới)",
        "newarticletext": "Bạn đi đến đây từ một liên kết đến một trang chưa tồn tại. Để tạo trang, hãy bắt đầu gõ vào ô bên dưới (xem [$1 trang trợ giúp] để có thêm thông tin). Nếu bạn đến đây do nhầm lẫn, chỉ cần nhấn vào nút '''Lùi''' (hoặc Trở lại, Quay lại, Back) trong trình duyệt của bạn.",
-       "anontalkpagetext": "----''Đây là trang thảo luận của một người dùng vô danh chưa tạo tài khoản hoặc có tài khoản nhưng không đăng nhập.\nDo đó chúng ta phải dùng một dãy số gọi là địa chỉ IP để xác định anh/chị ta.\nMột địa chỉ IP như vậy có thể có nhiều người cùng dùng chung.\nNếu bạn là một thành viên vô danh và cảm thấy rằng có những lời bàn luận không thích hợp đang nhắm vào bạn, xin hãy [[Special:CreateAccount|tạo tài khoản]] hoặc [[Special:UserLogin|đăng nhập]] để tránh sự nhầm lẫn về sau với những thành viên vô danh khác.''",
+       "anontalkpagetext": "----\n<em>Đây là trang thảo luận của một người dùng vô danh chưa tạo tài khoản hoặc có tài khoản nhưng không đăng nhập.</em>\nDo đó chúng ta phải dùng một dãy số gọi là địa chỉ IP để xác định anh/chị ta.\nMột địa chỉ IP như vậy có thể có nhiều người cùng dùng chung.\nNếu bạn là một thành viên vô danh và cảm thấy rằng có những lời bàn luận không thích hợp đang nhắm vào bạn, xin hãy [[Special:CreateAccount|tạo tài khoản]] hoặc [[Special:UserLogin|đăng nhập]] để tránh sự nhầm lẫn về sau với những thành viên vô danh khác.",
        "noarticletext": "Trang này hiện chưa có nội dung.\nBạn có thể [[Special:Search/{{PAGENAME}}|tìm kiếm tựa trang này]] trong các trang khác, <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} tìm trong các nhật trình liên quan],\nhoặc [{{fullurl:{{FULLPAGENAME}}|action=edit}} tạo mới trang này]</span>.",
        "noarticletext-nopermission": "Trang này hiện đang trống.\nBạn có thể [[Special:Search/{{PAGENAME}}|tìm kiếm tựa trang này]] tại các trang khác, hoặc <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} tìm kiếm các nhật trình liên quan]</span>, nhưng bạn không được phép tạo trang này.",
        "missing-revision": "Phiên bản #$1 của trang có tên “{{FULLPAGENAME}}” không tồn tại.\n\nLỗi này thường xuất hiện đối khi theo dõi liên kết lỗi thời đến phiên bản cũ của một trang đã bị xóa.\nXem chi tiết trong [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} nhật trình xóa].",
        "undo-failure": "Sửa đổi không thể phục hồi vì đã có những sửa đổi mới ở sau.",
        "undo-norev": "Sửa đổi không thể hồi phục vì nó không tồn tại hoặc đã bị xóa.",
        "undo-nochange": "Hình như sửa đổi này đã được lùi lại rồi.",
-       "undo-summary": "Đã lùi lại sửa đổi $1 của [[Special:Contributions/$2|$2]] ([[User talk:$2|Thảo luận]])",
+       "undo-summary": "Đã lùi lại sửa đổi $1 của [[Special:Contributions/$2|$2]] ([[User talk:$2|thảo luận]])",
        "undo-summary-username-hidden": "Đã lùi lại sửa đổi $1 của một người dùng ẩn",
        "cantcreateaccounttitle": "Không thể mở tài khoản",
        "cantcreateaccount-text": "Chức năng tài tạo khoản từ địa chỉ IP này ('''$1''') đã bị [[User:$3|$3]] cấm.\n\nLý do được $3 đưa ra là ''$2''",
        "prefs-watchlist-days-max": "Tối đa $1 ngày",
        "prefs-watchlist-edits": "Số lần sửa đổi tối đa trong danh sách theo dõi mở rộng:",
        "prefs-watchlist-edits-max": "Con số tối đa: 1.000",
-       "prefs-watchlist-token": "Số thẻ Danh sách theo dõi:",
+       "prefs-watchlist-token": "Dấu hiệu cho danh sách theo dõi:",
        "prefs-misc": "Linh tinh",
        "prefs-resetpass": "Thay đổi mật khẩu",
        "prefs-changeemail": "Đổi hoặc gỡ địa chỉ thư điện tử",
        "right-override-export-depth": "Xuất trang kèm theo các trang được liên kết đến với độ sâu tối đa là 5",
        "right-sendemail": "Gửi thư điện tử cho thành viên khác",
        "right-passwordreset": "Xem các thư điện tử đặt lại mật khẩu",
-       "right-managechangetags": "Tạo và xóa [[Special:Tags|thẻ]] từ cơ sở dữ liệu",
+       "right-managechangetags": "Tạo và bật/tắt [[Special:Tags|thẻ]]",
        "right-applychangetags": "Áp dụng [[Special:Tags|thẻ]], cùng với những thay đổi của một người",
        "right-changetags": "Thêm và loại bỏ tùy ý các [[Special:Tags|thẻ]] vào các phiên bản riêng và các mục nhật trình",
+       "right-deletechangetags": "Xóa [[Special:Tags|thẻ]] khỏi cơ sở dữ liệu",
        "grant-generic": "Gói quyền “$1”",
        "grant-group-page-interaction": "Tương tác với trang",
        "grant-group-file-interaction": "Tương tác với tập tin",
        "action-viewmyprivateinfo": "xem thông tin cá nhân của bạn",
        "action-editmyprivateinfo": "sửa đổi thông tin cá nhân của bạn",
        "action-editcontentmodel": "sửa kiểu nội dung của trang",
-       "action-managechangetags": "tạo và xóa các thẻ từ cơ sở dữ liệu",
+       "action-managechangetags": "tạo và bật/tắt thẻ",
        "action-applychangetags": "áp dụng các thẻ cùng với những thay đổi của bạn",
        "action-changetags": "thêm và loại bỏ các thẻ tùy ý trên các phiên bản riêng và các mục nhật trình",
+       "action-deletechangetags": "xóa thẻ khỏi cơ sở dữ liệu",
        "nchanges": "$1 thay đổi",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|sau lần truy cập vừa rồi}}",
        "enhancedrc-history": "lịch sử",
        "trackingcategories-msg": "Thể loại phần mềm",
        "trackingcategories-name": "Tên thông điệp",
        "trackingcategories-desc": "Tiêu chuẩn xếp thể loại",
+       "restricted-displaytitle-ignored": "Trang có tên hiển thị được bỏ qua",
+       "restricted-displaytitle-ignored-desc": "Trang có <code><nowiki>{{TÊN_HIỂN_THỊ}}</nowiki></code>, <code><nowiki>{{TÊNHIỂNTHỊ}}</nowiki></code>, hoặc <code><nowiki>{{DISPLAYTITLE}}</nowiki></code> được bỏ qua vì nó không tương đương với tên thật của trang.",
        "noindex-category-desc": "Trang này không được các robot đánh chỉ mục vì trang có từ thần chú <code><nowiki>__NOINDEX__</nowiki></code> và nằm trong không gian tên cho phép từ thần chú này.",
        "index-category-desc": "Trang này có từ thần chú <code><nowiki>__INDEX__</nowiki></code> và nằm trong một không gian tên cho phép từ thần chú này, nên được các robot đánh chỉ mục, trong khi bình thường nó không được đánh chỉ mục.",
        "post-expand-template-inclusion-category-desc": "Kích thước trang sẽ vượt quá <code>$wgMaxArticleSize</code> nếu bung hết toàn bộ bản mẫu, nên một số bản mẫu không được bung.",
        "rollbacklinkcount": "lùi tất cả $1 sửa đổi",
        "rollbacklinkcount-morethan": "lùi tất cả hơn $1 sửa đổi",
        "rollbackfailed": "Lùi sửa đổi không thành công",
+       "rollback-missingparam": "Yêu cầu thiếu những tham số bắt buộc.",
        "cantrollback": "Không lùi sửa đổi được;\nngười viết trang cuối cùng cũng là tác giả duy nhất của trang này.",
        "alreadyrolled": "Không thể lùi tất cả sửa đổi cuối của [[User:$2|$2]] ([[User talk:$2|thảo luận]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) tại [[:$1]]; ai đó đã thực hiện sửa đổi hoặc thực hiện lùi tất cả rồi.\n\nSửa đổi cuối cùng tại trang do [[User:$3|$3]] ([[User talk:$3|thảo luận]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]) thực hiện.",
        "editcomment": "Tóm lược sửa đổi: <em>$1</em>.",
        "revertpage": "Đã lùi lại sửa đổi của [[Special:Contributions/$2|$2]] ([[User talk:$2|Thảo luận]]) quay về phiên bản cuối của [[User:$1|$1]]",
        "revertpage-nouser": "Đã lùi lại sửa đổi của người dùng ẩn quay về phiên bản cuối của {{GENDER:$1}}[[User:$1|$1]]",
        "rollback-success": "Đã hủy sửa đổi của $1;\nquay về phiên bản cuối của $2.",
+       "rollback-success-notify": "Đã hủy sửa đổi của $1;\nquay về phiên bản cuối của $2. [$3 Xem thay đổi]",
        "sessionfailure-title": "Phiên thất bại",
        "sessionfailure": "Dường như có trục trặc với phiên đăng nhập của bạn; thao tác này đã bị hủy để tránh việc cướp quyền đăng nhập. Xin hãy nhấn nút “Back”, tải lại trang đó, rồi thử lại.",
        "changecontentmodel": "Thay đổi kiểu nội dung của một trang",
        "changecontentmodel-success-text": "Kiểu nội dung của [[:$1]] đã được thay đổi.",
        "changecontentmodel-cannot-convert": "Không thể chuyển đổi nội dung [[:$1]] thành nội dung dưới dạng $2.",
        "changecontentmodel-nodirectediting": "Kiểu nội dung $1 không hỗ trợ sửa đổi trực tiếp",
+       "changecontentmodel-emptymodels-title": "Không có sẵn kiểu nội dung nào",
+       "changecontentmodel-emptymodels-text": "Không thể chuyển đổi nội dung tại [[:$1]] thành nội dung dưới định dạng nào.",
        "log-name-contentmodel": "Nhật trình thay đổi kiểu nội dung",
        "log-description-contentmodel": "Sự kiện có liên quan đến kiểu nội dung của trang.",
        "logentry-contentmodel-new": "$1 {{GENDER:$2}}đã tạo trang $3 với kiểu nội dung không mặc định “$5”",
        "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",
        "lockdbsuccesstext": "Cơ sở dữ liệu đã bị khóa.\n<br />Nhớ [[Special:UnlockDB|mở khóa]] sau khi bảo trì xong.",
        "unlockdbsuccesstext": "Cơ sở dữ liệu đã được mở khóa.",
        "lockfilenotwritable": "Tập tin khóa của cơ sở dữ liệu không cho phép ghi. Để khóa hay mở khóa cơ sở dữ liệu, máy chủ web phải có khả năng ghi tập tin.",
+       "databaselocked": "Cơ sở dữ liệu đã được khóa rồi.",
        "databasenotlocked": "Cơ sở dữ liệu không bị khóa.",
        "lockedbyandtime": "($1 khóa vào $2 lúc $3)",
        "move-page": "Di chuyển $1",
        "confirm-watch-top": "Bạn có muốn thêm trang này vào danh sách theo dõi của bạn?",
        "confirm-unwatch-button": "Ngừng theo dõi",
        "confirm-unwatch-top": "Bạn có muốn gỡ trang này khỏi danh sách theo dõi của bạn?",
+       "confirm-rollback-button": "OK",
+       "confirm-rollback-top": "Có muốn lùi lại các sửa đổi trong trang này?",
        "ellipsis": "…",
        "quotation-marks": "“$1”",
        "imgmultipageprev": "← trang trước",
        "timezone-local": "Địa phương",
        "duplicate-defaultsort": "Cảnh báo: Từ khóa xếp mặc định “$2” ghi đè từ khóa trước, “$1”.",
        "duplicate-displaytitle": "<strong>Cảnh báo:</strong> Tên hiển thị “$2” ghi đè tên hiển thị “$1” bên trên.",
+       "restricted-displaytitle": "<strong>Chú ý:</strong> Tên hiển thị “$1” được bỏ qua vì nó không tương đương với tên thật của trang.",
        "invalid-indicator-name": "<strong>Lỗi:</strong> Không thể để trống thuộc tính <code>name</code> của cái chỉ trạng thái trang.",
        "version": "Phiên bản",
        "version-extensions": "Các phần mở rộng được cài đặt",
        "tags-delete-not-found": "Thẻ “$1” không tồn tại.",
        "tags-delete-too-many-uses": "Thẻ “$1” được áp dụng cho hơn $2 phiên bản, có nghĩa là nó không thể bị xóa.",
        "tags-delete-warnings-after-delete": "Thẻ “$1” đã được xóa thành công, nhưng gặp phải {{PLURAL:$2|cảnh báo|các cảnh báo}} sau:",
+       "tags-delete-no-permission": "Bạn không có quyền hạn để xóa các thẻ thay đổi.",
        "tags-activate-title": "Kích hoạt thẻ",
        "tags-activate-question": "Bạn sắp sửa kích hoạt thẻ “$1”.",
        "tags-activate-reason": "Lý do:",
        "log-action-filter-suppress-block": "Ẩn giấu người dùng bằng cách cấm",
        "log-action-filter-suppress-reblock": "Ẩn giấu người dùng bằng cách cấm lại",
        "log-action-filter-upload-upload": "Tải lên mới",
-       "log-action-filter-upload-overwrite": "Tải lên lại"
+       "log-action-filter-upload-overwrite": "Tải lên lại",
+       "authmanager-authn-not-in-progress": "Không phải đang xác thực, hoặc dữ liệu phiên làm việc bị mất. Xin hãy thử lại từ đầu.",
+       "authmanager-authn-no-primary": "Không thể xác thực định danh được cung cấp.",
+       "authmanager-authn-no-local-user": "Định danh được cung cấp không ứng với người dùng nào trên wiki này.",
+       "authmanager-authn-no-local-user-link": "Định danh được cung cấp có hợp lệ nhưng không ứng với người dùng nào trên wiki này. Hãy đăng nhập một cách khác hoặc tạo tài khoản mới; bạn sẽ có cơ hội để liên kết định danh cũ với tài khoản mới.",
+       "authmanager-authn-autocreate-failed": "Thất bại khi tự động tạo tài khoản địa phương: $1",
+       "authmanager-change-not-supported": "Không thể thay đổi định danh được cung cấp, vì sẽ không có gì sử dụng nó.",
+       "authmanager-create-disabled": "Chứng năng tạo tài khoản được tắt.",
+       "authmanager-create-from-login": "Để tạo tài khoản của mình, xin hãy điền vào các thông tin bên dưới.",
+       "authmanager-create-not-in-progress": "Không phải đang tạo tài khoản, hoặc dữ liệu phiên làm việc bị mất. Xin hãy thử lại từ đầu.",
+       "authmanager-create-no-primary": "Không thể sử dụng định danh được cung cấp để tạo tài khoản.",
+       "authmanager-link-no-primary": "Không thể sử dụng định danh được cung cấp để liên kết tài khoản.",
+       "authmanager-link-not-in-progress": "Không phải đang liên kết tài khoản, hoặc dữ liệu phiên làm việc bị mất. Xin hãy thử lại từ đầu.",
+       "authmanager-authplugin-setpass-failed-title": "Thay đổi mật khẩu bị thất bại",
+       "authmanager-authplugin-setpass-failed-message": "Phần bổ trợ xác thực đã từ chối việc đổi mật khẩu.",
+       "authmanager-authplugin-create-fail": "Phần bổ trợ xác thực đã từ chối việc tạo tài khoản.",
+       "authmanager-authplugin-setpass-denied": "Phần bổ trợ xác thực không cho phép đổi mật khẩu.",
+       "authmanager-authplugin-setpass-bad-domain": "Tên miền không hợp lệ.",
+       "authmanager-autocreate-noperm": "Không cho phép tự động tạo tài khoản.",
+       "authmanager-autocreate-exception": "Tạm thời không cho phép tự động tạo tài khoản vì các lỗi trước đây.",
+       "authmanager-userdoesnotexist": "Chưa có tài khoản với tên “$1”.",
+       "authmanager-userlogin-remembermypassword-help": "Mật khẩu có nên được duy trì sau phiên làm việc hay không.",
+       "authmanager-username-help": "Tên người dùng để xác thực.",
+       "authmanager-password-help": "Mật khẩu để xác thực.",
+       "authmanager-domain-help": "Tên miền để xác thực bên ngoài.",
+       "authmanager-retype-help": "Mật khẩu lần nữa để xác nhận.",
+       "authmanager-email-label": "Thư điện tử",
+       "authmanager-email-help": "Địa chỉ thư điện tử",
+       "authmanager-realname-label": "Tên thật",
+       "authmanager-realname-help": "Tên thật của người dùng",
+       "authmanager-provider-password": "Xác thực qua mật khẩu",
+       "authmanager-provider-password-domain": "Xác thực qua mật khẩu và tên miền",
+       "authmanager-provider-temporarypassword": "Mật khẩu tạm",
+       "authprovider-confirmlink-message": "Dựa trên các lần bạn thử đăng nhập gần đây, có thể liên kết các tài khoản bên dưới với tài khoản wiki của bạn. Sau khi liên kết các tài khoản này, bạn có thể đăng nhập qua chúng. Xin hãy chọn các tài khoản để liên kết.",
+       "authprovider-confirmlink-request-label": "Các tài khoản để liên kết",
+       "authprovider-confirmlink-success-line": "$1: Đã liên kết thành công.",
+       "authprovider-confirmlink-failed": "Việc liên kết tài khoản không hoàn toàn thành công: $1",
+       "authprovider-confirmlink-ok-help": "Tiếp tục sau khi hiển thị các thông báo liên kết thất bại.",
+       "authprovider-resetpass-skip-label": "Bỏ qua",
+       "authprovider-resetpass-skip-help": "Bỏ qua việc đặt lại mật khẩu.",
+       "authform-nosession-login": "Đã xác thực thành công, nhưng trình duyệt của bạn không thể duy trì đăng nhập.\n\n$1",
+       "authform-nosession-signup": "Đã tạo tài khoản thành công, nhưng trình duyệt của bạn không thể duy trì đăng nhập.\n\n$1",
+       "authform-newtoken": "Dấu hiệu bị mất. $1",
+       "authform-notoken": "Dấu hiệu bị mất",
+       "authform-wrongtoken": "Dấu hiệu sai",
+       "specialpage-securitylevel-not-allowed-title": "Không được phép",
+       "specialpage-securitylevel-not-allowed": "Rất tiếc, bạn không được phép sử dụng trang này vì không thể xác nhận danh tính của bạn.",
+       "authpage-cannot-login": "Không thể tiến hành đăng nhập.",
+       "authpage-cannot-login-continue": "Không thể tiếp tục đăng nhập. Có lẽ phiên làm việc của bạn đã hết hạn.",
+       "authpage-cannot-create": "Không thể tiến hành tạo tài khoản.",
+       "authpage-cannot-create-continue": "Không thể tiếp tục tạo tài khoản. Có lẽ phiên làm việc của bạn đã hết hạn.",
+       "authpage-cannot-link": "Không thể tiến hành liên kết tài khoản.",
+       "authpage-cannot-link-continue": "Không thể tiếp tục liên kết tài khoản. Có lẽ phiên làm việc của bạn đã hết hạn.",
+       "cannotauth-not-allowed-title": "Không cho phép",
+       "cannotauth-not-allowed": "Bạn không có quyền sử dụng trang này.",
+       "changecredentials": "Thay đổi định danh",
+       "changecredentials-submit": "Thay đổi định danh",
+       "changecredentials-invalidsubpage": "$1 không phải là kiểu định danh hợp lệ.",
+       "changecredentials-success": "Đã thay đổi định danh của bạn.",
+       "removecredentials": "Xóa định danh",
+       "removecredentials-submit": "Xóa định danh",
+       "removecredentials-invalidsubpage": "$1 không phải là kiểu định danh hợp lệ.",
+       "removecredentials-success": "Đã xóa định danh của bạn.",
+       "credentialsform-provider": "Kiểu định danh:",
+       "credentialsform-account": "Tên tài khoản:",
+       "cannotlink-no-provider-title": "Không có tài khoản liên kết được",
+       "cannotlink-no-provider": "Không có tài khoản liên kết được.",
+       "linkaccounts": "Liên kết tài khoản",
+       "linkaccounts-success-text": "Đã liên kết tài khoản.",
+       "linkaccounts-submit": "Liên kết tài khoản",
+       "unlinkaccounts": "Gỡ liên kết tài khoản",
+       "unlinkaccounts-success": "Đã gỡ liên kết tài khoản."
 }
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 0e3b9fd..fc9ac94 100644 (file)
        "accmailtext": "א צופֿעליק פאַסווארט פֿאַר [[User talk:$1|$1]] איז געשיקט געוואָרן צו $2.\n\nמען קען עס טוישן אויפֿן [[Special:ChangePassword|טוישן פאַסווארט]] בלאַט נאָכן ארײַנלאגירן.",
        "newarticle": "(ניי)",
        "newarticletext": "איר זענט געקומען צו אַ בלאַט וואָס עקזיסטירט נאָך נישט!\nכדי שאַפֿן דעם בלאַט, קלאַפט אַרײַן טעקסט אין דעם קעסטל אונטן (זעט דעם [$1 הילף בלאַט] פֿאַר מער אינפֿארמאַציע).\nאויב איר זענט אַהערגעקומען בטעות, דרוקט דאָס '''Back''' קנעפל אין אײַער בלעטערער.",
-       "anontalkpagetext": "----'''דאָס איז א רעדן בלאַט פון א אַן אַנאנימען באַניצער וואָס האט נאך נישט געשאַפֿן קיין קאנטע, אדער באניצט זיך נישט דערמיט. דערוועגן, מוזן מיר זיך באניצן מיט זיין IP אדרעס כדי אים צו אידענטיפיצירן. עס קען זיין אז עטלעכע אנדערע ניצן אויך דעם  IP אדרעס. אויב זענט איר אן אנאנימער באַניצער וואס שפירט אז איר האט באקומען מעלדונגען וואס זענען נישט שייך צו אייך, ביטע [[Special:CreateAccount|שאַפֿט א קאנטע]] אדער [[Special:UserLogin|טוט זיך אריינלאגירן]] כדי צו פארמיידן דאס אין די עתיד זיך פארמישן מיט אנדערע אַנאנימע באַניצערס.'''",
+       "anontalkpagetext": "<em>דאָס איז א רעדן בלאַט פון א אַן אַנאנימען באַניצער וואָס האט נאך נישט געשאַפֿן קיין קאנטע, אדער באניצט זיך נישט דערמיט. </em>\nדערוועגן, מוזן מיר זיך באניצן מיט זיין IP אדרעס כדי אים צו אידענטיפיצירן. עס קען זיין אז עטלעכע אנדערע ניצן אויך דעם  IP אדרעס. אויב זענט איר אן אנאנימער באַניצער וואס שפירט אז איר האט באקומען מעלדונגען וואס זענען נישט שייך צו אייך, ביטע [[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}}}} אויסמעקונג לאגבוך].",
        "confirm-watch-top": "צולייגן דעם בלאט צו אייער אויפֿפאסונג ליסטע?",
        "confirm-unwatch-button": "יאָ",
        "confirm-unwatch-top": "אראפנעמען דעם בלאט פון אייער אויפפאסונג ליסטע?",
+       "confirm-rollback-button": "יאָ",
        "quotation-marks": "„$1“",
        "imgmultipageprev": "→ פֿריערדיגער בלאַט",
        "imgmultipagenext": "צום קומענדיגן בלאט ←",
        "hebrew-calendar-m12-gen": "אלול",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|רעדן]])",
        "duplicate-defaultsort": "'''ווארענונג:''' גרונט סארטשליסל \"$2\" פֿאָרט איבערן פֿריערדיגן גרונט סארטשליסל \"$1\".",
+       "duplicate-displaytitle": "<strong>ווארענונג:</strong> דער אויסשטעלונג־טיטל \"$2\" שרייבט איבער דעם פריערדיקן אויסשטעלונג־טיטל \"$1\".",
+       "restricted-displaytitle": "<strong>ווארענונג:</strong> דער אויסשטעלונג־טיטל \"$1\" איז געווארן איגנארירט ווייל ער שטימט נישט מיטן עכטן טיטל פונעם בלאַט.",
        "version": "ווערסיע",
        "version-extensions": "אינסטאלירטע פארברייטערונגען",
        "version-skins": "אינסטאלירטע באניצער־אייבערפלאכן",
index 12e1da8..fb54eeb 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": "最近更改中显示的天数:",
        "trackingcategories-msg": "追踪分类",
        "trackingcategories-name": "信息名",
        "trackingcategories-desc": "分类收录标准",
+       "restricted-displaytitle-ignored": "有忽略显示标题的页面",
+       "restricted-displaytitle-ignored-desc": "页面有被忽略的<code><nowiki>{{DISPLAYTITLE}}</nowiki></code>,因为它不等同于页面的实际标题。",
        "noindex-category-desc": "因为页面上有魔术字<code><nowiki>__NOINDEX__</nowiki></code>并位于允许该标记的名字空间,而不被机器人索引的页面。",
        "index-category-desc": "页面上有魔术字<code><nowiki>__INDEX__</nowiki></code>(并位于允许该标记的名字空间),并因此被机器人索引,但通常不应被索引。",
        "post-expand-template-inclusion-category-desc": "在展开所有模板后,页面大小大于<code>$wgMaxArticleSize</code>,所以某些模板未展开。",
        "deletereasonotherlist": "其他原因",
        "deletereason-dropdown": "*常见删除原因\n**广告\n**破坏行为\n**侵犯著作权\n**作者申请\n**受损重定向",
        "delete-edit-reasonlist": "编辑删除原因",
-       "delete-toobig": "这个页面有一个十分大量的编辑历史,超过$1个版本。删除此类页面的动作已经被限制,以防止在{{SITENAME}}上的意外扰乱。",
-       "delete-warning-toobig": "这个页面有一个十分大量的编辑历史,超过$1个版本。删除它可能会扰乱{{SITENAME}}的数据库操作;在继续此动作前请小心。",
+       "delete-toobig": "此页面有大量的编辑历史,超过$1个版本。删除此类页面的操作已被限制,以防止对{{SITENAME}}的意外破坏。",
+       "delete-warning-toobig": "此页面有大量的编辑历史,超过$1个版本。删除它可能会破坏{{SITENAME}}的数据库操作;请谨慎考虑是否执行。",
        "deleteprotected": "您不能删除此页面因为它被保护。",
        "deleting-backlinks-warning": "<strong>警告:</strong>有[[Special:WhatLinksHere/{{FULLPAGENAME}}|其他页面]]链接至或包含您要删除的页面。",
        "rollback": "回退编辑",
        "rollbacklinkcount": "回退$1次编辑",
        "rollbacklinkcount-morethan": "回退超过$1次的编辑",
        "rollbackfailed": "回退失败",
+       "rollback-missingparam": "请求中缺少必需参数。",
        "cantrollback": "无法恢复编辑,最后贡献者是该页面的唯一作者。",
        "alreadyrolled": "无法回退[[User:$2|$2]]([[User talk:$2|讨论]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]])对[[:$1]]的编辑,其他人已经编辑或者回退了该页。\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": "已恢复$1的编辑,更改回$2的最后版本。",
+       "rollback-success-notify": "已回退$1的编辑,更改回$2的最后版本。[$3 显示更改]",
        "sessionfailure-title": "会话无效",
        "sessionfailure": "似乎您的登录会话有问题;\n为了防止会话劫持,这个操作已经被取消。\n请返回先前的页面,重新载入该页面,然后重试。",
        "changecontentmodel": "更改一个页面的内容模型",
        "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",
        "confirm-watch-top": "将此页添加到您的监视列表吗?",
        "confirm-unwatch-button": "确定",
        "confirm-unwatch-top": "从监视列表中删除此页吗?",
+       "confirm-rollback-button": "确定",
+       "confirm-rollback-top": "回退此页面的编辑么?",
        "semicolon-separator": ";",
        "comma-separator": "、",
        "colon-separator": ":",
        "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-invalidsubpage": "$1不是有效的证书类型。",
+       "changecredentials-success": "您的证书已被更改。",
+       "removecredentials": "移除证书",
+       "removecredentials-submit": "移除证书",
+       "removecredentials-invalidsubpage": "$1不是有效的证书类型。",
+       "removecredentials-success": "您的证书已被移除。",
+       "credentialsform-provider": "证书类型:",
+       "credentialsform-account": "帐户名称:",
+       "cannotlink-no-provider-title": "没有可链接账户",
+       "cannotlink-no-provider": "没有可链接账户。",
+       "linkaccounts": "链接账户",
+       "linkaccounts-success-text": "账户已链接。",
+       "linkaccounts-submit": "链接帐户",
+       "unlinkaccounts": "取消链接账户",
+       "unlinkaccounts-success": "账户已取消链接。"
 }
index fbe0e55..f44aa45 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": "電子郵件地址 (選填)",
        "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": "$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": "取消",
        "passwordreset-emailsentusername": "若此確實為您使用者名稱所登記的電子郵件地址,將會寄出重設密碼的信件給您。",
        "passwordreset-emailsent-capture": "已寄出重設密碼的電子郵件,並於下方顯示。",
        "passwordreset-emailerror-capture": "下列為重設密碼的電子郵件內容,傳送給{{GENDER:$2|使用者}}失敗:$1",
+       "passwordreset-emailsent-capture2": "密碼重設{{PLURAL:$1|郵件|郵件}}已寄出,{{PLURAL:$1|使用者名稱與密碼|使用者名稱與密碼}}如下顯示。",
+       "passwordreset-emailerror-capture2": "寄發電子郵件給{{GENDER:$2|使用者}}失敗:$1,{{PLURAL:$3|使用者名稱與密碼|使用者名稱與密碼}}如下顯示。",
+       "passwordreset-nocaller": "必須提供 caller",
+       "passwordreset-nosuchcaller": "Caller 不存在:$1",
+       "passwordreset-ignored": "未處理密碼重設動作,可能尚未設定提供者?",
+       "passwordreset-invalideamil": "無效的電子郵件地址",
+       "passwordreset-nodata": "未提供使用者名稱或是電子郵件地址",
        "changeemail": "變更或移除電子郵件地址",
        "changeemail-header": "請填寫此表單來變更您的電子郵件地址,若您想要移除您帳號所連結的所有電子郵件地址,請於新電子郵件地址欄位留空。",
        "changeemail-passwordrequired": "您須要輸入您的密碼來確認此次變更。",
        "minoredit": "這是一個小修訂",
        "watchthis": "監視此頁面",
        "savearticle": "儲存頁面",
-       "publishpage": "發頁面",
+       "publishpage": "發頁面",
        "preview": "預覽",
        "showpreview": "顯示預覽",
        "showdiff": "顯示變更",
        "userpage-userdoesnotexist": "使用者帳號 \"$1\" 尚未註冊。\n若您要建立/編輯此頁面,請先檢查是否正確。",
        "userpage-userdoesnotexist-view": "使用者帳號 \"$1\" 尚未註冊。",
        "blocked-notice-logextract": "此使用者目前已被封鎖。\n以下為最近的封鎖紀錄以供參考:",
-       "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> 中清除快取。",
+       "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 → 偏好設定</em>) 然後再到 <em>隱私 & 安全性 → 清除瀏覽資料 → 已快取的圖片與檔案</em>。",
        "usercssyoucanpreview": "<strong>提示:</strong>在儲存之前使用 \"{{int:showpreview}}\" 按鈕來測試您的新 CSS 。",
        "userjsyoucanpreview": "<strong>提示:</strong>在儲存之前使用 \"{{int:showpreview}}\" 按鈕來測試您的新 JavaScript 。",
        "usercsspreview": "<strong>您目前正預覽您的使用者 CSS,CSS 還尚未儲存!</strong>",
        "previewnote": "<strong>您目前正在預覽,您的變更還尚未儲存!</strong>",
        "continue-editing": "前往編輯框",
        "previewconflict": "此預覽顯示了您於上方文字編輯框中的內容儲存之後將會顯示的結果。",
-       "session_fail_preview": "很抱歉!由於連線階段的資料遺失,以至於我們無法處理您的編輯動作。\n您可能已經登出了。<strong>請您確認您仍然在登入狀態,並請再試一次<strong/>。\n請再試一次。\n如果仍然失敗,請 [[Special:UserLogout|登出]] 後重新登入,並請您確認您的瀏覽器允許此網站的Cookie。",
+       "session_fail_preview": "很抱歉!由於連線階段的資料遺失,以至於我們無法處理您的編輯動作。\n您可能已經登出了。<strong>請您確認您仍然在登入狀態,並請再試一次</strong>。\n請再試一次。\n如果仍然失敗,請 [[Special:UserLogout|登出]] 後重新登入,並請您確認您的瀏覽器允許此網站的 Cookie。",
        "session_fail_preview_html": "<strong>抱歉!由於是次登入時段出現資料遺失,我們無法處理您所作出的編輯。</strong>\n\n<em> {{SITENAME}} 已開啟了原始 HTML 模式,故此預覽畫面將不會顯示以避免 JavaScript 攻擊。</em>\n\n<strong>如您希望真正能夠作出這次編輯,請再試一次。</strong>\n如果仍不成功,請 [[Special:UserLogout|登出]] 後再重新登入,並確保瀏覽器設定為「允許這個網域的cookie」。",
        "token_suffix_mismatch": "<strong>因您使用的瀏覽器破壞了編輯密鑰中的特殊符號,您的編輯已被拒絕。</strong>\n為了避免破壞頁面內容,已拒絕此次編輯動作,\n會發生這個問題通常是因為您使用了有問題的匿名網頁代理伺服器。",
        "edit_form_incomplete": "<strong>部份編輯的內容未送至伺服器,請檢查您的編輯內容是否完整並再試一次。</strong>",
        "right-override-export-depth": "匯出頁面包含連結內容,深度上限為 5 層",
        "right-sendemail": "傳送電子郵件聯絡其他使用者",
        "right-passwordreset": "檢視重設密碼電子郵件",
-       "right-managechangetags": "建立並自資料庫移除[[Special:Tags|標籤]]",
+       "right-managechangetags": "建立並自資料庫 (取消) 啟用 [[Special:Tags|標籤]]",
        "right-applychangetags": "連同某個人的變更一起套用[[Special:Tags|標籤]]",
        "right-changetags": "加入與移除任何於各別修訂與日誌項目的[[Special:Tags|標籤]]",
+       "right-deletechangetags": "從資料庫刪除 [[Special:Tags|標籤]]",
        "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 次變更",
        "enhancedrc-since-last-visit": "{{PLURAL:$1|自上次拜訪}}已有 $1",
        "enhancedrc-history": "歷史",
        "trackingcategories-msg": "追蹤分類",
        "trackingcategories-name": "訊息名稱",
        "trackingcategories-desc": "分類收錄標準",
+       "restricted-displaytitle-ignored": "已忽略顯示標題的頁面",
+       "restricted-displaytitle-ignored-desc": "頁面已忽略 <code><nowiki>{{DISPLAYTITLE}}</nowiki></code>,因該標題於頁面實際標題不相同。",
        "noindex-category-desc": "命名空間允許,且含有魔術字 <code><nowiki>__NOINDEX__</nowiki></code> 未被機器人列入索引的頁面。",
        "index-category-desc": "命名空間允許,且含有魔術字 <code><nowiki>__INDEX__</nowiki></code> 被機器人列入索引的頁面。",
        "post-expand-template-inclusion-category-desc": "展開模板後大小超過 <code>$wgMaxArticleSize</code> 導致部份模板未正常展開的頁面。",
        "rollbacklinkcount": "還原 $1 次編輯",
        "rollbacklinkcount-morethan": "還原超過 $1 次{{PLURAL:$1|編輯}}",
        "rollbackfailed": "還原失敗",
+       "rollback-missingparam": "請求缺少必要參數。",
        "cantrollback": "無法還原編輯;\n此頁面的最後貢獻者是唯一的作者。",
        "alreadyrolled": "無法還原由 [[User:$2|$2]] ([[User talk:$2|對話]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]] 所作的最後一次編輯 [[:$1]],已有其他人編輯或還原了該頁面。\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": "已還原 $1 所做的編輯;\n變更回由 $2 修訂的最後一個版本。",
+       "rollback-success-notify": "已還原 $1 所做的編輯;\n變更回由 $2 修訂的最後一個版本。[$3 顯示變更]",
        "sessionfailure-title": "連線階段失敗",
        "sessionfailure": "您的登入連線階段似乎有問題,\n為了預防連線階段受到劫持攻擊,此動作已經被取消。\n請返回上一頁,重新讀取該頁面再試一次。",
        "changecontentmodel": "變更頁面的內容模型",
        "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": "前往",
        "confirm-watch-top": "新增此頁面至您的監視清單?",
        "confirm-unwatch-button": "確定",
        "confirm-unwatch-top": "從您的監視清單中移除此頁面?",
+       "confirm-rollback-button": "確定",
+       "confirm-rollback-top": "還原編輯到此頁面?",
        "semicolon-separator": ";",
        "comma-separator": "、",
        "colon-separator": ":",
        "timezone-local": "當地",
        "duplicate-defaultsort": "<strong>警告:</strong>預設的排序鍵 \"$2\" 會覆蓋先前預設的排序鍵 \"$1\"。",
        "duplicate-displaytitle": "<strong>警告:</strong> 顯示標題 \"$2\" 覆蓋之前的顯示標題 \"$1\"。",
+       "restricted-displaytitle": "<strong>警告:</strong> 由於顯示標題與頁面實際標題不哃,已忽略顯示標題 \"$1\"。",
        "invalid-indicator-name": "<strong>錯誤:</strong>頁面狀態指示的 <code>name</code> 屬性不能為空。",
        "version": "版本",
        "version-extensions": "已安裝的擴充套件",
        "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": "原因:",
        "api-error-autoblocked": "您的IP位址已經被自動封禁,因為它曾經被一名已封禁的使用者使用過。",
        "api-error-badaccess-groups": "您沒有權限在此 Wiki 上傳檔案。",
        "api-error-badtoken": "內部錯誤:密鑰錯誤。",
-       "api-error-blocked": "您已被封,無法編輯。",
+       "api-error-blocked": "您已被封,無法編輯。",
        "api-error-copyuploaddisabled": "此伺服器已停用使用 URL 上傳檔案的功能。",
        "api-error-duplicate": "在網站上已有相同內容的{{PLURAL:$1|其他檔案|其他檔案}}。",
        "api-error-duplicate-archive": "在網站上曾有相同內容的{{PLURAL:$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": "Password-based 認証",
+       "authmanager-provider-password-domain": "Password- 及 domain-based 認証",
+       "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-invalidsubpage": "$1 不是有效的憑証類型。",
+       "changecredentials-success": "已更改您的憑證。",
+       "removecredentials": "移除憑證",
+       "removecredentials-submit": "移除憑證",
+       "removecredentials-invalidsubpage": "$1 不是有效的憑証類型。",
+       "removecredentials-success": "已移除您的憑證。",
+       "credentialsform-provider": "憑證類型:",
+       "credentialsform-account": "帳號名稱:",
+       "cannotlink-no-provider-title": "沒有可連結的帳號",
+       "cannotlink-no-provider": "沒有可連結的帳號。",
+       "linkaccounts": "連結帳號",
+       "linkaccounts-success-text": "已連結帳號。",
+       "linkaccounts-submit": "連結帳號",
+       "unlinkaccounts": "取消連結帳號",
+       "unlinkaccounts-success": "已取消連結帳號。"
 }
index f9dd58c..7c87e10 100644 (file)
@@ -59,6 +59,7 @@ class ConvertExtensionToRegistration extends Maintenance {
                $this->addArg( 'path', 'Location to the PHP entry point you wish to convert',
                        /* $required = */ true );
                $this->addOption( 'skin', 'Whether to write to skin.json', false, false );
+               $this->addOption( 'config-prefix', 'Custom prefix for configuration settings', false, true );
        }
 
        protected function getAllGlobals() {
@@ -92,8 +93,15 @@ class ConvertExtensionToRegistration extends Maintenance {
                $this->dir = dirname( realpath( $this->getArg( 0 ) ) );
                $this->json = [];
                $globalSettings = $this->getAllGlobals();
+               $configPrefix = $this->getOption( 'config-prefix', 'wg' );
+               if ( $configPrefix !== 'wg' ) {
+                       $this->json['config']['_prefix'] = $configPrefix;
+               }
                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 ) ) {
@@ -110,9 +118,14 @@ class ConvertExtensionToRegistration extends Maintenance {
                                        $this->noLongerSupportedGlobals[$realName] . '). ' .
                                        "Please update the entry point before convert to registration.\n" );
                                $this->hasWarning = true;
-                       } elseif ( strpos( $name, 'wg' ) === 0 ) {
+                       } elseif ( strpos( $name, $configPrefix ) === 0 ) {
                                // Most likely a config setting
-                               $this->json['config'][$realName] = $value;
+                               $this->json['config'][substr( $name, strlen( $configPrefix ) )] = $value;
+                       } elseif ( $configPrefix !== 'wg' && strpos( $name, 'wg' ) === 0 ) {
+                               // Warn about this
+                               $this->output( 'Warning: Skipped global "' . $name . '" (' .
+                                       'config prefix is "' . $configPrefix . '"). ' .
+                                       "Please check that this setting isn't needed.\n" );
                        }
                }
 
index 5434735..2b59735 100644 (file)
        <script src="modules/src/mediawiki/mediawiki.errorLogger.js"></script>
        <script src="modules/src/mediawiki/mediawiki.startUp.js"></script>
        <script src="modules/lib/oojs/oojs.jquery.js"></script>
-       <script src="modules/lib/oojs-ui/oojs-ui.js"></script>
+       <script src="modules/lib/oojs-ui/oojs-ui-core.js"></script>
+       <script src="modules/lib/oojs-ui/oojs-ui-widgets.js"></script>
+       <script src="modules/lib/oojs-ui/oojs-ui-toolbars.js"></script>
+       <script src="modules/lib/oojs-ui/oojs-ui-windows.js"></script>
        <script src="modules/lib/oojs-ui/oojs-ui-mediawiki.js"></script>
        <style>
                body {
                        background: #fff;
                }
        </style>
-       <link rel="stylesheet" href="modules/lib/oojs-ui/oojs-ui-local.css">
-       <link rel="stylesheet" href="modules/lib/oojs-ui/oojs-ui-mediawiki-noimages.css">
+       <link rel="stylesheet" href="modules/src/oojs-ui/oojs-ui-local.css">
+       <link rel="stylesheet" href="modules/lib/oojs-ui/oojs-ui-core-mediawiki.css">
+       <link rel="stylesheet" href="modules/lib/oojs-ui/oojs-ui-widgets-mediawiki.css">
+       <link rel="stylesheet" href="modules/lib/oojs-ui/oojs-ui-toolbars-mediawiki.css">
+       <link rel="stylesheet" href="modules/lib/oojs-ui/oojs-ui-windows-mediawiki.css">
 </head>
 <body>
 <script>
index fe99d8e..6cc3b68 100644 (file)
 模里西斯   毛里求斯
 沙地阿拉伯        沙特阿拉伯
 沙烏地阿拉伯     沙特阿拉伯
-波士尼äº\9e赫å¡\9eå\93¥ç¶­ç´\8d    波斯尼亚和黑塞哥维那
+波士尼äº\9eè\88\87赫å¡\9eå\93¥ç¶­ç´\8d 波斯尼亚和黑塞哥维那
 辛巴威      津巴布韦
 宏都拉斯   洪都拉斯
 千里達托貝哥     特立尼达和托巴哥
index 997acfc..ec9b3d7 100644 (file)
 模里西斯   毛里裘斯
 沙地阿拉伯        沙特阿拉伯
 沙烏地阿拉伯     沙特阿拉伯
-波士尼亞赫塞哥維納    波斯尼亞黑塞哥維那
 辛巴威      津巴布韋
 宏都拉斯   洪都拉斯
 千里達托貝哥     特立尼達和多巴哥
 塞拉耶佛   薩拉熱窩
 波士尼亞   波斯尼亞
 塞爾維亞與蒙特內哥羅 塞爾維亞和黑山
+波士尼亞與赫塞哥維納 波斯尼亞和黑塞哥維那
 卢塞恩      琉森
 亞斯文      阿斯旺
 奈及利亞   尼日利亞
index 271a055..2a72501 100644 (file)
 毛里裘斯   模里西斯
 沙特阿拉伯        沙烏地阿拉伯
 沙地阿拉伯        沙烏地阿拉伯
-波斯尼亚和黑塞哥维那 波士尼亞赫塞哥維納
-波斯尼亞黑塞哥維那    波士尼亞赫塞哥維納
+æ³¢æ\96¯å°¼äº\9aå\92\8cé»\91å¡\9eå\93¥ç»´é\82£ æ³¢å£«å°¼äº\9eè\88\87赫å¡\9eå\93¥ç¶­ç´\8d
+波斯尼亞和黑塞哥維那 波士尼亞與赫塞哥維納
 津巴布韦   辛巴威
 津巴布韋   辛巴威
 洪都拉斯   宏都拉斯
@@ -778,3 +778,4 @@ IP地址    IP位址
 行人路权   行人路權
 塑料袋      塑膠袋
 桃金娘      桃金孃
+触摸屏      觸控螢幕
index c9d78b7..e5b05ff 100644 (file)
@@ -135,6 +135,7 @@ U+056D9囙|U+056E0因|
 U+05705圅|U+051FD函|
 U+0577F坿|U+09644附|
 U+0579C垜|U+0579B垛|
+U+0585A塚|U+051A2冢|
 U+0585F塟|U+0846C葬|
 U+05872塲|U+0573A场|
 U+05896墖|U+05854塔|
@@ -200,7 +201,6 @@ U+05ED5廕|U+0836B荫|
 U+05EF5廵|U+05DE1巡|
 U+05EF9廹|U+08FEB迫|
 U+05EFB廻|U+056DE回|
-U+05EFC廼|U+04E43乃|
 U+05F14弔|U+0540A吊|
 U+05F46彆|U+0522B别|
 U+05F6B彫|U+096D5雕|
index 94756f0..4d18dda 100644 (file)
 水併流
 逼併
 併名
-併火
 併肩子
 併疊
 簡併
 言大而夸
 睏覺
 愛睏
-睏了
 纍堆
 纍紲
 纍臣
 桌几
 每每只
 法自制
-洒滌
 洒淅
 洒濯
 洒然
index 10408ec..dcb9933 100644 (file)
@@ -1,7 +1,6 @@
 <?php
 /**
- * Populates the rev_len and ar_len fields for old revisions created
- * before MW 1.10.
+ * Populates the rev_len and ar_len fields when they are NULL.
  *
  * 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
@@ -25,8 +24,9 @@
 require_once __DIR__ . '/Maintenance.php';
 
 /**
- * Maintenance script that populates the rev_len and ar_len fields
- * for old revisions created before MW 1.10.
+ * Maintenance script that populates the rev_len and ar_len fields when they are NULL.
+ * This is the case for all revisions created before MW 1.10, as well as those affected
+ * by T18748 (MW 1.10-1.13) and those affected by T135414 (MW 1.21-1.24).
  *
  * @ingroup Maintenance
  */
@@ -42,12 +42,12 @@ class PopulateRevisionLength extends LoggedUpdateMaintenance {
        }
 
        public function doDBUpdates() {
-               $db = $this->getDB( DB_MASTER );
-               if ( !$db->tableExists( 'revision' ) ) {
+               $dbw = $this->getDB( DB_MASTER );
+               if ( !$dbw->tableExists( 'revision' ) ) {
                        $this->error( "revision table does not exist", true );
-               } elseif ( !$db->tableExists( 'archive' ) ) {
+               } elseif ( !$dbw->tableExists( 'archive' ) ) {
                        $this->error( "archive table does not exist", true );
-               } elseif ( !$db->fieldExists( 'revision', 'rev_len', __METHOD__ ) ) {
+               } elseif ( !$dbw->fieldExists( 'revision', 'rev_len', __METHOD__ ) ) {
                        $this->output( "rev_len column does not exist\n\n", true );
 
                        return false;
@@ -73,9 +73,10 @@ class PopulateRevisionLength extends LoggedUpdateMaintenance {
         * @return int
         */
        protected function doLenUpdates( $table, $idCol, $prefix, $fields ) {
-               $db = $this->getDB( DB_MASTER );
-               $start = $db->selectField( $table, "MIN($idCol)", false, __METHOD__ );
-               $end = $db->selectField( $table, "MAX($idCol)", false, __METHOD__ );
+               $dbr = $this->getDB( DB_SLAVE );
+               $dbw = $this->getDB( DB_MASTER );
+               $start = $dbw->selectField( $table, "MIN($idCol)", false, __METHOD__ );
+               $end = $dbw->selectField( $table, "MAX($idCol)", false, __METHOD__ );
                if ( !$start || !$end ) {
                        $this->output( "...$table table seems to be empty.\n" );
 
@@ -89,7 +90,7 @@ class PopulateRevisionLength extends LoggedUpdateMaintenance {
 
                while ( $blockStart <= $end ) {
                        $this->output( "...doing $idCol from $blockStart to $blockEnd\n" );
-                       $res = $db->select(
+                       $res = $dbr->select(
                                $table,
                                $fields,
                                [
@@ -100,14 +101,16 @@ class PopulateRevisionLength extends LoggedUpdateMaintenance {
                                __METHOD__
                        );
 
-                       $this->beginTransaction( $db, __METHOD__ );
-                       # Go through and update rev_len from these rows.
-                       foreach ( $res as $row ) {
-                               if ( $this->upgradeRow( $row, $table, $idCol, $prefix ) ) {
-                                       $count++;
+                       if ( $res->numRows() > 0 ) {
+                               $this->beginTransaction( $dbw, __METHOD__ );
+                               # Go through and update rev_len from these rows.
+                               foreach ( $res as $row ) {
+                                       if ( $this->upgradeRow( $row, $table, $idCol, $prefix ) ) {
+                                               $count++;
+                                       }
                                }
+                               $this->commitTransaction( $dbw, __METHOD__ );
                        }
-                       $this->commitTransaction( $db, __METHOD__ );
 
                        $blockStart += $this->mBatchSize;
                        $blockEnd += $this->mBatchSize;
@@ -125,7 +128,7 @@ class PopulateRevisionLength extends LoggedUpdateMaintenance {
         * @return bool
         */
        protected function upgradeRow( $row, $table, $idCol, $prefix ) {
-               $db = $this->getDB( DB_MASTER );
+               $dbw = $this->getDB( DB_MASTER );
 
                $rev = ( $table === 'archive' )
                        ? Revision::newFromArchiveRow( $row )
@@ -141,7 +144,7 @@ class PopulateRevisionLength extends LoggedUpdateMaintenance {
                }
 
                # Update the row...
-               $db->update( $table,
+               $dbw->update( $table,
                        [ "{$prefix}_len" => $content->getSize() ],
                        [ $idCol => $row->$idCol ],
                        __METHOD__
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..3aeb1ed 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: #008000;
 }
 
 .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..6fde2e0 100644 (file)
     "grunt-jscs": "2.8.0",
     "grunt-jsonlint": "1.0.7",
     "grunt-karma": "0.12.2",
+    "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"
+    "qunitjs": "1.22.0",
+    "stylelint-config-wikimedia": "0.1.0"
   }
 }
index 9a5931f..b591b28 100644 (file)
@@ -43,7 +43,11 @@ return [
                'class' => 'ResourceLoaderWikiModule',
                'styles' => [ 'MediaWiki:Filepage.css' ],
        ],
-       'user.groups' => [ 'class' => 'ResourceLoaderUserGroupsModule' ],
+       'user.groups' => [
+               // Merged into 'user' since MediaWiki 1.28 - kept for back-compat
+               'dependencies' => 'user',
+               'targets' => [ 'desktop', 'mobile' ],
+       ],
 
        // Scripts managed by the current user (stored in their user space)
        'user' => [ 'class' => 'ResourceLoaderUserModule' ],
@@ -824,6 +828,9 @@ return [
                                'resources/src/moment-locale-overrides.js',
                        ],
                ],
+               'dependencies' => [
+                       'mediawiki.language',
+               ],
                'targets' => [ 'desktop', 'mobile' ],
        ],
 
@@ -933,6 +940,12 @@ return [
                        'mediawiki.api',
                ],
        ],
+       'mediawiki.api.rollback' => [
+               'scripts' => 'resources/src/mediawiki/api/rollback.js',
+               'dependencies' => [
+                       'mediawiki.api',
+               ],
+       ],
        'mediawiki.content.json' => [
                'position' => 'top',
                'styles' => 'resources/src/mediawiki/mediawiki.content.json.css',
@@ -1050,14 +1063,17 @@ return [
                        // @todo Load this message in content language
                        'colon-separator',
                ],
+               'targets' => [ 'desktop', 'mobile' ],
        ],
        'mediawiki.htmlform.styles' => [
                'styles' => 'resources/src/mediawiki/mediawiki.htmlform.css',
                'position' => 'top',
+               'targets' => [ 'desktop', 'mobile' ],
        ],
        'mediawiki.htmlform.ooui.styles' => [
                'styles' => 'resources/src/mediawiki/mediawiki.htmlform.ooui.css',
                'position' => 'top',
+               'targets' => [ 'desktop', 'mobile' ],
        ],
        'mediawiki.icon' => [
                'styles' => 'resources/src/mediawiki/mediawiki.icon.less',
@@ -1692,6 +1708,18 @@ return [
                        'watcherrortext',
                ],
        ],
+       'mediawiki.page.rollback' => [
+               'scripts' => 'resources/src/mediawiki/page/rollback.js',
+               'dependencies' => [
+                       'mediawiki.api.rollback',
+                       'mediawiki.notify',
+                       'jquery.spinner',
+               ],
+               'messages' => [
+                       'rollbackfailed',
+                       'actioncomplete',
+               ],
+       ],
        'mediawiki.page.image.pagination' => [
                'scripts' => 'resources/src/mediawiki/page/image-pagination.js',
                'dependencies' => [
@@ -1704,7 +1732,6 @@ return [
 
        'mediawiki.special' => [
                'position' => 'top',
-               'scripts' => 'resources/src/mediawiki.special/mediawiki.special.js',
                'styles' => 'resources/src/mediawiki.special/mediawiki.special.css',
                'targets' => [ 'desktop', 'mobile' ],
        ],
@@ -1715,7 +1742,6 @@ return [
                'styles' => 'resources/src/mediawiki.special/mediawiki.special.apisandbox.css',
                'scripts' => 'resources/src/mediawiki.special/mediawiki.special.apisandbox.js',
                'dependencies' => [
-                       'mediawiki.special',
                        'mediawiki.api',
                        'mediawiki.jqueryMsg',
                        'oojs-ui',
@@ -1768,10 +1794,6 @@ return [
                'styles' => 'resources/src/mediawiki.special/mediawiki.special.block.css',
                'dependencies' => 'mediawiki.util',
        ],
-       'mediawiki.special.blocklist' => [
-               'styles' => 'resources/src/mediawiki.special/mediawiki.special.blocklist.css',
-               'position' => 'top',
-       ],
        'mediawiki.special.changeslist' => [
                'position' => 'top',
                'styles' => 'resources/src/mediawiki.special/mediawiki.special.changeslist.css',
@@ -1858,7 +1880,6 @@ return [
        ],
        'mediawiki.special.recentchanges' => [
                'scripts' => 'resources/src/mediawiki.special/mediawiki.special.recentchanges.js',
-               'dependencies' => 'mediawiki.special',
                'position' => 'top',
        ],
        'mediawiki.special.search' => [
@@ -1872,6 +1893,10 @@ return [
                        'powersearch-togglenone',
                ],
        ],
+       'mediawiki.special.search.styles' => [
+               'styles' => 'resources/src/mediawiki.special/mediawiki.special.search.styles.css',
+               'targets' => [ 'desktop', 'mobile' ],
+       ],
        'mediawiki.special.undelete' => [
                'scripts' => 'resources/src/mediawiki.special/mediawiki.special.undelete.js',
        ],
@@ -1880,7 +1905,6 @@ return [
                        'thumbnail.html' => 'resources/src/mediawiki.special/templates/thumbnail.html',
                ],
                'scripts' => 'resources/src/mediawiki.special/mediawiki.special.upload.js',
-               'styles' => 'resources/src/mediawiki.special/mediawiki.special.upload.css',
                'messages' => [
                        'widthheight',
                        'size-bytes',
@@ -1893,6 +1917,7 @@ return [
                        'prefs-editing',
                ],
                'dependencies' => [
+                       'mediawiki.special.upload.styles',
                        'jquery.spinner',
                        'mediawiki.jqueryMsg',
                        'mediawiki.api',
@@ -1903,6 +1928,9 @@ return [
                        'user.options',
                ],
        ],
+       'mediawiki.special.upload.styles' => [
+               'styles' => 'resources/src/mediawiki.special/mediawiki.special.upload.styles.css',
+       ],
        'mediawiki.special.userlogin.common.styles' => [
                'styles' => [
                        'resources/src/mediawiki.special/mediawiki.special.userlogin.common.css',
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 85f51e2..91a7a39 100644 (file)
 ;
 
 // UMD (Universal Module Definition)
-// see https://github.com/umdjs/umd/blob/master/returnExports.js
+// see https://github.com/umdjs/umd/blob/master/templates/returnExports.js
 (function (root, factory) {
     'use strict';
 
-    /*global define, exports, module */
+    /* global define, exports, module */
     if (typeof define === 'function' && define.amd) {
         // AMD. Register as an anonymous module.
         define(factory);
  */
 
 // Shortcut to an often accessed properties, in order to avoid multiple
-// dereference that costs universally.
-var ArrayPrototype = Array.prototype;
-var ObjectPrototype = Object.prototype;
-var FunctionPrototype = Function.prototype;
-var StringPrototype = String.prototype;
-var NumberPrototype = Number.prototype;
+// dereference that costs universally. This also holds a reference to known-good
+// functions.
+var $Array = Array;
+var ArrayPrototype = $Array.prototype;
+var $Object = Object;
+var ObjectPrototype = $Object.prototype;
+var $Function = Function;
+var FunctionPrototype = $Function.prototype;
+var $String = String;
+var StringPrototype = $String.prototype;
+var $Number = Number;
+var NumberPrototype = $Number.prototype;
 var array_slice = ArrayPrototype.slice;
 var array_splice = ArrayPrototype.splice;
 var array_push = ArrayPrototype.push;
 var array_unshift = ArrayPrototype.unshift;
 var array_concat = ArrayPrototype.concat;
+var array_join = ArrayPrototype.join;
 var call = FunctionPrototype.call;
+var apply = FunctionPrototype.apply;
+var max = Math.max;
+var min = Math.min;
 
 // Having a toString local variable name breaks in Opera so use to_string.
 var to_string = ObjectPrototype.toString;
 
-var isArray = Array.isArray || function isArray(obj) {
-    return to_string.call(obj) === '[object Array]';
-};
-
+/* global Symbol */
+/* eslint-disable one-var-declaration-per-line, no-redeclare, max-statements-per-line */
 var hasToStringTag = typeof Symbol === 'function' && typeof Symbol.toStringTag === 'symbol';
-var isCallable; /* inlined from https://npmjs.com/is-callable */ var fnToStr = Function.prototype.toString, tryFunctionObject = function tryFunctionObject(value) { try { fnToStr.call(value); return true; } catch (e) { return false; } }, fnClass = '[object Function]', genClass = '[object GeneratorFunction]'; isCallable = function isCallable(value) { if (typeof value !== 'function') { return false; } if (hasToStringTag) { return tryFunctionObject(value); } var strClass = to_string.call(value); return strClass === fnClass || strClass === genClass; };
+var isCallable; /* inlined from https://npmjs.com/is-callable */ var fnToStr = Function.prototype.toString, constructorRegex = /^\s*class /, isES6ClassFn = function isES6ClassFn(value) { try { var fnStr = fnToStr.call(value); var singleStripped = fnStr.replace(/\/\/.*\n/g, ''); var multiStripped = singleStripped.replace(/\/\*[.\s\S]*\*\//g, ''); var spaceStripped = multiStripped.replace(/\n/mg, ' ').replace(/ {2}/g, ' '); return constructorRegex.test(spaceStripped); } catch (e) { return false; /* not a function */ } }, tryFunctionObject = function tryFunctionObject(value) { try { if (isES6ClassFn(value)) { return false; } fnToStr.call(value); return true; } catch (e) { return false; } }, fnClass = '[object Function]', genClass = '[object GeneratorFunction]', isCallable = function isCallable(value) { if (!value) { return false; } if (typeof value !== 'function' && typeof value !== 'object') { return false; } if (hasToStringTag) { return tryFunctionObject(value); } if (isES6ClassFn(value)) { return false; } var strClass = to_string.call(value); return strClass === fnClass || strClass === genClass; };
+
 var isRegex; /* inlined from https://npmjs.com/is-regex */ var regexExec = RegExp.prototype.exec, tryRegexExec = function tryRegexExec(value) { try { regexExec.call(value); return true; } catch (e) { return false; } }, regexClass = '[object RegExp]'; isRegex = function isRegex(value) { if (typeof value !== 'object') { return false; } return hasToStringTag ? tryRegexExec(value) : to_string.call(value) === regexClass; };
 var isString; /* inlined from https://npmjs.com/is-string */ var strValue = String.prototype.valueOf, tryStringObject = function tryStringObject(value) { try { strValue.call(value); return true; } catch (e) { return false; } }, stringClass = '[object String]'; isString = function isString(value) { if (typeof value === 'string') { return true; } if (typeof value !== 'object') { return false; } return hasToStringTag ? tryStringObject(value) : to_string.call(value) === stringClass; };
-
-var isArguments = function isArguments(value) {
-    var str = to_string.call(value);
-    var isArgs = str === '[object Arguments]';
-    if (!isArgs) {
-        isArgs = !isArray(value) &&
-          value !== null &&
-          typeof value === 'object' &&
-          typeof value.length === 'number' &&
-          value.length >= 0 &&
-          isCallable(value.callee);
-    }
-    return isArgs;
-};
+/* eslint-enable one-var-declaration-per-line, no-redeclare, max-statements-per-line */
 
 /* inlined from http://npmjs.com/define-properties */
+var supportsDescriptors = $Object.defineProperty && (function () {
+    try {
+        var obj = {};
+        $Object.defineProperty(obj, 'x', { enumerable: false, value: obj });
+        for (var _ in obj) { return false; }
+        return obj.x === obj;
+    } catch (e) { /* this is ES3 */
+        return false;
+    }
+}());
 var defineProperties = (function (has) {
-  var supportsDescriptors = Object.defineProperty && (function () {
-      try {
-          var obj = {};
-          Object.defineProperty(obj, 'x', { enumerable: false, value: obj });
-          for (var _ in obj) { return false; }
-          return obj.x === obj;
-      } catch (e) { /* this is ES3 */
-          return false;
-      }
-  }());
-
-  // Define configurable, writable and non-enumerable props
+  // Define configurable, writable, and non-enumerable props
   // if they don't exist.
   var defineProperty;
   if (supportsDescriptors) {
       defineProperty = function (object, name, method, forceAssign) {
           if (!forceAssign && (name in object)) { return; }
-          Object.defineProperty(object, name, {
+          $Object.defineProperty(object, name, {
               configurable: true,
               enumerable: false,
               writable: true,
@@ -130,6 +125,8 @@ var isPrimitive = function isPrimitive(input) {
     return input === null || (type !== 'object' && type !== 'function');
 };
 
+var isActualNaN = $Number.isNaN || function (x) { return x !== x; };
+
 var ES = {
     // ES5 9.4
     // http://es5.github.com/#x9.4
@@ -137,7 +134,7 @@ var ES = {
     /* replaceable with https://npmjs.com/package/es-abstract ES5.ToInteger */
     ToInteger: function ToInteger(num) {
         var n = +num;
-        if (n !== n) { // isNaN
+        if (isActualNaN(n)) {
             n = 0;
         } else if (n !== 0 && n !== (1 / 0) && n !== -(1 / 0)) {
             n = (n > 0 || -1) * Math.floor(Math.abs(n));
@@ -172,11 +169,10 @@ var ES = {
     // http://es5.github.com/#x9.9
     /* replaceable with https://npmjs.com/package/es-abstract ES5.ToObject */
     ToObject: function (o) {
-        /*jshint eqnull: true */
         if (o == null) { // this matches both null and undefined
             throw new TypeError("can't convert " + o + ' to object');
         }
-        return Object(o);
+        return $Object(o);
     },
 
     /* replaceable with https://npmjs.com/package/es-abstract ES5.ToUint32 */
@@ -236,11 +232,12 @@ defineProperties(FunctionPrototype, {
                 // 5. Return the result of calling the [[Construct]] internal
                 //   method of target providing args as the arguments.
 
-                var result = target.apply(
+                var result = apply.call(
+                    target,
                     this,
                     array_concat.call(args, array_slice.call(arguments))
                 );
-                if (Object(result) === result) {
+                if ($Object(result) === result) {
                     return result;
                 }
                 return this;
@@ -265,7 +262,8 @@ defineProperties(FunctionPrototype, {
                 //   providing args as the arguments.
 
                 // equiv: target.call(this, ...boundArgs, ...args)
-                return target.apply(
+                return apply.call(
+                    target,
                     that,
                     array_concat.call(args, array_slice.call(arguments))
                 );
@@ -280,13 +278,13 @@ defineProperties(FunctionPrototype, {
         //       larger.
         // 16. Else set the length own property of F to 0.
 
-        var boundLength = Math.max(0, target.length - args.length);
+        var boundLength = max(0, target.length - args.length);
 
         // 17. Set the attributes of the length own property of F to the values
         //   specified in 15.3.5.1.
         var boundArgs = [];
         for (var i = 0; i < boundLength; i++) {
-            boundArgs.push('$' + i);
+            array_push.call(boundArgs, '$' + i);
         }
 
         // XXX Build a dynamic function with desired amount of arguments is the only
@@ -295,7 +293,7 @@ defineProperties(FunctionPrototype, {
         // for ex.) all use of eval or Function costructor throws an exception.
         // However in all of these environments Function.prototype.bind exists
         // and so this code will never be executed.
-        bound = Function('binder', 'return function (' + boundArgs.join(',') + '){ return binder.apply(this, arguments); }')(binder);
+        bound = $Function('binder', 'return function (' + array_join.call(boundArgs, ',') + '){ return binder.apply(this, arguments); }')(binder);
 
         if (target.prototype) {
             Empty.prototype = target.prototype;
@@ -330,53 +328,26 @@ defineProperties(FunctionPrototype, {
 });
 
 // _Please note: Shortcuts are defined after `Function.prototype.bind` as we
-// us it in defining shortcuts.
+// use it in defining shortcuts.
 var owns = call.bind(ObjectPrototype.hasOwnProperty);
+var toStr = call.bind(ObjectPrototype.toString);
+var arraySlice = call.bind(array_slice);
+var arraySliceApply = apply.bind(array_slice);
+var strSlice = call.bind(StringPrototype.slice);
+var strSplit = call.bind(StringPrototype.split);
+var strIndexOf = call.bind(StringPrototype.indexOf);
+var pushCall = call.bind(array_push);
+var isEnum = call.bind(ObjectPrototype.propertyIsEnumerable);
+var arraySort = call.bind(ArrayPrototype.sort);
 
 //
 // Array
 // =====
 //
 
-// ES5 15.4.4.12
-// http://es5.github.com/#x15.4.4.12
-var spliceNoopReturnsEmptyArray = (function () {
-    var a = [1, 2];
-    var result = a.splice();
-    return a.length === 2 && isArray(result) && result.length === 0;
-}());
-defineProperties(ArrayPrototype, {
-    // Safari 5.0 bug where .splice() returns undefined
-    splice: function splice(start, deleteCount) {
-        if (arguments.length === 0) {
-            return [];
-        } else {
-            return array_splice.apply(this, arguments);
-        }
-    }
-}, !spliceNoopReturnsEmptyArray);
-
-var spliceWorksWithEmptyObject = (function () {
-    var obj = {};
-    ArrayPrototype.splice.call(obj, 0, 0, 1);
-    return obj.length === 1;
-}());
-defineProperties(ArrayPrototype, {
-    splice: function splice(start, deleteCount) {
-        if (arguments.length === 0) { return []; }
-        var args = arguments;
-        this.length = Math.max(ES.ToInteger(this.length), 0);
-        if (arguments.length > 0 && typeof deleteCount !== 'number') {
-            args = array_slice.call(arguments);
-            if (args.length < 2) {
-                args.push(this.length - start);
-            } else {
-                args[1] = ES.ToInteger(deleteCount);
-            }
-        }
-        return array_splice.apply(this, args);
-    }
-}, !spliceWorksWithEmptyObject);
+var isArray = $Array.isArray || function isArray(obj) {
+    return toStr(obj) === '[object Array]';
+};
 
 // ES5 15.4.4.12
 // http://es5.github.com/#x15.4.4.13
@@ -394,7 +365,7 @@ defineProperties(ArrayPrototype, {
 // ES5 15.4.3.2
 // http://es5.github.com/#x15.4.3.2
 // https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/isArray
-defineProperties(Array, { isArray: isArray });
+defineProperties($Array, { isArray: isArray });
 
 // The IsCallable() check in the Array functions
 // has been replaced with a strict check on the
@@ -414,33 +385,40 @@ defineProperties(Array, { isArray: isArray });
 
 // Check failure of by-index access of string characters (IE < 9)
 // and failure of `0 in boxedString` (Rhino)
-var boxedString = Object('a');
+var boxedString = $Object('a');
 var splitString = boxedString[0] !== 'a' || !(0 in boxedString);
 
 var properlyBoxesContext = function properlyBoxed(method) {
     // Check node 0.6.21 bug where third parameter is not boxed
     var properlyBoxesNonStrict = true;
     var properlyBoxesStrict = true;
+    var threwException = false;
     if (method) {
-        method.call('foo', function (_, __, context) {
-            if (typeof context !== 'object') { properlyBoxesNonStrict = false; }
-        });
+        try {
+            method.call('foo', function (_, __, context) {
+                if (typeof context !== 'object') {
+                    properlyBoxesNonStrict = false;
+                }
+            });
 
-        method.call([1], function () {
-            'use strict';
+            method.call([1], function () {
+                'use strict';
 
-            properlyBoxesStrict = typeof this === 'string';
-        }, 'x');
+                properlyBoxesStrict = typeof this === 'string';
+            }, 'x');
+        } catch (e) {
+            threwException = true;
+        }
     }
-    return !!method && properlyBoxesNonStrict && properlyBoxesStrict;
+    return !!method && !threwException && properlyBoxesNonStrict && properlyBoxesStrict;
 };
 
 defineProperties(ArrayPrototype, {
-    forEach: function forEach(callbackfn /*, thisArg*/) {
+    forEach: function forEach(callbackfn/*, thisArg*/) {
         var object = ES.ToObject(this);
-        var self = splitString && isString(this) ? this.split('') : object;
+        var self = splitString && isString(this) ? strSplit(this, '') : object;
         var i = -1;
-        var length = self.length >>> 0;
+        var length = ES.ToUint32(self.length);
         var T;
         if (arguments.length > 1) {
           T = arguments[1];
@@ -455,10 +433,10 @@ defineProperties(ArrayPrototype, {
             if (i in self) {
                 // Invoke the callback function with call, passing arguments:
                 // context, property value, property key, thisArg object
-                if (typeof T !== 'undefined') {
-                    callbackfn.call(T, self[i], i, object);
-                } else {
+                if (typeof T === 'undefined') {
                     callbackfn(self[i], i, object);
+                } else {
+                    callbackfn.call(T, self[i], i, object);
                 }
             }
         }
@@ -471,9 +449,9 @@ defineProperties(ArrayPrototype, {
 defineProperties(ArrayPrototype, {
     map: function map(callbackfn/*, thisArg*/) {
         var object = ES.ToObject(this);
-        var self = splitString && isString(this) ? this.split('') : object;
-        var length = self.length >>> 0;
-        var result = Array(length);
+        var self = splitString && isString(this) ? strSplit(this, '') : object;
+        var length = ES.ToUint32(self.length);
+        var result = $Array(length);
         var T;
         if (arguments.length > 1) {
             T = arguments[1];
@@ -486,10 +464,10 @@ defineProperties(ArrayPrototype, {
 
         for (var i = 0; i < length; i++) {
             if (i in self) {
-                if (typeof T !== 'undefined') {
-                    result[i] = callbackfn.call(T, self[i], i, object);
-                } else {
+                if (typeof T === 'undefined') {
                     result[i] = callbackfn(self[i], i, object);
+                } else {
+                    result[i] = callbackfn.call(T, self[i], i, object);
                 }
             }
         }
@@ -501,10 +479,10 @@ defineProperties(ArrayPrototype, {
 // http://es5.github.com/#x15.4.4.20
 // https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/filter
 defineProperties(ArrayPrototype, {
-    filter: function filter(callbackfn /*, thisArg*/) {
+    filter: function filter(callbackfn/*, thisArg*/) {
         var object = ES.ToObject(this);
-        var self = splitString && isString(this) ? this.split('') : object;
-        var length = self.length >>> 0;
+        var self = splitString && isString(this) ? strSplit(this, '') : object;
+        var length = ES.ToUint32(self.length);
         var result = [];
         var value;
         var T;
@@ -521,7 +499,7 @@ defineProperties(ArrayPrototype, {
             if (i in self) {
                 value = self[i];
                 if (typeof T === 'undefined' ? callbackfn(value, i, object) : callbackfn.call(T, value, i, object)) {
-                    result.push(value);
+                    pushCall(result, value);
                 }
             }
         }
@@ -533,10 +511,10 @@ defineProperties(ArrayPrototype, {
 // http://es5.github.com/#x15.4.4.16
 // https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/every
 defineProperties(ArrayPrototype, {
-    every: function every(callbackfn /*, thisArg*/) {
+    every: function every(callbackfn/*, thisArg*/) {
         var object = ES.ToObject(this);
-        var self = splitString && isString(this) ? this.split('') : object;
-        var length = self.length >>> 0;
+        var self = splitString && isString(this) ? strSplit(this, '') : object;
+        var length = ES.ToUint32(self.length);
         var T;
         if (arguments.length > 1) {
             T = arguments[1];
@@ -562,8 +540,8 @@ defineProperties(ArrayPrototype, {
 defineProperties(ArrayPrototype, {
     some: function some(callbackfn/*, thisArg */) {
         var object = ES.ToObject(this);
-        var self = splitString && isString(this) ? this.split('') : object;
-        var length = self.length >>> 0;
+        var self = splitString && isString(this) ? strSplit(this, '') : object;
+        var length = ES.ToUint32(self.length);
         var T;
         if (arguments.length > 1) {
             T = arguments[1];
@@ -588,13 +566,15 @@ defineProperties(ArrayPrototype, {
 // https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/reduce
 var reduceCoercesToObject = false;
 if (ArrayPrototype.reduce) {
-    reduceCoercesToObject = typeof ArrayPrototype.reduce.call('es5', function (_, __, ___, list) { return list; }) === 'object';
+    reduceCoercesToObject = typeof ArrayPrototype.reduce.call('es5', function (_, __, ___, list) {
+        return list;
+    }) === 'object';
 }
 defineProperties(ArrayPrototype, {
-    reduce: function reduce(callbackfn /*, initialValue*/) {
+    reduce: function reduce(callbackfn/*, initialValue*/) {
         var object = ES.ToObject(this);
-        var self = splitString && isString(this) ? this.split('') : object;
-        var length = self.length >>> 0;
+        var self = splitString && isString(this) ? strSplit(this, '') : object;
+        var length = ES.ToUint32(self.length);
 
         // If no callback function or if callback is not a callable function
         if (!isCallable(callbackfn)) {
@@ -639,13 +619,15 @@ defineProperties(ArrayPrototype, {
 // https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/reduceRight
 var reduceRightCoercesToObject = false;
 if (ArrayPrototype.reduceRight) {
-    reduceRightCoercesToObject = typeof ArrayPrototype.reduceRight.call('es5', function (_, __, ___, list) { return list; }) === 'object';
+    reduceRightCoercesToObject = typeof ArrayPrototype.reduceRight.call('es5', function (_, __, ___, list) {
+        return list;
+    }) === 'object';
 }
 defineProperties(ArrayPrototype, {
     reduceRight: function reduceRight(callbackfn/*, initial*/) {
         var object = ES.ToObject(this);
-        var self = splitString && isString(this) ? this.split('') : object;
-        var length = self.length >>> 0;
+        var self = splitString && isString(this) ? strSplit(this, '') : object;
+        var length = ES.ToUint32(self.length);
 
         // If no callback function or if callback is not a callable function
         if (!isCallable(callbackfn)) {
@@ -692,11 +674,11 @@ defineProperties(ArrayPrototype, {
 // ES5 15.4.4.14
 // http://es5.github.com/#x15.4.4.14
 // https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/indexOf
-var hasFirefox2IndexOfBug = Array.prototype.indexOf && [0, 1].indexOf(1, 2) !== -1;
+var hasFirefox2IndexOfBug = ArrayPrototype.indexOf && [0, 1].indexOf(1, 2) !== -1;
 defineProperties(ArrayPrototype, {
-    indexOf: function indexOf(searchElement /*, fromIndex */) {
-        var self = splitString && isString(this) ? this.split('') : ES.ToObject(this);
-        var length = self.length >>> 0;
+    indexOf: function indexOf(searchElement/*, fromIndex */) {
+        var self = splitString && isString(this) ? strSplit(this, '') : ES.ToObject(this);
+        var length = ES.ToUint32(self.length);
 
         if (length === 0) {
             return -1;
@@ -708,7 +690,7 @@ defineProperties(ArrayPrototype, {
         }
 
         // handle negative indices
-        i = i >= 0 ? i : Math.max(0, length + i);
+        i = i >= 0 ? i : max(0, length + i);
         for (; i < length; i++) {
             if (i in self && self[i] === searchElement) {
                 return i;
@@ -721,18 +703,18 @@ defineProperties(ArrayPrototype, {
 // ES5 15.4.4.15
 // http://es5.github.com/#x15.4.4.15
 // https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/lastIndexOf
-var hasFirefox2LastIndexOfBug = Array.prototype.lastIndexOf && [0, 1].lastIndexOf(0, -3) !== -1;
+var hasFirefox2LastIndexOfBug = ArrayPrototype.lastIndexOf && [0, 1].lastIndexOf(0, -3) !== -1;
 defineProperties(ArrayPrototype, {
-    lastIndexOf: function lastIndexOf(searchElement /*, fromIndex */) {
-        var self = splitString && isString(this) ? this.split('') : ES.ToObject(this);
-        var length = self.length >>> 0;
+    lastIndexOf: function lastIndexOf(searchElement/*, fromIndex */) {
+        var self = splitString && isString(this) ? strSplit(this, '') : ES.ToObject(this);
+        var length = ES.ToUint32(self.length);
 
         if (length === 0) {
             return -1;
         }
         var i = length - 1;
         if (arguments.length > 1) {
-            i = Math.min(i, ES.ToInteger(arguments[1]));
+            i = min(i, ES.ToInteger(arguments[1]));
         }
         // handle negative indices
         i = i >= 0 ? i : length - Math.abs(i);
@@ -745,6 +727,236 @@ defineProperties(ArrayPrototype, {
     }
 }, hasFirefox2LastIndexOfBug);
 
+// ES5 15.4.4.12
+// http://es5.github.com/#x15.4.4.12
+var spliceNoopReturnsEmptyArray = (function () {
+    var a = [1, 2];
+    var result = a.splice();
+    return a.length === 2 && isArray(result) && result.length === 0;
+}());
+defineProperties(ArrayPrototype, {
+    // Safari 5.0 bug where .splice() returns undefined
+    splice: function splice(start, deleteCount) {
+        if (arguments.length === 0) {
+            return [];
+        } else {
+            return array_splice.apply(this, arguments);
+        }
+    }
+}, !spliceNoopReturnsEmptyArray);
+
+var spliceWorksWithEmptyObject = (function () {
+    var obj = {};
+    ArrayPrototype.splice.call(obj, 0, 0, 1);
+    return obj.length === 1;
+}());
+defineProperties(ArrayPrototype, {
+    splice: function splice(start, deleteCount) {
+        if (arguments.length === 0) { return []; }
+        var args = arguments;
+        this.length = max(ES.ToInteger(this.length), 0);
+        if (arguments.length > 0 && typeof deleteCount !== 'number') {
+            args = arraySlice(arguments);
+            if (args.length < 2) {
+                pushCall(args, this.length - start);
+            } else {
+                args[1] = ES.ToInteger(deleteCount);
+            }
+        }
+        return array_splice.apply(this, args);
+    }
+}, !spliceWorksWithEmptyObject);
+var spliceWorksWithLargeSparseArrays = (function () {
+    // Per https://github.com/es-shims/es5-shim/issues/295
+    // Safari 7/8 breaks with sparse arrays of size 1e5 or greater
+    var arr = new $Array(1e5);
+    // note: the index MUST be 8 or larger or the test will false pass
+    arr[8] = 'x';
+    arr.splice(1, 1);
+    // note: this test must be defined *after* the indexOf shim
+    // per https://github.com/es-shims/es5-shim/issues/313
+    return arr.indexOf('x') === 7;
+}());
+var spliceWorksWithSmallSparseArrays = (function () {
+    // Per https://github.com/es-shims/es5-shim/issues/295
+    // Opera 12.15 breaks on this, no idea why.
+    var n = 256;
+    var arr = [];
+    arr[n] = 'a';
+    arr.splice(n + 1, 0, 'b');
+    return arr[n] === 'a';
+}());
+defineProperties(ArrayPrototype, {
+    splice: function splice(start, deleteCount) {
+        var O = ES.ToObject(this);
+        var A = [];
+        var len = ES.ToUint32(O.length);
+        var relativeStart = ES.ToInteger(start);
+        var actualStart = relativeStart < 0 ? max((len + relativeStart), 0) : min(relativeStart, len);
+        var actualDeleteCount = min(max(ES.ToInteger(deleteCount), 0), len - actualStart);
+
+        var k = 0;
+        var from;
+        while (k < actualDeleteCount) {
+            from = $String(actualStart + k);
+            if (owns(O, from)) {
+                A[k] = O[from];
+            }
+            k += 1;
+        }
+
+        var items = arraySlice(arguments, 2);
+        var itemCount = items.length;
+        var to;
+        if (itemCount < actualDeleteCount) {
+            k = actualStart;
+            var maxK = len - actualDeleteCount;
+            while (k < maxK) {
+                from = $String(k + actualDeleteCount);
+                to = $String(k + itemCount);
+                if (owns(O, from)) {
+                    O[to] = O[from];
+                } else {
+                    delete O[to];
+                }
+                k += 1;
+            }
+            k = len;
+            var minK = len - actualDeleteCount + itemCount;
+            while (k > minK) {
+                delete O[k - 1];
+                k -= 1;
+            }
+        } else if (itemCount > actualDeleteCount) {
+            k = len - actualDeleteCount;
+            while (k > actualStart) {
+                from = $String(k + actualDeleteCount - 1);
+                to = $String(k + itemCount - 1);
+                if (owns(O, from)) {
+                    O[to] = O[from];
+                } else {
+                    delete O[to];
+                }
+                k -= 1;
+            }
+        }
+        k = actualStart;
+        for (var i = 0; i < items.length; ++i) {
+            O[k] = items[i];
+            k += 1;
+        }
+        O.length = len - actualDeleteCount + itemCount;
+
+        return A;
+    }
+}, !spliceWorksWithLargeSparseArrays || !spliceWorksWithSmallSparseArrays);
+
+var originalJoin = ArrayPrototype.join;
+var hasStringJoinBug;
+try {
+    hasStringJoinBug = Array.prototype.join.call('123', ',') !== '1,2,3';
+} catch (e) {
+    hasStringJoinBug = true;
+}
+if (hasStringJoinBug) {
+    defineProperties(ArrayPrototype, {
+        join: function join(separator) {
+            var sep = typeof separator === 'undefined' ? ',' : separator;
+            return originalJoin.call(isString(this) ? strSplit(this, '') : this, sep);
+        }
+    }, hasStringJoinBug);
+}
+
+var hasJoinUndefinedBug = [1, 2].join(undefined) !== '1,2';
+if (hasJoinUndefinedBug) {
+    defineProperties(ArrayPrototype, {
+        join: function join(separator) {
+            var sep = typeof separator === 'undefined' ? ',' : separator;
+            return originalJoin.call(this, sep);
+        }
+    }, hasJoinUndefinedBug);
+}
+
+var pushShim = function push(item) {
+    var O = ES.ToObject(this);
+    var n = ES.ToUint32(O.length);
+    var i = 0;
+    while (i < arguments.length) {
+        O[n + i] = arguments[i];
+        i += 1;
+    }
+    O.length = n + i;
+    return n + i;
+};
+
+var pushIsNotGeneric = (function () {
+    var obj = {};
+    var result = Array.prototype.push.call(obj, undefined);
+    return result !== 1 || obj.length !== 1 || typeof obj[0] !== 'undefined' || !owns(obj, 0);
+}());
+defineProperties(ArrayPrototype, {
+    push: function push(item) {
+        if (isArray(this)) {
+            return array_push.apply(this, arguments);
+        }
+        return pushShim.apply(this, arguments);
+    }
+}, pushIsNotGeneric);
+
+// This fixes a very weird bug in Opera 10.6 when pushing `undefined
+var pushUndefinedIsWeird = (function () {
+    var arr = [];
+    var result = arr.push(undefined);
+    return result !== 1 || arr.length !== 1 || typeof arr[0] !== 'undefined' || !owns(arr, 0);
+}());
+defineProperties(ArrayPrototype, { push: pushShim }, pushUndefinedIsWeird);
+
+// ES5 15.2.3.14
+// http://es5.github.io/#x15.4.4.10
+// Fix boxed string bug
+defineProperties(ArrayPrototype, {
+    slice: function (start, end) {
+        var arr = isString(this) ? strSplit(this, '') : this;
+        return arraySliceApply(arr, arguments);
+    }
+}, splitString);
+
+var sortIgnoresNonFunctions = (function () {
+    try {
+        [1, 2].sort(null);
+        [1, 2].sort({});
+        return true;
+    } catch (e) { /**/ }
+    return false;
+}());
+var sortThrowsOnRegex = (function () {
+    // this is a problem in Firefox 4, in which `typeof /a/ === 'function'`
+    try {
+        [1, 2].sort(/a/);
+        return false;
+    } catch (e) { /**/ }
+    return true;
+}());
+var sortIgnoresUndefined = (function () {
+    // applies in IE 8, for one.
+    try {
+        [1, 2].sort(undefined);
+        return true;
+    } catch (e) { /**/ }
+    return false;
+}());
+defineProperties(ArrayPrototype, {
+    sort: function sort(compareFn) {
+        if (typeof compareFn === 'undefined') {
+            return arraySort(this);
+        }
+        if (!isCallable(compareFn)) {
+            throw new TypeError('Array.prototype.sort callback must be a function');
+        }
+        return arraySort(this, compareFn);
+    }
+}, sortIgnoresNonFunctions || !sortIgnoresUndefined || !sortThrowsOnRegex);
+
 //
 // Object
 // ======
@@ -754,26 +966,79 @@ defineProperties(ArrayPrototype, {
 // http://es5.github.com/#x15.2.3.14
 
 // http://whattheheadsaid.com/2010/10/a-safer-object-keys-compatibility-implementation
-var hasDontEnumBug = !({ 'toString': null }).propertyIsEnumerable('toString'),
-    hasProtoEnumBug = function () {}.propertyIsEnumerable('prototype'),
-    hasStringEnumBug = !owns('x', '0'),
-    dontEnums = [
-        'toString',
-        'toLocaleString',
-        'valueOf',
-        'hasOwnProperty',
-        'isPrototypeOf',
-        'propertyIsEnumerable',
-        'constructor'
-    ],
-    dontEnumsLength = dontEnums.length;
-
-defineProperties(Object, {
+var hasDontEnumBug = !({ 'toString': null }).propertyIsEnumerable('toString');
+var hasProtoEnumBug = function () {}.propertyIsEnumerable('prototype');
+var hasStringEnumBug = !owns('x', '0');
+var equalsConstructorPrototype = function (o) {
+    var ctor = o.constructor;
+    return ctor && ctor.prototype === o;
+};
+var blacklistedKeys = {
+    $window: true,
+    $console: true,
+    $parent: true,
+    $self: true,
+    $frame: true,
+    $frames: true,
+    $frameElement: true,
+    $webkitIndexedDB: true,
+    $webkitStorageInfo: true,
+    $external: true
+};
+var hasAutomationEqualityBug = (function () {
+    /* globals window */
+    if (typeof window === 'undefined') { return false; }
+    for (var k in window) {
+        try {
+            if (!blacklistedKeys['$' + k] && owns(window, k) && window[k] !== null && typeof window[k] === 'object') {
+                equalsConstructorPrototype(window[k]);
+            }
+        } catch (e) {
+            return true;
+        }
+    }
+    return false;
+}());
+var equalsConstructorPrototypeIfNotBuggy = function (object) {
+    if (typeof window === 'undefined' || !hasAutomationEqualityBug) { return equalsConstructorPrototype(object); }
+    try {
+        return equalsConstructorPrototype(object);
+    } catch (e) {
+        return false;
+    }
+};
+var dontEnums = [
+    'toString',
+    'toLocaleString',
+    'valueOf',
+    'hasOwnProperty',
+    'isPrototypeOf',
+    'propertyIsEnumerable',
+    'constructor'
+];
+var dontEnumsLength = dontEnums.length;
+
+// taken directly from https://github.com/ljharb/is-arguments/blob/master/index.js
+// can be replaced with require('is-arguments') if we ever use a build process instead
+var isStandardArguments = function isArguments(value) {
+    return toStr(value) === '[object Arguments]';
+};
+var isLegacyArguments = function isArguments(value) {
+    return value !== null &&
+        typeof value === 'object' &&
+        typeof value.length === 'number' &&
+        value.length >= 0 &&
+        !isArray(value) &&
+        isCallable(value.callee);
+};
+var isArguments = isStandardArguments(arguments) ? isStandardArguments : isLegacyArguments;
+
+defineProperties($Object, {
     keys: function keys(object) {
-        var isFn = isCallable(object),
-            isArgs = isArguments(object),
-            isObject = object !== null && typeof object === 'object',
-            isStr = isObject && isString(object);
+        var isFn = isCallable(object);
+        var isArgs = isArguments(object);
+        var isObject = object !== null && typeof object === 'object';
+        var isStr = isObject && isString(object);
 
         if (!isObject && !isFn && !isArgs) {
             throw new TypeError('Object.keys called on a non-object');
@@ -783,25 +1048,24 @@ defineProperties(Object, {
         var skipProto = hasProtoEnumBug && isFn;
         if ((isStr && hasStringEnumBug) || isArgs) {
             for (var i = 0; i < object.length; ++i) {
-                theKeys.push(String(i));
+                pushCall(theKeys, $String(i));
             }
         }
 
         if (!isArgs) {
             for (var name in object) {
                 if (!(skipProto && name === 'prototype') && owns(object, name)) {
-                    theKeys.push(String(name));
+                    pushCall(theKeys, $String(name));
                 }
             }
         }
 
         if (hasDontEnumBug) {
-            var ctor = object.constructor,
-                skipConstructor = ctor && ctor.prototype === object;
+            var skipConstructor = equalsConstructorPrototypeIfNotBuggy(object);
             for (var j = 0; j < dontEnumsLength; j++) {
                 var dontEnum = dontEnums[j];
                 if (!(skipConstructor && dontEnum === 'constructor') && owns(object, dontEnum)) {
-                    theKeys.push(dontEnum);
+                    pushCall(theKeys, dontEnum);
                 }
             }
         }
@@ -809,26 +1073,214 @@ defineProperties(Object, {
     }
 });
 
-var keysWorksWithArguments = Object.keys && (function () {
+var keysWorksWithArguments = $Object.keys && (function () {
     // Safari 5.0 bug
-    return Object.keys(arguments).length === 2;
+    return $Object.keys(arguments).length === 2;
 }(1, 2));
-var originalKeys = Object.keys;
-defineProperties(Object, {
+var keysHasArgumentsLengthBug = $Object.keys && (function () {
+    var argKeys = $Object.keys(arguments);
+    return arguments.length !== 1 || argKeys.length !== 1 || argKeys[0] !== 1;
+}(1));
+var originalKeys = $Object.keys;
+defineProperties($Object, {
     keys: function keys(object) {
         if (isArguments(object)) {
-            return originalKeys(ArrayPrototype.slice.call(object));
+            return originalKeys(arraySlice(object));
         } else {
             return originalKeys(object);
         }
     }
-}, !keysWorksWithArguments);
+}, !keysWorksWithArguments || keysHasArgumentsLengthBug);
 
 //
 // Date
 // ====
 //
 
+var hasNegativeMonthYearBug = new Date(-3509827329600292).getUTCMonth() !== 0;
+var aNegativeTestDate = new Date(-1509842289600292);
+var aPositiveTestDate = new Date(1449662400000);
+var hasToUTCStringFormatBug = aNegativeTestDate.toUTCString() !== 'Mon, 01 Jan -45875 11:59:59 GMT';
+var hasToDateStringFormatBug;
+var hasToStringFormatBug;
+var timeZoneOffset = aNegativeTestDate.getTimezoneOffset();
+if (timeZoneOffset < -720) {
+    hasToDateStringFormatBug = aNegativeTestDate.toDateString() !== 'Tue Jan 02 -45875';
+    hasToStringFormatBug = !(/^Thu Dec 10 2015 \d\d:\d\d:\d\d GMT[-\+]\d\d\d\d(?: |$)/).test(aPositiveTestDate.toString());
+} else {
+    hasToDateStringFormatBug = aNegativeTestDate.toDateString() !== 'Mon Jan 01 -45875';
+    hasToStringFormatBug = !(/^Wed Dec 09 2015 \d\d:\d\d:\d\d GMT[-\+]\d\d\d\d(?: |$)/).test(aPositiveTestDate.toString());
+}
+
+var originalGetFullYear = call.bind(Date.prototype.getFullYear);
+var originalGetMonth = call.bind(Date.prototype.getMonth);
+var originalGetDate = call.bind(Date.prototype.getDate);
+var originalGetUTCFullYear = call.bind(Date.prototype.getUTCFullYear);
+var originalGetUTCMonth = call.bind(Date.prototype.getUTCMonth);
+var originalGetUTCDate = call.bind(Date.prototype.getUTCDate);
+var originalGetUTCDay = call.bind(Date.prototype.getUTCDay);
+var originalGetUTCHours = call.bind(Date.prototype.getUTCHours);
+var originalGetUTCMinutes = call.bind(Date.prototype.getUTCMinutes);
+var originalGetUTCSeconds = call.bind(Date.prototype.getUTCSeconds);
+var originalGetUTCMilliseconds = call.bind(Date.prototype.getUTCMilliseconds);
+var dayName = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];
+var monthName = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
+var daysInMonth = function daysInMonth(month, year) {
+    return originalGetDate(new Date(year, month, 0));
+};
+
+defineProperties(Date.prototype, {
+    getFullYear: function getFullYear() {
+        if (!this || !(this instanceof Date)) {
+            throw new TypeError('this is not a Date object.');
+        }
+        var year = originalGetFullYear(this);
+        if (year < 0 && originalGetMonth(this) > 11) {
+            return year + 1;
+        }
+        return year;
+    },
+    getMonth: function getMonth() {
+        if (!this || !(this instanceof Date)) {
+            throw new TypeError('this is not a Date object.');
+        }
+        var year = originalGetFullYear(this);
+        var month = originalGetMonth(this);
+        if (year < 0 && month > 11) {
+            return 0;
+        }
+        return month;
+    },
+    getDate: function getDate() {
+        if (!this || !(this instanceof Date)) {
+            throw new TypeError('this is not a Date object.');
+        }
+        var year = originalGetFullYear(this);
+        var month = originalGetMonth(this);
+        var date = originalGetDate(this);
+        if (year < 0 && month > 11) {
+            if (month === 12) {
+                return date;
+            }
+            var days = daysInMonth(0, year + 1);
+            return (days - date) + 1;
+        }
+        return date;
+    },
+    getUTCFullYear: function getUTCFullYear() {
+        if (!this || !(this instanceof Date)) {
+            throw new TypeError('this is not a Date object.');
+        }
+        var year = originalGetUTCFullYear(this);
+        if (year < 0 && originalGetUTCMonth(this) > 11) {
+            return year + 1;
+        }
+        return year;
+    },
+    getUTCMonth: function getUTCMonth() {
+        if (!this || !(this instanceof Date)) {
+            throw new TypeError('this is not a Date object.');
+        }
+        var year = originalGetUTCFullYear(this);
+        var month = originalGetUTCMonth(this);
+        if (year < 0 && month > 11) {
+            return 0;
+        }
+        return month;
+    },
+    getUTCDate: function getUTCDate() {
+        if (!this || !(this instanceof Date)) {
+            throw new TypeError('this is not a Date object.');
+        }
+        var year = originalGetUTCFullYear(this);
+        var month = originalGetUTCMonth(this);
+        var date = originalGetUTCDate(this);
+        if (year < 0 && month > 11) {
+            if (month === 12) {
+                return date;
+            }
+            var days = daysInMonth(0, year + 1);
+            return (days - date) + 1;
+        }
+        return date;
+    }
+}, hasNegativeMonthYearBug);
+
+defineProperties(Date.prototype, {
+    toUTCString: function toUTCString() {
+        if (!this || !(this instanceof Date)) {
+            throw new TypeError('this is not a Date object.');
+        }
+        var day = originalGetUTCDay(this);
+        var date = originalGetUTCDate(this);
+        var month = originalGetUTCMonth(this);
+        var year = originalGetUTCFullYear(this);
+        var hour = originalGetUTCHours(this);
+        var minute = originalGetUTCMinutes(this);
+        var second = originalGetUTCSeconds(this);
+        return dayName[day] + ', ' +
+            (date < 10 ? '0' + date : date) + ' ' +
+            monthName[month] + ' ' +
+            year + ' ' +
+            (hour < 10 ? '0' + hour : hour) + ':' +
+            (minute < 10 ? '0' + minute : minute) + ':' +
+            (second < 10 ? '0' + second : second) + ' GMT';
+    }
+}, hasNegativeMonthYearBug || hasToUTCStringFormatBug);
+
+// Opera 12 has `,`
+defineProperties(Date.prototype, {
+    toDateString: function toDateString() {
+        if (!this || !(this instanceof Date)) {
+            throw new TypeError('this is not a Date object.');
+        }
+        var day = this.getDay();
+        var date = this.getDate();
+        var month = this.getMonth();
+        var year = this.getFullYear();
+        return dayName[day] + ' ' +
+            monthName[month] + ' ' +
+            (date < 10 ? '0' + date : date) + ' ' +
+            year;
+    }
+}, hasNegativeMonthYearBug || hasToDateStringFormatBug);
+
+// can't use defineProperties here because of toString enumeration issue in IE <= 8
+if (hasNegativeMonthYearBug || hasToStringFormatBug) {
+    Date.prototype.toString = function toString() {
+        if (!this || !(this instanceof Date)) {
+            throw new TypeError('this is not a Date object.');
+        }
+        var day = this.getDay();
+        var date = this.getDate();
+        var month = this.getMonth();
+        var year = this.getFullYear();
+        var hour = this.getHours();
+        var minute = this.getMinutes();
+        var second = this.getSeconds();
+        var timezoneOffset = this.getTimezoneOffset();
+        var hoursOffset = Math.floor(Math.abs(timezoneOffset) / 60);
+        var minutesOffset = Math.floor(Math.abs(timezoneOffset) % 60);
+        return dayName[day] + ' ' +
+            monthName[month] + ' ' +
+            (date < 10 ? '0' + date : date) + ' ' +
+            year + ' ' +
+            (hour < 10 ? '0' + hour : hour) + ':' +
+            (minute < 10 ? '0' + minute : minute) + ':' +
+            (second < 10 ? '0' + second : second) + ' GMT' +
+            (timezoneOffset > 0 ? '-' : '+') +
+            (hoursOffset < 10 ? '0' + hoursOffset : hoursOffset) +
+            (minutesOffset < 10 ? '0' + minutesOffset : minutesOffset);
+    };
+    if (supportsDescriptors) {
+        $Object.defineProperty(Date.prototype, 'toString', {
+            configurable: true,
+            enumerable: false,
+            writable: true
+        });
+    }
+}
+
 // ES5 15.9.5.43
 // http://es5.github.com/#x15.9.5.43
 // This function returns a String value represent the instance in time
@@ -839,45 +1291,43 @@ defineProperties(Object, {
 var negativeDate = -62198755200000;
 var negativeYearString = '-000001';
 var hasNegativeDateBug = Date.prototype.toISOString && new Date(negativeDate).toISOString().indexOf(negativeYearString) === -1;
+var hasSafari51DateBug = Date.prototype.toISOString && new Date(-1).toISOString() !== '1969-12-31T23:59:59.999Z';
+
+var getTime = call.bind(Date.prototype.getTime);
 
 defineProperties(Date.prototype, {
     toISOString: function toISOString() {
-        var result, length, value, year, month;
-        if (!isFinite(this)) {
+        if (!isFinite(this) || !isFinite(getTime(this))) {
+            // Adope Photoshop requires the second check.
             throw new RangeError('Date.prototype.toISOString called on non-finite value.');
         }
 
-        year = this.getUTCFullYear();
+        var year = originalGetUTCFullYear(this);
 
-        month = this.getUTCMonth();
+        var month = originalGetUTCMonth(this);
         // see https://github.com/es-shims/es5-shim/issues/111
         year += Math.floor(month / 12);
         month = (month % 12 + 12) % 12;
 
         // the date time string format is specified in 15.9.1.15.
-        result = [month + 1, this.getUTCDate(), this.getUTCHours(), this.getUTCMinutes(), this.getUTCSeconds()];
+        var result = [month + 1, originalGetUTCDate(this), originalGetUTCHours(this), originalGetUTCMinutes(this), originalGetUTCSeconds(this)];
         year = (
             (year < 0 ? '-' : (year > 9999 ? '+' : '')) +
-            ('00000' + Math.abs(year)).slice((0 <= year && year <= 9999) ? -4 : -6)
+            strSlice('00000' + Math.abs(year), (0 <= year && year <= 9999) ? -4 : -6)
         );
 
-        length = result.length;
-        while (length--) {
-            value = result[length];
-            // pad months, days, hours, minutes, and seconds to have two
-            // digits.
-            if (value < 10) {
-                result[length] = '0' + value;
-            }
+        for (var i = 0; i < result.length; ++i) {
+          // pad months, days, hours, minutes, and seconds to have two digits.
+          result[i] = strSlice('00' + result[i], -2);
         }
         // pad milliseconds to have three digits.
         return (
-            year + '-' + result.slice(0, 2).join('-') +
-            'T' + result.slice(2).join(':') + '.' +
-            ('000' + this.getUTCMilliseconds()).slice(-3) + 'Z'
+            year + '-' + arraySlice(result, 0, 2).join('-') +
+            'T' + arraySlice(result, 2).join(':') + '.' +
+            strSlice('000' + originalGetUTCMilliseconds(this), -3) + 'Z'
         );
     }
-}, hasNegativeDateBug);
+}, hasNegativeDateBug || hasSafari51DateBug);
 
 // ES5 15.9.5.44
 // http://es5.github.com/#x15.9.5.44
@@ -903,7 +1353,7 @@ if (!dateToJSONIsSupported) {
         // 1.  Let O be the result of calling ToObject, giving it the this
         // value as its argument.
         // 2. Let tv be ES.ToPrimitive(O, hint Number).
-        var O = Object(this);
+        var O = $Object(this);
         var tv = ES.ToPrimitive(O);
         // 3. If tv is a Number and is not finite, return null.
         if (typeof tv === 'number' && !isFinite(tv)) {
@@ -938,36 +1388,51 @@ if (!dateToJSONIsSupported) {
 var supportsExtendedYears = Date.parse('+033658-09-27T01:46:40.000Z') === 1e15;
 var acceptsInvalidDates = !isNaN(Date.parse('2012-04-04T24:00:00.500Z')) || !isNaN(Date.parse('2012-11-31T23:59:59.000Z')) || !isNaN(Date.parse('2012-12-31T23:59:60.000Z'));
 var doesNotParseY2KNewYear = isNaN(Date.parse('2000-01-01T00:00:00.000Z'));
-if (!Date.parse || doesNotParseY2KNewYear || acceptsInvalidDates || !supportsExtendedYears) {
+if (doesNotParseY2KNewYear || acceptsInvalidDates || !supportsExtendedYears) {
     // XXX global assignment won't work in embeddings that use
     // an alternate object for the context.
-    /*global Date: true */
-    /*eslint-disable no-undef*/
+    /* global Date: true */
+    /* eslint-disable no-undef */
+    var maxSafeUnsigned32Bit = Math.pow(2, 31) - 1;
+    var hasSafariSignedIntBug = isActualNaN(new Date(1970, 0, 1, 0, 0, 0, maxSafeUnsigned32Bit + 1).getTime());
+    /* eslint-disable no-implicit-globals */
     Date = (function (NativeDate) {
-    /*eslint-enable no-undef*/
+    /* eslint-enable no-implicit-globals */
+    /* eslint-enable no-undef */
         // Date.length === 7
         var DateShim = function Date(Y, M, D, h, m, s, ms) {
             var length = arguments.length;
             var date;
             if (this instanceof NativeDate) {
-                date = length === 1 && String(Y) === Y ? // isString(Y)
+                var seconds = s;
+                var millis = ms;
+                if (hasSafariSignedIntBug && length >= 7 && ms > maxSafeUnsigned32Bit) {
+                    // work around a Safari 8/9 bug where it treats the seconds as signed
+                    var msToShift = Math.floor(ms / maxSafeUnsigned32Bit) * maxSafeUnsigned32Bit;
+                    var sToShift = Math.floor(msToShift / 1e3);
+                    seconds += sToShift;
+                    millis -= sToShift * 1e3;
+                }
+                date = length === 1 && $String(Y) === Y ? // isString(Y)
                     // We explicitly pass it through parse:
                     new NativeDate(DateShim.parse(Y)) :
                     // We have to manually make calls depending on argument
                     // length here
-                    length >= 7 ? new NativeDate(Y, M, D, h, m, s, ms) :
-                    length >= 6 ? new NativeDate(Y, M, D, h, m, s) :
+                    length >= 7 ? new NativeDate(Y, M, D, h, m, seconds, millis) :
+                    length >= 6 ? new NativeDate(Y, M, D, h, m, seconds) :
                     length >= 5 ? new NativeDate(Y, M, D, h, m) :
                     length >= 4 ? new NativeDate(Y, M, D, h) :
                     length >= 3 ? new NativeDate(Y, M, D) :
                     length >= 2 ? new NativeDate(Y, M) :
-                    length >= 1 ? new NativeDate(Y) :
+                    length >= 1 ? new NativeDate(Y instanceof NativeDate ? +Y : Y) :
                                   new NativeDate();
             } else {
                 date = NativeDate.apply(this, arguments);
             }
-            // Prevent mixups with unfixed Date object
-            defineProperties(date, { constructor: DateShim }, true);
+            if (!isPrimitive(date)) {
+              // Prevent mixups with unfixed Date object
+              defineProperties(date, { constructor: DateShim }, true);
+            }
             return date;
         };
 
@@ -1008,7 +1473,16 @@ if (!Date.parse || doesNotParseY2KNewYear || acceptsInvalidDates || !supportsExt
         };
 
         var toUTC = function toUTC(t) {
-            return Number(new NativeDate(1970, 0, 1, 0, 0, 0, t));
+            var s = 0;
+            var ms = t;
+            if (hasSafariSignedIntBug && ms > maxSafeUnsigned32Bit) {
+                // work around a Safari 8/9 bug where it treats the seconds as signed
+                var msToShift = Math.floor(ms / maxSafeUnsigned32Bit) * maxSafeUnsigned32Bit;
+                var sToShift = Math.floor(msToShift / 1e3);
+                s += sToShift;
+                ms -= sToShift * 1e3;
+            }
+            return $Number(new NativeDate(1970, 0, 1, 0, 0, s, ms));
         };
 
         // Copy any custom methods a 3rd party library may have added
@@ -1029,40 +1503,35 @@ if (!Date.parse || doesNotParseY2KNewYear || acceptsInvalidDates || !supportsExt
         }, true);
 
         // Upgrade Date.parse to handle simplified ISO 8601 strings
-        DateShim.parse = function parse(string) {
+        var parseShim = function parse(string) {
             var match = isoDateExpression.exec(string);
             if (match) {
                 // parse months, days, hours, minutes, seconds, and milliseconds
                 // provide default values if necessary
                 // parse the UTC offset component
-                var year = Number(match[1]),
-                    month = Number(match[2] || 1) - 1,
-                    day = Number(match[3] || 1) - 1,
-                    hour = Number(match[4] || 0),
-                    minute = Number(match[5] || 0),
-                    second = Number(match[6] || 0),
-                    millisecond = Math.floor(Number(match[7] || 0) * 1000),
+                var year = $Number(match[1]),
+                    month = $Number(match[2] || 1) - 1,
+                    day = $Number(match[3] || 1) - 1,
+                    hour = $Number(match[4] || 0),
+                    minute = $Number(match[5] || 0),
+                    second = $Number(match[6] || 0),
+                    millisecond = Math.floor($Number(match[7] || 0) * 1000),
                     // When time zone is missed, local offset should be used
                     // (ES 5.1 bug)
                     // see https://bugs.ecmascript.org/show_bug.cgi?id=112
                     isLocalTime = Boolean(match[4] && !match[8]),
                     signOffset = match[9] === '-' ? 1 : -1,
-                    hourOffset = Number(match[10] || 0),
-                    minuteOffset = Number(match[11] || 0),
+                    hourOffset = $Number(match[10] || 0),
+                    minuteOffset = $Number(match[11] || 0),
                     result;
+                var hasMinutesOrSecondsOrMilliseconds = minute > 0 || second > 0 || millisecond > 0;
                 if (
-                    hour < (
-                        minute > 0 || second > 0 || millisecond > 0 ?
-                        24 : 25
-                    ) &&
+                    hour < (hasMinutesOrSecondsOrMilliseconds ? 24 : 25) &&
                     minute < 60 && second < 60 && millisecond < 1000 &&
                     month > -1 && month < 12 && hourOffset < 24 &&
                     minuteOffset < 60 && // detect invalid offsets
                     day > -1 &&
-                    day < (
-                        dayFromMonth(year, month + 1) -
-                        dayFromMonth(year, month)
-                    )
+                    day < (dayFromMonth(year, month + 1) - dayFromMonth(year, month))
                 ) {
                     result = (
                         (dayFromMonth(year, month) + day) * 24 +
@@ -1084,10 +1553,11 @@ if (!Date.parse || doesNotParseY2KNewYear || acceptsInvalidDates || !supportsExt
             }
             return NativeDate.parse.apply(this, arguments);
         };
+        defineProperties(DateShim, { parse: parseShim });
 
         return DateShim;
     }(Date));
-    /*global Date: false */
+    /* global Date: false */
 }
 
 // ES5 15.9.4.4
@@ -1126,7 +1596,8 @@ var toFixedHelpers = {
       }
   },
   divide: function divide(n) {
-      var i = toFixedHelpers.size, c = 0;
+      var i = toFixedHelpers.size;
+      var c = 0;
       while (--i >= 0) {
           c += toFixedHelpers.data[i];
           toFixedHelpers.data[i] = Math.floor(c / n);
@@ -1138,11 +1609,11 @@ var toFixedHelpers = {
       var s = '';
       while (--i >= 0) {
           if (s !== '' || i === 0 || toFixedHelpers.data[i] !== 0) {
-              var t = String(toFixedHelpers.data[i]);
+              var t = $String(toFixedHelpers.data[i]);
               if (s === '') {
                   s = t;
               } else {
-                  s += '0000000'.slice(0, 7 - t.length) + t;
+                  s += strSlice('0000000', 0, 7 - t.length) + t;
               }
           }
       }
@@ -1166,92 +1637,104 @@ var toFixedHelpers = {
   }
 };
 
-defineProperties(NumberPrototype, {
-    toFixed: function toFixed(fractionDigits) {
-        var f, x, s, m, e, z, j, k;
-
-        // Test for NaN and round fractionDigits down
-        f = Number(fractionDigits);
-        f = f !== f ? 0 : Math.floor(f);
-
-        if (f < 0 || f > 20) {
-            throw new RangeError('Number.toFixed called with invalid number of decimals');
-        }
+var toFixedShim = function toFixed(fractionDigits) {
+    var f, x, s, m, e, z, j, k;
 
-        x = Number(this);
-
-        // Test for NaN
-        if (x !== x) {
-            return 'NaN';
-        }
-
-        // If it is too big or small, return the string value of the number
-        if (x <= -1e21 || x >= 1e21) {
-            return String(x);
-        }
+    // Test for NaN and round fractionDigits down
+    f = $Number(fractionDigits);
+    f = isActualNaN(f) ? 0 : Math.floor(f);
 
-        s = '';
+    if (f < 0 || f > 20) {
+        throw new RangeError('Number.toFixed called with invalid number of decimals');
+    }
 
-        if (x < 0) {
-            s = '-';
-            x = -x;
-        }
+    x = $Number(this);
 
-        m = '0';
+    if (isActualNaN(x)) {
+        return 'NaN';
+    }
 
-        if (x > 1e-21) {
-            // 1e-21 < x < 1e21
-            // -70 < log2(x) < 70
-            e = toFixedHelpers.log(x * toFixedHelpers.pow(2, 69, 1)) - 69;
-            z = (e < 0 ? x * toFixedHelpers.pow(2, -e, 1) : x / toFixedHelpers.pow(2, e, 1));
-            z *= 0x10000000000000; // Math.pow(2, 52);
-            e = 52 - e;
+    // If it is too big or small, return the string value of the number
+    if (x <= -1e21 || x >= 1e21) {
+        return $String(x);
+    }
 
-            // -18 < e < 122
-            // x = z / 2 ^ e
-            if (e > 0) {
-                toFixedHelpers.multiply(0, z);
-                j = f;
+    s = '';
 
-                while (j >= 7) {
-                    toFixedHelpers.multiply(1e7, 0);
-                    j -= 7;
-                }
+    if (x < 0) {
+        s = '-';
+        x = -x;
+    }
 
-                toFixedHelpers.multiply(toFixedHelpers.pow(10, j, 1), 0);
-                j = e - 1;
+    m = '0';
+
+    if (x > 1e-21) {
+        // 1e-21 < x < 1e21
+        // -70 < log2(x) < 70
+        e = toFixedHelpers.log(x * toFixedHelpers.pow(2, 69, 1)) - 69;
+        z = (e < 0 ? x * toFixedHelpers.pow(2, -e, 1) : x / toFixedHelpers.pow(2, e, 1));
+        z *= 0x10000000000000; // Math.pow(2, 52);
+        e = 52 - e;
+
+        // -18 < e < 122
+        // x = z / 2 ^ e
+        if (e > 0) {
+            toFixedHelpers.multiply(0, z);
+            j = f;
+
+            while (j >= 7) {
+                toFixedHelpers.multiply(1e7, 0);
+                j -= 7;
+            }
 
-                while (j >= 23) {
-                    toFixedHelpers.divide(1 << 23);
-                    j -= 23;
-                }
+            toFixedHelpers.multiply(toFixedHelpers.pow(10, j, 1), 0);
+            j = e - 1;
 
-                toFixedHelpers.divide(1 << j);
-                toFixedHelpers.multiply(1, 1);
-                toFixedHelpers.divide(2);
-                m = toFixedHelpers.numToString();
-            } else {
-                toFixedHelpers.multiply(0, z);
-                toFixedHelpers.multiply(1 << (-e), 0);
-                m = toFixedHelpers.numToString() + '0.00000000000000000000'.slice(2, 2 + f);
+            while (j >= 23) {
+                toFixedHelpers.divide(1 << 23);
+                j -= 23;
             }
+
+            toFixedHelpers.divide(1 << j);
+            toFixedHelpers.multiply(1, 1);
+            toFixedHelpers.divide(2);
+            m = toFixedHelpers.numToString();
+        } else {
+            toFixedHelpers.multiply(0, z);
+            toFixedHelpers.multiply(1 << (-e), 0);
+            m = toFixedHelpers.numToString() + strSlice('0.00000000000000000000', 2, 2 + f);
         }
+    }
 
-        if (f > 0) {
-            k = m.length;
+    if (f > 0) {
+        k = m.length;
 
-            if (k <= f) {
-                m = s + '0.0000000000000000000'.slice(0, f - k + 2) + m;
-            } else {
-                m = s + m.slice(0, k - f) + '.' + m.slice(k - f);
-            }
+        if (k <= f) {
+            m = s + strSlice('0.0000000000000000000', 0, f - k + 2) + m;
         } else {
-            m = s + m;
+            m = s + strSlice(m, 0, k - f) + '.' + strSlice(m, k - f);
         }
+    } else {
+        m = s + m;
+    }
+
+    return m;
+};
+defineProperties(NumberPrototype, { toFixed: toFixedShim }, hasToFixedBugs);
 
-        return m;
+var hasToPrecisionUndefinedBug = (function () {
+    try {
+        return 1.0.toPrecision(undefined) === '1';
+    } catch (e) {
+        return true;
+    }
+}());
+var originalToPrecision = NumberPrototype.toPrecision;
+defineProperties(NumberPrototype, {
+    toPrecision: function toPrecision(precision) {
+        return typeof precision === 'undefined' ? originalToPrecision.call(this) : originalToPrecision.call(this, precision);
     }
-}, hasToFixedBugs);
+}, hasToPrecisionUndefinedBug);
 
 //
 // String
@@ -1273,7 +1756,6 @@ defineProperties(NumberPrototype, {
 //    ''.split(/.?/) should be [], not [""]
 //    '.'.split(/()()/) should be ["."], not ["", "", "."]
 
-var string_split = StringPrototype.split;
 if (
     'ab'.split(/(?:ab)*/).length !== 2 ||
     '.'.split(/(.?)(.?)/).length !== 4 ||
@@ -1284,52 +1766,50 @@ if (
 ) {
     (function () {
         var compliantExecNpcg = typeof (/()??/).exec('')[1] === 'undefined'; // NPCG: nonparticipating capturing group
+        var maxSafe32BitInt = Math.pow(2, 32) - 1;
 
         StringPrototype.split = function (separator, limit) {
-            var string = this;
+            var string = String(this);
             if (typeof separator === 'undefined' && limit === 0) {
                 return [];
             }
 
             // If `separator` is not a regex, use native split
             if (!isRegex(separator)) {
-                return string_split.call(this, separator, limit);
+                return strSplit(this, separator, limit);
             }
 
             var output = [];
             var flags = (separator.ignoreCase ? 'i' : '') +
                         (separator.multiline ? 'm' : '') +
-                        (separator.extended ? 'x' : '') + // Proposed for ES6
-                        (separator.sticky ? 'y' : ''), // Firefox 3+
+                        (separator.unicode ? 'u' : '') + // in ES6
+                        (separator.sticky ? 'y' : ''), // Firefox 3+ and ES6
                 lastLastIndex = 0,
                 // Make `global` and avoid `lastIndex` issues by working with a copy
                 separator2, match, lastIndex, lastLength;
             var separatorCopy = new RegExp(separator.source, flags + 'g');
-            string += ''; // Type-convert
             if (!compliantExecNpcg) {
                 // Doesn't need flags gy, but they don't hurt
                 separator2 = new RegExp('^' + separatorCopy.source + '$(?!\\s)', flags);
             }
             /* Values for `limit`, per the spec:
-             * If undefined: 4294967295 // Math.pow(2, 32) - 1
+             * If undefined: 4294967295 // maxSafe32BitInt
              * If 0, Infinity, or NaN: 0
              * If positive number: limit = Math.floor(limit); if (limit > 4294967295) limit -= 4294967296;
              * If negative number: 4294967296 - Math.floor(Math.abs(limit))
              * If other: Type-convert, then use the above rules
              */
-            var splitLimit = typeof limit === 'undefined' ?
-                -1 >>> 0 : // Math.pow(2, 32) - 1
-                ES.ToUint32(limit);
+            var splitLimit = typeof limit === 'undefined' ? maxSafe32BitInt : ES.ToUint32(limit);
             match = separatorCopy.exec(string);
             while (match) {
                 // `separatorCopy.lastIndex` is not reliable cross-browser
                 lastIndex = match.index + match[0].length;
                 if (lastIndex > lastLastIndex) {
-                    output.push(string.slice(lastLastIndex, match.index));
+                    pushCall(output, strSlice(string, lastLastIndex, match.index));
                     // Fix browsers whose `exec` methods don't consistently return `undefined` for
                     // nonparticipating capturing groups
                     if (!compliantExecNpcg && match.length > 1) {
-                        /*eslint-disable no-loop-func */
+                        /* eslint-disable no-loop-func */
                         match[0].replace(separator2, function () {
                             for (var i = 1; i < arguments.length - 2; i++) {
                                 if (typeof arguments[i] === 'undefined') {
@@ -1337,10 +1817,10 @@ if (
                                 }
                             }
                         });
-                        /*eslint-enable no-loop-func */
+                        /* eslint-enable no-loop-func */
                     }
                     if (match.length > 1 && match.index < string.length) {
-                        array_push.apply(output, match.slice(1));
+                        array_push.apply(output, arraySlice(match, 1));
                     }
                     lastLength = match[0].length;
                     lastLastIndex = lastIndex;
@@ -1355,12 +1835,12 @@ if (
             }
             if (lastLastIndex === string.length) {
                 if (lastLength || !separatorCopy.test('')) {
-                    output.push('');
+                    pushCall(output, '');
                 }
             } else {
-                output.push(string.slice(lastLastIndex));
+                pushCall(output, strSlice(string, lastLastIndex));
             }
-            return output.length > splitLimit ? output.slice(0, splitLimit) : output;
+            return output.length > splitLimit ? arraySlice(output, 0, splitLimit) : output;
         };
     }());
 
@@ -1373,7 +1853,7 @@ if (
 } else if ('0'.split(void 0, 0).length) {
     StringPrototype.split = function split(separator, limit) {
         if (typeof separator === 'undefined' && limit === 0) { return []; }
-        return string_split.call(this, separator, limit);
+        return strSplit(this, separator, limit);
     };
 }
 
@@ -1381,7 +1861,7 @@ var str_replace = StringPrototype.replace;
 var replaceReportsGroupsCorrectly = (function () {
     var groups = [];
     'x'.replace(/x(.)?/g, function (match, group) {
-        groups.push(group);
+        pushCall(groups, group);
     });
     return groups.length === 1 && typeof groups[0] === 'undefined';
 }());
@@ -1399,7 +1879,7 @@ if (!replaceReportsGroupsCorrectly) {
                 searchValue.lastIndex = 0;
                 var args = searchValue.exec(match) || [];
                 searchValue.lastIndex = originalLastIndex;
-                args.push(arguments[length - 2], arguments[length - 1]);
+                pushCall(args, arguments[length - 2], arguments[length - 1]);
                 return replaceValue.apply(this, args);
             };
             return str_replace.call(this, searchValue, wrappedReplaceValue);
@@ -1418,7 +1898,7 @@ defineProperties(StringPrototype, {
     substr: function substr(start, length) {
         var normalizedStart = start;
         if (start < 0) {
-            normalizedStart = Math.max(this.length + start, 0);
+            normalizedStart = max(this.length + start, 0);
         }
         return string_substr.call(this, normalizedStart, length);
     }
@@ -1441,21 +1921,131 @@ defineProperties(StringPrototype, {
         if (typeof this === 'undefined' || this === null) {
             throw new TypeError("can't convert " + this + ' to object');
         }
-        return String(this).replace(trimBeginRegexp, '').replace(trimEndRegexp, '');
+        return $String(this).replace(trimBeginRegexp, '').replace(trimEndRegexp, '');
     }
 }, hasTrimWhitespaceBug);
+var trim = call.bind(String.prototype.trim);
+
+var hasLastIndexBug = StringPrototype.lastIndexOf && 'abcあい'.lastIndexOf('あい', 2) !== -1;
+defineProperties(StringPrototype, {
+    lastIndexOf: function lastIndexOf(searchString) {
+        if (typeof this === 'undefined' || this === null) {
+            throw new TypeError("can't convert " + this + ' to object');
+        }
+        var S = $String(this);
+        var searchStr = $String(searchString);
+        var numPos = arguments.length > 1 ? $Number(arguments[1]) : NaN;
+        var pos = isActualNaN(numPos) ? Infinity : ES.ToInteger(numPos);
+        var start = min(max(pos, 0), S.length);
+        var searchLen = searchStr.length;
+        var k = start + searchLen;
+        while (k > 0) {
+            k = max(0, k - searchLen);
+            var index = strIndexOf(strSlice(S, k, start + searchLen), searchStr);
+            if (index !== -1) {
+                return k + index;
+            }
+        }
+        return -1;
+    }
+}, hasLastIndexBug);
+
+var originalLastIndexOf = StringPrototype.lastIndexOf;
+defineProperties(StringPrototype, {
+    lastIndexOf: function lastIndexOf(searchString) {
+        return originalLastIndexOf.apply(this, arguments);
+    }
+}, StringPrototype.lastIndexOf.length !== 1);
 
 // ES-5 15.1.2.2
+/* eslint-disable radix */
 if (parseInt(ws + '08') !== 8 || parseInt(ws + '0x16') !== 22) {
-    /*global parseInt: true */
+/* eslint-enable radix */
+    /* global parseInt: true */
     parseInt = (function (origParseInt) {
-        var hexRegex = /^0[xX]/;
+        var hexRegex = /^[\-+]?0[xX]/;
         return function parseInt(str, radix) {
-            var string = String(str).trim();
-            var defaultedRadix = Number(radix) || (hexRegex.test(string) ? 16 : 10);
+            var string = trim(str);
+            var defaultedRadix = $Number(radix) || (hexRegex.test(string) ? 16 : 10);
             return origParseInt(string, defaultedRadix);
         };
     }(parseInt));
 }
 
+// https://es5.github.io/#x15.1.2.3
+if (1 / parseFloat('-0') !== -Infinity) {
+    /* global parseFloat: true */
+    parseFloat = (function (origParseFloat) {
+        return function parseFloat(string) {
+            var inputString = trim(string);
+            var result = origParseFloat(inputString);
+            return result === 0 && strSlice(inputString, 0, 1) === '-' ? -0 : result;
+        };
+    }(parseFloat));
+}
+
+if (String(new RangeError('test')) !== 'RangeError: test') {
+    var errorToStringShim = function toString() {
+        if (typeof this === 'undefined' || this === null) {
+            throw new TypeError("can't convert " + this + ' to object');
+        }
+        var name = this.name;
+        if (typeof name === 'undefined') {
+            name = 'Error';
+        } else if (typeof name !== 'string') {
+            name = $String(name);
+        }
+        var msg = this.message;
+        if (typeof msg === 'undefined') {
+            msg = '';
+        } else if (typeof msg !== 'string') {
+            msg = $String(msg);
+        }
+        if (!name) {
+            return msg;
+        }
+        if (!msg) {
+            return name;
+        }
+        return name + ': ' + msg;
+    };
+    // can't use defineProperties here because of toString enumeration issue in IE <= 8
+    Error.prototype.toString = errorToStringShim;
+}
+
+if (supportsDescriptors) {
+    var ensureNonEnumerable = function (obj, prop) {
+        if (isEnum(obj, prop)) {
+            var desc = Object.getOwnPropertyDescriptor(obj, prop);
+            if (desc.configurable) {
+              desc.enumerable = false;
+              Object.defineProperty(obj, prop, desc);
+            }
+        }
+    };
+    ensureNonEnumerable(Error.prototype, 'message');
+    if (Error.prototype.message !== '') {
+      Error.prototype.message = '';
+    }
+    ensureNonEnumerable(Error.prototype, 'name');
+}
+
+if (String(/a/mig) !== '/a/gim') {
+    var regexToString = function toString() {
+        var str = '/' + this.source + '/';
+        if (this.global) {
+            str += 'g';
+        }
+        if (this.ignoreCase) {
+            str += 'i';
+        }
+        if (this.multiline) {
+            str += 'm';
+        }
+        return str;
+    };
+    // can't use defineProperties here because of toString enumeration issue in IE <= 8
+    RegExp.prototype.toString = regexToString;
+}
+
 }));
index e507325..033c1b0 100644 (file)
@@ -22,5 +22,6 @@
        "ooui-dialog-process-continue": "Jarraitu",
        "ooui-selectfile-button-select": "Fitxategi bat aukeratu",
        "ooui-selectfile-not-supported": "Fitxategi aukeraketa ez da onartzen",
-       "ooui-selectfile-placeholder": "Ez da fitxategirik hautatu"
+       "ooui-selectfile-placeholder": "Ez da fitxategirik hautatu",
+       "ooui-selectfile-dragdrop-placeholder": "Fitxategia hemen utzi"
 }
diff --git a/resources/lib/oojs-ui/i18n/gom-latn.json b/resources/lib/oojs-ui/i18n/gom-latn.json
new file mode 100644 (file)
index 0000000..afd4710
--- /dev/null
@@ -0,0 +1,14 @@
+{
+       "@metadata": {
+               "authors": [
+                       "The Discoverer"
+               ]
+       },
+       "ooui-toolbar-more": "Anik",
+       "ooui-toolgroup-expand": "Anik",
+       "ooui-dialog-message-reject": "Rodd'dd kor",
+       "ooui-dialog-process-retry": "Porot proyotn kor",
+       "ooui-selectfile-button-select": "Ek fayl nivodd",
+       "ooui-selectfile-placeholder": "Khuimchech fayl nivddunk nam",
+       "ooui-selectfile-dragdrop-placeholder": "Fayl hanga udoi"
+}
diff --git a/resources/lib/oojs-ui/i18n/gor.json b/resources/lib/oojs-ui/i18n/gor.json
new file mode 100644 (file)
index 0000000..ca0f1b4
--- /dev/null
@@ -0,0 +1,23 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Marwan Mohamad"
+               ]
+       },
+       "ooui-outline-control-move-down": "Heyiya botu ode tibawa",
+       "ooui-outline-control-move-up": "Heyiya botu ode yitaato",
+       "ooui-outline-control-remove": "Yinggila botu",
+       "ooui-toolbar-more": "Pe'eentapo",
+       "ooui-toolgroup-expand": "Pe'eentapo",
+       "ooui-toolgroup-collapse": "ngoolo botu",
+       "ooui-dialog-message-accept": "Jo",
+       "ooui-dialog-message-reject": "Bataliya",
+       "ooui-dialog-process-error": "Woluwo u yilotalawa",
+       "ooui-dialog-process-dismiss": "He'uti",
+       "ooui-dialog-process-retry": "Yimontali pooli",
+       "ooui-dialog-process-continue": "Turusi",
+       "ooui-selectfile-button-select": "Tulawota berkas tuwawu",
+       "ooui-selectfile-not-supported": "Berkas tilulawoto ja motuhatawa",
+       "ooui-selectfile-placeholder": "Diya'a berkas u letulawoto",
+       "ooui-selectfile-dragdrop-placeholder": "Dutuwa berkas teeya"
+}
index 36cc8eb..b07594c 100644 (file)
@@ -19,5 +19,6 @@
        "ooui-dialog-process-dismiss": "Zatvori",
        "ooui-dialog-process-retry": "Pokušajte ponovo",
        "ooui-selectfile-button-select": "Odaberi datoteku",
-       "ooui-selectfile-placeholder": "Datoteka nije označena"
+       "ooui-selectfile-placeholder": "Datoteka nije označena",
+       "ooui-selectfile-dragdrop-placeholder": "Povucite datoteku ovdje"
 }
index 9ff787a..74658ce 100644 (file)
        },
        "ooui-outline-control-move-down": "Pārvietot vienumu uz leju",
        "ooui-outline-control-move-up": "Pārvietot vienumu uz augšu",
+       "ooui-outline-control-remove": "Noņemt vienumu",
        "ooui-toolbar-more": "Vairāk",
        "ooui-toolgroup-expand": "Vairāk",
        "ooui-toolgroup-collapse": "Mazāk",
        "ooui-dialog-message-accept": "Labi",
        "ooui-dialog-message-reject": "Atcelt",
        "ooui-dialog-process-error": "Kaut kas nogāja greizi",
+       "ooui-dialog-process-dismiss": "Paslēpt",
        "ooui-dialog-process-retry": "Mēģināt vēlreiz",
-       "ooui-dialog-process-continue": "Turpināt"
+       "ooui-dialog-process-continue": "Turpināt",
+       "ooui-selectfile-button-select": "Izvēlies failu",
+       "ooui-selectfile-not-supported": "Failu izvēle nav atbalstīta",
+       "ooui-selectfile-placeholder": "Nav izvēlēts neviens fails",
+       "ooui-selectfile-dragdrop-placeholder": "Nomet failu šeit"
 }
index 9a8b058..537a9d7 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.17.2
+ * OOjs UI v0.17.4
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2016 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2016-05-10T22:58:27Z
+ * Date: 2016-05-31T21:50:52Z
  */
 ( function ( OO ) {
 
index 9ec7278..fdfd3e4 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.17.2
+ * OOjs UI v0.17.4
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2016 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2016-05-10T22:58:31Z
+ * Date: 2016-05-31T21:50:56Z
  */
 .oo-ui-element-hidden {
        display: none !important;
@@ -16,6 +16,7 @@
        display: inline-block;
        vertical-align: middle;
        font: inherit;
+       line-height: normal;
        white-space: nowrap;
        -webkit-touch-callout: none;
        -webkit-user-select: none;
        vertical-align: middle;
 }
 .oo-ui-buttonElement-frameless {
-       display: inline-block;
        position: relative;
 }
 .oo-ui-buttonElement-framed > .oo-ui-buttonElement-button {
        vertical-align: top;
        text-align: center;
 }
-.oo-ui-buttonElement-framed.oo-ui-widget-disabled > .oo-ui-buttonElement-button,
-.oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
-.oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
-       cursor: default;
-}
 .oo-ui-buttonElement > .oo-ui-buttonElement-button {
        color: #333333;
 }
 .oo-ui-buttonElement-framed.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
 .oo-ui-buttonElement-framed.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
        box-shadow: inset 0 1px 4px 0 rgba(0, 0, 0, 0.07);
-       color: black;
+       color: #000000;
        border-color: #c9c9c9;
        background-color: #eeeeee;
        background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0, #dddddd), color-stop(100%, #ffffff));
        position: relative;
        margin: 0;
        padding: 0;
-       border: none;
+       border: 0;
 }
 .oo-ui-fieldsetLayout.oo-ui-iconElement > .oo-ui-iconElement-icon {
        display: block;
        position: relative;
        display: block;
        padding: 0.25em 0.5em;
-       border: none;
+       border: 0;
 }
 .oo-ui-optionWidget.oo-ui-widget-enabled {
        cursor: pointer;
        padding: 0;
        background-color: transparent;
 }
+.oo-ui-checkboxMultiselectInputWidget .oo-ui-fieldLayout {
+       margin-bottom: 0;
+}
 .oo-ui-dropdownInputWidget {
        position: relative;
        vertical-align: middle;
        font-size: inherit;
        font-family: inherit;
        background-color: #ffffff;
-       color: black;
+       color: #000000;
        border: 1px solid #cccccc;
-       box-shadow: 0 0 0 white, inset 0 0.1em 0.2em #dddddd;
+       box-shadow: 0 0 0 #ffffff, inset 0 0.1em 0.2em #dddddd;
        border-radius: 0.25em;
        -webkit-transition: border-color 250ms ease, box-shadow 250ms ease;
           -moz-transition: border-color 250ms ease, box-shadow 250ms ease;
 .oo-ui-textInputWidget.oo-ui-widget-enabled textarea:focus {
        outline: none;
        border-color: #a7dcff;
-       box-shadow: 0 0 0.3em #a7dcff, 0 0 0 white;
+       box-shadow: 0 0 0.3em #a7dcff, 0 0 0 #ffffff;
 }
 .oo-ui-textInputWidget.oo-ui-widget-enabled input[readonly],
 .oo-ui-textInputWidget.oo-ui-widget-enabled textarea[readonly] {
        border-color: rgba(0, 0, 0, 0.2);
 }
 .oo-ui-dropdownWidget-handle .oo-ui-indicatorElement-indicator {
+       top: 0;
        right: 0;
+       margin: 0.775em;
 }
 .oo-ui-dropdownWidget-handle .oo-ui-iconElement-icon {
+       top: 0;
        left: 0.25em;
+       margin: 0.3em;
 }
 .oo-ui-dropdownWidget-handle .oo-ui-labelElement-label {
        line-height: 2.5em;
        margin: 0 0.5em;
 }
-.oo-ui-dropdownWidget-handle .oo-ui-indicatorElement-indicator {
-       top: 0;
-       margin: 0.775em;
-}
-.oo-ui-dropdownWidget-handle .oo-ui-iconElement-icon {
-       top: 0;
-       margin: 0.3em;
-}
 .oo-ui-dropdownWidget.oo-ui-widget-disabled .oo-ui-dropdownWidget-handle {
        color: #cccccc;
        text-shadow: 0 1px 1px #ffffff;
        cursor: default;
        opacity: 0.2;
 }
+.oo-ui-multioptionWidget {
+       position: relative;
+       display: block;
+}
+.oo-ui-multioptionWidget.oo-ui-widget-enabled {
+       cursor: pointer;
+}
+.oo-ui-multioptionWidget.oo-ui-widget-disabled {
+       cursor: default;
+}
+.oo-ui-multioptionWidget.oo-ui-labelElement .oo-ui-labelElement-label {
+       display: block;
+       white-space: nowrap;
+       text-overflow: ellipsis;
+       overflow: hidden;
+}
+.oo-ui-multioptionWidget .oo-ui-labelElement-label {
+       line-height: 1.5em;
+}
+.oo-ui-multioptionWidget.oo-ui-widget-disabled {
+       color: #cccccc;
+}
+.oo-ui-checkboxMultioptionWidget {
+       cursor: default;
+       padding: 0;
+}
+.oo-ui-checkboxMultioptionWidget .oo-ui-checkboxInputWidget,
+.oo-ui-checkboxMultioptionWidget.oo-ui-labelElement .oo-ui-labelElement-label {
+       display: inline-block;
+       vertical-align: middle;
+}
+.oo-ui-checkboxMultioptionWidget.oo-ui-labelElement .oo-ui-labelElement-label {
+       padding-left: 0.5em;
+}
+.oo-ui-checkboxMultioptionWidget .oo-ui-checkboxInputWidget {
+       margin-right: 0;
+}
index ba293e4..05f3838 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.17.2
+ * OOjs UI v0.17.4
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2016 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2016-05-10T22:58:31Z
+ * Date: 2016-05-31T21:50:56Z
  */
 .oo-ui-element-hidden {
        display: none !important;
@@ -16,6 +16,7 @@
        display: inline-block;
        vertical-align: middle;
        font: inherit;
+       line-height: normal;
        white-space: nowrap;
        -webkit-touch-callout: none;
        -webkit-user-select: none;
        vertical-align: middle;
 }
 .oo-ui-buttonElement-frameless {
-       display: inline-block;
        position: relative;
 }
 .oo-ui-buttonElement-framed > .oo-ui-buttonElement-button {
        vertical-align: top;
        text-align: center;
 }
-.oo-ui-buttonElement-framed.oo-ui-widget-disabled > .oo-ui-buttonElement-button,
-.oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
-.oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
-       cursor: default;
-}
 .oo-ui-buttonElement > .oo-ui-buttonElement-button {
        font-weight: bold;
        text-decoration: none;
        color: #ffffff;
        border: 1px solid #dddddd;
 }
+.oo-ui-buttonElement-framed.oo-ui-widget-disabled + .oo-ui-widget-disabled > .oo-ui-buttonElement-button {
+       border-left-color: #ffffff;
+}
 .oo-ui-buttonElement-framed.oo-ui-widget-enabled > .oo-ui-buttonElement-button {
        color: #555555;
        background-color: #ffffff;
        background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/check-invert.svg");
        background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/check-invert.png");
 }
+.oo-ui-checkboxMultiselectInputWidget .oo-ui-fieldLayout {
+       margin-bottom: 0;
+}
+.oo-ui-checkboxMultiselectInputWidget .oo-ui-fieldLayout .oo-ui-fieldLayout-body {
+       padding: 0.25em 0;
+}
+.oo-ui-checkboxMultiselectInputWidget .oo-ui-fieldLayout .oo-ui-fieldLayout-body .oo-ui-labelElement-label {
+       line-height: 1.5em;
+}
 .oo-ui-dropdownInputWidget {
        position: relative;
        vertical-align: middle;
        border-radius: 2px;
 }
 .oo-ui-dropdownWidget-handle .oo-ui-indicatorElement-indicator {
+       top: 0;
        right: 0;
+       margin: 0.775em;
 }
 .oo-ui-dropdownWidget-handle .oo-ui-iconElement-icon {
+       top: 0;
        left: 0.25em;
+       margin: 0.3em;
 }
 .oo-ui-dropdownWidget-handle .oo-ui-labelElement-label {
        margin: 0 1em;
 }
-.oo-ui-dropdownWidget-handle .oo-ui-indicatorElement-indicator {
-       top: 0;
-       margin: 0.775em;
-}
-.oo-ui-dropdownWidget-handle .oo-ui-iconElement-icon {
-       top: 0;
-       margin: 0.3em;
-}
 .oo-ui-dropdownWidget:hover .oo-ui-dropdownWidget-handle {
        border-color: #aaaaaa;
 }
 .oo-ui-comboBoxInputWidget textarea {
        height: 2.35em;
 }
+.oo-ui-multioptionWidget {
+       position: relative;
+       display: block;
+}
+.oo-ui-multioptionWidget.oo-ui-widget-enabled {
+       cursor: pointer;
+}
+.oo-ui-multioptionWidget.oo-ui-widget-disabled {
+       cursor: default;
+}
+.oo-ui-multioptionWidget.oo-ui-labelElement .oo-ui-labelElement-label {
+       display: block;
+       white-space: nowrap;
+       text-overflow: ellipsis;
+       overflow: hidden;
+}
+.oo-ui-multioptionWidget .oo-ui-labelElement-label {
+       line-height: 1.5em;
+}
+.oo-ui-multioptionWidget.oo-ui-widget-disabled {
+       color: #cccccc;
+}
+.oo-ui-checkboxMultioptionWidget {
+       cursor: default;
+       padding: 0.25em 0;
+}
+.oo-ui-checkboxMultioptionWidget .oo-ui-checkboxInputWidget,
+.oo-ui-checkboxMultioptionWidget.oo-ui-labelElement .oo-ui-labelElement-label {
+       display: inline-block;
+       vertical-align: middle;
+}
+.oo-ui-checkboxMultioptionWidget.oo-ui-labelElement .oo-ui-labelElement-label {
+       padding: 0.25em 0.25em 0.25em 1em;
+}
+.oo-ui-checkboxMultioptionWidget .oo-ui-checkboxInputWidget {
+       margin-right: 0;
+}
index cbc02eb..6836553 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.17.2
+ * OOjs UI v0.17.4
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2016 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2016-05-10T22:58:27Z
+ * Date: 2016-05-31T21:50:52Z
  */
 ( function ( OO ) {
 
@@ -4697,19 +4697,19 @@ OO.ui.PopupButtonWidget.prototype.onAction = function () {
  * @private
  * @abstract
  * @class
- * @extends OO.ui.mixin.GroupElement
+ * @mixins OO.ui.mixin.GroupElement
  *
  * @constructor
  * @param {Object} [config] Configuration options
  */
 OO.ui.mixin.GroupWidget = function OoUiMixinGroupWidget( config ) {
-       // Parent constructor
-       OO.ui.mixin.GroupWidget.parent.call( this, config );
+       // Mixin constructors
+       OO.ui.mixin.GroupElement.call( this, config );
 };
 
 /* Setup */
 
-OO.inheritClass( OO.ui.mixin.GroupWidget, OO.ui.mixin.GroupElement );
+OO.mixinClass( OO.ui.mixin.GroupWidget, OO.ui.mixin.GroupElement );
 
 /* Methods */
 
@@ -4797,8 +4797,10 @@ OO.ui.mixin.ItemWidget.prototype.setElementGroup = function ( group ) {
  *
  * @class
  * @extends OO.ui.Widget
+ * @mixins OO.ui.mixin.ItemWidget
  * @mixins OO.ui.mixin.LabelElement
  * @mixins OO.ui.mixin.FlaggedElement
+ * @mixins OO.ui.mixin.AccessKeyedElement
  *
  * @constructor
  * @param {Object} [config] Configuration options
@@ -4814,6 +4816,7 @@ OO.ui.OptionWidget = function OoUiOptionWidget( config ) {
        OO.ui.mixin.ItemWidget.call( this );
        OO.ui.mixin.LabelElement.call( this, config );
        OO.ui.mixin.FlaggedElement.call( this, config );
+       OO.ui.mixin.AccessKeyedElement.call( this, config );
 
        // Properties
        this.selected = false;
@@ -4823,6 +4826,8 @@ OO.ui.OptionWidget = function OoUiOptionWidget( config ) {
        // Initialization
        this.$element
                .data( 'oo-ui-optionWidget', this )
+               // Allow programmatic focussing (and by accesskey), but not tabbing
+               .attr( 'tabindex', '-1' )
                .attr( 'role', 'option' )
                .attr( 'aria-selected', 'false' )
                .addClass( 'oo-ui-optionWidget' )
@@ -4835,6 +4840,7 @@ OO.inheritClass( OO.ui.OptionWidget, OO.ui.Widget );
 OO.mixinClass( OO.ui.OptionWidget, OO.ui.mixin.ItemWidget );
 OO.mixinClass( OO.ui.OptionWidget, OO.ui.mixin.LabelElement );
 OO.mixinClass( OO.ui.OptionWidget, OO.ui.mixin.FlaggedElement );
+OO.mixinClass( OO.ui.OptionWidget, OO.ui.mixin.AccessKeyedElement );
 
 /* Static Properties */
 
@@ -5035,7 +5041,7 @@ OO.ui.SelectWidget = function OoUiSelectWidget( config ) {
                toggle: 'onToggle'
        } );
        this.$element.on( {
-               focus: this.onFocus.bind( this ),
+               focusin: this.onFocus.bind( this ),
                mousedown: this.onMouseDown.bind( this ),
                mouseover: this.onMouseOver.bind( this ),
                mouseleave: this.onMouseLeave.bind( this )
@@ -5053,16 +5059,8 @@ OO.ui.SelectWidget = function OoUiSelectWidget( config ) {
 /* Setup */
 
 OO.inheritClass( OO.ui.SelectWidget, OO.ui.Widget );
-
-// Need to mixin base class as well
-OO.mixinClass( OO.ui.SelectWidget, OO.ui.mixin.GroupElement );
 OO.mixinClass( OO.ui.SelectWidget, OO.ui.mixin.GroupWidget );
 
-/* Static */
-OO.ui.SelectWidget.static.passAllFilter = function () {
-       return true;
-};
-
 /* Events */
 
 /**
@@ -5122,10 +5120,30 @@ OO.ui.SelectWidget.static.passAllFilter = function () {
  * @private
  * @param {jQuery.Event} event
  */
-OO.ui.SelectWidget.prototype.onFocus = function () {
-       // The styles for focus state depend on one of the items being selected.
-       if ( !this.getSelectedItem() ) {
-               this.selectItem( this.getFirstSelectableItem() );
+OO.ui.SelectWidget.prototype.onFocus = function ( event ) {
+       var item;
+       if ( event.target === this.$element[ 0 ] ) {
+               // This widget was focussed, e.g. by the user tabbing to it.
+               // The styles for focus state depend on one of the items being selected.
+               if ( !this.getSelectedItem() ) {
+                       item = this.getFirstSelectableItem();
+               }
+       } else {
+               // One of the options got focussed (and the event bubbled up here).
+               // They can't be tabbed to, but they can be activated using accesskeys.
+               item = this.getTargetItem( event );
+       }
+
+       if ( item ) {
+               if ( item.constructor.static.highlightable ) {
+                       this.highlightItem( item );
+               } else {
+                       this.selectItem( item );
+               }
+       }
+
+       if ( event.target !== this.$element[ 0 ] ) {
+               this.$element.focus();
        }
 };
 
@@ -5380,7 +5398,7 @@ OO.ui.SelectWidget.prototype.onKeyPress = function ( e ) {
                item = this.getRelativeSelectableItem( item, 1, filter );
        }
        if ( item ) {
-               if ( item.constructor.static.highlightable ) {
+               if ( this.isVisible() && item.constructor.static.highlightable ) {
                        this.highlightItem( item );
                } else {
                        this.chooseItem( item );
@@ -5706,7 +5724,7 @@ OO.ui.SelectWidget.prototype.chooseItem = function ( item ) {
  *
  * @param {OO.ui.OptionWidget|null} item Item to describe the start position, or `null` to start at the beginning of the array.
  * @param {number} direction Direction to move in: -1 to move backward, 1 to move forward
- * @param {Function} filter Only consider items for which this function returns
+ * @param {Function} [filter] Only consider items for which this function returns
  *  true. Function takes an OO.ui.OptionWidget and returns a boolean.
  * @return {OO.ui.OptionWidget|null} Item at position, `null` if there are no items in the select
  */
@@ -5715,10 +5733,6 @@ OO.ui.SelectWidget.prototype.getRelativeSelectableItem = function ( item, direct
                increase = direction > 0 ? 1 : -1,
                len = this.items.length;
 
-       if ( !$.isFunction( filter ) ) {
-               filter = OO.ui.SelectWidget.static.passAllFilter;
-       }
-
        if ( item instanceof OO.ui.OptionWidget ) {
                currentIndex = this.items.indexOf( item );
                nextIndex = ( currentIndex + increase + len ) % len;
@@ -5730,7 +5744,10 @@ OO.ui.SelectWidget.prototype.getRelativeSelectableItem = function ( item, direct
 
        for ( i = 0; i < len; i++ ) {
                item = this.items[ nextIndex ];
-               if ( item instanceof OO.ui.OptionWidget && item.isSelectable() && filter( item ) ) {
+               if (
+                       item instanceof OO.ui.OptionWidget && item.isSelectable() &&
+                       ( !filter || filter( item ) )
+               ) {
                        return item;
                }
                nextIndex = ( nextIndex + increase + len ) % len;
@@ -5745,16 +5762,7 @@ OO.ui.SelectWidget.prototype.getRelativeSelectableItem = function ( item, direct
  * @return {OO.ui.OptionWidget|null} Item, `null` if there aren't any selectable items
  */
 OO.ui.SelectWidget.prototype.getFirstSelectableItem = function () {
-       var i, len, item;
-
-       for ( i = 0, len = this.items.length; i < len; i++ ) {
-               item = this.items[ i ];
-               if ( item instanceof OO.ui.OptionWidget && item.isSelectable() ) {
-                       return item;
-               }
-       }
-
-       return null;
+       return this.getRelativeSelectableItem( null, 1 );
 };
 
 /**
@@ -6002,7 +6010,7 @@ OO.ui.MenuSectionOptionWidget.static.highlightable = false;
  *  the text the user types. This config is used by {@link OO.ui.ComboBoxInputWidget ComboBoxInputWidget}
  *  and {@link OO.ui.mixin.LookupElement LookupElement}
  * @cfg {jQuery} [$input] Text input used to implement option highlighting for menu items that match
- *  the text the user types. This config is used by {@link OO.ui.CapsuleMultiSelectWidget CapsuleMultiSelectWidget}
+ *  the text the user types. This config is used by {@link OO.ui.CapsuleMultiselectWidget CapsuleMultiselectWidget}
  * @cfg {OO.ui.Widget} [widget] Widget associated with the menu's active state. If the user clicks the mouse
  *  anywhere on the page outside of this widget, the menu is hidden. For example, if there is a button
  *  that toggles the menu's visibility on click, the menu will be hidden then re-shown when the user clicks
@@ -6343,7 +6351,10 @@ OO.ui.DropdownWidget = function OoUiDropdownWidget( config ) {
        // Events
        this.$handle.on( {
                click: this.onClick.bind( this ),
-               keydown: this.onKeyDown.bind( this )
+               keydown: this.onKeyDown.bind( this ),
+               // Hack? Handle type-to-search when menu is not expanded and not handling its own events
+               keypress: this.menu.onKeyPressHandler,
+               blur: this.menu.clearKeyPressBuffer.bind( this.menu )
        } );
        this.menu.connect( this, { select: 'onMenuSelect' } );
 
@@ -6463,9 +6474,6 @@ OO.ui.RadioOptionWidget = function OoUiRadioOptionWidget( config ) {
        // Parent constructor
        OO.ui.RadioOptionWidget.parent.call( this, config );
 
-       // Events
-       this.radio.$input.on( 'focus', this.onInputFocus.bind( this ) );
-
        // Initialization
        // Remove implicit role, we're handling it ourselves
        this.radio.$input.attr( 'role', 'presentation' );
@@ -6493,15 +6501,6 @@ OO.ui.RadioOptionWidget.static.tagName = 'label';
 
 /* Methods */
 
-/**
- * @param {jQuery.Event} e Focus event
- * @private
- */
-OO.ui.RadioOptionWidget.prototype.onInputFocus = function () {
-       this.radio.$input.blur();
-       this.$element.parent().focus();
-};
-
 /**
  * @inheritdoc
  */
@@ -6591,6 +6590,428 @@ OO.ui.RadioSelectWidget = function OoUiRadioSelectWidget( config ) {
 OO.inheritClass( OO.ui.RadioSelectWidget, OO.ui.SelectWidget );
 OO.mixinClass( OO.ui.RadioSelectWidget, OO.ui.mixin.TabIndexedElement );
 
+/**
+ * MultioptionWidgets are special elements that can be selected and configured with data. The
+ * data is often unique for each option, but it does not have to be. MultioptionWidgets are used
+ * with OO.ui.SelectWidget to create a selection of mutually exclusive options. For more information
+ * and examples, please see the [OOjs UI documentation on MediaWiki][1].
+ *
+ * [1]: https://www.mediawiki.org/wiki/OOjs_UI/Widgets/Selects_and_Multioptions
+ *
+ * @class
+ * @extends OO.ui.Widget
+ * @mixins OO.ui.mixin.ItemWidget
+ * @mixins OO.ui.mixin.LabelElement
+ *
+ * @constructor
+ * @param {Object} [config] Configuration options
+ * @cfg {boolean} [selected=false] Whether the option is initially selected
+ */
+OO.ui.MultioptionWidget = function OoUiMultioptionWidget( config ) {
+       // Configuration initialization
+       config = config || {};
+
+       // Parent constructor
+       OO.ui.MultioptionWidget.parent.call( this, config );
+
+       // Mixin constructors
+       OO.ui.mixin.ItemWidget.call( this );
+       OO.ui.mixin.LabelElement.call( this, config );
+
+       // Properties
+       this.selected = null;
+
+       // Initialization
+       this.$element
+               .addClass( 'oo-ui-multioptionWidget' )
+               .append( this.$label );
+       this.setSelected( config.selected );
+};
+
+/* Setup */
+
+OO.inheritClass( OO.ui.MultioptionWidget, OO.ui.Widget );
+OO.mixinClass( OO.ui.MultioptionWidget, OO.ui.mixin.ItemWidget );
+OO.mixinClass( OO.ui.MultioptionWidget, OO.ui.mixin.LabelElement );
+
+/* Events */
+
+/**
+ * @event change
+ *
+ * A change event is emitted when the selected state of the option changes.
+ *
+ * @param {boolean} selected Whether the option is now selected
+ */
+
+/* Methods */
+
+/**
+ * Check if the option is selected.
+ *
+ * @return {boolean} Item is selected
+ */
+OO.ui.MultioptionWidget.prototype.isSelected = function () {
+       return this.selected;
+};
+
+/**
+ * Set the option’s selected state. In general, all modifications to the selection
+ * should be handled by the SelectWidget’s {@link OO.ui.SelectWidget#selectItem selectItem( [item] )}
+ * method instead of this method.
+ *
+ * @param {boolean} [state=false] Select option
+ * @chainable
+ */
+OO.ui.MultioptionWidget.prototype.setSelected = function ( state ) {
+       state = !!state;
+       if ( this.selected !== state ) {
+               this.selected = state;
+               this.emit( 'change', state );
+               this.$element.toggleClass( 'oo-ui-multioptionWidget-selected', state );
+       }
+       return this;
+};
+
+/**
+ * MultiselectWidget allows selecting multiple options from a list.
+ *
+ * For more information about menus and options, please see the [OOjs UI documentation on MediaWiki][1].
+ *
+ * [1]: https://www.mediawiki.org/wiki/OOjs_UI/Widgets/Selects_and_Options#Menu_selects_and_options
+ *
+ * @class
+ * @abstract
+ * @extends OO.ui.Widget
+ * @mixins OO.ui.mixin.GroupWidget
+ *
+ * @constructor
+ * @param {Object} [config] Configuration options
+ * @cfg {OO.ui.MultioptionWidget[]} [items] An array of options to add to the multiselect.
+ */
+OO.ui.MultiselectWidget = function OoUiMultiselectWidget( config ) {
+       // Parent constructor
+       OO.ui.MultiselectWidget.parent.call( this, config );
+
+       // Configuration initialization
+       config = config || {};
+
+       // Mixin constructors
+       OO.ui.mixin.GroupWidget.call( this, config );
+
+       // Events
+       this.aggregate( { change: 'select' } );
+       // This is mostly for compatibility with CapsuleMultiselectWidget... normally, 'change' is emitted
+       // by GroupElement only when items are added/removed
+       this.connect( this, { select: [ 'emit', 'change' ] } );
+
+       // Initialization
+       if ( config.items ) {
+               this.addItems( config.items );
+       }
+       this.$group.addClass( 'oo-ui-multiselectWidget-group' );
+       this.$element.addClass( 'oo-ui-multiselectWidget' )
+               .append( this.$group );
+};
+
+/* Setup */
+
+OO.inheritClass( OO.ui.MultiselectWidget, OO.ui.Widget );
+OO.mixinClass( OO.ui.MultiselectWidget, OO.ui.mixin.GroupWidget );
+
+/* Events */
+
+/**
+ * @event change
+ *
+ * A change event is emitted when the set of items changes, or an item is selected or deselected.
+ */
+
+/**
+ * @event select
+ *
+ * A select event is emitted when an item is selected or deselected.
+ */
+
+/* Methods */
+
+/**
+ * Get options that are selected.
+ *
+ * @return {OO.ui.MultioptionWidget[]} Selected options
+ */
+OO.ui.MultiselectWidget.prototype.getSelectedItems = function () {
+       return this.items.filter( function ( item ) {
+               return item.isSelected();
+       } );
+};
+
+/**
+ * Get the data of options that are selected.
+ *
+ * @return {Object[]|string[]} Values of selected options
+ */
+OO.ui.MultiselectWidget.prototype.getSelectedItemsData = function () {
+       return this.getSelectedItems().map( function ( item ) {
+               return item.data;
+       } );
+};
+
+/**
+ * Select options by reference. Options not mentioned in the `items` array will be deselected.
+ *
+ * @param {OO.ui.MultioptionWidget[]} items Items to select
+ * @chainable
+ */
+OO.ui.MultiselectWidget.prototype.selectItems = function ( items ) {
+       this.items.forEach( function ( item ) {
+               var selected = items.indexOf( item ) !== -1;
+               item.setSelected( selected );
+       } );
+       return this;
+};
+
+/**
+ * Select items by their data. Options not mentioned in the `datas` array will be deselected.
+ *
+ * @param {Object[]|string[]} datas Values of items to select
+ * @chainable
+ */
+OO.ui.MultiselectWidget.prototype.selectItemsByData = function ( datas ) {
+       var items,
+               widget = this;
+       items = datas.map( function ( data ) {
+               return widget.getItemFromData( data );
+       } );
+       this.selectItems( items );
+       return this;
+};
+
+/**
+ * CheckboxMultioptionWidget is an option widget that looks like a checkbox.
+ * The class is used with OO.ui.CheckboxMultiselectWidget to create a selection of checkbox options.
+ * Please see the [OOjs UI documentation on MediaWiki] [1] for more information.
+ *
+ * [1]: https://www.mediawiki.org/wiki/OOjs_UI/Widgets/Selects_and_Options#Button_selects_and_option
+ *
+ * @class
+ * @extends OO.ui.MultioptionWidget
+ *
+ * @constructor
+ * @param {Object} [config] Configuration options
+ */
+OO.ui.CheckboxMultioptionWidget = function OoUiCheckboxMultioptionWidget( config ) {
+       // Configuration initialization
+       config = config || {};
+
+       // Properties (must be done before parent constructor which calls #setDisabled)
+       this.checkbox = new OO.ui.CheckboxInputWidget();
+
+       // Parent constructor
+       OO.ui.CheckboxMultioptionWidget.parent.call( this, config );
+
+       // Events
+       this.checkbox.on( 'change', this.onCheckboxChange.bind( this ) );
+       this.$element.on( 'keydown', this.onKeyDown.bind( this ) );
+
+       // Initialization
+       this.$element
+               .addClass( 'oo-ui-checkboxMultioptionWidget' )
+               .prepend( this.checkbox.$element );
+};
+
+/* Setup */
+
+OO.inheritClass( OO.ui.CheckboxMultioptionWidget, OO.ui.MultioptionWidget );
+
+/* Static Properties */
+
+OO.ui.CheckboxMultioptionWidget.static.tagName = 'label';
+
+/* Methods */
+
+/**
+ * Handle checkbox selected state change.
+ *
+ * @private
+ */
+OO.ui.CheckboxMultioptionWidget.prototype.onCheckboxChange = function () {
+       this.setSelected( this.checkbox.isSelected() );
+};
+
+/**
+ * @inheritdoc
+ */
+OO.ui.CheckboxMultioptionWidget.prototype.setSelected = function ( state ) {
+       OO.ui.CheckboxMultioptionWidget.parent.prototype.setSelected.call( this, state );
+       this.checkbox.setSelected( state );
+       return this;
+};
+
+/**
+ * @inheritdoc
+ */
+OO.ui.CheckboxMultioptionWidget.prototype.setDisabled = function ( disabled ) {
+       OO.ui.CheckboxMultioptionWidget.parent.prototype.setDisabled.call( this, disabled );
+       this.checkbox.setDisabled( this.isDisabled() );
+       return this;
+};
+
+/**
+ * Focus the widget.
+ */
+OO.ui.CheckboxMultioptionWidget.prototype.focus = function () {
+       this.checkbox.focus();
+};
+
+/**
+ * Handle key down events.
+ *
+ * @protected
+ * @param {jQuery.Event} e
+ */
+OO.ui.CheckboxMultioptionWidget.prototype.onKeyDown = function ( e ) {
+       var
+               element = this.getElementGroup(),
+               nextItem;
+
+       if ( e.keyCode === OO.ui.Keys.LEFT || e.keyCode === OO.ui.Keys.UP ) {
+               nextItem = element.getRelativeFocusableItem( this, -1 );
+       } else if ( e.keyCode === OO.ui.Keys.RIGHT || e.keyCode === OO.ui.Keys.DOWN ) {
+               nextItem = element.getRelativeFocusableItem( this, 1 );
+       }
+
+       if ( nextItem ) {
+               e.preventDefault();
+               nextItem.focus();
+       }
+};
+
+/**
+ * CheckboxMultiselectWidget is a {@link OO.ui.MultiselectWidget multiselect widget} that contains
+ * checkboxes and is used together with OO.ui.CheckboxMultioptionWidget. The
+ * CheckboxMultiselectWidget provides an interface for adding, removing and selecting options.
+ * Please see the [OOjs UI documentation on MediaWiki][1] for more information.
+ *
+ * If you want to use this within a HTML form, such as a OO.ui.FormLayout, use
+ * OO.ui.CheckboxMultiselectInputWidget instead.
+ *
+ *     @example
+ *     // A CheckboxMultiselectWidget with CheckboxMultioptions.
+ *     var option1 = new OO.ui.CheckboxMultioptionWidget( {
+ *         data: 'a',
+ *         selected: true,
+ *         label: 'Selected checkbox'
+ *     } );
+ *
+ *     var option2 = new OO.ui.CheckboxMultioptionWidget( {
+ *         data: 'b',
+ *         label: 'Unselected checkbox'
+ *     } );
+ *
+ *     var multiselect=new OO.ui.CheckboxMultiselectWidget( {
+ *         items: [ option1, option2 ]
+ *      } );
+ *
+ *     $( 'body' ).append( multiselect.$element );
+ *
+ * [1]: https://www.mediawiki.org/wiki/OOjs_UI/Widgets/Selects_and_Options
+ *
+ * @class
+ * @extends OO.ui.MultiselectWidget
+ *
+ * @constructor
+ * @param {Object} [config] Configuration options
+ */
+OO.ui.CheckboxMultiselectWidget = function OoUiCheckboxMultiselectWidget( config ) {
+       // Parent constructor
+       OO.ui.CheckboxMultiselectWidget.parent.call( this, config );
+
+       // Properties
+       this.$lastClicked = null;
+
+       // Events
+       this.$group.on( 'click', this.onClick.bind( this ) );
+
+       // Initialization
+       this.$element
+               .addClass( 'oo-ui-checkboxMultiselectWidget' );
+};
+
+/* Setup */
+
+OO.inheritClass( OO.ui.CheckboxMultiselectWidget, OO.ui.MultiselectWidget );
+
+/* Methods */
+
+/**
+ * Get an option by its position relative to the specified item (or to the start of the option array,
+ * if item is `null`). The direction in which to search through the option array is specified with a
+ * number: -1 for reverse (the default) or 1 for forward. The method will return an option, or
+ * `null` if there are no options in the array.
+ *
+ * @param {OO.ui.CheckboxMultioptionWidget|null} item Item to describe the start position, or `null` to start at the beginning of the array.
+ * @param {number} direction Direction to move in: -1 to move backward, 1 to move forward
+ * @return {OO.ui.CheckboxMultioptionWidget|null} Item at position, `null` if there are no items in the select
+ */
+OO.ui.CheckboxMultiselectWidget.prototype.getRelativeFocusableItem = function ( item, direction ) {
+       var currentIndex, nextIndex, i,
+               increase = direction > 0 ? 1 : -1,
+               len = this.items.length;
+
+       if ( item ) {
+               currentIndex = this.items.indexOf( item );
+               nextIndex = ( currentIndex + increase + len ) % len;
+       } else {
+               // If no item is selected and moving forward, start at the beginning.
+               // If moving backward, start at the end.
+               nextIndex = direction > 0 ? 0 : len - 1;
+       }
+
+       for ( i = 0; i < len; i++ ) {
+               item = this.items[ nextIndex ];
+               if ( item && !item.isDisabled() ) {
+                       return item;
+               }
+               nextIndex = ( nextIndex + increase + len ) % len;
+       }
+       return null;
+};
+
+/**
+ * Handle click events on checkboxes.
+ *
+ * @param {jQuery.Event} e
+ */
+OO.ui.CheckboxMultiselectWidget.prototype.onClick = function ( e ) {
+       var $options, checked,
+               $lastClicked = this.$lastClicked,
+               $nowClicked = $( e.target ).closest( '.oo-ui-checkboxMultioptionWidget' )
+                       .not( '.oo-ui-widget-disabled' );
+
+       // Allow selecting multiple options at once by Shift-clicking them
+       if ( $lastClicked && $nowClicked.length && e.shiftKey ) {
+               $options = this.$group.find( '.oo-ui-checkboxMultioptionWidget' );
+               checked = $nowClicked.find( 'input' ).prop( 'checked' );
+
+               $options
+                       .slice(
+                               Math.min( $options.index( $lastClicked ), $options.index( $nowClicked ) ),
+                               Math.max( $options.index( $lastClicked ), $options.index( $nowClicked ) ) + 1
+                       )
+                       .find( 'input' )
+                       .filter( function () {
+                               return !this.disabled;
+                       } )
+                       .prop( 'checked', checked )
+                       .trigger( 'change' );
+       }
+
+       if ( $nowClicked.length ) {
+               this.$lastClicked = $nowClicked;
+       }
+};
+
 /**
  * Element that will stick under a specified container, even when it is inserted elsewhere in the
  * document (for example, in a OO.ui.Window's $overlay).
@@ -7856,6 +8277,186 @@ OO.ui.RadioSelectInputWidget.prototype.setOptions = function ( options ) {
        return this;
 };
 
+/**
+ * CheckboxMultiselectInputWidget is a
+ * {@link OO.ui.CheckboxMultiselectWidget CheckboxMultiselectWidget} intended to be used within a
+ * HTML form, such as a OO.ui.FormLayout. The selected values are synchronized with the value of
+ * HTML `<input type=checkbox>` tags. Please see the [OOjs UI documentation on MediaWiki][1] for
+ * more information about input widgets.
+ *
+ *     @example
+ *     // Example: A CheckboxMultiselectInputWidget with three options
+ *     var multiselectInput = new OO.ui.CheckboxMultiselectInputWidget( {
+ *         options: [
+ *             { data: 'a', label: 'First' },
+ *             { data: 'b', label: 'Second'},
+ *             { data: 'c', label: 'Third' }
+ *         ]
+ *     } );
+ *     $( 'body' ).append( multiselectInput.$element );
+ *
+ * [1]: https://www.mediawiki.org/wiki/OOjs_UI/Widgets/Inputs
+ *
+ * @class
+ * @extends OO.ui.InputWidget
+ *
+ * @constructor
+ * @param {Object} [config] Configuration options
+ * @cfg {Object[]} [options=[]] Array of menu options in the format `{ data: …, label: … }`
+ */
+OO.ui.CheckboxMultiselectInputWidget = function OoUiCheckboxMultiselectInputWidget( config ) {
+       // Configuration initialization
+       config = config || {};
+
+       // Properties (must be done before parent constructor which calls #setDisabled)
+       this.checkboxMultiselectWidget = new OO.ui.CheckboxMultiselectWidget();
+
+       // Parent constructor
+       OO.ui.CheckboxMultiselectInputWidget.parent.call( this, config );
+
+       // Properties
+       this.inputName = config.name;
+
+       // Initialization
+       this.$element
+               .addClass( 'oo-ui-checkboxMultiselectInputWidget' )
+               .append( this.checkboxMultiselectWidget.$element );
+       // We don't use this.$input, but rather the CheckboxInputWidgets inside each option
+       this.$input.detach();
+       this.setOptions( config.options || [] );
+       // Have to repeat this from parent, as we need options to be set up for this to make sense
+       this.setValue( config.value );
+};
+
+/* Setup */
+
+OO.inheritClass( OO.ui.CheckboxMultiselectInputWidget, OO.ui.InputWidget );
+
+/* Static Properties */
+
+OO.ui.CheckboxMultiselectInputWidget.static.supportsSimpleLabel = false;
+
+/* Static Methods */
+
+/**
+ * @inheritdoc
+ */
+OO.ui.CheckboxMultiselectInputWidget.static.gatherPreInfuseState = function ( node, config ) {
+       var state = OO.ui.CheckboxMultiselectInputWidget.parent.static.gatherPreInfuseState( node, config );
+       state.value = $( node ).find( '.oo-ui-checkboxInputWidget .oo-ui-inputWidget-input:checked' )
+               .toArray().map( function ( el ) { return el.value; } );
+       return state;
+};
+
+/**
+ * @inheritdoc
+ */
+OO.ui.CheckboxMultiselectInputWidget.static.reusePreInfuseDOM = function ( node, config ) {
+       config = OO.ui.CheckboxMultiselectInputWidget.parent.static.reusePreInfuseDOM( node, config );
+       // Cannot reuse the `<input type=checkbox>` set
+       delete config.$input;
+       return config;
+};
+
+/* Methods */
+
+/**
+ * @inheritdoc
+ * @protected
+ */
+OO.ui.CheckboxMultiselectInputWidget.prototype.getInputElement = function () {
+       // Actually unused
+       return $( '<div>' );
+};
+
+/**
+ * @inheritdoc
+ */
+OO.ui.CheckboxMultiselectInputWidget.prototype.getValue = function () {
+       var value = this.$element.find( '.oo-ui-checkboxInputWidget .oo-ui-inputWidget-input:checked' )
+               .toArray().map( function ( el ) { return el.value; } );
+       if ( this.value !== value ) {
+               this.setValue( value );
+       }
+       return this.value;
+};
+
+/**
+ * @inheritdoc
+ */
+OO.ui.CheckboxMultiselectInputWidget.prototype.setValue = function ( value ) {
+       value = this.cleanUpValue( value );
+       this.checkboxMultiselectWidget.selectItemsByData( value );
+       OO.ui.CheckboxMultiselectInputWidget.parent.prototype.setValue.call( this, value );
+       return this;
+};
+
+/**
+ * Clean up incoming value.
+ *
+ * @param {string[]} value Original value
+ * @return {string[]} Cleaned up value
+ */
+OO.ui.CheckboxMultiselectInputWidget.prototype.cleanUpValue = function ( value ) {
+       var i, singleValue,
+               cleanValue = [];
+       if ( !Array.isArray( value ) ) {
+               return cleanValue;
+       }
+       for ( i = 0; i < value.length; i++ ) {
+               singleValue =
+                       OO.ui.CheckboxMultiselectInputWidget.parent.prototype.cleanUpValue.call( this, value[ i ] );
+               // Remove options that we don't have here
+               if ( !this.checkboxMultiselectWidget.getItemFromData( singleValue ) ) {
+                       continue;
+               }
+               cleanValue.push( singleValue );
+       }
+       return cleanValue;
+};
+
+/**
+ * @inheritdoc
+ */
+OO.ui.CheckboxMultiselectInputWidget.prototype.setDisabled = function ( state ) {
+       this.checkboxMultiselectWidget.setDisabled( state );
+       OO.ui.CheckboxMultiselectInputWidget.parent.prototype.setDisabled.call( this, state );
+       return this;
+};
+
+/**
+ * Set the options available for this input.
+ *
+ * @param {Object[]} options Array of menu options in the format `{ data: …, label: … }`
+ * @chainable
+ */
+OO.ui.CheckboxMultiselectInputWidget.prototype.setOptions = function ( options ) {
+       var widget = this;
+
+       // Rebuild the checkboxMultiselectWidget menu
+       this.checkboxMultiselectWidget
+               .clearItems()
+               .addItems( options.map( function ( opt ) {
+                       var optValue, item;
+                       optValue =
+                               OO.ui.CheckboxMultiselectInputWidget.parent.prototype.cleanUpValue.call( widget, opt.data );
+                       item = new OO.ui.CheckboxMultioptionWidget( {
+                               data: optValue,
+                               label: opt.label !== undefined ? opt.label : optValue
+                       } );
+                       // Set the 'name' and 'value' for form submission
+                       item.checkbox.$input.attr( 'name', widget.inputName );
+                       item.checkbox.setValue( optValue );
+                       return item;
+               } ) );
+
+       // Re-set the value, checking the checkboxes as needed.
+       // This will also get rid of any stale options that we just removed.
+       this.setValue( this.getValue() );
+
+       return this;
+};
+
 /**
  * TextInputWidgets, like HTML text inputs, can be configured with options that customize the
  * size of the field as well as its presentation. In addition, these widgets can be configured
@@ -8346,16 +8947,15 @@ OO.ui.TextInputWidget.prototype.getInputElement = function ( config ) {
  */
 OO.ui.TextInputWidget.prototype.getSaneType = function ( config ) {
        var allowedTypes = [
-                       'text',
-                       'password',
-                       'search',
-                       'email',
-                       'url',
-                       'date',
-                       'number'
-               ],
-               type = allowedTypes.indexOf( config.type ) !== -1 ? config.type : 'text';
-       return config.multiline ? 'multiline' : type;
+               'text',
+               'password',
+               'search',
+               'email',
+               'url',
+               'date',
+               'number'
+       ];
+       return allowedTypes.indexOf( config.type ) !== -1 ? config.type : 'text';
 };
 
 /**
index 3a99fba..750ab66 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.17.2
+ * OOjs UI v0.17.4
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2016 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2016-05-10T22:58:27Z
+ * Date: 2016-05-31T21:50:52Z
  */
 ( function ( OO ) {
 
index d757813..3f1910e 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.17.2
+ * OOjs UI v0.17.4
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2016 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2016-05-10T22:58:31Z
+ * Date: 2016-05-31T21:50:56Z
  */
 .oo-ui-popupTool .oo-ui-popupWidget-popup,
 .oo-ui-popupTool .oo-ui-popupWidget-anchor {
 }
 .oo-ui-toolGroup .oo-ui-tool-link {
        text-decoration: none;
+       cursor: pointer;
+}
+.oo-ui-toolGroup.oo-ui-widget-disabled .oo-ui-tool-link,
+.oo-ui-toolGroup .oo-ui-widget-disabled > .oo-ui-tool-link {
+       outline: 0;
+       cursor: default;
 }
 .oo-ui-toolbar-narrow .oo-ui-toolGroup + .oo-ui-toolGroup {
        margin-left: 0;
@@ -69,9 +75,6 @@
 .oo-ui-barToolGroup > .oo-ui-labelElement-label {
        display: none;
 }
-.oo-ui-barToolGroup.oo-ui-widget-enabled > .oo-ui-toolGroup-tools > .oo-ui-tool > .oo-ui-tool-link {
-       cursor: pointer;
-}
 .oo-ui-barToolGroup > .oo-ui-toolGroup-tools > .oo-ui-tool {
        display: inline-block;
        position: relative;
 .oo-ui-barToolGroup > .oo-ui-toolGroup-tools > .oo-ui-tool.oo-ui-iconElement.oo-ui-tool-with-label > .oo-ui-tool-link .oo-ui-tool-title {
        display: inline;
 }
-.oo-ui-barToolGroup > .oo-ui-toolGroup-tools > .oo-ui-tool.oo-ui-widget-disabled > .oo-ui-tool-link {
-       outline: 0;
-       cursor: default;
-}
 .oo-ui-barToolGroup > .oo-ui-toolGroup-tools > .oo-ui-tool {
        margin: -1px 0 -1px -1px;
        border: 1px solid transparent;
 .oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-accel {
        text-align: right;
 }
-.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-accel:not(:empty) {
+.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-accel:not( :empty ) {
        padding-left: 3em;
 }
 .oo-ui-toolbar-narrow .oo-ui-popupToolGroup {
        top: 2.5em;
        margin: 0 -1px;
        border: 1px solid #cccccc;
-       background-color: white;
+       background-color: #ffffff;
        box-shadow: 0 0.3125em 1.25em rgba(0, 0, 0, 0.25);
 }
 .oo-ui-popupToolGroup .oo-ui-tool-link {
           -moz-box-sizing: border-box;
                box-sizing: border-box;
 }
-.oo-ui-listToolGroup .oo-ui-tool-link {
-       cursor: pointer;
-}
-.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link {
-       cursor: default;
-}
 .oo-ui-listToolGroup .oo-ui-toolGroup-tools {
        padding: 0.3125em;
 }
 .oo-ui-menuToolGroup .oo-ui-tool {
        display: block;
 }
-.oo-ui-menuToolGroup .oo-ui-tool-link {
-       cursor: pointer;
-}
-.oo-ui-menuToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link {
-       cursor: default;
-}
 .oo-ui-menuToolGroup .oo-ui-popupToolGroup-handle {
        min-width: 10em;
 }
        -ms-filter: "progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffffffff', endColorstr='#fff1f7fb' )";
 }
 .oo-ui-toolbar-bar .oo-ui-toolbar-bar {
-       border: none;
+       border: 0;
        background: none;
 }
 .oo-ui-toolbar-actions > .oo-ui-buttonElement-framed,
index 82335a4..dd59a23 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.17.2
+ * OOjs UI v0.17.4
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2016 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2016-05-10T22:58:31Z
+ * Date: 2016-05-31T21:50:56Z
  */
 .oo-ui-popupTool .oo-ui-popupWidget-popup,
 .oo-ui-popupTool .oo-ui-popupWidget-anchor {
@@ -22,7 +22,7 @@
        margin: 0;
 }
 .oo-ui-toolGroupTool > .oo-ui-toolGroup {
-       border-right: none;
+       border-right: 0;
 }
 .oo-ui-toolGroupTool > .oo-ui-popupToolGroup > .oo-ui-popupToolGroup-handle {
        height: 2.5em;
 }
 .oo-ui-toolGroup .oo-ui-tool-link {
        text-decoration: none;
+       cursor: pointer;
+}
+.oo-ui-toolGroup.oo-ui-widget-disabled .oo-ui-tool-link,
+.oo-ui-toolGroup .oo-ui-widget-disabled > .oo-ui-tool-link {
+       outline: 0;
+       cursor: default;
 }
 .oo-ui-toolbar-narrow .oo-ui-toolGroup + .oo-ui-toolGroup {
        margin-left: 0;
 }
 .oo-ui-toolGroup .oo-ui-toolGroup .oo-ui-widget-enabled {
-       border-right: none !important;
+       border-right: 0 !important;
 }
 .oo-ui-barToolGroup > .oo-ui-iconElement-icon,
 .oo-ui-barToolGroup > .oo-ui-labelElement-label {
        display: none;
 }
-.oo-ui-barToolGroup.oo-ui-widget-enabled > .oo-ui-toolGroup-tools > .oo-ui-tool > .oo-ui-tool-link {
-       cursor: pointer;
-}
 .oo-ui-barToolGroup > .oo-ui-toolGroup-tools > .oo-ui-tool {
        display: inline-block;
        position: relative;
 .oo-ui-barToolGroup > .oo-ui-toolGroup-tools > .oo-ui-tool.oo-ui-iconElement.oo-ui-tool-with-label > .oo-ui-tool-link .oo-ui-tool-title {
        display: inline;
 }
-.oo-ui-barToolGroup > .oo-ui-toolGroup-tools > .oo-ui-tool.oo-ui-widget-disabled > .oo-ui-tool-link {
-       outline: 0;
-       cursor: default;
-}
 .oo-ui-barToolGroup > .oo-ui-toolGroup-tools > .oo-ui-tool > .oo-ui-tool-link {
        height: 1.875em;
        padding: 0.625em;
 .oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-accel {
        text-align: right;
 }
-.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-accel:not(:empty) {
+.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-accel:not( :empty ) {
        padding-left: 3em;
 }
 .oo-ui-toolbar-narrow .oo-ui-popupToolGroup {
           -moz-box-sizing: border-box;
                box-sizing: border-box;
 }
-.oo-ui-listToolGroup .oo-ui-tool-link {
-       cursor: pointer;
-}
-.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link {
-       cursor: default;
-}
 .oo-ui-listToolGroup.oo-ui-popupToolGroup-active {
        border-color: rgba(0, 0, 0, 0.2);
 }
 .oo-ui-menuToolGroup .oo-ui-tool {
        display: block;
 }
-.oo-ui-menuToolGroup .oo-ui-tool-link {
-       cursor: pointer;
-}
-.oo-ui-menuToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link {
-       cursor: default;
-}
 .oo-ui-menuToolGroup .oo-ui-popupToolGroup-handle {
        min-width: 10em;
 }
index d976448..3b1e15d 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.17.2
+ * OOjs UI v0.17.4
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2016 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2016-05-10T22:58:27Z
+ * Date: 2016-05-31T21:50:52Z
  */
 ( function ( OO ) {
 
index 7a45a25..0767ab7 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.17.2
+ * OOjs UI v0.17.4
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2016 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2016-05-10T22:58:31Z
+ * Date: 2016-05-31T21:50:56Z
  */
 .oo-ui-draggableElement-handle,
 .oo-ui-draggableElement-handle.oo-ui-widget {
        height: 2em;
        width: 4em;
        border-radius: 1em;
-       box-shadow: 0 0 0 white, inset 0 0.1em 0.2em #dddddd;
+       box-shadow: 0 0 0 #ffffff, inset 0 0.1em 0.2em #dddddd;
        border: 1px solid #cccccc;
        margin-right: 0.5em;
        background-color: #eeeeee;
 }
 .oo-ui-selectFileWidget-selectButton > .oo-ui-buttonElement-button > [type="file"] {
        position: absolute;
-       margin: 0;
        top: 0;
        bottom: 0;
        left: 0;
        position: absolute;
        right: 0.5em;
 }
-.oo-ui-selectFileWidget-empty .oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-dropLabel {
-       display: block;
-}
 .oo-ui-selectFileWidget-empty .oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-thumbnail,
 .oo-ui-selectFileWidget-empty .oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-info {
        display: none;
 .oo-ui-selectFileWidget-notsupported .oo-ui-selectFileWidget-clearButton {
        display: none;
 }
+.oo-ui-selectFileWidget-empty.oo-ui-widget-enabled .oo-ui-selectFileWidget-dropLabel {
+       display: block;
+}
 .oo-ui-selectFileWidget-empty.oo-ui-widget-disabled .oo-ui-selectFileWidget-dropTarget,
 .oo-ui-selectFileWidget-notsupported .oo-ui-selectFileWidget-dropTarget,
 .oo-ui-selectFileWidget-empty.oo-ui-widget-disabled .oo-ui-selectFileWidget-dropTarget .oo-ui-buttonElement-button,
        margin-right: 0;
 }
 .oo-ui-selectFileWidget-selectButton > .oo-ui-buttonElement-button {
-       margin-left: 0.5em;
+       border-radius: 0 0.25em 0.25em 0;
 }
 .oo-ui-selectFileWidget-info {
        height: 2.4em;
        background-color: #ffffff;
        border: 1px solid rgba(0, 0, 0, 0.1);
-       border-radius: 0.25em;
+       border-radius: 0.25em 0 0 0.25em;
+       border-width: 1px 0 1px 1px;
 }
 .oo-ui-selectFileWidget-info > .oo-ui-indicatorElement-indicator {
+       top: 0;
        right: 0;
+       height: 2.3em;
+       margin-right: 0.775em;
 }
 .oo-ui-selectFileWidget-info > .oo-ui-iconElement-icon {
+       top: 0;
        left: 0;
+       height: 2.3em;
+       margin-left: 0.3em;
 }
 .oo-ui-selectFileWidget-info > .oo-ui-selectFileWidget-label {
        line-height: 2.3em;
 .oo-ui-selectFileWidget-info > .oo-ui-selectFileWidget-clearButton .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
        height: 2.3em;
 }
-.oo-ui-selectFileWidget-info > .oo-ui-indicatorElement-indicator {
-       top: 0;
-       height: 2.3em;
-       margin-right: 0.775em;
-}
-.oo-ui-selectFileWidget-info > .oo-ui-iconElement-icon {
-       top: 0;
-       height: 2.3em;
-       margin-left: 0.3em;
-}
 .oo-ui-selectFileWidget.oo-ui-widget-disabled .oo-ui-selectFileWidget-info {
        color: #cccccc;
        text-shadow: 0 1px 1px #ffffff;
        vertical-align: middle;
        border-radius: 0.25em;
 }
+.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-selectButton > .oo-ui-buttonElement-button {
+       border-radius: 0.25em;
+}
 .oo-ui-selectFileWidget-empty .oo-ui-selectFileWidget-dropTarget {
        border-style: dashed;
 }
        padding: 0.5em 1em;
        margin: 0.5em 0 0 0.75em;
        border: 1px solid transparent;
-       border-bottom: none;
+       border-bottom: 0;
        border-top-left-radius: 0.5em;
        border-top-right-radius: 0.5em;
 }
        background-color: #ffffff;
        border-color: #dddddd;
 }
-.oo-ui-capsuleMultiSelectWidget {
+.oo-ui-capsuleMultiselectWidget {
        display: inline-block;
        position: relative;
        width: 100%;
        max-width: 50em;
 }
-.oo-ui-capsuleMultiSelectWidget-handle {
+.oo-ui-capsuleMultiselectWidget-handle {
        width: 100%;
        display: block;
        position: relative;
 }
-.oo-ui-capsuleMultiSelectWidget-content {
+.oo-ui-capsuleMultiselectWidget-content {
        position: relative;
 }
-.oo-ui-capsuleMultiSelectWidget.oo-ui-widget-disabled .oo-ui-capsuleMultiSelectWidget-content > input {
+.oo-ui-capsuleMultiselectWidget.oo-ui-widget-disabled .oo-ui-capsuleMultiselectWidget-content > input {
        display: none;
 }
-.oo-ui-capsuleMultiSelectWidget-group {
+.oo-ui-capsuleMultiselectWidget-group {
        display: inline;
 }
-.oo-ui-capsuleMultiSelectWidget > .oo-ui-menuSelectWidget {
+.oo-ui-capsuleMultiselectWidget > .oo-ui-menuSelectWidget {
        z-index: 1;
        width: 100%;
 }
-.oo-ui-capsuleMultiSelectWidget-handle {
+.oo-ui-capsuleMultiselectWidget-handle {
        background-color: #ffffff;
        cursor: text;
        min-height: 2.4em;
           -moz-box-sizing: border-box;
                box-sizing: border-box;
 }
-.oo-ui-capsuleMultiSelectWidget-handle:last-child {
+.oo-ui-capsuleMultiselectWidget-handle:last-child {
        margin-right: 0;
 }
-.oo-ui-capsuleMultiSelectWidget-handle > .oo-ui-indicatorElement-indicator,
-.oo-ui-capsuleMultiSelectWidget-handle > .oo-ui-iconElement-icon {
+.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-indicatorElement-indicator,
+.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-iconElement-icon {
        position: absolute;
 }
-.oo-ui-capsuleMultiSelectWidget-handle > .oo-ui-capsuleMultiSelectWidget-content > input {
-       border: none;
+.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-capsuleMultiselectWidget-content > input {
+       border: 0;
        line-height: 1.675em;
        margin: 0;
        margin-left: 0.2em;
        font-size: inherit;
        font-family: inherit;
        background-color: transparent;
-       color: black;
+       color: #000000;
        vertical-align: middle;
 }
-.oo-ui-capsuleMultiSelectWidget-handle > .oo-ui-capsuleMultiSelectWidget-content > input:focus {
+.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-capsuleMultiselectWidget-content > input:focus {
        outline: none;
 }
-.oo-ui-capsuleMultiSelectWidget.oo-ui-indicatorElement .oo-ui-capsuleMultiSelectWidget-handle {
+.oo-ui-capsuleMultiselectWidget.oo-ui-indicatorElement .oo-ui-capsuleMultiselectWidget-handle {
        padding-right: 2.4875em;
 }
-.oo-ui-capsuleMultiSelectWidget.oo-ui-indicatorElement .oo-ui-capsuleMultiSelectWidget-handle > .oo-ui-indicatorElement-indicator {
+.oo-ui-capsuleMultiselectWidget.oo-ui-indicatorElement .oo-ui-capsuleMultiselectWidget-handle > .oo-ui-indicatorElement-indicator {
        right: 0;
        top: 0;
        margin: 0.775em;
 }
-.oo-ui-capsuleMultiSelectWidget.oo-ui-iconElement .oo-ui-capsuleMultiSelectWidget-handle {
+.oo-ui-capsuleMultiselectWidget.oo-ui-iconElement .oo-ui-capsuleMultiselectWidget-handle {
        padding-left: 2.475em;
 }
-.oo-ui-capsuleMultiSelectWidget.oo-ui-iconElement .oo-ui-capsuleMultiSelectWidget-handle > .oo-ui-iconElement-icon {
+.oo-ui-capsuleMultiselectWidget.oo-ui-iconElement .oo-ui-capsuleMultiselectWidget-handle > .oo-ui-iconElement-icon {
        left: 0;
        top: 0;
        margin: 0.3em;
 }
-.oo-ui-capsuleMultiSelectWidget:hover .oo-ui-capsuleMultiSelectWidget-handle {
+.oo-ui-capsuleMultiselectWidget:hover .oo-ui-capsuleMultiselectWidget-handle {
        border-color: rgba(0, 0, 0, 0.2);
 }
-.oo-ui-capsuleMultiSelectWidget.oo-ui-widget-disabled .oo-ui-capsuleMultiSelectWidget-handle {
+.oo-ui-capsuleMultiselectWidget.oo-ui-widget-disabled .oo-ui-capsuleMultiselectWidget-handle {
        color: #cccccc;
        text-shadow: 0 1px 1px #ffffff;
        border-color: #dddddd;
        background-color: #f3f3f3;
        cursor: default;
 }
-.oo-ui-capsuleMultiSelectWidget.oo-ui-widget-disabled .oo-ui-capsuleMultiSelectWidget-handle > .oo-ui-iconElement-icon,
-.oo-ui-capsuleMultiSelectWidget.oo-ui-widget-disabled .oo-ui-capsuleMultiSelectWidget-handle > .oo-ui-indicatorElement-indicator {
+.oo-ui-capsuleMultiselectWidget.oo-ui-widget-disabled .oo-ui-capsuleMultiselectWidget-handle > .oo-ui-iconElement-icon,
+.oo-ui-capsuleMultiselectWidget.oo-ui-widget-disabled .oo-ui-capsuleMultiselectWidget-handle > .oo-ui-indicatorElement-indicator {
        opacity: 0.2;
 }
 .oo-ui-capsuleItemWidget {
index a530235..82d0b5f 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.17.2
+ * OOjs UI v0.17.4
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2016 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2016-05-10T22:58:31Z
+ * Date: 2016-05-31T21:50:56Z
  */
 .oo-ui-draggableElement-handle,
 .oo-ui-draggableElement-handle.oo-ui-widget {
 .oo-ui-buttonOptionWidget {
        display: inline-block;
        padding: 0;
-       background-color: transparent;
 }
 .oo-ui-buttonOptionWidget .oo-ui-buttonElement-button {
        position: relative;
 }
 .oo-ui-selectFileWidget-selectButton > .oo-ui-buttonElement-button > [type="file"] {
        position: absolute;
-       margin: 0;
        top: 0;
        bottom: 0;
        left: 0;
        position: absolute;
        right: 0.5em;
 }
-.oo-ui-selectFileWidget-empty .oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-dropLabel {
-       display: block;
-}
 .oo-ui-selectFileWidget-empty .oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-thumbnail,
 .oo-ui-selectFileWidget-empty .oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-info {
        display: none;
 .oo-ui-selectFileWidget-notsupported .oo-ui-selectFileWidget-clearButton {
        display: none;
 }
+.oo-ui-selectFileWidget-empty.oo-ui-widget-enabled .oo-ui-selectFileWidget-dropLabel {
+       display: block;
+}
 .oo-ui-selectFileWidget-empty.oo-ui-widget-disabled .oo-ui-selectFileWidget-dropTarget,
 .oo-ui-selectFileWidget-notsupported .oo-ui-selectFileWidget-dropTarget,
 .oo-ui-selectFileWidget-empty.oo-ui-widget-disabled .oo-ui-selectFileWidget-dropTarget .oo-ui-buttonElement-button,
        margin-right: 0;
 }
 .oo-ui-selectFileWidget-selectButton > .oo-ui-buttonElement-button {
-       margin-left: 0.5em;
+       border-radius: 0 2px 2px 0;
 }
 .oo-ui-selectFileWidget-info {
        height: 2.4em;
        background-color: #ffffff;
        border: 1px solid #cccccc;
-       border-radius: 2px;
+       border-radius: 2px 0 0 2px;
+       border-width: 1px 0 1px 1px;
 }
 .oo-ui-selectFileWidget-info > .oo-ui-iconElement-icon {
        left: 0;
 .oo-ui-selectFileWidget-info > .oo-ui-selectFileWidget-clearButton .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
        height: 2.3em;
 }
+.oo-ui-selectFileWidget-notsupported .oo-ui-selectFileWidget-info,
 .oo-ui-selectFileWidget.oo-ui-widget-disabled .oo-ui-selectFileWidget-info {
        background-color: #f3f3f3;
        color: #cccccc;
        border-color: #dddddd;
        cursor: default;
 }
+.oo-ui-selectFileWidget-notsupported .oo-ui-selectFileWidget-info > .oo-ui-iconElement-icon,
 .oo-ui-selectFileWidget.oo-ui-widget-disabled .oo-ui-selectFileWidget-info > .oo-ui-iconElement-icon,
+.oo-ui-selectFileWidget-notsupported .oo-ui-selectFileWidget-info > .oo-ui-indicatorElement-indicator,
 .oo-ui-selectFileWidget.oo-ui-widget-disabled .oo-ui-selectFileWidget-info > .oo-ui-indicatorElement-indicator {
        opacity: 0.2;
 }
        overflow: hidden;
        border-radius: 2px;
 }
+.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-selectButton > .oo-ui-buttonElement-button {
+       border-radius: 2px;
+}
 .oo-ui-selectFileWidget-empty .oo-ui-selectFileWidget-dropTarget {
        background-color: #eeeeee;
        border-style: dashed;
 }
+.oo-ui-widget-disabled .oo-ui-selectFileWidget-dropLabel {
+       display: none;
+}
 .oo-ui-outlineOptionWidget {
        position: relative;
        cursor: pointer;
        padding: 0.35em 1em;
        margin: 0.5em 0 0 0.75em;
        border: 1px solid transparent;
-       border-bottom: none;
+       border-bottom: 0;
        border-top-left-radius: 2px;
        border-top-right-radius: 2px;
        color: #555555;
        background-color: #ffffff;
        color: #333333;
 }
-.oo-ui-capsuleMultiSelectWidget {
+.oo-ui-capsuleMultiselectWidget {
        display: inline-block;
        position: relative;
        width: 100%;
        max-width: 50em;
 }
-.oo-ui-capsuleMultiSelectWidget-handle {
+.oo-ui-capsuleMultiselectWidget-handle {
        width: 100%;
        display: block;
        position: relative;
 }
-.oo-ui-capsuleMultiSelectWidget-content {
+.oo-ui-capsuleMultiselectWidget-content {
        position: relative;
 }
-.oo-ui-capsuleMultiSelectWidget.oo-ui-widget-disabled .oo-ui-capsuleMultiSelectWidget-content > input {
+.oo-ui-capsuleMultiselectWidget.oo-ui-widget-disabled .oo-ui-capsuleMultiselectWidget-content > input {
        display: none;
 }
-.oo-ui-capsuleMultiSelectWidget-group {
+.oo-ui-capsuleMultiselectWidget-group {
        display: inline;
 }
-.oo-ui-capsuleMultiSelectWidget > .oo-ui-menuSelectWidget {
+.oo-ui-capsuleMultiselectWidget > .oo-ui-menuSelectWidget {
        z-index: 1;
        width: 100%;
 }
-.oo-ui-capsuleMultiSelectWidget-handle {
+.oo-ui-capsuleMultiselectWidget-handle {
        background-color: #ffffff;
        cursor: text;
        min-height: 2.4em;
           -moz-box-sizing: border-box;
                box-sizing: border-box;
 }
-.oo-ui-capsuleMultiSelectWidget-handle:last-child {
+.oo-ui-capsuleMultiselectWidget-handle:last-child {
        margin-right: 0;
 }
-.oo-ui-capsuleMultiSelectWidget-handle > .oo-ui-indicatorElement-indicator,
-.oo-ui-capsuleMultiSelectWidget-handle > .oo-ui-iconElement-icon {
+.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-indicatorElement-indicator,
+.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-iconElement-icon {
        position: absolute;
 }
-.oo-ui-capsuleMultiSelectWidget-handle > .oo-ui-capsuleMultiSelectWidget-content > input {
+.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-capsuleMultiselectWidget-content > input {
        border: 0;
        line-height: 1.675em;
        margin: 0 0 0 0.2em;
        color: #000000;
        vertical-align: middle;
 }
-.oo-ui-capsuleMultiSelectWidget-handle > .oo-ui-capsuleMultiSelectWidget-content > input:focus {
+.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-capsuleMultiselectWidget-content > input:focus {
        outline: 0;
 }
-.oo-ui-capsuleMultiSelectWidget.oo-ui-indicatorElement .oo-ui-capsuleMultiSelectWidget-handle {
+.oo-ui-capsuleMultiselectWidget.oo-ui-indicatorElement .oo-ui-capsuleMultiselectWidget-handle {
        padding-right: 2.4875em;
 }
-.oo-ui-capsuleMultiSelectWidget.oo-ui-indicatorElement .oo-ui-capsuleMultiSelectWidget-handle > .oo-ui-indicatorElement-indicator {
+.oo-ui-capsuleMultiselectWidget.oo-ui-indicatorElement .oo-ui-capsuleMultiselectWidget-handle > .oo-ui-indicatorElement-indicator {
        right: 0;
        top: 0;
        margin: 0.775em;
 }
-.oo-ui-capsuleMultiSelectWidget.oo-ui-iconElement .oo-ui-capsuleMultiSelectWidget-handle {
+.oo-ui-capsuleMultiselectWidget.oo-ui-iconElement .oo-ui-capsuleMultiselectWidget-handle {
        padding-left: 2.475em;
 }
-.oo-ui-capsuleMultiSelectWidget.oo-ui-iconElement .oo-ui-capsuleMultiSelectWidget-handle > .oo-ui-iconElement-icon {
+.oo-ui-capsuleMultiselectWidget.oo-ui-iconElement .oo-ui-capsuleMultiselectWidget-handle > .oo-ui-iconElement-icon {
        left: 0;
        top: 0;
        margin: 0.3em;
 }
-.oo-ui-capsuleMultiSelectWidget:hover .oo-ui-capsuleMultiSelectWidget-handle {
+.oo-ui-capsuleMultiselectWidget:hover .oo-ui-capsuleMultiselectWidget-handle {
        border-color: #aaaaaa;
 }
-.oo-ui-capsuleMultiSelectWidget.oo-ui-widget-disabled .oo-ui-capsuleMultiSelectWidget-handle {
+.oo-ui-capsuleMultiselectWidget.oo-ui-widget-disabled .oo-ui-capsuleMultiselectWidget-handle {
        color: #cccccc;
        text-shadow: 0 1px 1px #ffffff;
        border-color: #dddddd;
        background-color: #f3f3f3;
        cursor: default;
 }
-.oo-ui-capsuleMultiSelectWidget.oo-ui-widget-disabled .oo-ui-capsuleMultiSelectWidget-handle > .oo-ui-iconElement-icon,
-.oo-ui-capsuleMultiSelectWidget.oo-ui-widget-disabled .oo-ui-capsuleMultiSelectWidget-handle > .oo-ui-indicatorElement-indicator {
+.oo-ui-capsuleMultiselectWidget.oo-ui-widget-disabled .oo-ui-capsuleMultiselectWidget-handle > .oo-ui-iconElement-icon,
+.oo-ui-capsuleMultiselectWidget.oo-ui-widget-disabled .oo-ui-capsuleMultiselectWidget-handle > .oo-ui-indicatorElement-indicator {
        opacity: 0.2;
 }
 .oo-ui-capsuleItemWidget {
index e3c2bd5..cc010a6 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.17.2
+ * OOjs UI v0.17.4
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2016 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2016-05-10T22:58:27Z
+ * Date: 2016-05-31T21:50:52Z
  */
 ( function ( OO ) {
 
@@ -539,6 +539,7 @@ OO.ui.mixin.RequestManager.prototype.getRequestCacheDataFromResponse = null;
  *
  * @class
  * @abstract
+ * @mixins OO.ui.mixin.RequestManager
  *
  * @constructor
  * @param {Object} [config] Configuration options
@@ -3186,7 +3187,6 @@ OO.mixinClass( OO.ui.OutlineSelectWidget, OO.ui.mixin.TabIndexedElement );
  * @mixins OO.ui.mixin.ButtonElement
  * @mixins OO.ui.mixin.IconElement
  * @mixins OO.ui.mixin.IndicatorElement
- * @mixins OO.ui.mixin.TabIndexedElement
  * @mixins OO.ui.mixin.TitledElement
  *
  * @constructor
@@ -3204,10 +3204,6 @@ OO.ui.ButtonOptionWidget = function OoUiButtonOptionWidget( config ) {
        OO.ui.mixin.IconElement.call( this, config );
        OO.ui.mixin.IndicatorElement.call( this, config );
        OO.ui.mixin.TitledElement.call( this, $.extend( {}, config, { $titled: this.$button } ) );
-       OO.ui.mixin.TabIndexedElement.call( this, $.extend( {}, config, {
-               $tabIndexed: this.$button,
-               tabIndex: -1
-       } ) );
 
        // Initialization
        this.$element.addClass( 'oo-ui-buttonOptionWidget' );
@@ -3222,7 +3218,6 @@ OO.mixinClass( OO.ui.ButtonOptionWidget, OO.ui.mixin.ButtonElement );
 OO.mixinClass( OO.ui.ButtonOptionWidget, OO.ui.mixin.IconElement );
 OO.mixinClass( OO.ui.ButtonOptionWidget, OO.ui.mixin.IndicatorElement );
 OO.mixinClass( OO.ui.ButtonOptionWidget, OO.ui.mixin.TitledElement );
-OO.mixinClass( OO.ui.ButtonOptionWidget, OO.ui.mixin.TabIndexedElement );
 
 /* Static Properties */
 
@@ -3376,8 +3371,8 @@ OO.inheritClass( OO.ui.TabSelectWidget, OO.ui.SelectWidget );
 OO.mixinClass( OO.ui.TabSelectWidget, OO.ui.mixin.TabIndexedElement );
 
 /**
- * CapsuleItemWidgets are used within a {@link OO.ui.CapsuleMultiSelectWidget
- * CapsuleMultiSelectWidget} to display the selected items.
+ * CapsuleItemWidgets are used within a {@link OO.ui.CapsuleMultiselectWidget
+ * CapsuleMultiselectWidget} to display the selected items.
  *
  * @class
  * @extends OO.ui.Widget
@@ -3484,15 +3479,15 @@ OO.ui.CapsuleItemWidget.prototype.focus = function () {
 };
 
 /**
- * CapsuleMultiSelectWidgets are something like a {@link OO.ui.ComboBoxInputWidget combo box widget}
+ * CapsuleMultiselectWidgets are something like a {@link OO.ui.ComboBoxInputWidget combo box widget}
  * that allows for selecting multiple values.
  *
  * For more information about menus and options, please see the [OOjs UI documentation on MediaWiki][1].
  *
  *     @example
- *     // Example: A CapsuleMultiSelectWidget.
- *     var capsule = new OO.ui.CapsuleMultiSelectWidget( {
- *         label: 'CapsuleMultiSelectWidget',
+ *     // Example: A CapsuleMultiselectWidget.
+ *     var capsule = new OO.ui.CapsuleMultiselectWidget( {
+ *         label: 'CapsuleMultiselectWidget',
  *         selected: [ 'Option 1', 'Option 3' ],
  *         menu: {
  *             items: [
@@ -3525,8 +3520,11 @@ OO.ui.CapsuleItemWidget.prototype.focus = function () {
  *
  * @class
  * @extends OO.ui.Widget
- * @mixins OO.ui.mixin.TabIndexedElement
  * @mixins OO.ui.mixin.GroupElement
+ * @mixins OO.ui.mixin.PopupElement
+ * @mixins OO.ui.mixin.TabIndexedElement
+ * @mixins OO.ui.mixin.IndicatorElement
+ * @mixins OO.ui.mixin.IconElement
  * @uses OO.ui.CapsuleItemWidget
  * @uses OO.ui.FloatingMenuSelectWidget
  *
@@ -3545,11 +3543,11 @@ OO.ui.CapsuleItemWidget.prototype.focus = function () {
  *  the containing `<div>` and has a larger area. By default, the menu uses
  *  relative positioning.
  */
-OO.ui.CapsuleMultiSelectWidget = function OoUiCapsuleMultiSelectWidget( config ) {
+OO.ui.CapsuleMultiselectWidget = function OoUiCapsuleMultiselectWidget( config ) {
        var $tabFocus;
 
        // Parent constructor
-       OO.ui.CapsuleMultiSelectWidget.parent.call( this, config );
+       OO.ui.CapsuleMultiselectWidget.parent.call( this, config );
 
        // Configuration initialization
        config = $.extend( {
@@ -3639,12 +3637,12 @@ OO.ui.CapsuleMultiSelectWidget = function OoUiCapsuleMultiSelectWidget( config )
        if ( config.data ) {
                this.setItemsFromData( config.data );
        }
-       this.$content.addClass( 'oo-ui-capsuleMultiSelectWidget-content' )
+       this.$content.addClass( 'oo-ui-capsuleMultiselectWidget-content' )
                .append( this.$group );
-       this.$group.addClass( 'oo-ui-capsuleMultiSelectWidget-group' );
-       this.$handle.addClass( 'oo-ui-capsuleMultiSelectWidget-handle' )
+       this.$group.addClass( 'oo-ui-capsuleMultiselectWidget-group' );
+       this.$handle.addClass( 'oo-ui-capsuleMultiselectWidget-handle' )
                .append( this.$indicator, this.$icon, this.$content );
-       this.$element.addClass( 'oo-ui-capsuleMultiSelectWidget' )
+       this.$element.addClass( 'oo-ui-capsuleMultiselectWidget' )
                .append( this.$handle );
        if ( this.popup ) {
                this.$content.append( $tabFocus );
@@ -3658,12 +3656,12 @@ OO.ui.CapsuleMultiSelectWidget = function OoUiCapsuleMultiSelectWidget( config )
 
 /* Setup */
 
-OO.inheritClass( OO.ui.CapsuleMultiSelectWidget, OO.ui.Widget );
-OO.mixinClass( OO.ui.CapsuleMultiSelectWidget, OO.ui.mixin.GroupElement );
-OO.mixinClass( OO.ui.CapsuleMultiSelectWidget, OO.ui.mixin.PopupElement );
-OO.mixinClass( OO.ui.CapsuleMultiSelectWidget, OO.ui.mixin.TabIndexedElement );
-OO.mixinClass( OO.ui.CapsuleMultiSelectWidget, OO.ui.mixin.IndicatorElement );
-OO.mixinClass( OO.ui.CapsuleMultiSelectWidget, OO.ui.mixin.IconElement );
+OO.inheritClass( OO.ui.CapsuleMultiselectWidget, OO.ui.Widget );
+OO.mixinClass( OO.ui.CapsuleMultiselectWidget, OO.ui.mixin.GroupElement );
+OO.mixinClass( OO.ui.CapsuleMultiselectWidget, OO.ui.mixin.PopupElement );
+OO.mixinClass( OO.ui.CapsuleMultiselectWidget, OO.ui.mixin.TabIndexedElement );
+OO.mixinClass( OO.ui.CapsuleMultiselectWidget, OO.ui.mixin.IndicatorElement );
+OO.mixinClass( OO.ui.CapsuleMultiselectWidget, OO.ui.mixin.IconElement );
 
 /* Events */
 
@@ -3692,7 +3690,7 @@ OO.mixinClass( OO.ui.CapsuleMultiSelectWidget, OO.ui.mixin.IconElement );
  * @param {string} label The label text.
  * @return {OO.ui.CapsuleItemWidget}
  */
-OO.ui.CapsuleMultiSelectWidget.prototype.createItemWidget = function ( data, label ) {
+OO.ui.CapsuleMultiselectWidget.prototype.createItemWidget = function ( data, label ) {
        return new OO.ui.CapsuleItemWidget( { data: data, label: label } );
 };
 
@@ -3701,8 +3699,10 @@ OO.ui.CapsuleMultiSelectWidget.prototype.createItemWidget = function ( data, lab
  *
  * @return {Mixed[]}
  */
-OO.ui.CapsuleMultiSelectWidget.prototype.getItemsData = function () {
-       return $.map( this.getItems(), function ( e ) { return e.data; } );
+OO.ui.CapsuleMultiselectWidget.prototype.getItemsData = function () {
+       return this.getItems().map( function ( item ) {
+               return item.data;
+       } );
 };
 
 /**
@@ -3710,9 +3710,9 @@ OO.ui.CapsuleMultiSelectWidget.prototype.getItemsData = function () {
  *
  * @chainable
  * @param {Mixed[]} datas
- * @return {OO.ui.CapsuleMultiSelectWidget}
+ * @return {OO.ui.CapsuleMultiselectWidget}
  */
-OO.ui.CapsuleMultiSelectWidget.prototype.setItemsFromData = function ( datas ) {
+OO.ui.CapsuleMultiselectWidget.prototype.setItemsFromData = function ( datas ) {
        var widget = this,
                menu = this.menu,
                items = this.getItems();
@@ -3755,9 +3755,9 @@ OO.ui.CapsuleMultiSelectWidget.prototype.setItemsFromData = function ( datas ) {
  *
  * @chainable
  * @param {Mixed[]} datas
- * @return {OO.ui.CapsuleMultiSelectWidget}
+ * @return {OO.ui.CapsuleMultiselectWidget}
  */
-OO.ui.CapsuleMultiSelectWidget.prototype.addItemsFromData = function ( datas ) {
+OO.ui.CapsuleMultiselectWidget.prototype.addItemsFromData = function ( datas ) {
        var widget = this,
                menu = this.menu,
                items = [];
@@ -3788,7 +3788,7 @@ OO.ui.CapsuleMultiSelectWidget.prototype.addItemsFromData = function ( datas ) {
  * @param {string} label
  * @return {boolean} Whether the item was added or not
  */
-OO.ui.CapsuleMultiSelectWidget.prototype.addItemFromLabel = function ( label ) {
+OO.ui.CapsuleMultiselectWidget.prototype.addItemFromLabel = function ( label ) {
        var item = this.menu.getItemFromLabel( label, true );
        if ( item ) {
                this.addItemsFromData( [ item.data ] );
@@ -3805,9 +3805,9 @@ OO.ui.CapsuleMultiSelectWidget.prototype.addItemFromLabel = function ( label ) {
  *
  * @chainable
  * @param {Mixed[]} datas
- * @return {OO.ui.CapsuleMultiSelectWidget}
+ * @return {OO.ui.CapsuleMultiselectWidget}
  */
-OO.ui.CapsuleMultiSelectWidget.prototype.removeItemsFromData = function ( datas ) {
+OO.ui.CapsuleMultiselectWidget.prototype.removeItemsFromData = function ( datas ) {
        var widget = this,
                items = [];
 
@@ -3828,7 +3828,7 @@ OO.ui.CapsuleMultiSelectWidget.prototype.removeItemsFromData = function ( datas
 /**
  * @inheritdoc
  */
-OO.ui.CapsuleMultiSelectWidget.prototype.addItems = function ( items ) {
+OO.ui.CapsuleMultiselectWidget.prototype.addItems = function ( items ) {
        var same, i, l,
                oldItems = this.items.slice();
 
@@ -3855,7 +3855,7 @@ OO.ui.CapsuleMultiSelectWidget.prototype.addItems = function ( items ) {
  *
  * @param {Object} item
  */
-OO.ui.CapsuleMultiSelectWidget.prototype.editItem = function ( item ) {
+OO.ui.CapsuleMultiselectWidget.prototype.editItem = function ( item ) {
        this.$input.val( item.label );
        this.updateInputSize();
        this.focus();
@@ -3865,7 +3865,7 @@ OO.ui.CapsuleMultiSelectWidget.prototype.editItem = function ( item ) {
 /**
  * @inheritdoc
  */
-OO.ui.CapsuleMultiSelectWidget.prototype.removeItems = function ( items ) {
+OO.ui.CapsuleMultiselectWidget.prototype.removeItems = function ( items ) {
        var same, i, l,
                oldItems = this.items.slice();
 
@@ -3890,7 +3890,7 @@ OO.ui.CapsuleMultiSelectWidget.prototype.removeItems = function ( items ) {
 /**
  * @inheritdoc
  */
-OO.ui.CapsuleMultiSelectWidget.prototype.clearItems = function () {
+OO.ui.CapsuleMultiselectWidget.prototype.clearItems = function () {
        if ( this.items.length ) {
                OO.ui.mixin.GroupElement.prototype.clearItems.call( this );
                this.emit( 'change', this.getItemsData() );
@@ -3907,7 +3907,7 @@ OO.ui.CapsuleMultiSelectWidget.prototype.clearItems = function () {
  * @param {OO.ui.CapsuleItemWidget} [item]
  * @return {OO.ui.CapsuleItemWidget|jQuery|boolean}
  */
-OO.ui.CapsuleMultiSelectWidget.prototype.getNextItem = function ( item ) {
+OO.ui.CapsuleMultiselectWidget.prototype.getNextItem = function ( item ) {
        var itemIndex;
 
        if ( item === undefined ) {
@@ -3932,7 +3932,7 @@ OO.ui.CapsuleMultiSelectWidget.prototype.getNextItem = function ( item ) {
  * @param {OO.ui.CapsuleItemWidget} [item]
  * @return {OO.ui.CapsuleItemWidget|jQuery|boolean}
  */
-OO.ui.CapsuleMultiSelectWidget.prototype.getPreviousItem = function ( item ) {
+OO.ui.CapsuleMultiselectWidget.prototype.getPreviousItem = function ( item ) {
        var itemIndex;
 
        if ( item === undefined ) {
@@ -3954,7 +3954,7 @@ OO.ui.CapsuleMultiSelectWidget.prototype.getPreviousItem = function ( item ) {
  *
  * @return {OO.ui.MenuSelectWidget} Menu widget
  */
-OO.ui.CapsuleMultiSelectWidget.prototype.getMenu = function () {
+OO.ui.CapsuleMultiselectWidget.prototype.getMenu = function () {
        return this.menu;
 };
 
@@ -3964,7 +3964,7 @@ OO.ui.CapsuleMultiSelectWidget.prototype.getMenu = function () {
  * @private
  * @param {jQuery.Event} event
  */
-OO.ui.CapsuleMultiSelectWidget.prototype.onInputFocus = function () {
+OO.ui.CapsuleMultiselectWidget.prototype.onInputFocus = function () {
        if ( !this.isDisabled() ) {
                this.menu.toggle( true );
        }
@@ -3976,7 +3976,7 @@ OO.ui.CapsuleMultiSelectWidget.prototype.onInputFocus = function () {
  * @private
  * @param {jQuery.Event} event
  */
-OO.ui.CapsuleMultiSelectWidget.prototype.onInputBlur = function () {
+OO.ui.CapsuleMultiselectWidget.prototype.onInputBlur = function () {
        this.addItemFromLabel( this.$input.val() );
        this.clearInput();
 };
@@ -3987,14 +3987,11 @@ OO.ui.CapsuleMultiSelectWidget.prototype.onInputBlur = function () {
  * @private
  * @param {jQuery.Event} event
  */
-OO.ui.CapsuleMultiSelectWidget.prototype.onFocusForPopup = function () {
+OO.ui.CapsuleMultiselectWidget.prototype.onFocusForPopup = function () {
        if ( !this.isDisabled() ) {
                this.popup.setSize( this.$handle.width() );
                this.popup.toggle( true );
-               this.popup.$element.find( '*' )
-                       .filter( function () { return OO.ui.isFocusableElement( $( this ), true ); } )
-                       .first()
-                       .focus();
+               OO.ui.findFocusable( this.popup.$element ).focus();
        }
 };
 
@@ -4004,7 +4001,7 @@ OO.ui.CapsuleMultiSelectWidget.prototype.onFocusForPopup = function () {
  * @private
  * @param {jQuery.Event} e Focus out event
  */
-OO.ui.CapsuleMultiSelectWidget.prototype.onPopupFocusOut = function () {
+OO.ui.CapsuleMultiselectWidget.prototype.onPopupFocusOut = function () {
        var widget = this.popup;
 
        setTimeout( function () {
@@ -4024,7 +4021,7 @@ OO.ui.CapsuleMultiSelectWidget.prototype.onPopupFocusOut = function () {
  * @private
  * @param {jQuery.Event} e Mouse down event
  */
-OO.ui.CapsuleMultiSelectWidget.prototype.onMouseDown = function ( e ) {
+OO.ui.CapsuleMultiselectWidget.prototype.onMouseDown = function ( e ) {
        if ( e.which === OO.ui.MouseButtons.LEFT ) {
                this.focus();
                return false;
@@ -4039,7 +4036,7 @@ OO.ui.CapsuleMultiSelectWidget.prototype.onMouseDown = function ( e ) {
  * @private
  * @param {jQuery.Event} e Key press event
  */
-OO.ui.CapsuleMultiSelectWidget.prototype.onKeyPress = function ( e ) {
+OO.ui.CapsuleMultiselectWidget.prototype.onKeyPress = function ( e ) {
        if ( !this.isDisabled() ) {
                if ( e.which === OO.ui.Keys.ESCAPE ) {
                        this.clearInput();
@@ -4067,7 +4064,7 @@ OO.ui.CapsuleMultiSelectWidget.prototype.onKeyPress = function ( e ) {
  * @private
  * @param {jQuery.Event} e Key down event
  */
-OO.ui.CapsuleMultiSelectWidget.prototype.onKeyDown = function ( e ) {
+OO.ui.CapsuleMultiselectWidget.prototype.onKeyDown = function ( e ) {
        if (
                !this.isDisabled() &&
                this.$input.val() === '' &&
@@ -4095,7 +4092,7 @@ OO.ui.CapsuleMultiSelectWidget.prototype.onKeyDown = function ( e ) {
  * @private
  * @param {jQuery.Event} e Event of some sort
  */
-OO.ui.CapsuleMultiSelectWidget.prototype.updateInputSize = function () {
+OO.ui.CapsuleMultiselectWidget.prototype.updateInputSize = function () {
        var $lastItem, direction, contentWidth, currentWidth, bestWidth;
        if ( !this.isDisabled() ) {
                this.$input.css( 'width', '1em' );
@@ -4133,7 +4130,7 @@ OO.ui.CapsuleMultiSelectWidget.prototype.updateInputSize = function () {
  *
  * @private
  */
-OO.ui.CapsuleMultiSelectWidget.prototype.updateIfHeightChanged = function () {
+OO.ui.CapsuleMultiselectWidget.prototype.updateIfHeightChanged = function () {
        var height = this.$element.height();
        if ( height !== this.height ) {
                this.height = height;
@@ -4148,7 +4145,7 @@ OO.ui.CapsuleMultiSelectWidget.prototype.updateIfHeightChanged = function () {
  * @private
  * @param {OO.ui.OptionWidget} item Chosen item
  */
-OO.ui.CapsuleMultiSelectWidget.prototype.onMenuChoose = function ( item ) {
+OO.ui.CapsuleMultiselectWidget.prototype.onMenuChoose = function ( item ) {
        if ( item && item.isVisible() ) {
                this.addItemsFromData( [ item.getData() ] );
                this.clearInput();
@@ -4160,9 +4157,9 @@ OO.ui.CapsuleMultiSelectWidget.prototype.onMenuChoose = function ( item ) {
  *
  * @private
  */
-OO.ui.CapsuleMultiSelectWidget.prototype.onMenuItemsChange = function () {
+OO.ui.CapsuleMultiselectWidget.prototype.onMenuItemsChange = function () {
        this.setItemsFromData( this.getItemsData() );
-       this.$element.toggleClass( 'oo-ui-capsuleMultiSelectWidget-empty', this.menu.isEmpty() );
+       this.$element.toggleClass( 'oo-ui-capsuleMultiselectWidget-empty', this.menu.isEmpty() );
 };
 
 /**
@@ -4170,7 +4167,7 @@ OO.ui.CapsuleMultiSelectWidget.prototype.onMenuItemsChange = function () {
  *
  * @private
  */
-OO.ui.CapsuleMultiSelectWidget.prototype.clearInput = function () {
+OO.ui.CapsuleMultiselectWidget.prototype.clearInput = function () {
        if ( this.$input ) {
                this.$input.val( '' );
                this.updateInputSize();
@@ -4186,11 +4183,11 @@ OO.ui.CapsuleMultiSelectWidget.prototype.clearInput = function () {
 /**
  * @inheritdoc
  */
-OO.ui.CapsuleMultiSelectWidget.prototype.setDisabled = function ( disabled ) {
+OO.ui.CapsuleMultiselectWidget.prototype.setDisabled = function ( disabled ) {
        var i, len;
 
        // Parent method
-       OO.ui.CapsuleMultiSelectWidget.parent.prototype.setDisabled.call( this, disabled );
+       OO.ui.CapsuleMultiselectWidget.parent.prototype.setDisabled.call( this, disabled );
 
        if ( this.$input ) {
                this.$input.prop( 'disabled', this.isDisabled() );
@@ -4215,17 +4212,14 @@ OO.ui.CapsuleMultiSelectWidget.prototype.setDisabled = function ( disabled ) {
  * Focus the widget
  *
  * @chainable
- * @return {OO.ui.CapsuleMultiSelectWidget}
+ * @return {OO.ui.CapsuleMultiselectWidget}
  */
-OO.ui.CapsuleMultiSelectWidget.prototype.focus = function () {
+OO.ui.CapsuleMultiselectWidget.prototype.focus = function () {
        if ( !this.isDisabled() ) {
                if ( this.popup ) {
                        this.popup.setSize( this.$handle.width() );
                        this.popup.toggle( true );
-                       this.popup.$element.find( '*' )
-                               .filter( function () { return OO.ui.isFocusableElement( $( this ), true ); } )
-                               .first()
-                               .focus();
+                       OO.ui.findFocusable( this.popup.$element ).focus();
                } else {
                        this.updateInputSize();
                        this.menu.toggle( true );
@@ -4235,6 +4229,12 @@ OO.ui.CapsuleMultiSelectWidget.prototype.focus = function () {
        return this;
 };
 
+/**
+ * @class
+ * @deprecated since 0.17.3; use OO.ui.CapsuleMultiselectWidget instead
+ */
+OO.ui.CapsuleMultiSelectWidget = OO.ui.CapsuleMultiselectWidget;
+
 /**
  * SelectFileWidgets allow for selecting files, using the HTML5 File API. These
  * widgets can be configured with {@link OO.ui.mixin.IconElement icons} and {@link
index 6dfe142..de80299 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.17.2
+ * OOjs UI v0.17.4
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2016 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2016-05-10T22:58:31Z
+ * Date: 2016-05-31T21:50:56Z
  */
 .oo-ui-actionWidget.oo-ui-pendingElement-pending {
        background-image: /* @embed */ url(themes/apex/images/textures/pending.gif);
index 9a544d6..5aaedc1 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.17.2
+ * OOjs UI v0.17.4
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2016 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2016-05-10T22:58:31Z
+ * Date: 2016-05-31T21:50:56Z
  */
 .oo-ui-window {
        background: transparent;
index 37b7d90..17bab01 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.17.2
+ * OOjs UI v0.17.4
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2016 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2016-05-10T22:58:27Z
+ * Date: 2016-05-31T21:50:52Z
  */
 ( function ( OO ) {
 
index bd26399..5b35e74 100644 (file)
@@ -23,7 +23,7 @@
                        "lang": {
                                "ar": "images/icons/bold-arab-ain.svg",
                                "be": "images/icons/bold-cyrl-te.svg",
-                               "cs,en,he,ml,pl,sco": "images/icons/bold-b.svg",
+                               "cs,en,en-ca,en-gb,he,ml,pl,sco": "images/icons/bold-b.svg",
                                "da,de,hu,ksh,nn,no,sv": "images/icons/bold-f.svg",
                                "es,gl,pt": "images/icons/bold-n.svg",
                                "eu,fi": "images/icons/bold-l.svg",
@@ -40,7 +40,7 @@
                        "default": "images/icons/italic-a.svg",
                        "lang": {
                                        "ar": "images/icons/italic-arab-meem.svg",
-                                       "cs,en,fr,he,ml,pl,pt,sco": "images/icons/italic-i.svg",
+                                       "cs,en,en-ca,en-gb,fr,he,ml,pl,pt,sco": "images/icons/italic-i.svg",
                                        "be,da,de,fi,ky,nn,no,os,sv,ru,uk": "images/icons/italic-k.svg",
                                        "es,gl,it,nl": "images/icons/italic-c.svg",
                                        "eu": "images/icons/italic-e.svg",
                "strikethrough": { "file": {
                        "default": "images/icons/strikethrough-a.svg",
                        "lang": {
-                               "en": "images/icons/strikethrough-s.svg",
+                               "en,en-ca,en-gb": "images/icons/strikethrough-s.svg",
                                "fi": "images/icons/strikethrough-y.svg"
                        }
                } },
                "underline": { "file": {
                        "default": "images/icons/underline-a.svg",
                        "lang": {
-                               "en": "images/icons/underline-u.svg"
+                               "en,en-ca,en-gb": "images/icons/underline-u.svg"
                        }
                } },
                "textLanguage": { "file": {
index 45c6a64..5c3d03a 100644 (file)
@@ -30,7 +30,7 @@
                        "lang": {
                                "ar": "images/icons/bold-arab-ain.svg",
                                "be": "images/icons/bold-cyrl-te.svg",
-                               "cs,en,he,ml,pl,sco": "images/icons/bold-b.svg",
+                               "cs,en,en-ca,en-gb,he,ml,pl,sco": "images/icons/bold-b.svg",
                                "da,de,hu,ksh,nn,no,sv": "images/icons/bold-f.svg",
                                "es,gl,pt": "images/icons/bold-n.svg",
                                "eu,fi": "images/icons/bold-l.svg",
@@ -47,7 +47,7 @@
                        "default": "images/icons/italic-a.svg",
                        "lang": {
                                        "ar": "images/icons/italic-arab-meem.svg",
-                                       "cs,en,fr,he,ml,pl,pt,sco": "images/icons/italic-i.svg",
+                                       "cs,en,en-ca,en-gb,fr,he,ml,pl,pt,sco": "images/icons/italic-i.svg",
                                        "be,da,de,fi,ky,nn,no,os,sv,ru,uk": "images/icons/italic-k.svg",
                                        "es,gl,it,nl": "images/icons/italic-c.svg",
                                        "eu": "images/icons/italic-e.svg",
                "strikethrough": { "file": {
                        "default": "images/icons/strikethrough-a.svg",
                        "lang": {
-                               "en": "images/icons/strikethrough-s.svg",
+                               "en,en-ca,en-gb": "images/icons/strikethrough-s.svg",
                                "fi": "images/icons/strikethrough-y.svg"
                        }
                } },
                "underline": { "file": {
                        "default": "images/icons/underline-a.svg",
                        "lang": {
-                               "en": "images/icons/underline-u.svg"
+                               "en,en-ca,en-gb": "images/icons/underline-u.svg"
                        }
                } },
                "textLanguage": { "file": {
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..95e92ae 100644 (file)
@@ -2,3 +2,7 @@
 #pagehistory li.after input[name="diff"] {
        visibility: hidden;
 }
+
+.updatedmarker {
+       background-color: #b7f430;
+}
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 d04e3a6..d387a2d 100644 (file)
@@ -249,6 +249,9 @@ div.thumbinner {
        padding: 3px !important;
        font-size: 94%;
        text-align: center;
+       /* new block formatting context,
+        * to clear background from floating content  */
+       overflow: hidden;
 }
 
 html .thumbimage {
@@ -261,8 +264,6 @@ html .thumbcaption {
        line-height: 1.4em;
        padding: 3px !important;
        font-size: 94%;
-       overflow: hidden;
-       word-wrap: break-word;
 }
 
 /* @noflip */
index 9adfba1..7ccf59e 100644 (file)
@@ -80,7 +80,7 @@ table.rimage {
 div.thumb {
        margin-bottom: .5em;
        border-style: solid;
-       border-color: white;
+       border-color: #fff;
        width: auto;
 }
 
@@ -90,6 +90,9 @@ div.thumbinner {
        background-color: #f9f9f9;
        font-size: 94%;
        text-align: center;
+       /* new block formatting context,
+        * to clear background from floating content  */
+       overflow: hidden;
 }
 
 html .thumbimage {
@@ -102,8 +105,6 @@ html .thumbcaption {
        padding: 3px;
        font-size: 94%;
        text-align: left;
-       overflow: hidden;
-       word-wrap: break-word;
 }
 
 div.magnify {
@@ -121,9 +122,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 +148,7 @@ div.tleft {
 }
 
 img.thumbborder {
-       border: 1px solid #dddddd;
+       border: 1px solid #ddd;
 }
 
 /* Page history styling */
@@ -212,7 +213,7 @@ table.toc td {
 }
 
 .error {
-       color: red;
+       color: #f00;
        font-size: larger;
 }
 
@@ -224,12 +225,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 +273,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 +291,7 @@ table.small {
 
 span.unpatrolled {
        font-weight: bold;
-       color: red;
-}
-
-span.updatedmarker {
-       color: black;
-       background-color: #00FF00;
+       color: #f00;
 }
 
 div.gallerybox {
@@ -308,14 +304,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 +321,7 @@ span.comment {
 
 .editExternallyHelp {
        font-style: italic;
-       color: gray;
+       color: #808080;
 }
 
 li span.deleted {
@@ -358,7 +354,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 +399,7 @@ table.mw_metadata td.spacer {
 }
 
 div.multipageimagenavbox {
-       border: solid 1px silver;
+       border: solid 1px #c0c0c0;
        padding: 4px;
        margin: 1em;
        background: #f0f0f0;
@@ -450,7 +446,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..85bf9f6 100644 (file)
@@ -152,6 +152,9 @@ div.thumbinner {
        background-color: #f9f9f9;
        font-size: 94%;
        text-align: center;
+       /* new block formatting context,
+        * to clear background from floating content  */
+       overflow: hidden;
 }
 
 html .thumbimage {
@@ -163,8 +166,6 @@ html .thumbcaption {
        line-height: 1.4em;
        padding: 3px;
        font-size: 94%;
-       overflow: hidden;
-       word-wrap: break-word;
        /* Default styles when there's no .mw-content-ltr or .mw-content-rtl, overridden below */
        text-align: left;
 }
@@ -187,9 +188,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 +199,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 +219,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 +239,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 afad5c6..2704514 100644 (file)
Binary files a/resources/src/mediawiki.skinning/images/magnify-clip-ltr.png and b/resources/src/mediawiki.skinning/images/magnify-clip-ltr.png differ
index 4ccc943..c8b2645 100644 (file)
Binary files a/resources/src/mediawiki.skinning/images/magnify-clip-rtl.png and b/resources/src/mediawiki.skinning/images/magnify-clip-rtl.png differ
index b57ee36..4ca2096 100644 (file)
        clear: both;
 }
 
+textarea {
+       /* Support Firefox: Border rule required to override system appearance on Linux */
+       border: 1px solid #c0c0c0;
+}
+
 .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 +31,7 @@
 .usermessage {
        background-color: #ffce7b;
        border: 1px solid #ffa500;
-       color: black;
+       color: #000;
        font-weight: bold;
        margin: 2em 0 1em;
        padding: .5em 1em;
index 3cfc52c..3d90307 100644 (file)
                                                        }
                                                } );
                                        } else if ( Util.apiBool( pi.multi ) ) {
-                                               widget = new OO.ui.CapsuleMultiSelectWidget( {
+                                               widget = new OO.ui.CapsuleMultiselectWidget( {
                                                        allowArbitrary: true
                                                } );
                                                widget.paramInfo = pi;
                                                return a.data - b.data;
                                        } );
                                        if ( Util.apiBool( pi.multi ) ) {
-                                               widget = new OO.ui.CapsuleMultiSelectWidget( {
+                                               widget = new OO.ui.CapsuleMultiselectWidget( {
                                                        menu: { items: items }
                                                } );
                                                widget.paramInfo = pi;
                                                return new OO.ui.MenuOptionWidget( { data: String( v ), label: String( v ) } );
                                        } );
                                        if ( Util.apiBool( pi.multi ) ) {
-                                               widget = new OO.ui.CapsuleMultiSelectWidget( {
+                                               widget = new OO.ui.CapsuleMultiselectWidget( {
                                                        menu: { items: items }
                                                } );
                                                widget.paramInfo = pi;
                                                throw new Error( 'Unknown multiMode "' + multiMode + '"' );
                                }
 
-                               widget = new OO.ui.CapsuleMultiSelectWidget( {
+                               widget = new OO.ui.CapsuleMultiselectWidget( {
                                        allowArbitrary: true,
                                        popup: {
                                                classes: [ 'mw-apisandbox-popup' ],
        *
        * @class mw.special.ApiSandbox
        */
-       mw.special.ApiSandbox = ApiSandbox = {
+       ApiSandbox = {
                /**
                 * Initialize the UI
                 *
                                                }
                                                if ( Util.apiBool( pi.parameters[ i ].multi ) ) {
                                                        tmp = [];
-                                                       if ( flag && !( widget instanceof OO.ui.CapsuleMultiSelectWidget ) &&
+                                                       if ( flag && !( widget instanceof OO.ui.CapsuleMultiselectWidget ) &&
                                                                !(
                                                                        widget instanceof OptionalWidget &&
-                                                                       widget.widget instanceof OO.ui.CapsuleMultiSelectWidget
+                                                                       widget.widget instanceof OO.ui.CapsuleMultiselectWidget
                                                                )
                                                        ) {
                                                                tmp.push( mw.message( 'api-help-param-multi-separate' ).parse() );
 
        $( ApiSandbox.init );
 
+       module.exports = ApiSandbox;
+
 }( jQuery, mediaWiki, OO ) );
diff --git a/resources/src/mediawiki.special/mediawiki.special.blocklist.css b/resources/src/mediawiki.special/mediawiki.special.blocklist.css
deleted file mode 100644 (file)
index b7513b6..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-.mw-htmlform-flatlist-item {\r
-       /* FIXME: There should be an option in OOUI to do that */\r
-       display: inline-block !important;\r
-}
\ No newline at end of file
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%;
 }
 
diff --git a/resources/src/mediawiki.special/mediawiki.special.js b/resources/src/mediawiki.special/mediawiki.special.js
deleted file mode 100644 (file)
index 630d162..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-/*!
- * Namespace for mediawiki.special.* modules
- */
-
-/**
- * @class mw.special
- * @singleton
- */
-mediaWiki.special = {};
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 */
 /*
index d43b62b..bdd45bc 100644 (file)
@@ -34,6 +34,6 @@
 
        $( rc.init );
 
-       mw.special.recentchanges = rc;
+       module.exports = rc;
 
 }( mediaWiki, jQuery ) );
old mode 100755 (executable)
new mode 100644 (file)
index 1ce9569..aad784e
@@ -1,181 +1,9 @@
-/* Special:Search */
-
-/*
- * Fixes sister projects box moving down the extract
- * of the first result (bug #16886).
- * It only happens when the window is small and
- * This changes slightly the layout for big screens
- * where there was space for the extracts and the
- * sister projects and thus it showed like in any
- * other browser.
- *
- * This will only affect IE 7 and lower
- */
-.searchresult {
-       display: inline !ie;
-}
-.searchresults {
-       margin: 1em 0 1em .4em;
-}
-/* needs extra specificity to override `.mw-body p` selector */
-.mw-body p.mw-search-nonefound {
-       margin: 0;
-}
-.mw-search-interwiki-header {
-       font-weight: bold;
-}
-.mw-search-nonefound + .mw-search-interwiki-header {
-       margin-top: 0;
-}
-div.searchresult {
-       font-size: 95%;
-       width: 38em;
-}
-.mw-search-results {
-       margin-left: 0;
-       float: left;
-}
-.mw-search-results li {
-       padding-bottom: 1.2em;
-       list-style: none;
-       list-style-image: none;
-}
-.mw-search-results li a {
-       font-size: 108%;
-}
-.mw-search-result-data {
-       color: green;
-       font-size: 97%;
-}
-.mw-search-profile-tabs {
-       background-color: #f3f3f3;
-       margin-top: 1em;
-       border: 1px solid silver;
-}
-.mw-search-profile-tabs div.search-types {
-       float: left;
-       padding-left: 0.25em;
-}
-.mw-search-profile-tabs div.search-types ul {
-       margin: 0;
-       padding: 0;
-       list-style: none;
-}
-.mw-search-profile-tabs div.search-types ul li {
-       float: left;
-       margin: 0;
-       padding: 0;
-}
-.mw-search-profile-tabs div.search-types ul li a {
-       display: block;
-       padding: 0.5em;
-}
-.mw-search-profile-tabs div.search-types ul li.current a {
-       color: #333333;
-       cursor: default;
-}
-.mw-search-profile-tabs div.search-types ul li.current a:hover {
-       text-decoration: none;
-}
-#mw-search-top-table div.results-info {
-       float: right;
-       padding: 0.5em;
-       padding-right: 0.75em;
-       color: #666;
-       font-size: 95%;
-}
-
-fieldset#mw-searchoptions {
-       margin: 0;
-       padding: 0.5em 0.75em 0.75em 0.75em;
-       border: none;
-       background-color: #f9f9f9;
-       border: 1px solid silver;
-       border-top-width: 0;
-}
-fieldset#mw-searchoptions legend {
-       display: none;
-}
-fieldset#mw-searchoptions h4 {
-       padding: 0;
-       margin: 0;
-       float: left;
-}
-fieldset#mw-searchoptions div#mw-search-togglebox {
+#mw-search-togglebox {
        float: right;
 }
-fieldset#mw-searchoptions div#mw-search-togglebox label {
+#mw-search-togglebox label {
        margin-right: 0.25em;
 }
-fieldset#mw-searchoptions div#mw-search-togglebox input {
+#mw-search-togglebox input {
        margin-left: 0.25em;
 }
-fieldset#mw-searchoptions table {
-       float: left;
-       margin-right: 3em;
-       border-collapse: collapse;
-}
-fieldset#mw-searchoptions table td {
-       padding: 0 1em 0 0;
-       white-space: nowrap;
-}
-fieldset#mw-searchoptions div.divider {
-       clear: both;
-       border-bottom: 1px solid #DDDDDD;
-       padding-top: 0.5em;
-       margin-bottom: 0.5em;
-}
-td#mw-search-menu {
-       padding-left:6em;
-       font-size:85%;
-}
-div#mw-search-interwiki {
-       float: right;
-       width: 18em;
-       border: 1px solid #AAAAAA;
-       margin-top: 2ex;
-}
-div#mw-search-interwiki li {
-       font-size: 95%;
-}
-.mw-search-interwiki-more {
-       float: right;
-       font-size: 90%;
-}
-div#mw-search-interwiki-caption {
-       text-align: center;
-       font-weight: bold;
-       font-size: 95%;
-}
-.mw-search-interwiki-project {
-       font-size: 97%;
-       text-align: left;
-       padding: 0.15em 0.15em 0.2em 0.2em;
-       background-color: #ececec;
-       border-top: 1px solid #BBBBBB;
-}
-span.searchalttitle {
-       font-size: 95%;
-}
-div.searchdidyoumean {
-       font-size: 127%;
-       margin-top: 0.8em;
-       /* Note that this color won't affect the link, as desired. */
-       color: #c00;
-}
-div.searchdidyoumean em {
-       font-weight: bold;
-}
-.searchmatch {
-       font-weight: bold;
-}
-/* Advanced PowerSearch box */
-td#mw-search-togglebox {
-       text-align: right;
-}
-table#mw-search-powertable {
-       width: 100%;
-}
-form#powersearch {
-       clear: both;
-}
diff --git a/resources/src/mediawiki.special/mediawiki.special.search.styles.css b/resources/src/mediawiki.special/mediawiki.special.search.styles.css
new file mode 100644 (file)
index 0000000..26c500d
--- /dev/null
@@ -0,0 +1,164 @@
+/* Special:Search */
+
+/*
+ * Fixes sister projects box moving down the extract
+ * of the first result (bug #16886).
+ * It only happens when the window is small and
+ * This changes slightly the layout for big screens
+ * where there was space for the extracts and the
+ * sister projects and thus it showed like in any
+ * other browser.
+ *
+ * This will only affect IE 7 and lower
+ */
+.searchresult {
+       display: inline !ie;
+}
+.searchresults {
+       margin: 1em 0 1em .4em;
+}
+/* needs extra specificity to override `.mw-body p` selector */
+.mw-body p.mw-search-nonefound {
+       margin: 0;
+}
+.mw-search-interwiki-header {
+       font-weight: bold;
+}
+.mw-search-nonefound + .mw-search-interwiki-header {
+       margin-top: 0;
+}
+div.searchresult {
+       font-size: 95%;
+       width: 38em;
+}
+.mw-search-results {
+       margin-left: 0;
+       float: left;
+}
+.mw-search-results li {
+       padding-bottom: 1.2em;
+       list-style: none;
+       list-style-image: none;
+}
+.mw-search-results li a {
+       font-size: 108%;
+}
+.mw-search-result-data {
+       color: #008000;
+       font-size: 97%;
+}
+.mw-search-profile-tabs {
+       background-color: #f3f3f3;
+       margin-top: 1em;
+       border: 1px solid #c0c0c0;
+}
+.mw-search-profile-tabs div.search-types {
+       float: left;
+       padding-left: 0.25em;
+}
+.mw-search-profile-tabs div.search-types ul {
+       margin: 0;
+       padding: 0;
+       list-style: none;
+}
+.mw-search-profile-tabs div.search-types ul li {
+       float: left;
+       margin: 0;
+       padding: 0;
+}
+.mw-search-profile-tabs div.search-types ul li a {
+       display: block;
+       padding: 0.5em;
+}
+.mw-search-profile-tabs div.search-types ul li.current a {
+       color: #333;
+       cursor: default;
+}
+.mw-search-profile-tabs div.search-types ul li.current a:hover {
+       text-decoration: none;
+}
+#mw-search-top-table div.results-info {
+       float: right;
+       padding: 0.5em;
+       padding-right: 0.75em;
+       color: #666;
+       font-size: 95%;
+}
+#mw-search-top-table div.oo-ui-actionFieldLayout {
+       float: left;
+}
+fieldset#mw-searchoptions {
+       margin: 0;
+       padding: 0.5em 0.75em 0.75em 0.75em;
+       border: none;
+       background-color: #f9f9f9;
+       border: 1px solid #c0c0c0;
+       border-top-width: 0;
+}
+fieldset#mw-searchoptions legend {
+       display: none;
+}
+fieldset#mw-searchoptions h4 {
+       padding: 0;
+       margin: 0;
+       float: left;
+}
+fieldset#mw-searchoptions table {
+       float: left;
+       margin-right: 3em;
+       border-collapse: collapse;
+}
+fieldset#mw-searchoptions table td {
+       padding: 0 1em 0 0;
+       white-space: nowrap;
+}
+fieldset#mw-searchoptions div.divider {
+       clear: both;
+       border-bottom: 1px solid #ddd;
+       padding-top: 0.5em;
+       margin-bottom: 0.5em;
+}
+td#mw-search-menu {
+       padding-left: 6em;
+       font-size: 85%;
+}
+div#mw-search-interwiki {
+       float: right;
+       width: 18em;
+       border: 1px solid #aaa;
+       margin-top: 2ex;
+}
+div#mw-search-interwiki li {
+       font-size: 95%;
+}
+.mw-search-interwiki-more {
+       float: right;
+       font-size: 90%;
+}
+div#mw-search-interwiki-caption {
+       text-align: center;
+       font-weight: bold;
+       font-size: 95%;
+}
+.mw-search-interwiki-project {
+       font-size: 97%;
+       text-align: left;
+       padding: 0.15em 0.15em 0.2em 0.2em;
+       background-color: #ececec;
+       border-top: 1px solid #bbb;
+}
+span.searchalttitle {
+       font-size: 95%;
+}
+div.searchdidyoumean {
+       font-size: 127%;
+       margin-top: 0.8em;
+       /* Note that this color won't affect the link, as desired. */
+       color: #c00;
+}
+div.searchdidyoumean em {
+       font-weight: bold;
+}
+.searchmatch {
+       font-weight: bold;
+}
diff --git a/resources/src/mediawiki.special/mediawiki.special.upload.css b/resources/src/mediawiki.special/mediawiki.special.upload.css
deleted file mode 100644 (file)
index b916248..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-/*!
- * Styling for Special:Upload
- */
-.mw-destfile-warning {
-       border: 1px solid #fde29b;
-       padding: .5em 1em;
-       margin-bottom: 1em;
-       color: #705000;
-       background-color: #fdf1d1;
-}
diff --git a/resources/src/mediawiki.special/mediawiki.special.upload.styles.css b/resources/src/mediawiki.special/mediawiki.special.upload.styles.css
new file mode 100644 (file)
index 0000000..b916248
--- /dev/null
@@ -0,0 +1,10 @@
+/*!
+ * Styling for Special:Upload
+ */
+.mw-destfile-warning {
+       border: 1px solid #fde29b;
+       padding: .5em 1em;
+       margin-bottom: 1em;
+       color: #705000;
+       background-color: #fdf1d1;
+}
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 2eb84e6..0bdf02e 100644 (file)
                        .text( this.label )
                        .attr( 'target', '_blank' )
                        .on( 'click', function ( e ) {
-                               // CapsuleMultiSelectWidget really wants to prevent you from clicking the link, don't let it
+                               // CapsuleMultiselectWidget really wants to prevent you from clicking the link, don't let it
                                e.stopPropagation();
                        } );
 
index 5d7d115..45f52b7 100644 (file)
@@ -9,7 +9,7 @@
                NS_CATEGORY = mw.config.get( 'wgNamespaceIds' ).category;
 
        /**
-        * Category selector widget. Displays an OO.ui.CapsuleMultiSelectWidget
+        * Category selector widget. Displays an OO.ui.CapsuleMultiselectWidget
         * and autocompletes with available categories.
         *
         *     var selector = new mw.widgets.CategorySelector( {
@@ -25,7 +25,7 @@
         *
         * @class mw.widgets.CategorySelector
         * @uses mw.Api
-        * @extends OO.ui.CapsuleMultiSelectWidget
+        * @extends OO.ui.CapsuleMultiselectWidget
         * @mixins OO.ui.mixin.PendingElement
         *
         * @constructor
@@ -67,7 +67,7 @@
 
        /* Setup */
 
-       OO.inheritClass( CategorySelector, OO.ui.CapsuleMultiSelectWidget );
+       OO.inheritClass( CategorySelector, OO.ui.CapsuleMultiselectWidget );
        OO.mixinClass( CategorySelector, OO.ui.mixin.PendingElement );
        CSP = CategorySelector.prototype;
 
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;
        }
 
diff --git a/resources/src/mediawiki/api/rollback.js b/resources/src/mediawiki/api/rollback.js
new file mode 100644 (file)
index 0000000..eb2b3fc
--- /dev/null
@@ -0,0 +1,34 @@
+/**
+ * @class mw.Api.plugin.rollback
+ * @since 1.27
+ */
+( function ( mw, $ ) {
+
+       $.extend( mw.Api.prototype, {
+               /**
+                * Convenience method for `action=rollback`.
+                *
+                * @param {string|mw.Title} page
+                * @param {string} user
+                * @param {Object} [params] Additional parameters
+                * @return {jQuery.Promise}
+                */
+               rollback: function ( page, user, params ) {
+                       return this.postWithToken( 'rollback', $.extend( {
+                               action: 'rollback',
+                               title: String( page ),
+                               user: user,
+                               uselang: mw.config.get( 'wgUserLanguage' )
+                       }, params ) )
+                       .then( function ( data ) {
+                               return data.rollback;
+                       } );
+               }
+       } );
+
+       /**
+        * @class mw.Api
+        * @mixins mw.Api.plugin.rollback
+        */
+
+}( mediaWiki, jQuery ) );
index 16fec73..0f61d97 100644 (file)
 
                                                // Update license messages
                                                return msgPromise.then( function () {
-                                                       booklet.$ownWorkMessage
-                                                               .msg( 'upload-form-label-own-work-message-' + msgs )
-                                                               .find( 'a' ).attr( 'target', '_blank' );
-                                                       booklet.$notOwnWorkMessage
-                                                               .msg( 'upload-form-label-not-own-work-message-' + msgs )
-                                                               .find( 'a' ).attr( 'target', '_blank' );
-                                                       booklet.$notOwnWorkLocal
-                                                               .msg( 'upload-form-label-not-own-work-local-' + msgs )
-                                                               .find( 'a' ).attr( 'target', '_blank' );
+                                                       var $labels;
+                                                       booklet.$ownWorkMessage.msg( 'upload-form-label-own-work-message-' + msgs );
+                                                       booklet.$notOwnWorkMessage.msg( 'upload-form-label-not-own-work-message-' + msgs );
+                                                       booklet.$notOwnWorkLocal.msg( 'upload-form-label-not-own-work-local-' + msgs );
+
+                                                       $labels = $( [
+                                                               booklet.$ownWorkMessage[ 0 ],
+                                                               booklet.$notOwnWorkMessage[ 0 ],
+                                                               booklet.$notOwnWorkLocal[ 0 ]
+                                                       ] );
+
+                                                       // Improve the behavior of links inside these labels, which may point to important
+                                                       // things like licensing requirements or terms of use
+                                                       $labels.find( 'a' )
+                                                               .attr( 'target', '_blank' )
+                                                               .on( 'click', function ( e ) {
+                                                                       // OO.ui.FieldLayout#onLabelClick is trying to prevent default on all clicks,
+                                                                       // which causes the links to not be openable. Don't let it do that.
+                                                                       e.stopPropagation();
+                                                               } );
                                                } );
                                        } )
                                );
index 6859592..ff4d1c2 100644 (file)
                                // Thumbnails
                                /\/[a-f0-9]\/[a-f0-9]{2}\/([^\s\/]+)\/[^\s\/]+-[^\s\/]*$/,
 
-                               // Thumbnails in non-hashed upload directories
-                               /\/([^\s\/]+)\/[^\s\/]+-(?:\1|thumbnail)[^\s\/]*$/,
-
                                // Full size images
                                /\/[a-f0-9]\/[a-f0-9]{2}\/([^\s\/]+)$/,
 
+                               // Thumbnails in non-hashed upload directories
+                               /\/([^\s\/]+)\/[^\s\/]+-(?:\1|thumbnail)[^\s\/]*$/,
+
                                // Full-size images in non-hashed upload directories
                                /\/([^\s\/]+)$/
                        ],
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..3cca6eb 100644 (file)
@@ -65,7 +65,7 @@
        font-size: 13px;
        /* IE-hack for display: inline-block */
        zoom: 1;
-       *display:inline;
+       *display: inline;
 }
 
 .mw-debug-panelink {
@@ -95,6 +95,7 @@ a.mw-debug-panelabel:visited {
        height: 300px;
        overflow: scroll;
        display: none;
+       font-family: monospace;
        font-size: 11px;
        background-color: #e1eff2;
        box-sizing: border-box;
@@ -115,7 +116,7 @@ a.mw-debug-panelabel:visited {
        th,
        td,
        table {
-               border: 1px solid #D0DBB3;
+               border: 1px solid #d0dbb3;
                border-collapse: collapse;
                margin: 0;
        }
@@ -127,12 +128,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 8f0ad6b..5b9d88c 100644 (file)
@@ -19,6 +19,8 @@
        width: 39%;
 }
 
-.oo-ui-fieldLayout .oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline {
-  margin-bottom: 0;
+.mw-htmlform-flatlist .oo-ui-optionWidget,
+.mw-htmlform-flatlist .oo-ui-multioptionWidget {
+       display: inline-block;
+       margin-right: 1em;
 }
index b8d0b09..50fef14 100644 (file)
         *
         * This method is only available when jqueryMsg is loaded.
         *
+        * @since 1.27
         * @method parseDom
         * @member mw.Message
         * @return {jQuery}
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 8dc8a61..2ce54e4 100644 (file)
         * Add the appropriate prefix to the accesskey shown in the tooltip.
         *
         * If the `$nodes` parameter is given, only those nodes are updated;
-        * otherwise, depending on browser support, we update either all elements
-        * with accesskeys on the page or a bunch of elements which are likely to
-        * have them on core skins.
+        * otherwise we update all elements with accesskeys on the page.
         *
         * @method updateTooltipAccessKeys
         * @param {Array|jQuery} [$nodes] A jQuery object, or array of nodes to update.
         */
        mw.log.deprecate( util, 'updateTooltipAccessKeys', function ( $nodes ) {
                if ( !$nodes ) {
-                       if ( document.querySelectorAll ) {
-                               // If we're running on a browser where we can do this efficiently,
-                               // just find all elements that have accesskeys. We can't use jQuery's
-                               // polyfill for the selector since looping over all elements on page
-                               // load might be too slow.
-                               $nodes = $( document.querySelectorAll( '[accesskey]' ) );
-                       } else {
-                               // Otherwise go through some elements likely to have accesskeys rather
-                               // than looping over all of them. Unfortunately this will not fully
-                               // work for custom skins with different HTML structures. Input, label
-                               // and button should be rare enough that no optimizations are needed.
-                               $nodes = $( '#column-one a, #mw-head a, #mw-panel a, #p-logo a, input, label, button' );
-                       }
+                       $nodes = $( '[accesskey]' );
                } else if ( !( $nodes instanceof $ ) ) {
                        $nodes = $( $nodes );
                }
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..89bbbe7 100644 (file)
                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())
+                       // Preload the notification module for mw.notify
                        mw.loader.load( 'mediawiki.notification' );
 
                        // Hide the link and create a spinner to show it inside the brackets.
@@ -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', {
index 2ad79eb..3b779d1 100644 (file)
                }
 
                // Add accesskey hints to the tooltips
-               if ( document.querySelectorAll ) {
-                       // If we're running on a browser where we can do this efficiently,
-                       // just find all elements that have accesskeys. We can't use jQuery's
-                       // polyfill for the selector since looping over all elements on page
-                       // load might be too slow.
-                       $nodes = $( document.querySelectorAll( '[accesskey]' ) );
-               } else {
-                       // Otherwise go through some elements likely to have accesskeys rather
-                       // than looping over all of them. Unfortunately this will not fully
-                       // work for custom skins with different HTML structures. Input, label
-                       // and button should be rare enough that no optimizations are needed.
-                       $nodes = $( '#column-one a, #mw-head a, #mw-panel a, #p-logo a, input, label, button' );
-               }
-               $nodes.updateTooltipAccessKeys();
+               $( '[accesskey]' ).updateTooltipAccessKeys();
 
                // Infuse OOUI widgets, if any are present
                $oouiNodes = $( '[data-ooui]' );
diff --git a/resources/src/mediawiki/page/rollback.js b/resources/src/mediawiki/page/rollback.js
new file mode 100644 (file)
index 0000000..d973d07
--- /dev/null
@@ -0,0 +1,66 @@
+/*!
+ * Enhance rollback links by using asynchronous API requests,
+ * rather than navigating to an action page.
+ *
+ * @since 1.27
+ * @author Timo Tijhof
+ */
+( function ( mw, $ ) {
+
+       $( function () {
+               $( '.mw-rollback-link' ).on( 'click', 'a[data-mw="interface"]', function ( e ) {
+                       var api, $spinner,
+                               $link = $( this ),
+                               url = this.href,
+                               page = mw.util.getParamValue( 'title', url ),
+                               user = mw.util.getParamValue( 'from', url );
+
+                       if ( !page || !user ) {
+                               // Let native browsing handle the link
+                               return true;
+                       }
+
+                       // Preload the notification module for mw.notify
+                       mw.loader.load( 'mediawiki.notification' );
+
+                       // Remove event handler so that next click (re-try) uses server action
+                       $( e.delegateTarget ).off( 'click' );
+
+                       // Hide the link and create a spinner to show it inside the brackets.
+                       $spinner = $.createSpinner( { size: 'small', type: 'inline' } );
+                       $link.hide().after( $spinner );
+
+                       api = new mw.Api();
+                       api.rollback( page, user )
+                               .then( function ( data ) {
+                                       mw.notify( $.parseHTML( data.messageHtml ), {
+                                               title: mw.msg( 'actioncomplete' )
+                                       } );
+
+                                       // Remove link container and the subsequent text node containing " | ".
+                                       if ( e.delegateTarget.nextSibling && e.delegateTarget.nextSibling.nodeType === Node.TEXT_NODE ) {
+                                               $( e.delegateTarget.nextSibling ).remove();
+                                       }
+                                       $( e.delegateTarget ).remove();
+                               }, function ( errorCode, data ) {
+                                       var message = data && data.error && data.error.messageHtml
+                                               ? $.parseHTML( data.error.messageHtml )
+                                               : mw.msg( 'rollbackfailed' ),
+                                               type = errorCode === 'alreadyrolled' ? 'warn' : 'error';
+
+                                       mw.notify( message, {
+                                               type: type,
+                                               title: mw.msg( 'rollbackfailed' ),
+                                               autoHide: false
+                                       } );
+
+                                       // Restore the link (enables user to try again)
+                                       $spinner.remove();
+                                       $link.show();
+                               } );
+
+                       e.preventDefault();
+               } );
+       } );
+
+}( mediaWiki, jQuery ) );
index a57d5c7..c59f5ba 100644 (file)
                $links.click( function ( e ) {
                        var action, api, $link;
 
-                       // Start preloading the notification module (normally loaded by mw.notify())
+                       // Preload the notification module for mw.notify
                        mw.loader.load( 'mediawiki.notification' );
 
                        action = mwUriGetAction( this.href );
 
                        if ( action !== 'watch' && action !== 'unwatch' ) {
-                               // Could not extract target action from link url,
-                               // let native browsing handle it further
+                               // Let native browsing handle the link
                                return true;
                        }
                        e.preventDefault();
index 9af0598..dd33b00 100644 (file)
@@ -27,7 +27,7 @@ moment.locale( moment.locale(), {
                if ( mw.config.get( 'wgTranslateNumerals' ) ) {
                        for ( i = 0; i < 10; i++ ) {
                                if ( table[ i ] !== undefined ) {
-                                       s = s.replace( new RegExp( mw.RegExp.escape( i ), 'g' ), table[ i ] );
+                                       s = s.replace( new RegExp( i, 'g' ), table[ i ] );
                                }
                        }
                }
index ebb6d90..8b100a2 100644 (file)
@@ -46,6 +46,7 @@ $wgAutoloadClasses += [
        'ResourceLoaderTestModule' => "$testDir/phpunit/ResourceLoaderTestCase.php",
        'ResourceLoaderFileModuleTestModule' => "$testDir/phpunit/ResourceLoaderTestCase.php",
        'TestUser' => "$testDir/phpunit/includes/TestUser.php",
+       'TestUserRegistry' => "$testDir/phpunit/includes/TestUserRegistry.php",
        'LessFileCompilationTest' => "$testDir/phpunit/LessFileCompilationTest.php",
 
        # tests/phpunit/includes
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 1be2d62..132743f 100644 (file)
@@ -342,7 +342,8 @@ class ParserTest {
                $services->resetServiceForTesting( 'TitleFormatter' );
                $services->resetServiceForTesting( 'TitleParser' );
                $services->resetServiceForTesting( '_MediaWikiTitleCodec' );
-
+               $services->resetServiceForTesting( 'LinkRenderer' );
+               $services->resetServiceForTesting( 'LinkRendererFactory' );
        }
 
        public function setupRecorder( $options ) {
@@ -890,7 +891,7 @@ class ParserTest {
                        'wgMaxTocLevel' => $maxtoclevel,
                        'wgCapitalLinks' => true,
                        'wgNoFollowLinks' => true,
-                       'wgNoFollowDomainExceptions' => [],
+                       'wgNoFollowDomainExceptions' => [ 'no-nofollow.org' ],
                        'wgThumbnailScriptPath' => false,
                        'wgUseImageResize' => true,
                        'wgSVGConverter' => 'null',
index 7051b4f..1f1d53b 100644 (file)
@@ -2265,6 +2265,17 @@ Entities inside <pre>
 
 !! end
 
+!! test
+<nowiki> inside of #tag:pre
+!! wikitext
+{{#tag:pre|Foo <nowiki>&rarr;bar</nowiki>}}
+!! html/php
+<pre>Foo &#8594;bar</pre>
+
+!! html/parsoid
+<pre about="#mwt1" typeof="mw:Transclusion" data-parsoid='{"pi":[[{"k":"1"}]]}' data-mw='{"parts":[{"template":{"target":{"wt":"#tag:pre","function":"#tag"},"params":{"1":{"wt":"Foo &lt;nowiki>&amp;rarr;bar&lt;/nowiki>"}},"i":0}}]}'>Foo <span typeof="mw:Entity">→</span>bar</pre>
+!! end
+
 !! test
 <nowiki> and <pre> preference (first one wins)
 !! wikitext
@@ -2813,7 +2824,7 @@ parsoid
 !! wikitext
 {{echo|[{{fullurl:{{FULLPAGENAME}}|action=edit}} bar]}}
 !! html
-<p typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"[{{fullurl:{{FULLPAGENAME}}|action=edit}} bar]"}},"i":0}}]}'>[Main Page bar]</p>
+<p typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"[{{fullurl:{{FULLPAGENAME}}|action=edit}} bar]"}},"i":0}}]}'>[Main_Page bar]</p>
 !! end
 
 !! test
@@ -4771,6 +4782,15 @@ ok-<a rel="nofollow" class="external free" href="http://example.com">http://exam
 </p>
 !! end
 
+!! test
+External links: nofollow domain exception
+!! wikitext
+A [https://no-nofollow.org/foobar link], and another [https://example.org link].
+!! html
+<p>A <a class="external text" href="https://no-nofollow.org/foobar">link</a>, and another <a rel="nofollow" class="external text" href="https://example.org">link</a>.
+</p>
+!!end
+
 !! test
 External image
 !! wikitext
@@ -7150,6 +7170,79 @@ parsoid={
 |}
 !!end
 
+!! test
+Testing selser after addition of new row before first row (T125419)
+!! options
+parsoid={
+  "modes": ["wt2wt", "selser"],
+  "changes": [
+    [ "tr", "before", "<tr><td>X</td></tr>" ]
+  ]
+}
+!! wikitext
+{|
+|a
+|}
+!! wikitext/edited
+{|
+|X
+|-
+|a
+|}
+!! end
+
+!! test
+Serialize new table rows in a HTML table using HTML tags
+!! options
+parsoid={
+  "modes": ["wt2wt", "selser"],
+  "changes": [
+    [ "tr", "before", "<tr><td>X</td></tr>" ]
+  ]
+}
+!! wikitext
+<table><tr><td>a</td></tr></table>
+!! wikitext/edited
+<table><tr><td>X</td></tr><tr><td>a</td></tr></table>
+!! end
+
+!! test
+Serialize new table cells in a HTML row using HTML tags
+!! options
+parsoid={
+  "modes": ["wt2wt", "selser"],
+  "changes": [
+    [ "td", "before", "<td>X</td>" ]
+  ]
+}
+!! wikitext
+<table><tr><td>a</td></tr></table>
+!! wikitext/edited
+<table><tr><td>X</td><td>a</td></tr></table>
+!! end
+
+!! test
+Wikitext tables can be nested inside HTML tables
+!! options
+parsoid=html2wt
+!! html
+<table data-parsoid='{"stx":"html"}'>
+<tr><td>
+<table>
+<tr><td>foo</td></tr>
+</table>
+</td></tr>
+</table>
+!! wikitext
+<table>
+<tr><td>
+{|
+|foo
+|}
+</td></tr>
+</table>
+!! end
+
 ###
 ### Internal links
 ###
@@ -7480,7 +7573,7 @@ Example for such a section: == < ==
 <p><a href="#.3C">#&lt;</a><a href="#.3E">#&gt;</a>
 </p>
 !! html/parsoid
-<p><a rel="mw:WikiLink" href="./Main%20Page#%3C" title="Main Page">#&lt;</a><a rel="mw:WikiLink" href="./Main%20Page#%3E" title="Main Page">#></a></p>
+<p><a rel="mw:WikiLink" href="./Main_Page#%3C" title="Main Page">#&lt;</a><a rel="mw:WikiLink" href="./Main_Page#%3E" title="Main Page">#></a></p>
 !! end
 
 !! test
@@ -9931,7 +10024,7 @@ Parsoid: Page property magic word with magic word contents
 !! wikitext
 {{DISPLAYTITLE:''{{PAGENAME}}''}}
 !! html/parsoid
-<meta property="mw:PageProp/displaytitle" content="Main Page" about="#mwt2" typeof="mw:ExpandedAttrs" data-parsoid='{"src":"{{DISPLAYTITLE:&#39;&#39;{{PAGENAME}}&#39;&#39;}}"}' data-mw='{"attribs":[[{"txt":"content"},{"html":"&lt;i data-parsoid=&#39;{\"dsr\":[15,31,2,2]}&#39;>&lt;span about=\"#mwt1\" typeof=\"mw:Transclusion\" data-parsoid=&#39;{\"pi\":[[]],\"dsr\":[17,29,null,null]}&#39; data-mw=&#39;{\"parts\":[{\"template\":{\"target\":{\"wt\":\"PAGENAME\",\"function\":\"pagename\"},\"params\":{},\"i\":0}}]}&#39;>Main Page&lt;/span>&lt;/i>"}]]}'/>
+<meta property="mw:PageProp/displaytitle" content="Main_Page" about="#mwt2" typeof="mw:ExpandedAttrs" data-parsoid='{"src":"{{DISPLAYTITLE:&#39;&#39;{{PAGENAME}}&#39;&#39;}}"}' data-mw='{"attribs":[[{"txt":"content"},{"html":"&lt;i data-parsoid=&#39;{\"dsr\":[15,31,2,2]}&#39;>&lt;span about=\"#mwt1\" typeof=\"mw:Transclusion\" data-parsoid=&#39;{\"pi\":[[]],\"dsr\":[17,29,null,null]}&#39; data-mw=&#39;{\"parts\":[{\"template\":{\"target\":{\"wt\":\"PAGENAME\",\"function\":\"pagename\"},\"params\":{},\"i\":0}}]}&#39;>Main_Page&lt;/span>&lt;/i>"}]]}'/>
 !! end
 
 !! test
@@ -13150,7 +13243,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 +13277,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
 
@@ -13944,7 +14037,7 @@ Redirected image
 !! wikitext
 [[Image:Barfoo.jpg]]
 !! html/php
-<p><a href="/wiki/File:Barfoo.jpg" title="File:Barfoo.jpg">File:Barfoo.jpg</a>
+<p><a href="/wiki/File:Barfoo.jpg" class="mw-redirect" title="File:Barfoo.jpg">File:Barfoo.jpg</a>
 </p>
 !! end
 
@@ -20646,7 +20739,6 @@ this is not the the title
 !! html/php
 Screen
 <p>this is not the the title
-<span class="error"><strong>Warning:</strong> Display title "whatever" was ignored since it is not equivalent to the page's actual title.</span>
 </p>
 !! end
 
index 9f3aa11..8dfe628 100644 (file)
@@ -127,6 +127,42 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
                self::prepareServices( new GlobalVarConfig() );
        }
 
+       /**
+        * Convenience method for getting an immutable test user
+        *
+        * @since 1.28
+        *
+        * @param string[] $groups Groups the test user should be in.
+        * @return TestUser
+        */
+       public static function getTestUser( $groups = [] ) {
+               return TestUserRegistry::getImmutableTestUser( $groups );
+       }
+
+       /**
+        * Convenience method for getting a mutable test user
+        *
+        * @since 1.28
+        *
+        * @param string[] $groups Groups the test user should be added in.
+        * @return TestUser
+        */
+       public static function getMutableTestUser( $groups = [] ) {
+               return TestUserRegistry::getMutableTestUser( __CLASS__, $groups );
+       }
+
+       /**
+        * Convenience method for getting an immutable admin test user
+        *
+        * @since 1.28
+        *
+        * @param string[] $groups Groups the test user should be added to.
+        * @return TestUser
+        */
+       public static function getTestSysop() {
+               return self::getTestUser( [ 'sysop', 'bureaucrat' ] );
+       }
+
        /**
         * Prepare service configuration for unit testing.
         *
@@ -221,6 +257,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 ] );
@@ -318,7 +357,7 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
 
                $needsResetDB = false;
 
-               if ( $this->needsDB() ) {
+               if ( !self::$dbSetup || $this->needsDB() ) {
                        // set up a DB connection for this test to use
 
                        self::$useTemporaryTables = !$this->getCliArg( 'use-normal-tables' );
@@ -597,6 +636,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 +694,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];
+                                       }
                                }
                        }
                }
@@ -848,7 +919,7 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
        protected function insertPage( $pageName, $text = 'Sample page for unit test.' ) {
                $title = Title::newFromText( $pageName, 0 );
 
-               $user = User::newFromName( 'UTSysop' );
+               $user = static::getTestSysop()->getUser();
                $comment = __METHOD__ . ': Sample page for unit test.';
 
                // Avoid memory leak...?
@@ -899,36 +970,33 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
 
                        # Insert 0 user to prevent FK violations
                        # Anonymous user
-                       $this->db->insert( 'user', [
-                               'user_id' => 0,
-                               'user_name' => 'Anonymous' ], __METHOD__, [ 'IGNORE' ] );
+                       if ( !$this->db->selectField( 'user', '1', [ 'user_id' => 0 ] ) ) {
+                               $this->db->insert( 'user', [
+                                       'user_id' => 0,
+                                       'user_name' => 'Anonymous' ], __METHOD__, [ 'IGNORE' ] );
+                       }
 
                        # Insert 0 page to prevent FK violations
                        # Blank page
-                       $this->db->insert( 'page', [
-                               'page_id' => 0,
-                               'page_namespace' => 0,
-                               'page_title' => ' ',
-                               'page_restrictions' => null,
-                               'page_is_redirect' => 0,
-                               'page_is_new' => 0,
-                               'page_random' => 0,
-                               'page_touched' => $this->db->timestamp(),
-                               'page_latest' => 0,
-                               'page_len' => 0 ], __METHOD__, [ 'IGNORE' ] );
+                       if ( !$this->db->selectField( 'page', '1', [ 'page_id' => 0 ] ) ) {
+                               $this->db->insert( 'page', [
+                                       'page_id' => 0,
+                                       'page_namespace' => 0,
+                                       'page_title' => ' ',
+                                       'page_restrictions' => null,
+                                       'page_is_redirect' => 0,
+                                       'page_is_new' => 0,
+                                       'page_random' => 0,
+                                       'page_touched' => $this->db->timestamp(),
+                                       'page_latest' => 0,
+                                       'page_len' => 0 ], __METHOD__, [ 'IGNORE' ] );
+                       }
                }
 
                User::resetIdByNameCache();
 
                // Make sysop user
-               $user = User::newFromName( 'UTSysop' );
-
-               if ( $user->idForName() == 0 ) {
-                       $user->addToDatabase();
-                       TestUser::setPasswordForUser( $user, 'UTSysopPassword' );
-                       $user->addGroup( 'sysop' );
-                       $user->addGroup( 'bureaucrat' );
-               }
+               $user = static::getTestSysop()->getUser();
 
                // Make 1 page with 1 revision
                $page = WikiPage::factory( Title::newFromText( 'UTPage' ) );
@@ -1147,11 +1215,7 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
                        // If any of the user tables were marked as used, we should clear all of them.
                        if ( array_intersect( $tablesUsed, $userTables ) ) {
                                $tablesUsed = array_unique( array_merge( $tablesUsed, $userTables ) );
-
-                               // Totally clear User class in-process cache to avoid CAS errors
-                               TestingAccessWrapper::newFromClass( 'User' )
-                                       ->getInProcessCache()
-                                       ->clear();
+                               TestUserRegistry::clear();
                        }
 
                        $truncate = in_array( $db->getType(), [ 'oracle', 'mysql' ] );
@@ -1586,32 +1650,6 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
                }
        }
 
-       /**
-        * Check whether we have the 'gzip' commandline utility, will skip
-        * the test whenever "gzip -V" fails.
-        *
-        * Result is cached at the process level.
-        *
-        * @return bool
-        *
-        * @since 1.21
-        */
-       protected function checkHasGzip() {
-               static $haveGzip;
-
-               if ( $haveGzip === null ) {
-                       $retval = null;
-                       wfShellExec( 'gzip -V', $retval );
-                       $haveGzip = ( $retval === 0 );
-               }
-
-               if ( !$haveGzip ) {
-                       $this->markTestSkipped( "Skip test, requires the gzip utility in PATH" );
-               }
-
-               return $haveGzip;
-       }
-
        /**
         * Check if $extName is a loaded PHP extension, will skip the
         * test whenever it is not loaded.
index 85bf954..275ed27 100644 (file)
@@ -30,6 +30,9 @@ abstract class ResourceLoaderTestCase extends MediaWikiTestCase {
                        // For ResourceLoader::inDebugMode since it doesn't have context
                        'ResourceLoaderDebug' => true,
 
+                       // For ResourceLoaderContext::newDummyContext()
+                       'DefaultSkin' => 'vector',
+
                        // Avoid influence from wgInvalidateCacheOnLocalSettingsChange
                        'CacheEpoch' => '20140101000000',
 
diff --git a/tests/phpunit/data/css/bom.css b/tests/phpunit/data/css/bom.css
new file mode 100644 (file)
index 0000000..3382ea4
--- /dev/null
@@ -0,0 +1 @@
+.efbbbf_bom_char_at_start_of_file {}
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..b7f7880 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * @group Database
  */
@@ -15,8 +17,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
                );
        }
 
@@ -32,35 +36,35 @@ class LinkerTest extends MediaWikiLangTestCase {
                        # ## ANONYMOUS USER ########################################
                        [
                                '<a href="/wiki/Special:Contributions/JohnDoe" '
-                                       . 'title="Special:Contributions/JohnDoe" '
-                                       . 'class="mw-userlink mw-anonuserlink">JohnDoe</a>',
+                                       . 'class="mw-userlink mw-anonuserlink" '
+                                       . 'title="Special:Contributions/JohnDoe">JohnDoe</a>',
                                0, 'JohnDoe', false,
                        ],
                        [
                                '<a href="/wiki/Special:Contributions/::1" '
-                                       . 'title="Special:Contributions/::1" '
-                                       . 'class="mw-userlink mw-anonuserlink">::1</a>',
+                                       . 'class="mw-userlink mw-anonuserlink" '
+                                       . 'title="Special:Contributions/::1">::1</a>',
                                0, '::1', false,
                                'Anonymous with pretty IPv6'
                        ],
                        [
                                '<a href="/wiki/Special:Contributions/0:0:0:0:0:0:0:1" '
-                                       . 'title="Special:Contributions/0:0:0:0:0:0:0:1" '
-                                       . 'class="mw-userlink mw-anonuserlink">::1</a>',
+                                       . 'class="mw-userlink mw-anonuserlink" '
+                                       . 'title="Special:Contributions/0:0:0:0:0:0:0:1">::1</a>',
                                0, '0:0:0:0:0:0:0:1', false,
                                'Anonymous with almost pretty IPv6'
                        ],
                        [
                                '<a href="/wiki/Special:Contributions/0000:0000:0000:0000:0000:0000:0000:0001" '
-                                       . 'title="Special:Contributions/0000:0000:0000:0000:0000:0000:0000:0001" '
-                                       . 'class="mw-userlink mw-anonuserlink">::1</a>',
+                                       . 'class="mw-userlink mw-anonuserlink" '
+                                       . 'title="Special:Contributions/0000:0000:0000:0000:0000:0000:0000:0001">::1</a>',
                                0, '0000:0000:0000:0000:0000:0000:0000:0001', false,
                                'Anonymous with full IPv6'
                        ],
                        [
                                '<a href="/wiki/Special:Contributions/::1" '
-                                       . 'title="Special:Contributions/::1" '
-                                       . 'class="mw-userlink mw-anonuserlink">AlternativeUsername</a>',
+                                       . 'class="mw-userlink mw-anonuserlink" '
+                                       . 'title="Special:Contributions/::1">AlternativeUsername</a>',
                                0, '::1', 'AlternativeUsername',
                                'Anonymous with pretty IPv6 and an alternative username'
                        ],
@@ -68,15 +72,15 @@ class LinkerTest extends MediaWikiLangTestCase {
                        # IPV4
                        [
                                '<a href="/wiki/Special:Contributions/127.0.0.1" '
-                                       . 'title="Special:Contributions/127.0.0.1" '
-                                       . 'class="mw-userlink mw-anonuserlink">127.0.0.1</a>',
+                                       . 'class="mw-userlink mw-anonuserlink" '
+                                       . 'title="Special:Contributions/127.0.0.1">127.0.0.1</a>',
                                0, '127.0.0.1', false,
                                'Anonymous with IPv4'
                        ],
                        [
                                '<a href="/wiki/Special:Contributions/127.0.0.1" '
-                                       . 'title="Special:Contributions/127.0.0.1" '
-                                       . 'class="mw-userlink mw-anonuserlink">AlternativeUsername</a>',
+                                       . 'class="mw-userlink mw-anonuserlink" '
+                                       . 'title="Special:Contributions/127.0.0.1">AlternativeUsername</a>',
                                0, '127.0.0.1', 'AlternativeUsername',
                                'Anonymous with IPv4 and an alternative username'
                        ],
@@ -359,6 +363,7 @@ class LinkerTest extends MediaWikiLangTestCase {
        }
 
        /**
+        * @covers MediaWiki\Linker\LinkRenderer::runLegacyBeginHook
         * @dataProvider provideLinkBeginHook
         */
        public function testLinkBeginHook( $callback, $expected ) {
@@ -405,6 +410,7 @@ class LinkerTest extends MediaWikiLangTestCase {
        }
 
        /**
+        * @covers MediaWiki\Linker\LinkRenderer::buildAElement
         * @dataProvider provideLinkEndHook
         */
        public function testLinkEndHook( $callback, $expected ) {
@@ -418,4 +424,53 @@ class LinkerTest extends MediaWikiLangTestCase {
                $out = Linker::link( $title );
                $this->assertEquals( $expected, $out );
        }
+
+       /**
+        * @covers Linker::getLinkColour
+        */
+       public function testGetLinkColour() {
+               $linkCache = MediaWikiServices::getInstance()->getLinkCache();
+               $foobarTitle = Title::makeTitle( NS_MAIN, 'FooBar' );
+               $redirectTitle = Title::makeTitle( NS_MAIN, 'Redirect' );
+               $userTitle = Title::makeTitle( NS_USER, 'Someuser' );
+               $linkCache->addGoodLinkObj(
+                       1, // id
+                       $foobarTitle,
+                       10, // len
+                       0 // redir
+               );
+               $linkCache->addGoodLinkObj(
+                       2, // id
+                       $redirectTitle,
+                       10, // len
+                       1 // redir
+               );
+
+               $linkCache->addGoodLinkObj(
+                       3, // id
+                       $userTitle,
+                       10, // len
+                       0 // redir
+               );
+
+               $this->assertEquals(
+                       '',
+                       Linker::getLinkColour( $foobarTitle, 0 )
+               );
+
+               $this->assertEquals(
+                       'stub',
+                       Linker::getLinkColour( $foobarTitle, 20 )
+               );
+
+               $this->assertEquals(
+                       'mw-redirect',
+                       Linker::getLinkColour( $redirectTitle, 0 )
+               );
+
+               $this->assertEquals(
+                       '',
+                       Linker::getLinkColour( $userTitle, 20 )
+               );
+       }
 }
index 51ef9d7..0e13721 100644 (file)
@@ -1,6 +1,11 @@
 <?php
 use Liuggio\StatsdClient\Factory\StatsdDataFactory;
+use MediaWiki\Interwiki\InterwikiLookup;
+use MediaWiki\Linker\LinkRenderer;
+use MediaWiki\Linker\LinkRendererFactory;
 use MediaWiki\MediaWikiServices;
+use MediaWiki\Services\DestructibleService;
+use MediaWiki\Services\SalvageableService;
 use MediaWiki\Services\ServiceDisabledException;
 
 /**
@@ -8,7 +13,7 @@ use MediaWiki\Services\ServiceDisabledException;
  *
  * @group MediaWiki
  */
-class MediaWikiServicesTest extends PHPUnit_Framework_TestCase {
+class MediaWikiServicesTest extends MediaWikiTestCase {
 
        /**
         * @return Config
@@ -65,9 +70,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 +174,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 +307,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 ],
@@ -244,6 +317,8 @@ class MediaWikiServicesTest extends PHPUnit_Framework_TestCase {
                        'WatchedItemStore' => [ 'WatchedItemStore', WatchedItemStore::class ],
                        'GenderCache' => [ 'GenderCache', GenderCache::class ],
                        'LinkCache' => [ 'LinkCache', LinkCache::class ],
+                       'LinkRenderer' => [ 'LinkRenderer', LinkRenderer::class ],
+                       'LinkRendererFactory' => [ 'LinkRendererFactory', LinkRendererFactory::class ],
                        '_MediaWikiTitleCodec' => [ '_MediaWikiTitleCodec', MediaWikiTitleCodec::class ],
                        'TitleFormatter' => [ 'TitleFormatter', TitleFormatter::class ],
                        'TitleParser' => [ 'TitleParser', TitleParser::class ],
index 22f6fa6..f44ae32 100644 (file)
@@ -97,13 +97,12 @@ class MergeHistoryTest extends MediaWikiTestCase {
                );
 
                // Sysop with mergehistory permission
-               $sysop = User::newFromName( 'UTSysop' );
+               $sysop = static::getTestSysop()->getUser();
                $status = $mh->checkPermissions( $sysop, '' );
                $this->assertTrue( $status->isOK() );
 
                // Normal user
-               $notSysop = User::newFromName( 'UTNotSysop' );
-               $notSysop->addToDatabase();
+               $notSysop = static::getTestUser()->getUser();
                $status = $mh->checkPermissions( $notSysop, '' );
                $this->assertTrue( $status->hasMessage( 'mergehistory-fail-permission' ) );
        }
@@ -118,7 +117,8 @@ class MergeHistoryTest extends MediaWikiTestCase {
                        Title::newFromText( 'Merge2' )
                );
 
-               $mh->merge( User::newFromName( 'UTSysop' ) );
+               $sysop = static::getTestSysop()->getUser();
+               $mh->merge( $sysop );
                $this->assertEquals( $mh->getMergedRevisionCount(), 1 );
        }
 }
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..8b8cbcd 100644 (file)
@@ -78,6 +78,12 @@ class TestUser {
                        $this->user->removeGroup( $group );
                }
                if ( $change ) {
+                       // Disable CAS check before saving. The User object may have been initialized from cached
+                       // information that may be out of whack with the database during testing. If tests were
+                       // perfectly isolated, this would not happen. But if it does happen, let's just ignore the
+                       // inconsistency, and just write the data we want - during testing, we are not worried
+                       // about data loss.
+                       $this->user->mTouched = '';
                        $this->user->saveSettings();
                }
        }
@@ -129,17 +135,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__
+                       );
+               }
        }
 
        /**
diff --git a/tests/phpunit/includes/TestUserRegistry.php b/tests/phpunit/includes/TestUserRegistry.php
new file mode 100644 (file)
index 0000000..4818b49
--- /dev/null
@@ -0,0 +1,110 @@
+<?php
+
+/**
+ * @since 1.28
+ */
+class TestUserRegistry {
+
+       /** @var TestUser[] (group key => TestUser) */
+       private static $testUsers = [];
+
+       /** @var int Count of users that have been generated */
+       private static $counter = 0;
+
+       /** @var int Random int, included in IDs */
+       private static $randInt;
+
+       public static function getNextId() {
+               if ( !self::$randInt ) {
+                       self::$randInt = mt_rand( 1, 0xFFFFFF );
+               }
+               return sprintf( '%06x.%03x', self::$randInt, ++self::$counter );
+       }
+
+       /**
+        * Get a TestUser object that the caller may modify.
+        *
+        * @since 1.28
+        *
+        * @param string $testName Caller's __CLASS__. Used to generate the
+        *  user's username.
+        * @param string[] $groups Groups the test user should be added to.
+        * @return TestUser
+        */
+       public static function getMutableTestUser( $testName, $groups = [] ) {
+               $id = self::getNextId();
+               $password = wfRandomString( 20 );
+               $testUser = new TestUser(
+                       "TestUser $testName $id",  // username
+                       "Name $id",                // real name
+                       "$id@mediawiki.test",      // e-mail
+                       $groups,                   // groups
+                       $password                  // password
+               );
+               $testUser->getUser()->clearInstanceCache();
+               return $testUser;
+       }
+
+       /**
+        * Get a TestUser object that the caller may not modify.
+        *
+        * Whenever possible, unit tests should use immutable users, because
+        * immutable users can be reused in multiple tests, which helps keep
+        * the unit tests fast.
+        *
+        * @since 1.28
+        *
+        * @param string[] $groups Groups the test user should be added to.
+        * @return TestUser
+        */
+       public static function getImmutableTestUser( $groups = [] ) {
+               $groups = array_unique( $groups );
+               sort( $groups );
+               $key = implode( ',', $groups );
+
+               $testUser = isset( self::$testUsers[$key] )
+                       ? self::$testUsers[$key]
+                       : false;
+
+               if ( !$testUser || !$testUser->getUser()->isLoggedIn() ) {
+                       $id = self::getNextId();
+                       // Hack! If this is the primary sysop account, make the username
+                       // be 'UTSysop', for back-compat, and for the sake of PHPUnit data
+                       // provider methods, which are executed before the test database
+                       // is set up. See T136348.
+                       if ( $groups === [ 'bureaucrat', 'sysop' ] ) {
+                               $username = 'UTSysop';
+                               $password = 'UTSysopPassword';
+                       } else {
+                               $username = "TestUser $id";
+                               $password = wfRandomString( 20 );
+                       }
+                       self::$testUsers[$key] = $testUser = new TestUser(
+                               $username,            // username
+                               "Name $id",           // real name
+                               "$id@mediawiki.test", // e-mail
+                               $groups,              // groups
+                               $password             // password
+                       );
+               }
+
+               $testUser->getUser()->clearInstanceCache();
+               return self::$testUsers[$key];
+       }
+
+       /**
+        * Clear the registry.
+        *
+        * TestUsers created by this class will not be deleted, but any handles
+        * to existing immutable TestUsers will be deleted, ensuring these users
+        * are not reused. We don't reset the counter or random string by design.
+        *
+        * @since 1.28
+        *
+        * @param string[] $groups Groups the test user should be added to.
+        * @return TestUser
+        */
+       public static function clear() {
+               self::$testUsers = [];
+       }
+}
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' );
+       }
 }
index f1f9295..def9c5d 100644 (file)
@@ -21,14 +21,12 @@ class ApiQueryWatchlistIntegrationTest extends ApiTestCase {
 
        protected function setUp() {
                parent::setUp();
-               self::$users['ApiQueryWatchlistIntegrationTestUser']
-                       = new TestUser( 'ApiQueryWatchlistIntegrationTestUser' );
-               self::$users['ApiQueryWatchlistIntegrationTestUser2']
-                       = new TestUser( 'ApiQueryWatchlistIntegrationTestUser2' );
+               self::$users['ApiQueryWatchlistIntegrationTestUser'] = $this->getMutableTestUser();
+               self::$users['ApiQueryWatchlistIntegrationTestUser2'] = $this->getMutableTestUser();
                $this->doLogin( 'ApiQueryWatchlistIntegrationTestUser' );
        }
 
-       private function getTestUser() {
+       private function getLoggedInTestUser() {
                return self::$users['ApiQueryWatchlistIntegrationTestUser']->getUser();
        }
 
@@ -36,10 +34,6 @@ class ApiQueryWatchlistIntegrationTest extends ApiTestCase {
                return self::$users['ApiQueryWatchlistIntegrationTestUser2']->getUser();
        }
 
-       private function getSysopTestUser() {
-               return self::$users['sysop']->getUser();
-       }
-
        private function doPageEdit( User $user, LinkTarget $target, $content, $summary ) {
                $title = Title::newFromLinkTarget( $target );
                $page = WikiPage::factory( $title );
@@ -244,7 +238,7 @@ class ApiQueryWatchlistIntegrationTest extends ApiTestCase {
        }
 
        private function cleanTestUsersWatchlist() {
-               $user = $this->getTestUser();
+               $user = $this->getLoggedInTestUser();
                $store = $this->getWatchedItemStore();
                $items = $store->getWatchedItemsForUser( $user );
                foreach ( $items as $item ) {
@@ -257,7 +251,7 @@ class ApiQueryWatchlistIntegrationTest extends ApiTestCase {
                // the user with the same user ID as user used here as the test user
                $this->cleanTestUsersWatchlist();
 
-               $user = $this->getTestUser();
+               $user = $this->getLoggedInTestUser();
                $target = new TitleValue( 0, 'ApiQueryWatchlistIntegrationTestPage' );
                $this->doPageEdit(
                        $user,
@@ -290,7 +284,7 @@ class ApiQueryWatchlistIntegrationTest extends ApiTestCase {
        }
 
        public function testIdsPropParameter() {
-               $user = $this->getTestUser();
+               $user = $this->getLoggedInTestUser();
                $target = new TitleValue( 0, 'ApiQueryWatchlistIntegrationTestPage' );
                $this->doPageEdit(
                        $user,
@@ -311,7 +305,7 @@ class ApiQueryWatchlistIntegrationTest extends ApiTestCase {
        }
 
        public function testTitlePropParameter() {
-               $user = $this->getTestUser();
+               $user = $this->getLoggedInTestUser();
                $subjectTarget = new TitleValue( 0, 'ApiQueryWatchlistIntegrationTestPage' );
                $talkTarget = new TitleValue( 1, 'ApiQueryWatchlistIntegrationTestPage' );
                $this->doPageEdits(
@@ -351,7 +345,7 @@ class ApiQueryWatchlistIntegrationTest extends ApiTestCase {
        }
 
        public function testFlagsPropParameter() {
-               $user = $this->getTestUser();
+               $user = $this->getLoggedInTestUser();
                $normalEditTarget = new TitleValue( 0, 'ApiQueryWatchlistIntegrationTestPage' );
                $minorEditTarget = new TitleValue( 0, 'ApiQueryWatchlistIntegrationTestPageM' );
                $botEditTarget = new TitleValue( 0, 'ApiQueryWatchlistIntegrationTestPageB' );
@@ -412,7 +406,7 @@ class ApiQueryWatchlistIntegrationTest extends ApiTestCase {
        }
 
        public function testUserPropParameter() {
-               $user = $this->getTestUser();
+               $user = $this->getLoggedInTestUser();
                $userEditTarget = new TitleValue( 0, 'ApiQueryWatchlistIntegrationTestPage' );
                $anonEditTarget = new TitleValue( 0, 'ApiQueryWatchlistIntegrationTestPageA' );
                $this->doPageEdit(
@@ -447,7 +441,7 @@ class ApiQueryWatchlistIntegrationTest extends ApiTestCase {
        }
 
        public function testUserIdPropParameter() {
-               $user = $this->getTestUser();
+               $user = $this->getLoggedInTestUser();
                $userEditTarget = new TitleValue( 0, 'ApiQueryWatchlistIntegrationTestPage' );
                $anonEditTarget = new TitleValue( 0, 'ApiQueryWatchlistIntegrationTestPageA' );
                $this->doPageEdit(
@@ -484,7 +478,7 @@ class ApiQueryWatchlistIntegrationTest extends ApiTestCase {
        }
 
        public function testCommentPropParameter() {
-               $user = $this->getTestUser();
+               $user = $this->getLoggedInTestUser();
                $target = new TitleValue( 0, 'ApiQueryWatchlistIntegrationTestPage' );
                $this->doPageEdit(
                        $user,
@@ -508,7 +502,7 @@ class ApiQueryWatchlistIntegrationTest extends ApiTestCase {
        }
 
        public function testParsedCommentPropParameter() {
-               $user = $this->getTestUser();
+               $user = $this->getLoggedInTestUser();
                $target = new TitleValue( 0, 'ApiQueryWatchlistIntegrationTestPage' );
                $this->doPageEdit(
                        $user,
@@ -532,7 +526,7 @@ class ApiQueryWatchlistIntegrationTest extends ApiTestCase {
        }
 
        public function testTimestampPropParameter() {
-               $user = $this->getTestUser();
+               $user = $this->getLoggedInTestUser();
                $target = new TitleValue( 0, 'ApiQueryWatchlistIntegrationTestPage' );
                $this->doPageEdit(
                        $user,
@@ -551,7 +545,7 @@ class ApiQueryWatchlistIntegrationTest extends ApiTestCase {
        }
 
        public function testSizesPropParameter() {
-               $user = $this->getTestUser();
+               $user = $this->getLoggedInTestUser();
                $target = new TitleValue( 0, 'ApiQueryWatchlistIntegrationTestPage' );
                $this->doPageEdit(
                        $user,
@@ -585,7 +579,7 @@ class ApiQueryWatchlistIntegrationTest extends ApiTestCase {
                        'Create the page'
                );
                $store = $this->getWatchedItemStore();
-               $store->addWatch( $this->getTestUser(), $target );
+               $store->addWatch( $this->getLoggedInTestUser(), $target );
                $store->updateNotificationTimestamp(
                        $otherUser,
                        $target,
@@ -620,7 +614,8 @@ class ApiQueryWatchlistIntegrationTest extends ApiTestCase {
        }
 
        public function testPatrolPropParameter() {
-               $user = $this->getSysopTestUser();
+               $testUser = static::getTestSysop();
+               $user = $testUser->getUser();
                $this->setupPatrolledSpecificFixtures( $user );
 
                $result = $this->doListWatchlistRequest( [ 'wlprop' => 'patrol', ], $user );
@@ -639,7 +634,7 @@ class ApiQueryWatchlistIntegrationTest extends ApiTestCase {
 
        private function createPageAndDeleteIt( LinkTarget $target ) {
                $this->doPageEdit(
-                       $this->getTestUser(),
+                       $this->getLoggedInTestUser(),
                        $target,
                        'Some Content',
                        'Create the page that will be deleted'
@@ -651,7 +646,7 @@ class ApiQueryWatchlistIntegrationTest extends ApiTestCase {
                $target = new TitleValue( 0, 'ApiQueryWatchlistIntegrationTestPage' );
                $this->createPageAndDeleteIt( $target );
 
-               $this->watchPages( $this->getTestUser(), [ $target ] );
+               $this->watchPages( $this->getLoggedInTestUser(), [ $target ] );
 
                $result = $this->doListWatchlistRequest( [ 'wlprop' => 'loginfo', ] );
 
@@ -671,7 +666,7 @@ class ApiQueryWatchlistIntegrationTest extends ApiTestCase {
        }
 
        public function testEmptyPropParameter() {
-               $user = $this->getTestUser();
+               $user = $this->getLoggedInTestUser();
                $target = new TitleValue( 0, 'ApiQueryWatchlistIntegrationTestPage' );
                $this->doPageEdit(
                        $user,
@@ -694,7 +689,7 @@ class ApiQueryWatchlistIntegrationTest extends ApiTestCase {
        }
 
        public function testNamespaceParam() {
-               $user = $this->getTestUser();
+               $user = $this->getLoggedInTestUser();
                $subjectTarget = new TitleValue( 0, 'ApiQueryWatchlistIntegrationTestPage' );
                $talkTarget = new TitleValue( 1, 'ApiQueryWatchlistIntegrationTestPage' );
                $this->doPageEdits(
@@ -729,7 +724,7 @@ class ApiQueryWatchlistIntegrationTest extends ApiTestCase {
        }
 
        public function testUserParam() {
-               $user = $this->getTestUser();
+               $user = $this->getLoggedInTestUser();
                $otherUser = $this->getNonLoggedInTestUser();
                $subjectTarget = new TitleValue( 0, 'ApiQueryWatchlistIntegrationTestPage' );
                $talkTarget = new TitleValue( 1, 'ApiQueryWatchlistIntegrationTestPage' );
@@ -766,7 +761,7 @@ class ApiQueryWatchlistIntegrationTest extends ApiTestCase {
        }
 
        public function testExcludeUserParam() {
-               $user = $this->getTestUser();
+               $user = $this->getLoggedInTestUser();
                $otherUser = $this->getNonLoggedInTestUser();
                $subjectTarget = new TitleValue( 0, 'ApiQueryWatchlistIntegrationTestPage' );
                $talkTarget = new TitleValue( 1, 'ApiQueryWatchlistIntegrationTestPage' );
@@ -803,7 +798,7 @@ class ApiQueryWatchlistIntegrationTest extends ApiTestCase {
        }
 
        public function testShowMinorParams() {
-               $user = $this->getTestUser();
+               $user = $this->getLoggedInTestUser();
                $target = new TitleValue( 0, 'ApiQueryWatchlistIntegrationTestPage' );
                $this->doPageEdits(
                        $user,
@@ -837,7 +832,7 @@ class ApiQueryWatchlistIntegrationTest extends ApiTestCase {
        }
 
        public function testShowBotParams() {
-               $user = $this->getTestUser();
+               $user = $this->getLoggedInTestUser();
                $target = new TitleValue( 0, 'ApiQueryWatchlistIntegrationTestPage' );
                $this->doBotPageEdit(
                        $user,
@@ -861,7 +856,7 @@ class ApiQueryWatchlistIntegrationTest extends ApiTestCase {
        }
 
        public function testShowAnonParams() {
-               $user = $this->getTestUser();
+               $user = $this->getLoggedInTestUser();
                $target = new TitleValue( 0, 'ApiQueryWatchlistIntegrationTestPage' );
                $this->doAnonPageEdit(
                        $target,
@@ -890,7 +885,7 @@ class ApiQueryWatchlistIntegrationTest extends ApiTestCase {
        }
 
        public function testShowUnreadParams() {
-               $user = $this->getTestUser();
+               $user = $this->getLoggedInTestUser();
                $otherUser = $this->getNonLoggedInTestUser();
                $subjectTarget = new TitleValue( 0, 'ApiQueryWatchlistIntegrationTestPage' );
                $talkTarget = new TitleValue( 1, 'ApiQueryWatchlistIntegrationTestPage' );
@@ -948,7 +943,7 @@ class ApiQueryWatchlistIntegrationTest extends ApiTestCase {
        }
 
        public function testShowPatrolledParams() {
-               $user = $this->getSysopTestUser();
+               $user = static::getTestSysop()->getUser();
                $this->setupPatrolledSpecificFixtures( $user );
 
                $resultPatrolled = $this->doListWatchlistRequest( [
@@ -974,7 +969,7 @@ class ApiQueryWatchlistIntegrationTest extends ApiTestCase {
        }
 
        public function testNewAndEditTypeParameters() {
-               $user = $this->getTestUser();
+               $user = $this->getLoggedInTestUser();
                $subjectTarget = new TitleValue( 0, 'ApiQueryWatchlistIntegrationTestPage' );
                $talkTarget = new TitleValue( 1, 'ApiQueryWatchlistIntegrationTestPage' );
                $this->doPageEdits(
@@ -1025,7 +1020,7 @@ class ApiQueryWatchlistIntegrationTest extends ApiTestCase {
        }
 
        public function testLogTypeParameters() {
-               $user = $this->getTestUser();
+               $user = $this->getLoggedInTestUser();
                $subjectTarget = new TitleValue( 0, 'ApiQueryWatchlistIntegrationTestPage' );
                $talkTarget = new TitleValue( 1, 'ApiQueryWatchlistIntegrationTestPage' );
                $this->createPageAndDeleteIt( $subjectTarget );
@@ -1093,7 +1088,7 @@ class ApiQueryWatchlistIntegrationTest extends ApiTestCase {
        }
 
        public function testExternalTypeParameters() {
-               $user = $this->getTestUser();
+               $user = $this->getLoggedInTestUser();
                $subjectTarget = new TitleValue( 0, 'ApiQueryWatchlistIntegrationTestPage' );
                $talkTarget = new TitleValue( 1, 'ApiQueryWatchlistIntegrationTestPage' );
                $this->doPageEdit(
@@ -1129,7 +1124,7 @@ class ApiQueryWatchlistIntegrationTest extends ApiTestCase {
        }
 
        public function testCategorizeTypeParameter() {
-               $user = $this->getTestUser();
+               $user = $this->getLoggedInTestUser();
                $subjectTarget = new TitleValue( 0, 'ApiQueryWatchlistIntegrationTestPage' );
                $categoryTarget = new TitleValue( NS_CATEGORY, 'ApiQueryWatchlistIntegrationTestCategory' );
                $this->doPageEdits(
@@ -1180,7 +1175,7 @@ class ApiQueryWatchlistIntegrationTest extends ApiTestCase {
        }
 
        public function testLimitParam() {
-               $user = $this->getTestUser();
+               $user = $this->getLoggedInTestUser();
                $target1 = new TitleValue( 0, 'ApiQueryWatchlistIntegrationTestPage' );
                $target2 = new TitleValue( 1, 'ApiQueryWatchlistIntegrationTestPage' );
                $target3 = new TitleValue( 0, 'ApiQueryWatchlistIntegrationTestPage2' );
@@ -1249,7 +1244,7 @@ class ApiQueryWatchlistIntegrationTest extends ApiTestCase {
        }
 
        public function testAllRevParam() {
-               $user = $this->getTestUser();
+               $user = $this->getLoggedInTestUser();
                $target = new TitleValue( 0, 'ApiQueryWatchlistIntegrationTestPage' );
                $this->doPageEdits(
                        $user,
@@ -1299,7 +1294,7 @@ class ApiQueryWatchlistIntegrationTest extends ApiTestCase {
        }
 
        public function testDirParams() {
-               $user = $this->getTestUser();
+               $user = $this->getLoggedInTestUser();
                $subjectTarget = new TitleValue( 0, 'ApiQueryWatchlistIntegrationTestPage' );
                $talkTarget = new TitleValue( 1, 'ApiQueryWatchlistIntegrationTestPage' );
                $this->doPageEdits(
@@ -1355,7 +1350,7 @@ class ApiQueryWatchlistIntegrationTest extends ApiTestCase {
        }
 
        public function testStartEndParams() {
-               $user = $this->getTestUser();
+               $user = $this->getLoggedInTestUser();
                $target = new TitleValue( 0, 'ApiQueryWatchlistIntegrationTestPage' );
                $this->doPageEdit(
                        $user,
@@ -1390,7 +1385,7 @@ class ApiQueryWatchlistIntegrationTest extends ApiTestCase {
        }
 
        public function testContinueParam() {
-               $user = $this->getTestUser();
+               $user = $this->getLoggedInTestUser();
                $target1 = new TitleValue( 0, 'ApiQueryWatchlistIntegrationTestPage' );
                $target2 = new TitleValue( 1, 'ApiQueryWatchlistIntegrationTestPage' );
                $target3 = new TitleValue( 0, 'ApiQueryWatchlistIntegrationTestPage2' );
@@ -1456,7 +1451,7 @@ class ApiQueryWatchlistIntegrationTest extends ApiTestCase {
        public function testOwnerAndTokenParams() {
                $target = new TitleValue( 0, 'ApiQueryWatchlistIntegrationTestPage' );
                $this->doPageEdit(
-                       $this->getTestUser(),
+                       $this->getLoggedInTestUser(),
                        $target,
                        'Some Content',
                        'Create the page'
@@ -1509,7 +1504,7 @@ class ApiQueryWatchlistIntegrationTest extends ApiTestCase {
        }
 
        public function testGeneratorWatchlistPropInfo_returnsWatchedPages() {
-               $user = $this->getTestUser();
+               $user = $this->getLoggedInTestUser();
                $target = new TitleValue( 0, 'ApiQueryWatchlistIntegrationTestPage' );
                $this->doPageEdit(
                        $user,
@@ -1541,7 +1536,7 @@ class ApiQueryWatchlistIntegrationTest extends ApiTestCase {
        }
 
        public function testGeneratorWatchlistPropRevisions_returnsWatchedItemsRevisions() {
-               $user = $this->getTestUser();
+               $user = $this->getLoggedInTestUser();
                $target = new TitleValue( 0, 'ApiQueryWatchlistIntegrationTestPage' );
                $this->doPageEdits(
                        $user,
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 ff5640a..e90b46f 100644 (file)
@@ -8,11 +8,6 @@ abstract class ApiTestCase extends MediaWikiLangTestCase {
         */
        protected $apiContext;
 
-       /**
-        * @var array
-        */
-       protected $tablesUsed = [ 'user', 'user_groups', 'user_properties' ];
-
        protected function setUp() {
                global $wgServer, $wgDisableAuthManager;
 
@@ -22,18 +17,8 @@ abstract class ApiTestCase extends MediaWikiLangTestCase {
                ApiQueryInfo::resetTokenCache(); // tokens are invalid because we cleared the session
 
                self::$users = [
-                       'sysop' => new TestUser(
-                               'Apitestsysop',
-                               'Api Test Sysop',
-                               'api_test_sysop@example.com',
-                               [ 'sysop' ]
-                       ),
-                       'uploader' => new TestUser(
-                               'Apitestuser',
-                               'Api Test User',
-                               'api_test_user@example.com',
-                               []
-                       )
+                       'sysop' => static::getTestSysop(),
+                       'uploader' => static::getTestUser(),
                ];
 
                $this->setMwGlobals( [
@@ -162,15 +147,19 @@ abstract class ApiTestCase extends MediaWikiLangTestCase {
                }
        }
 
-       protected function doLogin( $user = 'sysop' ) {
-               if ( !array_key_exists( $user, self::$users ) ) {
-                       throw new MWException( "Can not log in to undefined user $user" );
+       protected function doLogin( $testUser = 'sysop' ) {
+               if ( $testUser === null ) {
+                       $testUser = static::getTestSysop();
+               } elseif ( is_string( $testUser ) && array_key_exists( $testUser, self::$users ) ) {
+                       $testUser = self::$users[ $testUser ];
+               } elseif ( !$testUser instanceof TestUser ) {
+                       throw new MWException( "Can not log in to undefined user $testUser" );
                }
 
                $data = $this->doApiRequest( [
                        'action' => 'login',
-                       'lgname' => self::$users[$user]->username,
-                       'lgpassword' => self::$users[$user]->password ] );
+                       'lgname' => $testUser->username,
+                       'lgpassword' => $testUser->password ] );
 
                $token = $data[0]['login']['token'];
 
@@ -178,8 +167,8 @@ abstract class ApiTestCase extends MediaWikiLangTestCase {
                        [
                                'action' => 'login',
                                'lgtoken' => $token,
-                               'lgname' => self::$users[$user]->username,
-                               'lgpassword' => self::$users[$user]->password,
+                               'lgname' => $testUser->username,
+                               'lgpassword' => $testUser->password,
                        ],
                        $data[2]
                );
@@ -187,7 +176,7 @@ abstract class ApiTestCase extends MediaWikiLangTestCase {
                if ( $data[0]['login']['result'] === 'Success' ) {
                        // DWIM
                        global $wgUser;
-                       $wgUser = self::$users[$user]->getUser();
+                       $wgUser = $testUser->getUser();
                        RequestContext::getMain()->setUser( $wgUser );
                }
 
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 377abe2..82608b0 100644 (file)
@@ -781,6 +781,12 @@ class AuthManagerTest extends \MediaWikiTestCase {
                $userReq = new UsernameAuthenticationRequest;
                $userReq->username = 'UTDummy';
 
+               $req1->returnToUrl = 'http://localhost/';
+               $req2->returnToUrl = 'http://localhost/';
+               $req3->returnToUrl = 'http://localhost/';
+               $req3->username = 'UTDummy';
+               $userReq->returnToUrl = 'http://localhost/';
+
                // Passing one into beginAuthentication(), and an immediate FAIL
                $primary = $this->getMockForAbstractClass( AbstractPrimaryAuthenticationProvider::class );
                $this->primaryauthMocks = [ $primary ];
@@ -824,71 +830,29 @@ class AuthManagerTest extends \MediaWikiTestCase {
                $this->assertSame( $req2, $ret->createRequest->createRequest );
                $this->assertEquals( [], $ret->createRequest->maybeLink );
 
-               // Pass into beginAccountCreation(), no createRequest, primary needs reqs
-               $primary = $this->getMockBuilder( AbstractPrimaryAuthenticationProvider::class )
-                       ->setMethods( [ 'testForAccountCreation' ] )
-                       ->getMockForAbstractClass();
+               // Pass into beginAccountCreation(), see that maybeLink and createRequest get copied
+               $primary = $this->getMockForAbstractClass( AbstractPrimaryAuthenticationProvider::class );
                $this->primaryauthMocks = [ $primary ];
                $this->initializeManager( true );
+               $createReq = new CreateFromLoginAuthenticationRequest( $req3, [ $req2 ] );
+               $createReq->returnToUrl = 'http://localhost/';
+               $createReq->username = 'UTDummy';
+               $res = AuthenticationResponse::newUI( [ $req1 ], wfMessage( 'foo' ) );
+               $primary->expects( $this->any() )->method( 'beginPrimaryAccountCreation' )
+                       ->with( $this->anything(), $this->anything(), [ $userReq, $createReq, $req3 ] )
+                       ->will( $this->returnValue( $res ) );
                $primary->expects( $this->any() )->method( 'accountCreationType' )
                        ->will( $this->returnValue( PrimaryAuthenticationProvider::TYPE_CREATE ) );
-               $primary->expects( $this->any() )->method( 'getAuthenticationRequests' )
-                       ->will( $this->returnValue( [ $req1 ] ) );
-               $primary->expects( $this->any() )->method( 'testForAccountCreation' )
-                       ->will( $this->returnValue( StatusValue::newFatal( 'fail' ) ) );
-               $createReq = new CreateFromLoginAuthenticationRequest(
-                       null, [ $req2->getUniqueId() => $req2 ]
-               );
-               $this->logger->setCollect( true );
-               $ret = $this->manager->beginAccountCreation(
-                       $user, [ $userReq, $createReq ], 'http://localhost/'
-               );
-               $this->logger->setCollect( false );
-               $this->assertSame( AuthenticationResponse::UI, $ret->status );
-               $this->assertCount( 4, $ret->neededRequests );
-               $this->assertSame( $req1, $ret->neededRequests[0] );
-               $this->assertInstanceOf( UsernameAuthenticationRequest::class, $ret->neededRequests[1] );
-               $this->assertInstanceOf( UserDataAuthenticationRequest::class, $ret->neededRequests[2] );
-               $this->assertInstanceOf( CreateFromLoginAuthenticationRequest::class, $ret->neededRequests[3] );
-               $this->assertSame( null, $ret->neededRequests[3]->createRequest );
-               $this->assertEquals( [], $ret->neededRequests[3]->maybeLink );
-
-               // Pass into beginAccountCreation(), with createRequest, primary needs reqs
-               $createReq = new CreateFromLoginAuthenticationRequest( $req2, [] );
-               $this->logger->setCollect( true );
-               $ret = $this->manager->beginAccountCreation(
-                       $user, [ $userReq, $createReq ], 'http://localhost/'
-               );
-               $this->logger->setCollect( false );
-               $this->assertSame( AuthenticationResponse::FAIL, $ret->status );
-               $this->assertSame( 'fail', $ret->message->getKey() );
-
-               // Again, with a secondary needing reqs too
-               $secondary = $this->getMockBuilder( AbstractSecondaryAuthenticationProvider::class )
-                       ->getMockForAbstractClass();
-               $this->secondaryauthMocks = [ $secondary ];
-               $this->initializeManager( true );
-               $secondary->expects( $this->any() )->method( 'getAuthenticationRequests' )
-                       ->will( $this->returnValue( [ $req3 ] ) );
-               $createReq = new CreateFromLoginAuthenticationRequest( $req2, [] );
                $this->logger->setCollect( true );
                $ret = $this->manager->beginAccountCreation(
                        $user, [ $userReq, $createReq ], 'http://localhost/'
                );
                $this->logger->setCollect( false );
                $this->assertSame( AuthenticationResponse::UI, $ret->status );
-               $this->assertCount( 4, $ret->neededRequests );
-               $this->assertSame( $req3, $ret->neededRequests[0] );
-               $this->assertInstanceOf( UsernameAuthenticationRequest::class, $ret->neededRequests[1] );
-               $this->assertInstanceOf( UserDataAuthenticationRequest::class, $ret->neededRequests[2] );
-               $this->assertInstanceOf( CreateFromLoginAuthenticationRequest::class, $ret->neededRequests[3] );
-               $this->assertSame( $req2, $ret->neededRequests[3]->createRequest );
-               $this->assertEquals( [], $ret->neededRequests[3]->maybeLink );
-               $this->logger->setCollect( true );
-               $ret = $this->manager->continueAccountCreation( $ret->neededRequests );
-               $this->logger->setCollect( false );
-               $this->assertSame( AuthenticationResponse::FAIL, $ret->status );
-               $this->assertSame( 'fail', $ret->message->getKey() );
+               $state = $this->request->getSession()->getSecret( 'AuthManager::accountCreationState' );
+               $this->assertNotNull( $state );
+               $this->assertEquals( [ $userReq, $createReq, $req3 ], $state['reqs'] );
+               $this->assertEquals( [ $req2 ], $state['maybeLink'] );
        }
 
        /**
@@ -1095,6 +1059,10 @@ class AuthManagerTest extends \MediaWikiTestCase {
                        } else {
                                $this->assertNotNull( $session->getSecret( 'AuthManager::authnState' ),
                                        "Response $i, session state" );
+                               foreach ( $ret->neededRequests as $neededReq ) {
+                                       $this->assertEquals( AuthManager::ACTION_LOGIN, $neededReq->action,
+                                               "Response $i, neededRequest action" );
+                               }
                                $this->assertEquals(
                                        $ret->neededRequests,
                                        $this->manager->getAuthenticationRequests( AuthManager::ACTION_LOGIN_CONTINUE ),
@@ -1150,6 +1118,7 @@ class AuthManagerTest extends \MediaWikiTestCase {
                $restartResponse2->createRequest = new CreateFromLoginAuthenticationRequest(
                        null, [ $req->getUniqueId() => $req ]
                );
+               $restartResponse2->createRequest->action = AuthManager::ACTION_LOGIN;
                $restartResponse2->neededRequests = [ $rememberReq, $restartResponse2->createRequest ];
 
                return [
@@ -2138,6 +2107,10 @@ class AuthManagerTest extends \MediaWikiTestCase {
                                        $this->request->getSession()->getSecret( 'AuthManager::accountCreationState' ),
                                        "Response $i, session state"
                                );
+                               foreach ( $ret->neededRequests as $neededReq ) {
+                                       $this->assertEquals( AuthManager::ACTION_CREATE, $neededReq->action,
+                                               "Response $i, neededRequest action" );
+                               }
                                $this->assertEquals(
                                        $ret->neededRequests,
                                        $this->manager->getAuthenticationRequests( AuthManager::ACTION_CREATE_CONTINUE ),
@@ -3561,6 +3534,10 @@ class AuthManagerTest extends \MediaWikiTestCase {
                                        $this->request->getSession()->getSecret( 'AuthManager::accountLinkState' ),
                                        "Response $i, session state"
                                );
+                               foreach ( $ret->neededRequests as $neededReq ) {
+                                       $this->assertEquals( AuthManager::ACTION_LINK, $neededReq->action,
+                                               "Response $i, neededRequest action" );
+                               }
                                $this->assertEquals(
                                        $ret->neededRequests,
                                        $this->manager->getAuthenticationRequests( AuthManager::ACTION_LINK_CONTINUE ),
index b676d69..44f2743 100644 (file)
@@ -461,14 +461,19 @@ class AuthPluginPrimaryAuthenticationProviderTest extends \MediaWikiTestCase {
         * @param StatusValue $expect
         */
        public function testProviderAllowsAuthenticationDataChange( $type, $allow, $expect ) {
+               $domains = $type instanceof PasswordDomainAuthenticationRequest ? [ 'foo', 'bar' ] : [];
                $plugin = $this->getMock( 'AuthPlugin' );
-               $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] );
+               $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( $domains );
                $plugin->expects( $allow === null ? $this->never() : $this->once() )
                        ->method( 'allowPasswordChange' )->will( $this->returnValue( $allow ) );
+               $plugin->expects( $this->any() )->method( 'validDomain' )
+                       ->willReturnCallback( function ( $d ) use ( $domains ) {
+                               return in_array( $d, $domains, true );
+                       } );
                $provider = new AuthPluginPrimaryAuthenticationProvider( $plugin );
 
-               if ( $type === PasswordAuthenticationRequest::class ) {
-                       $req = new $type();
+               if ( is_object( $type ) ) {
+                       $req = $type;
                } else {
                        $req = $this->getMock( $type );
                }
@@ -480,14 +485,28 @@ class AuthPluginPrimaryAuthenticationProviderTest extends \MediaWikiTestCase {
        }
 
        public static function provideProviderAllowsAuthenticationDataChange() {
+               $domains = [ 'foo', 'bar' ];
+               $reqNoDomain = new PasswordDomainAuthenticationRequest( $domains );
+               $reqValidDomain = new PasswordDomainAuthenticationRequest( $domains );
+               $reqValidDomain->domain = 'foo';
+               $reqInvalidDomain = new PasswordDomainAuthenticationRequest( $domains );
+               $reqInvalidDomain->domain = 'invalid';
+
                return [
                        [ AuthenticationRequest::class, null, \StatusValue::newGood( 'ignored' ) ],
-                       [ PasswordAuthenticationRequest::class, true, \StatusValue::newGood() ],
+                       [ new PasswordAuthenticationRequest, true, \StatusValue::newGood() ],
                        [
-                               PasswordAuthenticationRequest::class,
+                               new PasswordAuthenticationRequest,
                                false,
                                \StatusValue::newFatal( 'authmanager-authplugin-setpass-denied' )
                        ],
+                       [ $reqNoDomain, true, \StatusValue::newGood( 'ignored' ) ],
+                       [ $reqValidDomain, true, \StatusValue::newGood() ],
+                       [
+                               $reqInvalidDomain,
+                               true,
+                               \StatusValue::newFatal( 'authmanager-authplugin-setpass-bad-domain' )
+                       ],
                ];
        }
 
index 84a0ea6..cac031c 100644 (file)
@@ -243,14 +243,6 @@ class AuthenticationRequestTest extends \MediaWikiTestCase {
 
                $req1->required = AuthenticationRequest::PRIMARY_REQUIRED;
 
-               $fields = AuthenticationRequest::mergeFieldInfo( [ $req1 ] );
-               $expect = $req1->getFieldInfo();
-               foreach ( $expect as $name => &$options ) {
-                       $options['optional'] = true;
-               }
-               unset( $options );
-               $this->assertEquals( $expect, $fields );
-
                $fields = AuthenticationRequest::mergeFieldInfo( [ $req1, $req2 ] );
                $expect += $req2->getFieldInfo();
                $expect['string1']['optional'] = false;
@@ -258,6 +250,17 @@ class AuthenticationRequestTest extends \MediaWikiTestCase {
                $expect['select']['optional'] = false;
                $expect['select']['options']['bar'] = $msg;
                $this->assertEquals( $expect, $fields );
+
+               $req2->required = AuthenticationRequest::PRIMARY_REQUIRED;
+
+               $fields = AuthenticationRequest::mergeFieldInfo( [ $req1, $req2 ] );
+               $expect = $req1->getFieldInfo() + $req2->getFieldInfo();
+               $expect['string1']['optional'] = false;
+               $expect['string2']['optional'] = true;
+               $expect['string3']['optional'] = true;
+               $expect['select']['optional'] = false;
+               $expect['select']['options']['bar'] = $msg;
+               $this->assertEquals( $expect, $fields );
        }
 
        /**
index 09d046c..d254e81 100644 (file)
@@ -128,12 +128,27 @@ class ConfirmLinkSecondaryAuthenticationProviderTest extends \MediaWikiTestCase
        }
 
        public function testBeginLinkAttempt() {
+               $badReq = $this->getMockBuilder( AuthenticationRequest::class )
+                       ->setMethods( [ 'getUniqueId' ] )
+                       ->getMockForAbstractClass();
+               $badReq->expects( $this->any() )->method( 'getUniqueId' )
+                       ->will( $this->returnValue( "BadReq" ) );
+
                $user = \User::newFromName( 'UTSysop' );
                $provider = \TestingAccessWrapper::newFromObject(
                        new ConfirmLinkSecondaryAuthenticationProvider
                );
                $request = new \FauxRequest();
-               $manager = new AuthManager( $request, \RequestContext::getMain()->getConfig() );
+               $manager = $this->getMockBuilder( AuthManager::class )
+                       ->setMethods( [ 'allowsAuthenticationDataChange' ] )
+                       ->setConstructorArgs( [ $request, \RequestContext::getMain()->getConfig() ] )
+                       ->getMock();
+               $manager->expects( $this->any() )->method( 'allowsAuthenticationDataChange' )
+                       ->will( $this->returnCallback( function ( $req ) {
+                               return $req->getUniqueId() !== 'BadReq'
+                                       ? \StatusValue::newGood()
+                                       : \StatusValue::newFatal( 'no' );
+                       } ) );
                $provider->setManager( $manager );
 
                $this->assertEquals(
@@ -151,7 +166,7 @@ class ConfirmLinkSecondaryAuthenticationProviderTest extends \MediaWikiTestCase
 
                $reqs = $this->getLinkRequests();
                $request->getSession()->setSecret( 'state', [
-                       'maybeLink' => $reqs
+                       'maybeLink' => $reqs + [ 'BadReq' => $badReq ]
                ] );
                $res = $provider->beginLinkAttempt( $user, 'state' );
                $this->assertInstanceOf( AuthenticationResponse::class, $res );
index fb0613d..d166caa 100644 (file)
@@ -23,4 +23,35 @@ class CreateFromLoginAuthenticationRequestTest extends AuthenticationRequestTest
                        ],
                ];
        }
+
+       /**
+        * @dataProvider provideState
+        */
+       public function testState(
+               $createReq, $maybeLink, $username, $loginState, $createState, $createPrimaryState
+       ) {
+               $req = new CreateFromLoginAuthenticationRequest( $createReq, $maybeLink );
+               $this->assertSame( $username, $req->username );
+               $this->assertSame( $loginState, $req->hasStateForAction( AuthManager::ACTION_LOGIN ) );
+               $this->assertSame( $createState, $req->hasStateForAction( AuthManager::ACTION_CREATE ) );
+               $this->assertFalse( $req->hasStateForAction( AuthManager::ACTION_LINK ) );
+               $this->assertFalse( $req->hasPrimaryStateForAction( AuthManager::ACTION_LOGIN ) );
+               $this->assertSame( $createPrimaryState,
+                       $req->hasPrimaryStateForAction( AuthManager::ACTION_CREATE ) );
+       }
+
+       public static function provideState() {
+               $req1 = new UsernameAuthenticationRequest;
+               $req2 = new UsernameAuthenticationRequest;
+               $req2->username = 'Bob';
+
+               return [
+                       'Nothing' => [ null, [], null, false, false, false ],
+                       'Link, no create' => [ null, [ $req2 ], null, true, true, false ],
+                       'No link, create but no name' => [ $req1, [], null, false, true, true ],
+                       'Link and create but no name' => [ $req1, [ $req2 ], null, true, true, true ],
+                       'No link, create with name' => [ $req2, [], 'Bob', false, true, true ],
+                       'Link and create with name' => [ $req2, [ $req2 ], 'Bob', true, true, true ],
+               ];
+       }
 }
index fa68dee..713c27e 100644 (file)
@@ -62,6 +62,10 @@ class LocalPasswordPrimaryAuthenticationProviderTest extends \MediaWikiTestCase
        }
 
        public function testBasics() {
+               $user = $this->getMutableTestUser()->getUser();
+               $userName = $user->getName();
+               $lowerInitialUserName = mb_strtolower( $userName[0] ) . substr( $userName, 1 );
+
                $provider = new LocalPasswordPrimaryAuthenticationProvider();
 
                $this->assertSame(
@@ -69,8 +73,8 @@ class LocalPasswordPrimaryAuthenticationProviderTest extends \MediaWikiTestCase
                        $provider->accountCreationType()
                );
 
-               $this->assertTrue( $provider->testUserExists( 'UTSysop' ) );
-               $this->assertTrue( $provider->testUserExists( 'uTSysop' ) );
+               $this->assertTrue( $provider->testUserExists( $userName ) );
+               $this->assertTrue( $provider->testUserExists( $lowerInitialUserName ) );
                $this->assertFalse( $provider->testUserExists( 'DoesNotExist' ) );
                $this->assertFalse( $provider->testUserExists( '<invalid>' ) );
 
@@ -81,7 +85,7 @@ class LocalPasswordPrimaryAuthenticationProviderTest extends \MediaWikiTestCase
                        $provider->accountCreationType()
                );
 
-               $this->assertTrue( $provider->testUserExists( 'UTSysop' ) );
+               $this->assertTrue( $provider->testUserExists( $userName ) );
                $this->assertFalse( $provider->testUserExists( 'DoesNotExist' ) );
 
                $req = new PasswordAuthenticationRequest;
@@ -91,12 +95,9 @@ class LocalPasswordPrimaryAuthenticationProviderTest extends \MediaWikiTestCase
        }
 
        public function testTestUserCanAuthenticate() {
+               $user = $this->getMutableTestUser()->getUser();
+               $userName = $user->getName();
                $dbw = wfGetDB( DB_MASTER );
-               $oldHash = $dbw->selectField( 'user', 'user_password', [ 'user_name' => 'UTSysop' ] );
-               $cb = new \ScopedCallback( function () use ( $dbw, $oldHash ) {
-                       $dbw->update( 'user', [ 'user_password' => $oldHash ], [ 'user_name' => 'UTSysop' ] );
-               } );
-               $id = \User::idFromName( 'UTSysop' );
 
                $provider = $this->getProvider();
 
@@ -104,23 +105,24 @@ class LocalPasswordPrimaryAuthenticationProviderTest extends \MediaWikiTestCase
 
                $this->assertFalse( $provider->testUserCanAuthenticate( 'DoesNotExist' ) );
 
-               $this->assertTrue( $provider->testUserCanAuthenticate( 'UTSysop' ) );
-               $this->assertTrue( $provider->testUserCanAuthenticate( 'uTSysop' ) );
+               $this->assertTrue( $provider->testUserCanAuthenticate( $userName ) );
+               $lowerInitialUserName = mb_strtolower( $userName[0] ) . substr( $userName, 1 );
+               $this->assertTrue( $provider->testUserCanAuthenticate( $lowerInitialUserName ) );
 
                $dbw->update(
                        'user',
                        [ 'user_password' => \PasswordFactory::newInvalidPassword()->toString() ],
-                       [ 'user_name' => 'UTSysop' ]
+                       [ 'user_name' => $userName ]
                );
-               $this->assertFalse( $provider->testUserCanAuthenticate( 'UTSysop' ) );
+               $this->assertFalse( $provider->testUserCanAuthenticate( $userName ) );
 
                // Really old format
                $dbw->update(
                        'user',
                        [ 'user_password' => '0123456789abcdef0123456789abcdef' ],
-                       [ 'user_name' => 'UTSysop' ]
+                       [ 'user_name' => $userName ]
                );
-               $this->assertTrue( $provider->testUserCanAuthenticate( 'UTSysop' ) );
+               $this->assertTrue( $provider->testUserCanAuthenticate( $userName ) );
        }
 
        public function testSetPasswordResetFlag() {
@@ -139,22 +141,24 @@ class LocalPasswordPrimaryAuthenticationProviderTest extends \MediaWikiTestCase
                $provider->setManager( $this->manager );
                $providerPriv = \TestingAccessWrapper::newFromObject( $provider );
 
+               $user = $this->getMutableTestUser()->getUser();
+               $userName = $user->getName();
                $dbw = wfGetDB( DB_MASTER );
                $row = $dbw->selectRow(
                        'user',
                        '*',
-                       [ 'user_name' => 'UTSysop' ],
+                       [ 'user_name' => $userName ],
                        __METHOD__
                );
 
                $this->manager->removeAuthenticationSessionData( null );
                $row->user_password_expires = wfTimestamp( TS_MW, time() + 200 );
-               $providerPriv->setPasswordResetFlag( 'UTSysop', \Status::newGood(), $row );
+               $providerPriv->setPasswordResetFlag( $userName, \Status::newGood(), $row );
                $this->assertNull( $this->manager->getAuthenticationSessionData( 'reset-pass' ) );
 
                $this->manager->removeAuthenticationSessionData( null );
                $row->user_password_expires = wfTimestamp( TS_MW, time() - 200 );
-               $providerPriv->setPasswordResetFlag( 'UTSysop', \Status::newGood(), $row );
+               $providerPriv->setPasswordResetFlag( $userName, \Status::newGood(), $row );
                $ret = $this->manager->getAuthenticationSessionData( 'reset-pass' );
                $this->assertNotNull( $ret );
                $this->assertSame( 'resetpass-expired', $ret->msg->getKey() );
@@ -162,7 +166,7 @@ class LocalPasswordPrimaryAuthenticationProviderTest extends \MediaWikiTestCase
 
                $this->manager->removeAuthenticationSessionData( null );
                $row->user_password_expires = wfTimestamp( TS_MW, time() - 1 );
-               $providerPriv->setPasswordResetFlag( 'UTSysop', \Status::newGood(), $row );
+               $providerPriv->setPasswordResetFlag( $userName, \Status::newGood(), $row );
                $ret = $this->manager->getAuthenticationSessionData( 'reset-pass' );
                $this->assertNotNull( $ret );
                $this->assertSame( 'resetpass-expired-soft', $ret->msg->getKey() );
@@ -172,7 +176,7 @@ class LocalPasswordPrimaryAuthenticationProviderTest extends \MediaWikiTestCase
                $row->user_password_expires = null;
                $status = \Status::newGood();
                $status->error( 'testing' );
-               $providerPriv->setPasswordResetFlag( 'UTSysop', $status, $row );
+               $providerPriv->setPasswordResetFlag( $userName, $status, $row );
                $ret = $this->manager->getAuthenticationSessionData( 'reset-pass' );
                $this->assertNotNull( $ret );
                $this->assertSame( 'resetpass-validity-soft', $ret->msg->getKey() );
@@ -180,12 +184,11 @@ class LocalPasswordPrimaryAuthenticationProviderTest extends \MediaWikiTestCase
        }
 
        public function testAuthentication() {
+               $testUser = $this->getMutableTestUser();
+               $userName = $testUser->getUser()->getName();
+
                $dbw = wfGetDB( DB_MASTER );
-               $oldHash = $dbw->selectField( 'user', 'user_password', [ 'user_name' => 'UTSysop' ] );
-               $cb = new \ScopedCallback( function () use ( $dbw, $oldHash ) {
-                       $dbw->update( 'user', [ 'user_password' => $oldHash ], [ 'user_name' => 'UTSysop' ] );
-               } );
-               $id = \User::idFromName( 'UTSysop' );
+               $id = \User::idFromName( $userName );
 
                $req = new PasswordAuthenticationRequest();
                $req->action = AuthManager::ACTION_LOGIN;
@@ -230,8 +233,8 @@ class LocalPasswordPrimaryAuthenticationProviderTest extends \MediaWikiTestCase
                );
 
                // Validation failure
-               $req->username = 'UTSysop';
-               $req->password = 'UTSysopPassword';
+               $req->username = $userName;
+               $req->password = $testUser->getPassword();
                $this->validity = \Status::newFatal( 'arbitrary-failure' );
                $ret = $provider->beginPrimaryAuthentication( $reqs );
                $this->assertEquals(
@@ -247,7 +250,7 @@ class LocalPasswordPrimaryAuthenticationProviderTest extends \MediaWikiTestCase
                $this->manager->removeAuthenticationSessionData( null );
                $this->validity = \Status::newGood();
                $this->assertEquals(
-                       AuthenticationResponse::newPass( 'UTSysop' ),
+                       AuthenticationResponse::newPass( $userName ),
                        $provider->beginPrimaryAuthentication( $reqs )
                );
                $this->assertNull( $this->manager->getAuthenticationSessionData( 'reset-pass' ) );
@@ -255,19 +258,19 @@ class LocalPasswordPrimaryAuthenticationProviderTest extends \MediaWikiTestCase
                // Successful auth after normalizing name
                $this->manager->removeAuthenticationSessionData( null );
                $this->validity = \Status::newGood();
-               $req->username = 'uTSysop';
+               $req->username = mb_strtolower( $userName[0] ) . substr( $userName, 1 );
                $this->assertEquals(
-                       AuthenticationResponse::newPass( 'UTSysop' ),
+                       AuthenticationResponse::newPass( $userName ),
                        $provider->beginPrimaryAuthentication( $reqs )
                );
                $this->assertNull( $this->manager->getAuthenticationSessionData( 'reset-pass' ) );
-               $req->username = 'UTSysop';
+               $req->username = $userName;
 
                // Successful auth with reset
                $this->manager->removeAuthenticationSessionData( null );
                $this->validity->error( 'arbitrary-warning' );
                $this->assertEquals(
-                       AuthenticationResponse::newPass( 'UTSysop' ),
+                       AuthenticationResponse::newPass( $userName ),
                        $provider->beginPrimaryAuthentication( $reqs )
                );
                $this->assertNotNull( $this->manager->getAuthenticationSessionData( 'reset-pass' ) );
@@ -287,7 +290,7 @@ class LocalPasswordPrimaryAuthenticationProviderTest extends \MediaWikiTestCase
 
                // Correct handling of legacy encodings
                $password = ':B:salt:' . md5( 'salt-' . md5( "\xe1\xe9\xed\xf3\xfa" ) );
-               $dbw->update( 'user', [ 'user_password' => $password ], [ 'user_name' => 'UTSysop' ] );
+               $dbw->update( 'user', [ 'user_password' => $password ], [ 'user_name' => $userName ] );
                $req->password = 'áéíóú';
                $ret = $provider->beginPrimaryAuthentication( $reqs );
                $this->assertEquals(
@@ -301,7 +304,7 @@ class LocalPasswordPrimaryAuthenticationProviderTest extends \MediaWikiTestCase
 
                $this->config->set( 'LegacyEncoding', true );
                $this->assertEquals(
-                       AuthenticationResponse::newPass( 'UTSysop' ),
+                       AuthenticationResponse::newPass( $userName ),
                        $provider->beginPrimaryAuthentication( $reqs )
                );
 
@@ -319,19 +322,19 @@ class LocalPasswordPrimaryAuthenticationProviderTest extends \MediaWikiTestCase
                // Correct handling of really old password hashes
                $this->config->set( 'PasswordSalt', false );
                $password = md5( 'FooBar' );
-               $dbw->update( 'user', [ 'user_password' => $password ], [ 'user_name' => 'UTSysop' ] );
+               $dbw->update( 'user', [ 'user_password' => $password ], [ 'user_name' => $userName ] );
                $req->password = 'FooBar';
                $this->assertEquals(
-                       AuthenticationResponse::newPass( 'UTSysop' ),
+                       AuthenticationResponse::newPass( $userName ),
                        $provider->beginPrimaryAuthentication( $reqs )
                );
 
                $this->config->set( 'PasswordSalt', true );
                $password = md5( "$id-" . md5( 'FooBar' ) );
-               $dbw->update( 'user', [ 'user_password' => $password ], [ 'user_name' => 'UTSysop' ] );
+               $dbw->update( 'user', [ 'user_password' => $password ], [ 'user_name' => $userName ] );
                $req->password = 'FooBar';
                $this->assertEquals(
-                       AuthenticationResponse::newPass( 'UTSysop' ),
+                       AuthenticationResponse::newPass( $userName ),
                        $provider->beginPrimaryAuthentication( $reqs )
                );
 
@@ -407,29 +410,24 @@ class LocalPasswordPrimaryAuthenticationProviderTest extends \MediaWikiTestCase
 
        /**
         * @dataProvider provideProviderChangeAuthenticationData
-        * @param string $user
+        * @param callable|bool $usernameTransform
         * @param string $type
         * @param bool $loginOnly
         * @param bool $changed
         */
-       public function testProviderChangeAuthenticationData( $user, $type, $loginOnly, $changed ) {
+       public function testProviderChangeAuthenticationData(
+                       $usernameTransform, $type, $loginOnly, $changed ) {
+               $testUser = $this->getMutableTestUser();
+               $user = $testUser->getUser()->getName();
+               if ( is_callable( $usernameTransform ) ) {
+                       $user = call_user_func( $usernameTransform, $user );
+               }
                $cuser = ucfirst( $user );
-               $oldpass = 'UTSysopPassword';
+               $oldpass = $testUser->getPassword();
                $newpass = 'NewPassword';
 
                $dbw = wfGetDB( DB_MASTER );
-               $oldHash = $dbw->selectField( 'user', 'user_password', [ 'user_name' => $cuser ] );
                $oldExpiry = $dbw->selectField( 'user', 'user_password_expires', [ 'user_name' => $cuser ] );
-               $cb = new \ScopedCallback( function () use ( $dbw, $cuser, $oldHash, $oldExpiry ) {
-                       $dbw->update(
-                               'user',
-                               [
-                                       'user_password' => $oldHash,
-                                       'user_password_expires' => $oldExpiry,
-                               ],
-                               [ 'user_name' => $cuser ]
-                       );
-               } );
 
                $this->mergeMwGlobalArrayValue( 'wgHooks', [
                        'ResetPasswordExpiration' => [ function ( $user, &$expires ) {
@@ -525,12 +523,12 @@ class LocalPasswordPrimaryAuthenticationProviderTest extends \MediaWikiTestCase
 
        public static function provideProviderChangeAuthenticationData() {
                return [
-                       [ 'UTSysop', AuthenticationRequest::class, false, false ],
-                       [ 'UTSysop', PasswordAuthenticationRequest::class, false, true ],
-                       [ 'UTSysop', AuthenticationRequest::class, true, false ],
-                       [ 'UTSysop', PasswordAuthenticationRequest::class, true, true ],
-                       [ 'uTSysop', PasswordAuthenticationRequest::class, false, true ],
-                       [ 'uTSysop', PasswordAuthenticationRequest::class, true, true ],
+                       [ false, AuthenticationRequest::class, false, false ],
+                       [ false, PasswordAuthenticationRequest::class, false, true ],
+                       [ false, AuthenticationRequest::class, true, false ],
+                       [ false, PasswordAuthenticationRequest::class, true, true ],
+                       [ 'ucfirst', PasswordAuthenticationRequest::class, false, true ],
+                       [ 'ucfirst', PasswordAuthenticationRequest::class, true, true ],
                ];
        }
 
@@ -640,10 +638,6 @@ class LocalPasswordPrimaryAuthenticationProviderTest extends \MediaWikiTestCase
                // We have to cheat a bit to avoid having to add a new user to
                // the database to test the actual setting of the password works right
                $dbw = wfGetDB( DB_MASTER );
-               $oldHash = $dbw->selectField( 'user', 'user_password', [ 'user_name' => $user ] );
-               $cb = new \ScopedCallback( function () use ( $dbw, $user, $oldHash ) {
-                       $dbw->update( 'user', [ 'user_password' => $oldHash ], [ 'user_name' => $user ] );
-               } );
 
                $user = \User::newFromName( 'UTSysop' );
                $req->username = $user->getName();
index 59edede..79c138b 100644 (file)
@@ -216,7 +216,9 @@ class ResetPasswordSecondaryAuthenticationProviderTest extends \MediaWikiTestCas
                $this->assertSame( AuthenticationResponse::UI, $res->status );
                $this->assertEquals( $msg, $res->message );
                $this->assertCount( 2, $res->neededRequests );
-               $this->assertEquals( $passReq, $res->neededRequests[0] );
+               $expectedPassReq = clone $passReq;
+               $expectedPassReq->required = AuthenticationRequest::OPTIONAL;
+               $this->assertEquals( $expectedPassReq, $res->neededRequests[0] );
                $this->assertEquals( $skipReq, $res->neededRequests[1] );
                $this->assertNotNull( $manager->getAuthenticationSessionData( 'reset-pass' ) );
                $this->assertFalse( $passReq->done );
@@ -304,7 +306,9 @@ class ResetPasswordSecondaryAuthenticationProviderTest extends \MediaWikiTestCas
                $this->assertSame( AuthenticationResponse::UI, $res->status );
                $this->assertEquals( $msg, $res->message );
                $this->assertCount( 2, $res->neededRequests );
-               $this->assertEquals( $passReq2, $res->neededRequests[0] );
+               $expectedPassReq = clone $passReq2;
+               $expectedPassReq->required = AuthenticationRequest::OPTIONAL;
+               $this->assertEquals( $expectedPassReq, $res->neededRequests[0] );
                $this->assertEquals( $skipReq, $res->neededRequests[1] );
                $this->assertNotNull( $manager->getAuthenticationSessionData( 'reset-pass' ) );
                $this->assertFalse( $passReq->done );
index e329f8d..9c723c0 100644 (file)
@@ -6,36 +6,30 @@
  */
 class GenderCacheTest extends MediaWikiLangTestCase {
 
+       /** @var string[] User key => username */
+       private static $nameMap;
+
        function addDBDataOnce() {
                // ensure the correct default gender
                $this->mergeMwGlobalArrayValue( 'wgDefaultUserOptions', [ 'gender' => 'unknown' ] );
 
-               $user = User::newFromName( 'UTMale' );
-               if ( $user->getId() == 0 ) {
-                       $user->addToDatabase();
-                       TestUser::setPasswordForUser( $user, 'UTMalePassword' );
-               }
-               // ensure the right gender
-               $user->setOption( 'gender', 'male' );
-               $user->saveSettings();
+               $male = $this->getMutableTestUser()->getUser();
+               $male->setOption( 'gender', 'male' );
+               $male->saveSettings();
+
+               $female = $this->getMutableTestUser()->getUser();
+               $female->setOption( 'gender', 'female' );
+               $female->saveSettings();
 
-               $user = User::newFromName( 'UTFemale' );
-               if ( $user->getId() == 0 ) {
-                       $user->addToDatabase();
-                       TestUser::setPasswordForUser( $user, 'UTFemalePassword' );
-               }
-               // ensure the right gender
-               $user->setOption( 'gender', 'female' );
-               $user->saveSettings();
+               $default = $this->getMutableTestUser()->getUser();
+               $default->setOption( 'gender', null );
+               $default->saveSettings();
 
-               $user = User::newFromName( 'UTDefaultGender' );
-               if ( $user->getId() == 0 ) {
-                       $user->addToDatabase();
-                       TestUser::setPasswordForUser( $user, 'UTDefaultGenderPassword' );
-               }
-               // ensure the default gender
-               $user->setOption( 'gender', null );
-               $user->saveSettings();
+               self::$nameMap = [
+                       'UTMale'          => $male->getName(),
+                       'UTFemale'        => $female->getName(),
+                       'UTDefaultGender' => $default->getName()
+               ];
        }
 
        /**
@@ -44,8 +38,9 @@ class GenderCacheTest extends MediaWikiLangTestCase {
         * @dataProvider provideUserGenders
         * @covers GenderCache::getGenderOf
         */
-       public function testUserName( $username, $expectedGender ) {
+       public function testUserName( $userKey, $expectedGender ) {
                $genderCache = GenderCache::singleton();
+               $username = isset( self::$nameMap[$userKey] ) ? self::$nameMap[$userKey] : $userKey;
                $gender = $genderCache->getGenderOf( $username );
                $this->assertEquals( $gender, $expectedGender, "GenderCache normal" );
        }
@@ -56,10 +51,10 @@ class GenderCacheTest extends MediaWikiLangTestCase {
         * @dataProvider provideUserGenders
         * @covers GenderCache::getGenderOf
         */
-       public function testUserObjects( $username, $expectedGender ) {
+       public function testUserObjects( $userKey, $expectedGender ) {
+               $username = isset( self::$nameMap[$userKey] ) ? self::$nameMap[$userKey] : $userKey;
                $genderCache = GenderCache::singleton();
-               $user = User::newFromName( $username );
-               $gender = $genderCache->getGenderOf( $user );
+               $gender = $genderCache->getGenderOf( $username );
                $this->assertEquals( $gender, $expectedGender, "GenderCache normal" );
        }
 
@@ -79,22 +74,13 @@ class GenderCacheTest extends MediaWikiLangTestCase {
         * test strip of subpages to avoid unnecessary queries
         * against the never existing username
         *
-        * @dataProvider provideStripSubpages
+        * @dataProvider provideUserGenders
         * @covers GenderCache::getGenderOf
         */
-       public function testStripSubpages( $pageWithSubpage, $expectedGender ) {
+       public function testStripSubpages( $userKey, $expectedGender ) {
+               $username = isset( self::$nameMap[$userKey] ) ? self::$nameMap[$userKey] : $userKey;
                $genderCache = GenderCache::singleton();
-               $gender = $genderCache->getGenderOf( $pageWithSubpage );
+               $gender = $genderCache->getGenderOf( "$username/subpage" );
                $this->assertEquals( $gender, $expectedGender, "GenderCache must strip of subpages" );
        }
-
-       public static function provideStripSubpages() {
-               return [
-                       [ 'UTMale/subpage', 'male' ],
-                       [ 'UTFemale/subpage', 'female' ],
-                       [ 'UTDefaultGender/subpage', 'unknown' ],
-                       [ 'UTNotExist/subpage', 'unknown' ],
-                       [ '127.0.0.1/subpage', 'unknown' ],
-               ];
-       }
 }
index 1d86fb4..e44de09 100644 (file)
@@ -29,6 +29,11 @@ class CategoryMembershipChangeTest extends MediaWikiLangTestCase {
         */
        private static $pageRev = null;
 
+       /**
+        * @var User
+        */
+       private static $revUser = null;
+
        /**
         * @var string
         */
@@ -54,6 +59,7 @@ class CategoryMembershipChangeTest extends MediaWikiLangTestCase {
 
                $page = WikiPage::factory( $title );
                self::$pageRev = $page->getRevision();
+               self::$revUser = User::newFromId( self::$pageRev->getUser( Revision::RAW ) );
        }
 
        private function newChange( Revision $revision = null ) {
@@ -114,7 +120,7 @@ class CategoryMembershipChangeTest extends MediaWikiLangTestCase {
 
                $this->assertTrue( strlen( self::$lastNotifyArgs[0] ) === 14 );
                $this->assertEquals( 'Category:CategoryName', self::$lastNotifyArgs[1]->getPrefixedText() );
-               $this->assertEquals( 'UTSysop', self::$lastNotifyArgs[2]->getName() );
+               $this->assertEquals( self::$revUser->getName(), self::$lastNotifyArgs[2]->getName() );
                $this->assertEquals( '(recentchanges-page-added-to-category: ' . self::$pageName . ')',
                        self::$lastNotifyArgs[3] );
                $this->assertEquals( self::$pageName, self::$lastNotifyArgs[4]->getPrefixedText() );
@@ -135,7 +141,7 @@ class CategoryMembershipChangeTest extends MediaWikiLangTestCase {
 
                $this->assertTrue( strlen( self::$lastNotifyArgs[0] ) === 14 );
                $this->assertEquals( 'Category:CategoryName', self::$lastNotifyArgs[1]->getPrefixedText() );
-               $this->assertEquals( 'UTSysop', self::$lastNotifyArgs[2]->getName() );
+               $this->assertEquals( self::$revUser->getName(), self::$lastNotifyArgs[2]->getName() );
                $this->assertEquals( '(recentchanges-page-removed-from-category: ' . self::$pageName . ')',
                        self::$lastNotifyArgs[3] );
                $this->assertEquals( self::$pageName, self::$lastNotifyArgs[4]->getPrefixedText() );
index b8be8d4..308e6de 100644 (file)
@@ -121,7 +121,7 @@ class EnhancedChangesListTest extends MediaWikiLangTestCase {
         * @return RecentChange
         */
        private function getEditChange( $timestamp ) {
-               $user = $this->getTestUser();
+               $user = $this->getMutableTestUser()->getUser();
                $recentChange = $this->testRecentChangesHelper->makeEditRecentChange(
                        $user, 'Cat', $timestamp, 5, 191, 190, 0, 0
                );
@@ -139,7 +139,7 @@ class EnhancedChangesListTest extends MediaWikiLangTestCase {
                $wikiPage = new WikiPage( Title::newFromText( 'Category:Foo' ) );
                $wikiPage->doEditContent( new WikitextContent( 'Some random text' ), 'category page created' );
 
-               $user = $this->getTestUser();
+               $user = $this->getMutableTestUser()->getUser();
                $recentChange = $this->testRecentChangesHelper->makeCategorizationRecentChange(
                        $user, 'Category:Foo', $wikiPage->getId(), $thisId, $lastId, $timestamp
                );
@@ -147,19 +147,6 @@ class EnhancedChangesListTest extends MediaWikiLangTestCase {
                return $recentChange;
        }
 
-       /**
-        * @return User
-        */
-       private function getTestUser() {
-               $user = User::newFromName( 'TestRecentChangesUser' );
-
-               if ( !$user->getId() ) {
-                       $user->addToDatabase();
-               }
-
-               return $user;
-       }
-
        private function createCategorizationLine( $recentChange ) {
                $enhancedChangesList = $this->newEnhancedChangesList();
                $cacheEntry = $this->testRecentChangesHelper->getCacheEntry( $recentChange );
index 5746a61..51cfadc 100644 (file)
@@ -93,7 +93,6 @@ class OldChangesListTest extends MediaWikiLangTestCase {
                        'assert diff link'
                );
 
-               $this->assertRegExp( '/tabindex="0"/', $line, 'assert tab index' );
                $this->assertRegExp(
                        '/title=Cat&amp;curid=20131103212153&amp;action=history"/',
                        $line,
@@ -151,7 +150,7 @@ class OldChangesListTest extends MediaWikiLangTestCase {
        }
 
        private function getNewBotEditChange() {
-               $user = $this->getTestUser();
+               $user = $this->getMutableTestUser()->getUser();
 
                $recentChange = $this->testRecentChangesHelper->makeNewBotEditRecentChange(
                        $user, 'Abc', '20131103212153', 5, 191, 190, 0, 0
@@ -161,7 +160,7 @@ class OldChangesListTest extends MediaWikiLangTestCase {
        }
 
        private function getLogChange( $logType, $logAction ) {
-               $user = $this->getTestUser();
+               $user = $this->getMutableTestUser()->getUser();
 
                $recentChange = $this->testRecentChangesHelper->makeLogRecentChange(
                        $logType, $logAction, $user, 'Abc', '20131103212153', 0, 0
@@ -171,7 +170,7 @@ class OldChangesListTest extends MediaWikiLangTestCase {
        }
 
        private function getEditChange() {
-               $user = $this->getTestUser();
+               $user = $this->getMutableTestUser()->getUser();
                $recentChange = $this->testRecentChangesHelper->makeEditRecentChange(
                        $user, 'Cat', '20131103212153', 5, 191, 190, 0, 0
                );
@@ -184,18 +183,8 @@ class OldChangesListTest extends MediaWikiLangTestCase {
                return new OldChangesList( $context );
        }
 
-       private function getTestUser() {
-               $user = User::newFromName( 'TestRecentChangesUser' );
-
-               if ( !$user->getId() ) {
-                       $user->addToDatabase();
-               }
-
-               return $user;
-       }
-
        private function getContext() {
-               $user = $this->getTestUser();
+               $user = $this->getMutableTestUser()->getUser();
                $context = $this->testRecentChangesHelper->getTestContext( $user );
                $context->setLanguage( 'qqx' );
 
index 602340b..16f210b 100644 (file)
@@ -1,5 +1,8 @@
 <?php
 
+use MediaWiki\Linker\LinkRenderer;
+use MediaWiki\MediaWikiServices;
+
 /**
  * @covers RCCacheEntryFactory
  *
@@ -14,6 +17,11 @@ class RCCacheEntryFactoryTest extends MediaWikiLangTestCase {
         */
        private $testRecentChangesHelper;
 
+       /**
+        * @var LinkRenderer;
+        */
+       private $linkRenderer;
+
        public function __construct( $name = null, array $data = [], $dataName = '' ) {
                parent::__construct( $name, $data, $dataName );
 
@@ -26,133 +34,113 @@ class RCCacheEntryFactoryTest extends MediaWikiLangTestCase {
                $this->setMwGlobals( [
                        'wgArticlePath' => '/wiki/$1'
                ] );
+
+               $this->linkRenderer = new LinkRenderer(
+                       MediaWikiServices::getInstance()->getTitleFormatter()
+               );
        }
 
-       /**
-        * @dataProvider editChangeProvider
-        */
-       public function testNewFromRecentChange( $expected, $context, $messages,
-               $recentChange, $watched
-       ) {
-               $cacheEntryFactory = new RCCacheEntryFactory( $context, $messages );
-               $cacheEntry = $cacheEntryFactory->newFromRecentChange( $recentChange, $watched );
+       public function testNewFromRecentChange() {
+               $user = $this->getMutableTestUser()->getUser();
+               $recentChange = $this->testRecentChangesHelper->makeEditRecentChange(
+                       $user,
+                       'Xyz',
+                       5, // curid
+                       191, // thisid
+                       190, // lastid
+                       '20131103212153',
+                       0, // counter
+                       0 // number of watching users
+               );
+               $cacheEntryFactory = new RCCacheEntryFactory(
+                       $this->getContext(),
+                       $this->getMessages(),
+                       $this->linkRenderer
+               );
+               $cacheEntry = $cacheEntryFactory->newFromRecentChange( $recentChange, false );
 
                $this->assertInstanceOf( 'RCCacheEntry', $cacheEntry );
 
-               $this->assertEquals( $watched, $cacheEntry->watched, 'watched' );
-               $this->assertEquals( $expected['timestamp'], $cacheEntry->timestamp, 'timestamp' );
-               $this->assertEquals(
-                       $expected['numberofWatchingusers'], $cacheEntry->numberofWatchingusers,
-                       'watching users'
-               );
-               $this->assertEquals( $expected['unpatrolled'], $cacheEntry->unpatrolled, 'unpatrolled' );
+               $this->assertEquals( false, $cacheEntry->watched, 'watched' );
+               $this->assertEquals( '21:21', $cacheEntry->timestamp, 'timestamp' );
+               $this->assertEquals( 0, $cacheEntry->numberofWatchingusers, 'watching users' );
+               $this->assertEquals( false, $cacheEntry->unpatrolled, 'unpatrolled' );
 
-               $this->assertUserLinks( 'TestRecentChangesUser', $cacheEntry );
+               $this->assertUserLinks( $user->getName(), $cacheEntry );
                $this->assertTitleLink( 'Xyz', $cacheEntry );
 
-               $this->assertQueryLink( 'cur', $expected['cur'], $cacheEntry->curlink, 'cur link' );
-               $this->assertQueryLink( 'prev', $expected['diff'], $cacheEntry->lastlink, 'prev link' );
-               $this->assertQueryLink( 'diff', $expected['diff'], $cacheEntry->difflink, 'diff link' );
+               $diff = [ 'curid' => 5, 'diff' => 191, 'oldid' => 190 ];
+               $cur = [ 'curid' => 5, 'diff' => 0, 'oldid' => 191 ];
+               $this->assertQueryLink( 'cur', $cur, $cacheEntry->curlink, 'cur link' );
+               $this->assertQueryLink( 'prev', $diff, $cacheEntry->lastlink, 'prev link' );
+               $this->assertQueryLink( 'diff', $diff, $cacheEntry->difflink, 'diff link' );
        }
 
-       public function editChangeProvider() {
-               return [
-                       [
-                               [
-                                       'title' => 'Xyz',
-                                       'user' => 'TestRecentChangesUser',
-                                       'diff' => [ 'curid' => 5, 'diff' => 191, 'oldid' => 190 ],
-                                       'cur' => [ 'curid' => 5, 'diff' => 0, 'oldid' => 191 ],
-                                       'timestamp' => '21:21',
-                                       'numberofWatchingusers' => 0,
-                                       'unpatrolled' => false
-                               ],
-                               $this->getContext(),
-                               $this->getMessages(),
-                               $this->testRecentChangesHelper->makeEditRecentChange(
-                                       $this->getTestUser(),
-                                       'Xyz',
-                                       5, // curid
-                                       191, // thisid
-                                       190, // lastid
-                                       '20131103212153',
-                                       0, // counter
-                                       0 // number of watching users
-                               ),
-                               false
-                       ]
+       public function testNewForDeleteChange() {
+               $expected = [
+                       'title' => 'Abc',
+                       'user' => 'TestRecentChangesUser',
+                       'timestamp' => '21:21',
+                       'numberofWatchingusers' => 0,
+                       'unpatrolled' => false
                ];
-       }
-
-       /**
-        * @dataProvider deleteChangeProvider
-        */
-       public function testNewForDeleteChange( $expected, $context, $messages, $recentChange, $watched ) {
-               $cacheEntryFactory = new RCCacheEntryFactory( $context, $messages );
-               $cacheEntry = $cacheEntryFactory->newFromRecentChange( $recentChange, $watched );
+               $user = $this->getMutableTestUser()->getUser();
+               $recentChange = $this->testRecentChangesHelper->makeLogRecentChange(
+                       'delete',
+                       'delete',
+                       $user,
+                       'Abc',
+                       '20131103212153',
+                       0, // counter
+                       0 // number of watching users
+               );
+               $cacheEntryFactory = new RCCacheEntryFactory(
+                       $this->getContext(),
+                       $this->getMessages(),
+                       $this->linkRenderer
+               );
+               $cacheEntry = $cacheEntryFactory->newFromRecentChange( $recentChange, false );
 
                $this->assertInstanceOf( 'RCCacheEntry', $cacheEntry );
 
-               $this->assertEquals( $watched, $cacheEntry->watched, 'watched' );
-               $this->assertEquals( $expected['timestamp'], $cacheEntry->timestamp, 'timestamp' );
-               $this->assertEquals(
-                       $expected['numberofWatchingusers'],
-                       $cacheEntry->numberofWatchingusers, 'watching users'
-               );
-               $this->assertEquals( $expected['unpatrolled'], $cacheEntry->unpatrolled, 'unpatrolled' );
+               $this->assertEquals( false, $cacheEntry->watched, 'watched' );
+               $this->assertEquals( '21:21', $cacheEntry->timestamp, 'timestamp' );
+               $this->assertEquals( 0, $cacheEntry->numberofWatchingusers, 'watching users' );
+               $this->assertEquals( false, $cacheEntry->unpatrolled, 'unpatrolled' );
 
                $this->assertDeleteLogLink( $cacheEntry );
-               $this->assertUserLinks( 'TestRecentChangesUser', $cacheEntry );
+               $this->assertUserLinks( $user->getName(), $cacheEntry );
 
                $this->assertEquals( 'cur', $cacheEntry->curlink, 'cur link for delete log or rev' );
                $this->assertEquals( 'diff', $cacheEntry->difflink, 'diff link for delete log or rev' );
                $this->assertEquals( 'prev', $cacheEntry->lastlink, 'pref link for delete log or rev' );
        }
 
-       public function deleteChangeProvider() {
-               return [
-                       [
-                               [
-                                       'title' => 'Abc',
-                                       'user' => 'TestRecentChangesUser',
-                                       'timestamp' => '21:21',
-                                       'numberofWatchingusers' => 0,
-                                       'unpatrolled' => false
-                               ],
-                               $this->getContext(),
-                               $this->getMessages(),
-                               $this->testRecentChangesHelper->makeLogRecentChange(
-                                       'delete',
-                                       'delete',
-                                       $this->getTestUser(),
-                                       'Abc',
-                                       '20131103212153',
-                                       0, // counter
-                                       0 // number of watching users
-                               ),
-                               false
-                       ]
-               ];
-       }
-
-       /**
-        * @dataProvider revUserDeleteProvider
-        */
-       public function testNewForRevUserDeleteChange( $expected, $context, $messages,
-               $recentChange, $watched
-       ) {
-               $cacheEntryFactory = new RCCacheEntryFactory( $context, $messages );
-               $cacheEntry = $cacheEntryFactory->newFromRecentChange( $recentChange, $watched );
+       public function testNewForRevUserDeleteChange() {
+               $user = $this->getMutableTestUser()->getUser();
+               $recentChange = $this->testRecentChangesHelper->makeDeletedEditRecentChange(
+                       $user,
+                       'Zzz',
+                       '20131103212153',
+                       191, // thisid
+                       190, // lastid
+                       '20131103212153',
+                       0, // counter
+                       0 // number of watching users
+               );
+               $cacheEntryFactory = new RCCacheEntryFactory(
+                       $this->getContext(),
+                       $this->getMessages(),
+                       $this->linkRenderer
+               );
+               $cacheEntry = $cacheEntryFactory->newFromRecentChange( $recentChange, false );
 
                $this->assertInstanceOf( 'RCCacheEntry', $cacheEntry );
 
-               $this->assertEquals( $watched, $cacheEntry->watched, 'watched' );
-               $this->assertEquals( $expected['timestamp'], $cacheEntry->timestamp, 'timestamp' );
-               $this->assertEquals(
-                       $expected['numberofWatchingusers'],
-                       $cacheEntry->numberofWatchingusers, 'watching users'
-               );
-               $this->assertEquals( $expected['unpatrolled'], $cacheEntry->unpatrolled, 'unpatrolled' );
+               $this->assertEquals( false, $cacheEntry->watched, 'watched' );
+               $this->assertEquals( '21:21', $cacheEntry->timestamp, 'timestamp' );
+               $this->assertEquals( 0, $cacheEntry->numberofWatchingusers, 'watching users' );
+               $this->assertEquals( false, $cacheEntry->unpatrolled, 'unpatrolled' );
 
                $this->assertRevDel( $cacheEntry );
                $this->assertTitleLink( 'Zzz', $cacheEntry );
@@ -162,35 +150,6 @@ class RCCacheEntryFactoryTest extends MediaWikiLangTestCase {
                $this->assertEquals( 'prev', $cacheEntry->lastlink, 'pref link for delete log or rev' );
        }
 
-       public function revUserDeleteProvider() {
-               return [
-                       [
-                               [
-                                       'title' => 'Zzz',
-                                       'user' => 'TestRecentChangesUser',
-                                       'diff' => '',
-                                       'cur' => '',
-                                       'timestamp' => '21:21',
-                                       'numberofWatchingusers' => 0,
-                                       'unpatrolled' => false
-                               ],
-                               $this->getContext(),
-                               $this->getMessages(),
-                               $this->testRecentChangesHelper->makeDeletedEditRecentChange(
-                                       $this->getTestUser(),
-                                       'Zzz',
-                                       '20131103212153',
-                                       191, // thisid
-                                       190, // lastid
-                                       '20131103212153',
-                                       0, // counter
-                                       0 // number of watching users
-                               ),
-                               false
-                       ]
-               ];
-       }
-
        private function assertUserLinks( $user, $cacheEntry ) {
                $this->assertTag(
                        [
@@ -308,18 +267,8 @@ class RCCacheEntryFactoryTest extends MediaWikiLangTestCase {
                ];
        }
 
-       private function getTestUser() {
-               $user = User::newFromName( 'TestRecentChangesUser' );
-
-               if ( !$user->getId() ) {
-                       $user->addToDatabase();
-               }
-
-               return $user;
-       }
-
        private function getContext() {
-               $user = $this->getTestUser();
+               $user = $this->getMutableTestUser()->getUser();
                $context = $this->testRecentChangesHelper->getTestContext( $user );
 
                $title = Title::newFromText( 'RecentChanges', NS_SPECIAL );
index faa1dcc..cac3d43 100644 (file)
@@ -1,4 +1,6 @@
 <?php
+use MediaWiki\Linker\LinkRenderer;
+use MediaWiki\MediaWikiServices;
 
 /**
  * Helper for generating test recent changes entries.
@@ -100,7 +102,10 @@ class TestRecentChangesHelper {
        public function getCacheEntry( $recentChange ) {
                $rcCacheFactory = new RCCacheEntryFactory(
                        new RequestContext(),
-                       [ 'diff' => 'diff', 'cur' => 'cur', 'last' => 'last' ]
+                       [ 'diff' => 'diff', 'cur' => 'cur', 'last' => 'last' ],
+                       new LinkRenderer(
+                               MediaWikiServices::getInstance()->getTitleFormatter()
+                       )
                );
                return $rcCacheFactory->newFromRecentChange( $recentChange, false );
        }
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 ],
diff --git a/tests/phpunit/includes/libs/HtmlArmorTest.php b/tests/phpunit/includes/libs/HtmlArmorTest.php
new file mode 100644 (file)
index 0000000..5f176e0
--- /dev/null
@@ -0,0 +1,34 @@
+<?php
+
+/**
+ * @covers HtmlArmor
+ */
+class HtmlArmorTest extends PHPUnit_Framework_TestCase {
+
+       public static function provideHtmlArmor() {
+               return [
+                       [
+                               'foobar',
+                               'foobar',
+                       ],
+                       [
+                               '<script>alert("evil!");</script>',
+                               '&lt;script&gt;alert(&quot;evil!&quot;);&lt;/script&gt;',
+                       ],
+                       [
+                               new HtmlArmor( '<script>alert("evil!");</script>' ),
+                               '<script>alert("evil!");</script>',
+                       ],
+               ];
+       }
+
+       /**
+        * @dataProvider provideHtmlArmor
+        */
+       public function testHtmlArmor( $input, $expected ) {
+               $this->assertEquals(
+                       $expected,
+                       HtmlArmor::getHtml( $input )
+               );
+       }
+}
index 266e025..3a4aab4 100644 (file)
@@ -33,17 +33,26 @@ class WANObjectCacheTest extends MediaWikiTestCase {
         * @param integer $ttl
         */
        public function testSetAndGet( $value, $ttl ) {
+               $curTTL = null;
+               $asOf = null;
                $key = wfRandomString();
+
+               $this->cache->get( $key, $curTTL, [], $asOf );
+               $this->assertNull( $curTTL, "Current TTL is null" );
+               $this->assertNull( $asOf, "Current as-of-time is infinite" );
+
+               $t = microtime( true );
                $this->cache->set( $key, $value, $ttl );
 
-               $curTTL = null;
-               $this->assertEquals( $value, $this->cache->get( $key, $curTTL ) );
+               $this->assertEquals( $value, $this->cache->get( $key, $curTTL, [], $asOf ) );
                if ( is_infinite( $ttl ) || $ttl == 0 ) {
                        $this->assertTrue( is_infinite( $curTTL ), "Current TTL is infinite" );
                } else {
                        $this->assertGreaterThan( 0, $curTTL, "Current TTL > 0" );
                        $this->assertLessThanOrEqual( $ttl, $curTTL, "Current TTL < nominal TTL" );
                }
+               $this->assertGreaterThanOrEqual( $t - 1, $asOf, "As-of-time in range of set() time" );
+               $this->assertLessThanOrEqual( $t + 1, $asOf, "As-of-time in range of set() time" );
        }
 
        public static function provideSetAndGet() {
@@ -97,10 +106,13 @@ class WANObjectCacheTest extends MediaWikiTestCase {
        }
 
        /**
+        * @dataProvider getWithSetCallback_provider
         * @covers WANObjectCache::getWithSetCallback()
         * @covers WANObjectCache::doGetWithSetCallback()
+        * @param array $extOpts
+        * @param bool $versioned
         */
-       public function testGetWithSetCallback() {
+       public function testGetWithSetCallback( array $extOpts, $versioned ) {
                $cache = $this->cache;
 
                $key = wfRandomString();
@@ -116,7 +128,7 @@ class WANObjectCacheTest extends MediaWikiTestCase {
                };
 
                $wasSet = 0;
-               $v = $cache->getWithSetCallback( $key, 30, $func, [ 'lockTSE' => 5 ] );
+               $v = $cache->getWithSetCallback( $key, 30, $func, [ 'lockTSE' => 5 ] + $extOpts );
                $this->assertEquals( $value, $v, "Value returned" );
                $this->assertEquals( 1, $wasSet, "Value regenerated" );
 
@@ -129,15 +141,16 @@ class WANObjectCacheTest extends MediaWikiTestCase {
                $v = $cache->getWithSetCallback( $key, 30, $func, [
                        'lowTTL' => 0,
                        'lockTSE' => 5,
-               ] );
+               ] + $extOpts );
                $this->assertEquals( $value, $v, "Value returned" );
                $this->assertEquals( 0, $wasSet, "Value not regenerated" );
 
                $priorTime = microtime( true );
                usleep( 1 );
                $wasSet = 0;
-               $v = $cache->getWithSetCallback( $key, 30, $func,
-                       [ 'checkKeys' => [ $cKey1, $cKey2 ] ] );
+               $v = $cache->getWithSetCallback(
+                       $key, 30, $func, [ 'checkKeys' => [ $cKey1, $cKey2 ] ] + $extOpts
+               );
                $this->assertEquals( $value, $v, "Value returned" );
                $this->assertEquals( 1, $wasSet, "Value regenerated due to check keys" );
                $t1 = $cache->getCheckKeyTime( $cKey1 );
@@ -147,8 +160,9 @@ class WANObjectCacheTest extends MediaWikiTestCase {
 
                $priorTime = microtime( true );
                $wasSet = 0;
-               $v = $cache->getWithSetCallback( $key, 30, $func,
-                       [ 'checkKeys' => [ $cKey1, $cKey2 ] ] );
+               $v = $cache->getWithSetCallback(
+                       $key, 30, $func, [ 'checkKeys' => [ $cKey1, $cKey2 ] ] + $extOpts
+               );
                $this->assertEquals( $value, $v, "Value returned" );
                $this->assertEquals( 1, $wasSet, "Value regenerated due to still-recent check keys" );
                $t1 = $cache->getCheckKeyTime( $cKey1 );
@@ -158,19 +172,30 @@ class WANObjectCacheTest extends MediaWikiTestCase {
 
                $curTTL = null;
                $v = $cache->get( $key, $curTTL, [ $cKey1, $cKey2 ] );
-               $this->assertEquals( $value, $v, "Value returned" );
+               if ( $versioned ) {
+                       $this->assertEquals( $value, $v[$cache::VFLD_DATA], "Value returned" );
+               } else {
+                       $this->assertEquals( $value, $v, "Value returned" );
+               }
                $this->assertLessThanOrEqual( 0, $curTTL, "Value has current TTL < 0 due to check keys" );
 
                $wasSet = 0;
                $key = wfRandomString();
-               $v = $cache->getWithSetCallback( $key, 30, $func, [ 'pcTTL' => 5 ] );
+               $v = $cache->getWithSetCallback( $key, 30, $func, [ 'pcTTL' => 5 ] + $extOpts );
                $this->assertEquals( $value, $v, "Value returned" );
                $cache->delete( $key );
-               $v = $cache->getWithSetCallback( $key, 30, $func, [ 'pcTTL' => 5 ] );
+               $v = $cache->getWithSetCallback( $key, 30, $func, [ 'pcTTL' => 5 ] + $extOpts );
                $this->assertEquals( $value, $v, "Value still returned after deleted" );
                $this->assertEquals( 1, $wasSet, "Value process cached while deleted" );
        }
 
+       public static function getWithSetCallback_provider() {
+               return [
+                       [ [], false ],
+                       [ [ 'version' => 1 ], true ]
+               ];
+       }
+
        /**
         * @covers WANObjectCache::getWithSetCallback()
         * @covers WANObjectCache::doGetWithSetCallback()
@@ -434,6 +459,71 @@ class WANObjectCacheTest extends MediaWikiTestCase {
                $this->assertGreaterThan( 0, $curTTL, "Existing key has current TTL > 0" );
        }
 
+       /**
+        * @dataProvider getWithSetCallback_versions_provider
+        * @param array $extOpts
+        * @param $versioned
+        */
+       public function testGetWithSetCallback_versions( array $extOpts, $versioned ) {
+               $cache = $this->cache;
+
+               $key = wfRandomString();
+               $value = wfRandomString();
+
+               $wasSet = 0;
+               $func = function( $old, &$ttl ) use ( &$wasSet, $value ) {
+                       ++$wasSet;
+                       return $value;
+               };
+
+               // Set the main key (version N if versioned)
+               $wasSet = 0;
+               $v = $cache->getWithSetCallback( $key, 30, $func, $extOpts );
+               $this->assertEquals( $value, $v, "Value returned" );
+               $this->assertEquals( 1, $wasSet, "Value regenerated" );
+               $cache->getWithSetCallback( $key, 30, $func, $extOpts );
+               $this->assertEquals( 1, $wasSet, "Value not regenerated" );
+               // Set the key for version N+1 (if versioned)
+               if ( $versioned ) {
+                       $verOpts = [ 'version' => $extOpts['version'] + 1 ];
+
+                       $wasSet = 0;
+                       $v = $cache->getWithSetCallback( $key, 30, $func, $verOpts + $extOpts );
+                       $this->assertEquals( $value, $v, "Value returned" );
+                       $this->assertEquals( 1, $wasSet, "Value regenerated" );
+
+                       $wasSet = 0;
+                       $v = $cache->getWithSetCallback( $key, 30, $func, $verOpts + $extOpts );
+                       $this->assertEquals( $value, $v, "Value returned" );
+                       $this->assertEquals( 0, $wasSet, "Value not regenerated" );
+               }
+
+               $wasSet = 0;
+               $cache->getWithSetCallback( $key, 30, $func, $extOpts );
+               $this->assertEquals( 0, $wasSet, "Value not regenerated" );
+
+               $wasSet = 0;
+               $cache->delete( $key );
+               $v = $cache->getWithSetCallback( $key, 30, $func, $extOpts );
+               $this->assertEquals( $value, $v, "Value returned" );
+               $this->assertEquals( 1, $wasSet, "Value regenerated" );
+
+               if ( $versioned ) {
+                       $wasSet = 0;
+                       $verOpts = [ 'version' => $extOpts['version'] + 1 ];
+                       $v = $cache->getWithSetCallback( $key, 30, $func, $verOpts + $extOpts );
+                       $this->assertEquals( $value, $v, "Value returned" );
+                       $this->assertEquals( 1, $wasSet, "Value regenerated" );
+               }
+       }
+
+       public static function getWithSetCallback_versions_provider() {
+               return [
+                       [ [], false ],
+                       [ [ 'version' => 1 ], true ]
+               ];
+       }
+
        /**
         * @covers WANObjectCache::touchCheckKey()
         * @covers WANObjectCache::resetCheckKey()
diff --git a/tests/phpunit/includes/linker/LinkRendererFactoryTest.php b/tests/phpunit/includes/linker/LinkRendererFactoryTest.php
new file mode 100644 (file)
index 0000000..ed28b79
--- /dev/null
@@ -0,0 +1,74 @@
+<?php
+
+use MediaWiki\Linker\LinkRenderer;
+use MediaWiki\Linker\LinkRendererFactory;
+use MediaWiki\MediaWikiServices;
+
+/**
+ * @covers MediaWiki\Linker\LinkRendererFactory
+ */
+class LinkRendererFactoryTest extends MediaWikiLangTestCase {
+
+       /**
+        * @var TitleFormatter
+        */
+       private $titleFormatter;
+
+       public function setUp() {
+               parent::setUp();
+               $this->titleFormatter = MediaWikiServices::getInstance()->getTitleFormatter();
+       }
+
+       public static function provideCreateFromLegacyOptions() {
+               return [
+                       [
+                               [ 'forcearticlepath' ],
+                               'getForceArticlePath',
+                               true
+                       ],
+                       [
+                               [ 'http' ],
+                               'getExpandURLs',
+                               PROTO_HTTP
+                       ],
+                       [
+                               [ 'https' ],
+                               'getExpandURLs',
+                               PROTO_HTTPS
+                       ],
+                       [
+                               [ 'stubThreshold' => 150 ],
+                               'getStubThreshold',
+                               150
+                       ],
+               ];
+       }
+
+       /**
+        * @dataProvider provideCreateFromLegacyOptions
+        */
+       public function testCreateFromLegacyOptions( $options, $func, $val ) {
+               $factory = new LinkRendererFactory( $this->titleFormatter );
+               $linkRenderer = $factory->createFromLegacyOptions(
+                       $options
+               );
+               $this->assertInstanceOf( LinkRenderer::class, $linkRenderer );
+               $this->assertEquals( $val, $linkRenderer->$func(), $func );
+       }
+
+       public function testCreate() {
+               $factory = new LinkRendererFactory( $this->titleFormatter );
+               $this->assertInstanceOf( LinkRenderer::class, $factory->create() );
+       }
+
+       public function testCreateForUser() {
+               $user = $this->getMock( User::class, [ 'getStubThreshold' ] );
+               $user->expects( $this->once() )
+                       ->method( 'getStubThreshold' )
+                       ->willReturn( 15 );
+               $factory = new LinkRendererFactory( $this->titleFormatter );
+               $linkRenderer = $factory->createForUser( $user );
+               $this->assertInstanceOf( LinkRenderer::class, $linkRenderer );
+               $this->assertEquals( 15, $linkRenderer->getStubThreshold() );
+       }
+}
diff --git a/tests/phpunit/includes/linker/LinkRendererTest.php b/tests/phpunit/includes/linker/LinkRendererTest.php
new file mode 100644 (file)
index 0000000..b78592b
--- /dev/null
@@ -0,0 +1,134 @@
+<?php
+
+use MediaWiki\Linker\LinkRenderer;
+use MediaWiki\MediaWikiServices;
+
+/**
+ * @covers MediaWiki\Linker\LinkRenderer
+ */
+class LinkRendererTest extends MediaWikiLangTestCase {
+
+       /**
+        * @var TitleFormatter
+        */
+       private $titleFormatter;
+
+       public function setUp() {
+               parent::setUp();
+               $this->setMwGlobals( [
+                       'wgArticlePath' => '/wiki/$1',
+                       'wgServer' => '//example.org',
+                       'wgCanonicalServer' => 'http://example.org',
+                       'wgScriptPath' => '/w',
+                       'wgScript' => '/w/index.php',
+               ] );
+               $this->titleFormatter = MediaWikiServices::getInstance()->getTitleFormatter();
+       }
+
+       public function testMergeAttribs() {
+               $target = new TitleValue( NS_SPECIAL, 'Blankpage' );
+               $linkRenderer = new LinkRenderer( $this->titleFormatter );
+               $link = $linkRenderer->makeBrokenLink( $target, null, [
+                       // Appended to class
+                       'class' => 'foobar',
+                       // Suppresses href attribute
+                       'href' => false,
+                       // Extra attribute
+                       'bar' => 'baz'
+               ] );
+               $this->assertEquals(
+                       '<a href="/wiki/Special:BlankPage" class="new foobar" '
+                       . 'title="Special:BlankPage (page does not exist)" bar="baz">'
+                       . 'Special:BlankPage</a>',
+                       $link
+               );
+       }
+
+       public function testMakeKnownLink() {
+               $target = new TitleValue( NS_MAIN, 'Foobar' );
+               $linkRenderer = new LinkRenderer( $this->titleFormatter );
+
+               // Query added
+               $this->assertEquals(
+                       '<a href="/w/index.php?title=Foobar&amp;foo=bar" '. 'title="Foobar">Foobar</a>',
+                       $linkRenderer->makeKnownLink( $target, null, [], [ 'foo' => 'bar' ] )
+               );
+
+               // forcearticlepath
+               $linkRenderer->setForceArticlePath( true );
+               $this->assertEquals(
+                       '<a href="/wiki/Foobar?foo=bar" title="Foobar">Foobar</a>',
+                       $linkRenderer->makeKnownLink( $target, null, [], [ 'foo' => 'bar' ] )
+               );
+
+               // expand = HTTPS
+               $linkRenderer->setForceArticlePath( false );
+               $linkRenderer->setExpandURLs( PROTO_HTTPS );
+               $this->assertEquals(
+                       '<a href="https://example.org/wiki/Foobar" title="Foobar">Foobar</a>',
+                       $linkRenderer->makeKnownLink( $target )
+               );
+       }
+
+       public function testMakeBrokenLink() {
+               $target = new TitleValue( NS_MAIN, 'Foobar' );
+               $special = new TitleValue( NS_SPECIAL, 'Foobar' );
+               $linkRenderer = new LinkRenderer( $this->titleFormatter );
+
+               // action=edit&redlink=1 added
+               $this->assertEquals(
+                       '<a href="/w/index.php?title=Foobar&amp;action=edit&amp;redlink=1" '
+                       . 'class="new" title="Foobar (page does not exist)">Foobar</a>',
+                       $linkRenderer->makeBrokenLink( $target )
+               );
+
+               // action=edit&redlink=1 not added due to action query parameter
+               $this->assertEquals(
+                       '<a href="/w/index.php?title=Foobar&amp;action=foobar" class="new" '
+                       . 'title="Foobar (page does not exist)">Foobar</a>',
+                       $linkRenderer->makeBrokenLink( $target, null, [], [ 'action' => 'foobar' ] )
+               );
+
+               // action=edit&redlink=1 not added due to NS_SPECIAL
+               $this->assertEquals(
+                       '<a href="/wiki/Special:Foobar" class="new" title="Special:Foobar '
+                       . '(page does not exist)">Special:Foobar</a>',
+                       $linkRenderer->makeBrokenLink( $special )
+               );
+
+               // fragment stripped
+               $this->assertEquals(
+                       '<a href="/w/index.php?title=Foobar&amp;action=edit&amp;redlink=1" '
+                       . 'class="new" title="Foobar (page does not exist)">Foobar</a>',
+                       $linkRenderer->makeBrokenLink( $target->createFragmentTarget( 'foobar' ) )
+               );
+       }
+
+       public function testMakeLink() {
+               $linkRenderer = new LinkRenderer( $this->titleFormatter );
+               $foobar = new TitleValue( NS_SPECIAL, 'Foobar' );
+               $blankpage = new TitleValue( NS_SPECIAL, 'Blankpage' );
+               $this->assertEquals(
+                       '<a href="/wiki/Special:Foobar" class="new" title="Special:Foobar '
+                       . '(page does not exist)">foo</a>',
+                       $linkRenderer->makeLink( $foobar, 'foo' )
+               );
+
+               $this->assertEquals(
+                       '<a href="/wiki/Special:BlankPage" title="Special:BlankPage">blank</a>',
+                       $linkRenderer->makeLink( $blankpage, 'blank' )
+               );
+
+               $this->assertEquals(
+                       '<a href="/wiki/Special:Foobar" class="new" title="Special:Foobar '
+                       . '(page does not exist)">&lt;script&gt;evil()&lt;/script&gt;</a>',
+                       $linkRenderer->makeLink( $foobar, '<script>evil()</script>' )
+               );
+
+               $this->assertEquals(
+                       '<a href="/wiki/Special:Foobar" class="new" title="Special:Foobar '
+                       . '(page does not exist)"><script>evil()</script></a>',
+                       $linkRenderer->makeLink( $foobar, new HtmlArmor( '<script>evil()</script>' ) )
+               );
+       }
+}
index c024555..354ddd4 100644 (file)
@@ -94,7 +94,7 @@ class NewParserTest extends MediaWikiTestCase {
                $tmpGlobals['wgParserCacheType'] = CACHE_NONE;
                $tmpGlobals['wgCapitalLinks'] = true;
                $tmpGlobals['wgNoFollowLinks'] = true;
-               $tmpGlobals['wgNoFollowDomainExceptions'] = [];
+               $tmpGlobals['wgNoFollowDomainExceptions'] = [ 'no-nofollow.org' ];
                $tmpGlobals['wgExternalLinkTarget'] = false;
                $tmpGlobals['wgThumbnailScriptPath'] = false;
                $tmpGlobals['wgUseImageResize'] = true;
index 90d8e9f..2dec02b 100644 (file)
@@ -226,4 +226,24 @@ class ResourceLoaderFileModuleTest extends ResourceLoaderTestCase {
 
                $this->assertEquals( $rl->getTemplates(), $expected );
        }
+
+       public function testBomConcatenation() {
+               $basePath = __DIR__ . '/../../data/css';
+               $testModule = new ResourceLoaderFileModule( [
+                       'localBasePath' => $basePath,
+                       'styles' => [ 'bom.css' ],
+                       ] );
+               $this->assertEquals(
+                       substr( file_get_contents( "$basePath/bom.css" ), 0, 10 ),
+                       "\xef\xbb\xbf.efbbbf",
+                       'File has leading BOM'
+               );
+
+               $contextLtr = $this->getResourceLoaderContext( 'en', 'ltr' );
+               $this->assertEquals(
+                       $testModule->getStyles( $contextLtr ),
+                       [ 'all' => ".efbbbf_bom_char_at_start_of_file {}\n" ],
+                       'Leading BOM removed when concatenating files'
+               );
+       }
 }
index 85834d7..e6bb5a7 100644 (file)
@@ -49,6 +49,12 @@ class ResourceLoaderWikiModuleTest extends ResourceLoaderTestCase {
                        'scripts' => [ 'MediaWiki:Common.js' ],
                ];
 
+               $variableParams = [
+                       'allowVariables' => true,
+                       'styles' => [ 'MediaWiki:Common.css', 'MediaWiki:{skin}.css' ],
+                       'scripts' => [ 'MediaWiki:Common.js', 'MediaWiki:{skin}.js' ],
+               ];
+
                return [
                        [ [], new HashConfig( $settings ), [] ],
                        [ $params, new HashConfig( $settings ), [
@@ -67,6 +73,12 @@ class ResourceLoaderWikiModuleTest extends ResourceLoaderTestCase {
                                ),
                                []
                        ],
+                       [ $variableParams, new HashConfig( $settings ), [
+                               'MediaWiki:Common.js' => [ 'type' => 'script' ],
+                               'MediaWiki:vector.js' => [ 'type' => 'script' ],
+                               'MediaWiki:Common.css' => [ 'type' => 'style' ],
+                               'MediaWiki:vector.css' => [ 'type' => 'style' ]
+                       ] ],
                ];
        }
 
index edab0dc..9bc41c0 100644 (file)
@@ -65,11 +65,10 @@ 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' );
+               $sysop = static::getTestSysop()->getUser();
+               $userId = \CentralIdLookup::factory( 'local' )->centralIdFromName( $sysop->getName() );
 
                $dbw = wfGetDB( DB_MASTER );
                $dbw->delete(
@@ -82,7 +81,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"]',
@@ -184,7 +183,7 @@ class BotPasswordSessionProviderTest extends MediaWikiTestCase {
 
        public function testNewSessionInfoForRequest() {
                $provider = $this->getProvider();
-               $user = \User::newFromName( 'UTSysop' );
+               $user = static::getTestSysop()->getUser();
                $request = $this->getMock( 'FauxRequest', [ 'getIP' ] );
                $request->expects( $this->any() )->method( 'getIP' )
                        ->will( $this->returnValue( '127.0.0.1' ) );
@@ -211,7 +210,7 @@ class BotPasswordSessionProviderTest extends MediaWikiTestCase {
                $provider = $this->getProvider();
                $provider->setLogger( $logger );
 
-               $user = \User::newFromName( 'UTSysop' );
+               $user = static::getTestSysop()->getUser();
                $request = $this->getMock( 'FauxRequest', [ 'getIP' ] );
                $request->expects( $this->any() )->method( 'getIP' )
                        ->will( $this->returnValue( '127.0.0.1' ) );
index 9600184..b35b685 100644 (file)
@@ -165,7 +165,7 @@ class CookieSessionProviderTest extends MediaWikiTestCase {
                $provider->setConfig( $this->getConfig() );
                $provider->setManager( new SessionManager() );
 
-               $user = User::newFromName( 'UTSysop' );
+               $user = static::getTestSysop()->getUser();
                $id = $user->getId();
                $name = $user->getName();
                $token = $user->getToken( true );
@@ -390,7 +390,7 @@ class CookieSessionProviderTest extends MediaWikiTestCase {
 
                $sessionId = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa';
                $store = new TestBagOStuff();
-               $user = User::newFromName( 'UTSysop' );
+               $user = static::getTestSysop()->getUser();
                $anon = new User;
 
                $backend = new SessionBackend(
@@ -475,7 +475,7 @@ class CookieSessionProviderTest extends MediaWikiTestCase {
                $provider->setManager( SessionManager::singleton() );
 
                $sessionId = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa';
-               $user = User::newFromName( 'UTSysop' );
+               $user = static::getTestSysop()->getUser();
                $this->assertFalse( $user->requiresHTTPS(), 'sanity check' );
 
                $backend = new SessionBackend(
@@ -577,7 +577,7 @@ class CookieSessionProviderTest extends MediaWikiTestCase {
 
                $sessionId = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa';
                $store = new TestBagOStuff();
-               $user = User::newFromName( 'UTSysop' );
+               $user = static::getTestSysop()->getUser();
                $anon = new User;
 
                $backend = new SessionBackend(
index ce0f1b0..799a97b 100644 (file)
@@ -173,14 +173,6 @@ class PHPSessionHandlerTest extends MediaWikiTestCase {
                        $this->assertSame( $expect, $_SESSION );
                }
 
-               // Test expiry
-               session_write_close();
-               ini_set( 'session.gc_divisor', 1 );
-               ini_set( 'session.gc_probability', 1 );
-               sleep( 3 );
-               session_start();
-               $this->assertSame( [], $_SESSION );
-
                // Re-fill the session, then test that session_destroy() works.
                $_SESSION['AuthenticationSessionTest'] = $rand;
                session_write_close();
index 0b5f4c2..a3d5de7 100644 (file)
@@ -360,7 +360,7 @@ class SessionBackendTest extends MediaWikiTestCase {
        }
 
        public function testSetUser() {
-               $user = User::newFromName( 'UTSysop' );
+               $user = static::getTestSysop()->getUser();
 
                $this->provider = $this->getMock( 'DummySessionProvider', [ 'canChangeUser' ] );
                $this->provider->expects( $this->any() )->method( 'canChangeUser' )
@@ -484,7 +484,7 @@ class SessionBackendTest extends MediaWikiTestCase {
        }
 
        public function testSave() {
-               $user = User::newFromName( 'UTSysop' );
+               $user = static::getTestSysop()->getUser();
                $this->store = new TestBagOStuff();
                $testData = [ 'foo' => 'foo!', 'bar', [ 'baz', null ] ];
 
@@ -733,7 +733,7 @@ class SessionBackendTest extends MediaWikiTestCase {
        }
 
        public function testRenew() {
-               $user = User::newFromName( 'UTSysop' );
+               $user = static::getTestSysop()->getUser();
                $this->store = new TestBagOStuff();
                $testData = [ 'foo' => 'foo!', 'bar', [ 'baz', null ] ];
 
@@ -829,7 +829,7 @@ class SessionBackendTest extends MediaWikiTestCase {
                        $handler->enable = true;
                }
 
-               $backend = $this->getBackend( User::newFromName( 'UTSysop' ) );
+               $backend = $this->getBackend( static::getTestSysop()->getUser() );
                \TestingAccessWrapper::newFromObject( $backend )->usePhpSessionHandling = true;
 
                $resetSingleton = TestUtils::setSessionManagerSingleton( $this->manager );
index e55a3a4..4d914e4 100644 (file)
@@ -164,6 +164,7 @@ class MediaWikiTitleCodecTest extends MediaWikiTestCase {
                        // getGenderCache() provides a mock that considers first
                        // names ending in "a" to be female.
                        [ NS_USER, 'Lisa_Müller', '', 'de', 'Benutzerin:Lisa Müller' ],
+                       [ 1000000, 'Invalid_namespace', '', 'en', ':Invalid namespace' ],
                ];
        }
 
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..1ef5082 100644 (file)
@@ -7,6 +7,13 @@ use MediaWiki\Session\SessionManager;
  * @group Database
  */
 class BotPasswordTest extends MediaWikiTestCase {
+
+       /** @var TestUser */
+       private $testUser;
+
+       /** @var string */
+       private $testUserName;
+
        protected function setUp() {
                parent::setUp();
 
@@ -20,11 +27,14 @@ class BotPasswordTest extends MediaWikiTestCase {
                        'wgUserrightsInterwikiDelimiter' => '@',
                ] );
 
+               $this->testUser = $this->getMutableTestUser();
+               $this->testUserName = $this->testUser->getUser()->getName();
+
                $mock1 = $this->getMockForAbstractClass( 'CentralIdLookup' );
                $mock1->expects( $this->any() )->method( 'isAttached' )
                        ->will( $this->returnValue( true ) );
                $mock1->expects( $this->any() )->method( 'lookupUserNames' )
-                       ->will( $this->returnValue( [ 'UTSysop' => 42, 'UTDummy' => 43, 'UTInvalid' => 0 ] ) );
+                       ->will( $this->returnValue( [ $this->testUserName => 42, 'UTDummy' => 43, 'UTInvalid' => 0 ] ) );
                $mock1->expects( $this->never() )->method( 'lookupCentralIds' );
 
                $mock2 = $this->getMockForAbstractClass( 'CentralIdLookup' );
@@ -49,9 +59,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 +73,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 +81,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"]',
@@ -84,7 +92,7 @@ class BotPasswordTest extends MediaWikiTestCase {
        }
 
        public function testBasics() {
-               $user = User::newFromName( 'UTSysop' );
+               $user = $this->testUser->getUser();
                $bp = BotPassword::newFromUser( $user, 'BotPassword' );
                $this->assertInstanceOf( 'BotPassword', $bp );
                $this->assertTrue( $bp->isSaved() );
@@ -109,7 +117,7 @@ class BotPasswordTest extends MediaWikiTestCase {
        }
 
        public function testUnsaved() {
-               $user = User::newFromName( 'UTSysop' );
+               $user = $this->testUser->getUser();
                $bp = BotPassword::newUnsaved( [
                        'user' => $user,
                        'appId' => 'DoesNotExist'
@@ -134,7 +142,7 @@ class BotPasswordTest extends MediaWikiTestCase {
                $this->assertEquals( '{"IPAddresses":["127.0.0.0/8"]}', $bp->getRestrictions()->toJson() );
                $this->assertSame( [ 'test' ], $bp->getGrants() );
 
-               $user = User::newFromName( 'UTSysop' );
+               $user = $this->testUser->getUser();
                $bp = BotPassword::newUnsaved( [
                        'centralId' => 45,
                        'appId' => 'DoesNotExist'
@@ -144,7 +152,7 @@ class BotPasswordTest extends MediaWikiTestCase {
                $this->assertSame( 45, $bp->getUserCentralId() );
                $this->assertSame( 'DoesNotExist', $bp->getAppId() );
 
-               $user = User::newFromName( 'UTSysop' );
+               $user = $this->testUser->getUser();
                $bp = BotPassword::newUnsaved( [
                        'user' => $user,
                        'appId' => 'BotPassword'
@@ -161,7 +169,7 @@ class BotPasswordTest extends MediaWikiTestCase {
                        'appId' => str_repeat( 'X', BotPassword::APPID_MAXLENGTH + 1 ),
                ] ) );
                $this->assertNull( BotPassword::newUnsaved( [
-                       'user' => 'UTSysop',
+                       'user' => $this->testUserName,
                        'appId' => 'Ok',
                ] ) );
                $this->assertNull( BotPassword::newUnsaved( [
@@ -202,7 +210,7 @@ class BotPasswordTest extends MediaWikiTestCase {
 
                $this->assertNotInstanceOf( 'InvalidPassword', $bp1->getPassword(), 'sanity check' );
                $this->assertNotInstanceOf( 'InvalidPassword', $bp2->getPassword(), 'sanity check' );
-               BotPassword::invalidateAllPasswordsForUser( 'UTSysop' );
+               BotPassword::invalidateAllPasswordsForUser( $this->testUserName );
                $this->assertInstanceOf( 'InvalidPassword', $bp1->getPassword() );
                $this->assertNotInstanceOf( 'InvalidPassword', $bp2->getPassword() );
 
@@ -214,7 +222,7 @@ class BotPasswordTest extends MediaWikiTestCase {
                $this->assertNotNull( BotPassword::newFromCentralId( 42, 'BotPassword' ), 'sanity check' );
                $this->assertNotNull( BotPassword::newFromCentralId( 43, 'BotPassword' ), 'sanity check' );
 
-               BotPassword::removeAllPasswordsForUser( 'UTSysop' );
+               BotPassword::removeAllPasswordsForUser( $this->testUserName );
 
                $this->assertNull( BotPassword::newFromCentralId( 42, 'BotPassword' ) );
                $this->assertNotNull( BotPassword::newFromCentralId( 43, 'BotPassword' ) );
@@ -223,7 +231,7 @@ class BotPasswordTest extends MediaWikiTestCase {
        public function testLogin() {
                // Test failure when bot passwords aren't enabled
                $this->setMwGlobals( 'wgEnableBotPasswords', false );
-               $status = BotPassword::login( 'UTSysop@BotPassword', 'foobaz', new FauxRequest );
+               $status = BotPassword::login( "{$this->testUserName}@BotPassword", 'foobaz', new FauxRequest );
                $this->assertEquals( Status::newFatal( 'botpasswords-disabled' ), $status );
                $this->setMwGlobals( 'wgEnableBotPasswords', true );
 
@@ -237,7 +245,7 @@ class BotPasswordTest extends MediaWikiTestCase {
                        $manager->getProvider( MediaWiki\Session\BotPasswordSessionProvider::class ),
                        'sanity check'
                );
-               $status = BotPassword::login( 'UTSysop@BotPassword', 'foobaz', new FauxRequest );
+               $status = BotPassword::login( "{$this->testUserName}@BotPassword", 'foobaz', new FauxRequest );
                $this->assertEquals( Status::newFatal( 'botpasswords-no-provider' ), $status );
                ScopedCallback::consume( $reset );
 
@@ -259,7 +267,7 @@ class BotPasswordTest extends MediaWikiTestCase {
                $reset = MediaWiki\Session\TestUtils::setSessionManagerSingleton( $manager );
 
                // No "@"-thing in the username
-               $status = BotPassword::login( 'UTSysop', 'foobaz', new FauxRequest );
+               $status = BotPassword::login( $this->testUserName, 'foobaz', new FauxRequest );
                $this->assertEquals( Status::newFatal( 'botpasswords-invalid-name', '@' ), $status );
 
                // No base user
@@ -267,9 +275,9 @@ class BotPasswordTest extends MediaWikiTestCase {
                $this->assertEquals( Status::newFatal( 'nosuchuser', 'UTDummy' ), $status );
 
                // No bot password
-               $status = BotPassword::login( 'UTSysop@DoesNotExist', 'foobaz', new FauxRequest );
+               $status = BotPassword::login( "{$this->testUserName}@DoesNotExist", 'foobaz', new FauxRequest );
                $this->assertEquals(
-                       Status::newFatal( 'botpasswords-not-exist', 'UTSysop', 'DoesNotExist' ),
+                       Status::newFatal( 'botpasswords-not-exist', $this->testUserName, 'DoesNotExist' ),
                        $status
                );
 
@@ -277,11 +285,12 @@ class BotPasswordTest extends MediaWikiTestCase {
                $request = $this->getMock( 'FauxRequest', [ 'getIP' ] );
                $request->expects( $this->any() )->method( 'getIP' )
                        ->will( $this->returnValue( '10.0.0.1' ) );
-               $status = BotPassword::login( 'UTSysop@BotPassword', 'foobaz', $request );
+               $status = BotPassword::login( "{$this->testUserName}@BotPassword", 'foobaz', $request );
                $this->assertEquals( Status::newFatal( 'botpasswords-restriction-failed' ), $status );
 
                // Wrong password
-               $status = BotPassword::login( 'UTSysop@BotPassword', 'UTSysopPassword', new FauxRequest );
+               $status = BotPassword::login(
+                       "{$this->testUserName}@BotPassword", $this->testUser->password, new FauxRequest );
                $this->assertEquals( Status::newFatal( 'wrongpassword' ), $status );
 
                // Success!
@@ -291,7 +300,7 @@ class BotPasswordTest extends MediaWikiTestCase {
                        $request->getSession()->getProvider(),
                        'sanity check'
                );
-               $status = BotPassword::login( 'UTSysop@BotPassword', 'foobaz', $request );
+               $status = BotPassword::login( "{$this->testUserName}@BotPassword", 'foobaz', $request );
                $this->assertInstanceOf( 'Status', $status );
                $this->assertTrue( $status->isGood() );
                $session = $status->getValue();
@@ -311,8 +320,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 +332,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 +363,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 1786261..feac641 100644 (file)
@@ -45,7 +45,7 @@ class CentralIdLookupTest extends MediaWikiTestCase {
                        $this->getMockForAbstractClass( 'CentralIdLookup' )
                );
 
-               $user = User::newFromName( 'UTSysop' );
+               $user = static::getTestSysop()->getUser();
                $this->assertSame( $user, $mock->checkAudience( $user ) );
 
                $user = $mock->checkAudience( CentralIdLookup::AUDIENCE_PUBLIC );
index c86fb6c..c91d8e0 100644 (file)
@@ -18,18 +18,14 @@ class LocalIdLookupTest extends MediaWikiTestCase {
 
        public function addDBData() {
                for ( $i = 1; $i <= 4; $i++ ) {
-                       $user = User::newFromName( "UTLocalIdLookup$i" );
-                       if ( $user->getId() == 0 ) {
-                               $user->addToDatabase();
-                       }
-                       $this->localUsers["UTLocalIdLookup$i"] = $user->getId();
+                       $this->localUsers[] = $this->getMutableTestUser()->getUser();
                }
 
-               User::newFromName( 'UTLocalIdLookup1' )->addGroup( 'local-id-lookup-test' );
+               $sysop = static::getTestSysop()->getUser();
 
                $block = new Block( [
-                       'address' => 'UTLocalIdLookup3',
-                       'by' => User::idFromName( 'UTSysop' ),
+                       'address' => $this->localUsers[2]->getName(),
+                       'by' => $sysop->getId(),
                        'reason' => __METHOD__,
                        'expiry' => '1 day',
                        'hideName' => false,
@@ -37,8 +33,8 @@ class LocalIdLookupTest extends MediaWikiTestCase {
                $block->insert();
 
                $block = new Block( [
-                       'address' => 'UTLocalIdLookup4',
-                       'by' => User::idFromName( 'UTSysop' ),
+                       'address' => $this->localUsers[3]->getName(),
+                       'by' => $sysop->getId(),
                        'reason' => __METHOD__,
                        'expiry' => '1 day',
                        'hideName' => true,
@@ -46,9 +42,14 @@ class LocalIdLookupTest extends MediaWikiTestCase {
                $block->insert();
        }
 
+       public function getLookupUser() {
+               return static::getTestUser( [ 'local-id-lookup-test' ] )->getUser();
+       }
+
        public function testLookupCentralIds() {
                $lookup = new LocalIdLookup();
-               $user1 = User::newFromName( 'UTLocalIdLookup1' );
+
+               $user1 = $this->getLookupUser();
                $user2 = User::newFromName( 'UTLocalIdLookup2' );
 
                $this->assertTrue( $user1->isAllowed( 'hideuser' ), 'sanity check' );
@@ -56,12 +57,15 @@ class LocalIdLookupTest extends MediaWikiTestCase {
 
                $this->assertSame( [], $lookup->lookupCentralIds( [] ) );
 
-               $expect = array_flip( $this->localUsers );
-               $expect[123] = 'X';
+               $expect = [];
+               foreach ( $this->localUsers as $localUser ) {
+                       $expect[$localUser->getId()] = $localUser->getName();
+               }
+               $expect[12345] = 'X';
                ksort( $expect );
 
                $expect2 = $expect;
-               $expect2[$this->localUsers['UTLocalIdLookup4']] = '';
+               $expect2[$this->localUsers[3]->getId()] = '';
 
                $arg = array_fill_keys( array_keys( $expect ), 'X' );
 
@@ -73,7 +77,7 @@ class LocalIdLookupTest extends MediaWikiTestCase {
 
        public function testLookupUserNames() {
                $lookup = new LocalIdLookup();
-               $user1 = User::newFromName( 'UTLocalIdLookup1' );
+               $user1 = $this->getLookupUser();
                $user2 = User::newFromName( 'UTLocalIdLookup2' );
 
                $this->assertTrue( $user1->isAllowed( 'hideuser' ), 'sanity check' );
@@ -81,12 +85,15 @@ class LocalIdLookupTest extends MediaWikiTestCase {
 
                $this->assertSame( [], $lookup->lookupUserNames( [] ) );
 
-               $expect = $this->localUsers;
+               $expect = [];
+               foreach ( $this->localUsers as $localUser ) {
+                       $expect[$localUser->getName()] = $localUser->getId();
+               }
                $expect['UTDoesNotExist'] = 'X';
                ksort( $expect );
 
                $expect2 = $expect;
-               $expect2['UTLocalIdLookup4'] = 'X';
+               $expect2[$this->localUsers[3]->getName()] = 'X';
 
                $arg = array_fill_keys( array_keys( $expect ), 'X' );
 
@@ -98,7 +105,7 @@ class LocalIdLookupTest extends MediaWikiTestCase {
 
        public function testIsAttached() {
                $lookup = new LocalIdLookup();
-               $user1 = User::newFromName( 'UTLocalIdLookup1' );
+               $user1 = $this->getLookupUser();
                $user2 = User::newFromName( 'DoesNotExist' );
 
                $this->assertTrue( $lookup->isAttached( $user1 ) );
@@ -130,7 +137,7 @@ class LocalIdLookupTest extends MediaWikiTestCase {
                $lookup = new LocalIdLookup();
                $this->assertSame(
                        $sharedDB && $sharedTable && $localDBSet,
-                       $lookup->isAttached( User::newFromName( 'UTLocalIdLookup1' ), 'shared' )
+                       $lookup->isAttached( $this->getLookupUser(), 'shared' )
                );
        }
 
index c9b6929..801ab91 100644 (file)
@@ -213,11 +213,7 @@ class UserTest extends MediaWikiTestCase {
         * @covers User::getEditCount
         */
        public function testEditCount() {
-               $user = User::newFromName( 'UnitTestUser' );
-
-               if ( !$user->getId() ) {
-                       $user->addToDatabase();
-               }
+               $user = $this->getMutableTestUser()->getUser();
 
                // let the user have a few (3) edits
                $page = WikiPage::factory( Title::newFromText( 'Help:UserTest_EditCount' ) );
@@ -249,17 +245,13 @@ class UserTest extends MediaWikiTestCase {
         * @covers User::getOption
         */
        public function testOptions() {
-               $user = User::newFromName( 'UnitTestUser' );
-
-               if ( !$user->getId() ) {
-                       $user->addToDatabase();
-               }
+               $user = $this->getMutableTestUser()->getUser();
 
                $user->setOption( 'userjs-someoption', 'test' );
                $user->setOption( 'cols', 200 );
                $user->saveSettings();
 
-               $user = User::newFromName( 'UnitTestUser' );
+               $user = User::newFromName( $user->getName() );
                $this->assertEquals( 'test', $user->getOption( 'userjs-someoption' ) );
                $this->assertEquals( 200, $user->getOption( 'cols' ) );
        }
@@ -298,7 +290,7 @@ class UserTest extends MediaWikiTestCase {
                                                'MinimalPasswordLength' => 6,
                                                'PasswordCannotMatchUsername' => true,
                                                'PasswordCannotMatchBlacklist' => true,
-                                               'MaximalPasswordLength' => 30,
+                                               'MaximalPasswordLength' => 40,
                                        ],
                                ],
                                'checks' => [
@@ -311,7 +303,8 @@ class UserTest extends MediaWikiTestCase {
                        ],
                ] );
 
-               $user = User::newFromName( 'Useruser' );
+               $user = static::getTestUser()->getUser();
+
                // Sanity
                $this->assertTrue( $user->isValidPassword( 'Password1234' ) );
 
@@ -322,18 +315,19 @@ class UserTest extends MediaWikiTestCase {
                $this->assertEquals( 'passwordtooshort', $user->getPasswordValidity( 'a' ) );
 
                // Maximum length
-               $longPass = str_repeat( 'a', 31 );
+               $longPass = str_repeat( 'a', 41 );
                $this->assertFalse( $user->isValidPassword( $longPass ) );
                $this->assertFalse( $user->checkPasswordValidity( $longPass )->isGood() );
                $this->assertFalse( $user->checkPasswordValidity( $longPass )->isOK() );
                $this->assertEquals( 'passwordtoolong', $user->getPasswordValidity( $longPass ) );
 
                // Matches username
-               $this->assertFalse( $user->checkPasswordValidity( 'Useruser' )->isGood() );
-               $this->assertTrue( $user->checkPasswordValidity( 'Useruser' )->isOK() );
-               $this->assertEquals( 'password-name-match', $user->getPasswordValidity( 'Useruser' ) );
+               $this->assertFalse( $user->checkPasswordValidity( $user->getName() )->isGood() );
+               $this->assertTrue( $user->checkPasswordValidity( $user->getName() )->isOK() );
+               $this->assertEquals( 'password-name-match', $user->getPasswordValidity( $user->getName() ) );
 
                // On the forbidden list
+               $user = User::newFromName( 'Useruser' );
                $this->assertFalse( $user->checkPasswordValidity( 'Passpass' )->isGood() );
                $this->assertEquals( 'password-login-forbidden', $user->getPasswordValidity( 'Passpass' ) );
        }
@@ -389,29 +383,23 @@ class UserTest extends MediaWikiTestCase {
         * @covers User::equals
         */
        public function testEquals() {
-               $first = User::newFromName( 'EqualUser' );
-               $second = User::newFromName( 'EqualUser' );
+               $first = $this->getMutableTestUser()->getUser();
+               $second = User::newFromName( $first->getName() );
 
                $this->assertTrue( $first->equals( $first ) );
                $this->assertTrue( $first->equals( $second ) );
                $this->assertTrue( $second->equals( $first ) );
 
-               $third = User::newFromName( '0' );
-               $fourth = User::newFromName( '000' );
+               $third = $this->getMutableTestUser()->getUser();
+               $fourth = $this->getMutableTestUser()->getUser();
 
                $this->assertFalse( $third->equals( $fourth ) );
                $this->assertFalse( $fourth->equals( $third ) );
 
                // Test users loaded from db with id
-               $user = User::newFromName( 'EqualUnitTestUser' );
-               if ( !$user->getId() ) {
-                       $user->addToDatabase();
-               }
-
-               $id = $user->getId();
-
-               $fifth = User::newFromId( $id );
-               $sixth = User::newFromName( 'EqualUnitTestUser' );
+               $user = $this->getMutableTestUser()->getUser();
+               $fifth = User::newFromId( $user->getId() );
+               $sixth = User::newFromName( $user->getName() );
                $this->assertTrue( $fifth->equals( $sixth ) );
        }
 
@@ -419,7 +407,7 @@ class UserTest extends MediaWikiTestCase {
         * @covers User::getId
         */
        public function testGetId() {
-               $user = User::newFromName( 'UTSysop' );
+               $user = static::getTestUser()->getUser();
                $this->assertTrue( $user->getId() > 0 );
 
        }
@@ -429,7 +417,7 @@ class UserTest extends MediaWikiTestCase {
         * @covers User::isAnon
         */
        public function testLoggedIn() {
-               $user = User::newFromName( 'UTSysop' );
+               $user = $this->getMutableTestUser()->getUser();
                $this->assertTrue( $user->isLoggedIn() );
                $this->assertFalse( $user->isAnon() );
 
@@ -447,7 +435,8 @@ class UserTest extends MediaWikiTestCase {
         * @covers User::checkAndSetTouched
         */
        public function testCheckAndSetTouched() {
-               $user = TestingAccessWrapper::newFromObject( User::newFromName( 'UTSysop' ) );
+               $user = $this->getMutableTestUser()->getUser();
+               $user = TestingAccessWrapper::newFromObject( $user );
                $this->assertTrue( $user->isLoggedIn() );
 
                $touched = $user->getDBTouched();
index 0cf2d0f..9e41a4e 100644 (file)
@@ -1738,4 +1738,17 @@ class LanguageTest extends LanguageClassesTestCase {
                        ],
                ];
        }
+
+       public function testEquals() {
+               $en1 = new Language();
+               $en1->setCode( 'en' );
+
+               $en2 = Language::factory( 'en' );
+               $en2->setCode( 'en' );
+
+               $this->assertTrue( $en1->equals( $en2 ), 'en equals en' );
+
+               $fr = Language::factory( 'fr' );
+               $this->assertFalse( $en1->equals( $fr ), 'en not equals fr' );
+       }
 }
index ac83d4e..1d55ab8 100644 (file)
@@ -25,6 +25,26 @@ abstract class DumpTestCase extends MediaWikiLangTestCase {
         */
        protected $xml = null;
 
+       /** @var bool|null Whether the 'gzip' utility is available */
+       protected static $hasGzip = null;
+
+       /**
+        * Skip the test if 'gzip' is not in $PATH.
+        *
+        * @return bool
+        */
+       protected function checkHasGzip() {
+               if ( self::$hasGzip === null ) {
+                       self::$hasGzip = ( Installer::locateExecutableInDefaultPaths( 'gzip' ) !== false );
+               }
+
+               if ( !self::$hasGzip ) {
+                       $this->markTestSkipped( "Skip test, requires the gzip utility in PATH" );
+               }
+
+               return self::$hasGzip;
+       }
+
        /**
         * Adds a revision to a page, while returning the resuting revision's id
         *
index d13da60..baaa66b 100755 (executable)
@@ -75,7 +75,7 @@ class PHPUnitMaintClass extends Maintenance {
                global $wgLanguageConverterCacheType, $wgUseDatabaseMessages;
                global $wgLocaltimezone, $wgLocalisationCacheConf;
                global $wgDevelopmentWarnings;
-               global $wgSessionProviders;
+               global $wgSessionProviders, $wgSessionPbkdf2Iterations;
                global $wgJobTypeConf;
                global $wgAuthManagerConfig, $wgAuth, $wgDisableAuthManager;
 
@@ -125,6 +125,9 @@ class PHPUnitMaintClass extends Maintenance {
                        ],
                ];
 
+               // Single-iteration PBKDF2 session secret derivation, for speed.
+               $wgSessionPbkdf2Iterations = 1;
+
                // Generic AuthManager configuration for testing
                $wgAuthManagerConfig = [
                        'preauth' => [],
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>
index ee854ae..edc2716 100644 (file)
@@ -4,7 +4,8 @@
        // TODO: verify checkboxes == [ 'nsassociated', 'nsinvert' ]
 
        QUnit.test( '"all" namespace disable checkboxes', 8, function ( assert ) {
-               var selectHtml, $env, $options;
+               var selectHtml, $env, $options,
+                       rc = require( 'mediawiki.special.recentchanges' );
 
                // from Special:Recentchanges
                selectHtml = '<select id="namespace" name="namespace" class="namespaceselector">'
@@ -32,7 +33,7 @@
                assert.strictEqual( $( '#nsassociated' ).prop( 'disabled' ), false );
 
                // Initiate the recentchanges module
-               mw.special.recentchanges.init();
+               rc.init();
 
                // By default
                assert.strictEqual( $( '#nsinvert' ).prop( 'disabled' ), true );