Merge "Show ParserOutput warning instead of on the actual page output for ignored...
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Thu, 2 Jun 2016 21:23:04 +0000 (21:23 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Thu, 2 Jun 2016 21:23:04 +0000 (21:23 +0000)
320 files changed:
.stylelintrc
CREDITS
HISTORY
RELEASE-NOTES-1.28
autoload.php
composer.json
docs/hooks.txt
includes/DefaultSettings.php
includes/DummyLinker.php
includes/EditPage.php
includes/Linker.php
includes/MediaWiki.php
includes/MediaWikiServices.php
includes/Message.php
includes/OutputPage.php
includes/PHPVersionCheck.php
includes/ServiceWiring.php
includes/Setup.php
includes/Status.php
includes/Title.php
includes/WatchedItemStore.php
includes/WebRequest.php
includes/actions/RollbackAction.php
includes/api/ApiAMCreateAccount.php
includes/api/ApiAuthManagerHelper.php
includes/api/ApiClientLogin.php
includes/api/ApiMain.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/ApiQueryUsers.php
includes/api/ApiRollback.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/qqq.json
includes/api/i18n/ta.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/cache/HTMLFileCache.php
includes/cache/LinkBatch.php
includes/cache/LinkCache.php
includes/changes/ChangesList.php
includes/changes/EnhancedChangesList.php
includes/changes/RCCacheEntryFactory.php
includes/collation/IcuCollation.php
includes/db/DatabaseMysqlBase.php
includes/db/loadbalancer/LBFactory.php
includes/db/loadbalancer/LoadBalancer.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
includes/diff/WordLevelDiff.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/i18n/en.json
includes/installer/i18n/ia.json
includes/installer/i18n/ksh.json
includes/installer/i18n/lv.json
includes/installer/i18n/qqq.json
includes/installer/i18n/ru.json
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/logging/LogEventsList.php
includes/page/WikiPage.php
includes/parser/CoreParserFunctions.php
includes/parser/LinkHolderArray.php
includes/parser/Parser.php
includes/parser/ParserOptions.php
includes/resourceloader/ResourceLoaderFileModule.php
includes/resourceloader/ResourceLoaderUserGroupsModule.php [deleted file]
includes/resourceloader/ResourceLoaderUserModule.php
includes/revisiondelete/RevDelArchiveList.php
includes/revisiondelete/RevDelRevisionList.php
includes/search/SearchEngine.php
includes/session/Session.php
includes/session/SessionManager.php
includes/specialpage/LoginSignupSpecialPage.php
includes/specials/SpecialChangeCredentials.php
includes/specials/SpecialPrefixindex.php
includes/specials/SpecialSearch.php
includes/specials/SpecialUpload.php
includes/specials/SpecialWithoutinterwiki.php
includes/specials/pagers/AllMessagesTablePager.php
includes/specials/pre-authmanager/SpecialUserlogin.php
includes/title/MediaWikiTitleCodec.php
includes/user/User.php
languages/Language.php
languages/i18n/ar.json
languages/i18n/ba.json
languages/i18n/be-tarask.json
languages/i18n/be.json
languages/i18n/bg.json
languages/i18n/bho.json
languages/i18n/bn.json
languages/i18n/bs.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/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/hu.json
languages/i18n/ia.json
languages/i18n/id.json
languages/i18n/inh.json
languages/i18n/it.json
languages/i18n/ja.json
languages/i18n/jut.json
languages/i18n/ka.json
languages/i18n/kk-cyrl.json
languages/i18n/ko.json
languages/i18n/ksh.json
languages/i18n/lb.json
languages/i18n/lv.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/olo.json
languages/i18n/pa.json
languages/i18n/pl.json
languages/i18n/pms.json
languages/i18n/ps.json
languages/i18n/pt-br.json
languages/i18n/pt.json
languages/i18n/qqq.json
languages/i18n/ro.json
languages/i18n/ru.json
languages/i18n/sgs.json
languages/i18n/shn.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/tly.json
languages/i18n/tt-cyrl.json
languages/i18n/uk.json
languages/i18n/ur.json
languages/i18n/vi.json
languages/i18n/yi.json
languages/i18n/zh-hans.json
languages/i18n/zh-hant.json
maintenance/convertExtensionToRegistration.php
maintenance/populateRevisionLength.php
mw-config/config.css
package.json
resources/Resources.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/mediawiki.action/mediawiki.action.history.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/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.js [deleted file]
resources/src/mediawiki.special/mediawiki.special.recentchanges.js
resources/src/mediawiki.special/mediawiki.special.search.css
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/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/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.debug.less
resources/src/mediawiki/mediawiki.feedback.css
resources/src/mediawiki/mediawiki.feedlink.css
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.notification.css
resources/src/mediawiki/mediawiki.raggett.css
resources/src/mediawiki/mediawiki.util.js
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/parser/parserTest.inc
tests/parser/parserTests.txt
tests/phpunit/MediaWikiTestCase.php
tests/phpunit/data/css/bom.css [new file with mode: 0644]
tests/phpunit/includes/LinkerTest.php
tests/phpunit/includes/MediaWikiServicesTest.php
tests/phpunit/includes/MergeHistoryTest.php
tests/phpunit/includes/TestUser.php
tests/phpunit/includes/TestUserRegistry.php [new file with mode: 0644]
tests/phpunit/includes/api/ApiQueryWatchlistIntegrationTest.php
tests/phpunit/includes/api/ApiTestCase.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/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/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/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/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/qunit/suites/resources/mediawiki.special/mediawiki.special.recentchanges.test.js

index e8e1567..6b94db6 100644 (file)
                "declaration-colon-space-before": [ "never" ],
 
                "font-family-name-quotes": [ "single-unless-keyword" ],
-               "font-weight-notation": [ "named-where-possible" ]
+               "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.
 -->
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 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 fe37fe9..27da2ca 100644 (file)
@@ -557,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',
@@ -794,8 +795,6 @@ $wgAutoloadLocalClasses = [
        'MediaWikiSite' => __DIR__ . '/includes/site/MediaWikiSite.php',
        'MediaWikiTitleCodec' => __DIR__ . '/includes/title/MediaWikiTitleCodec.php',
        'MediaWikiVersionFetcher' => __DIR__ . '/includes/MediaWikiVersionFetcher.php',
-       'MediaWiki\\Interwiki\\ClassicInterwikiLookup' => __DIR__ . '/includes/interwiki/ClassicInterwikiLookup.php',
-       'MediaWiki\\Interwiki\\InterwikiLookup' => __DIR__ . '/includes/interwiki/InterwikiLookup.php',
        'MediaWiki\\Auth\\AbstractAuthenticationProvider' => __DIR__ . '/includes/auth/AbstractAuthenticationProvider.php',
        'MediaWiki\\Auth\\AbstractPasswordPrimaryAuthenticationProvider' => __DIR__ . '/includes/auth/AbstractPasswordPrimaryAuthenticationProvider.php',
        'MediaWiki\\Auth\\AbstractPreAuthenticationProvider' => __DIR__ . '/includes/auth/AbstractPreAuthenticationProvider.php',
@@ -831,9 +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',
@@ -853,8 +857,8 @@ $wgAutoloadLocalClasses = [
        'MediaWiki\\Services\\CannotReplaceActiveServiceException' => __DIR__ . '/includes/Services/CannotReplaceActiveServiceException.php',
        'MediaWiki\\Services\\ContainerDisabledException' => __DIR__ . '/includes/Services/ContainerDisabledException.php',
        'MediaWiki\\Services\\DestructibleService' => __DIR__ . '/includes/Services/DestructibleService.php',
-       'MediaWiki\\Services\\SalvageableService' => __DIR__ . '/includes/Services/SalvageableService.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',
@@ -1151,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',
@@ -1196,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',
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 9d2b3c2..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
index c7a0c15..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
  */
@@ -4457,7 +4465,7 @@ $wgPasswordPolicy = [
  * @since 1.27
  * @deprecated since 1.27, for use during development only
  */
-$wgDisableAuthManager = true;
+$wgDisableAuthManager = false;
 
 /**
  * Configure AuthManager
@@ -4545,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.
  */
@@ -4556,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 = [
@@ -7057,6 +7106,7 @@ $wgExtensionCredits = [];
 /**
  * Authentication plugin.
  * @var $wgAuth AuthPlugin
+ * @deprecated since 1.27 use $wgAuthManagerConfig instead
  */
 $wgAuth = null;
 
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 8acd036..f2403fe 100644 (file)
@@ -3501,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 3baf865..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' ] );
        }
 
        /**
@@ -1881,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
         *
@@ -2005,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
@@ -2034,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 4028aa2..6613db1 100644 (file)
@@ -11,11 +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 ObjectCache;
-use ResourceLoader;
 use SearchEngine;
 use SearchEngineConfig;
 use SearchEngineFactory;
@@ -517,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 d8600c1..6f62ae6 100644 (file)
@@ -3101,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 );
        }
 
@@ -3672,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 6bdacf0..b076d07 100644 (file)
@@ -38,6 +38,7 @@
  */
 
 use MediaWiki\Interwiki\ClassicInterwikiLookup;
+use MediaWiki\Linker\LinkRendererFactory;
 use MediaWiki\MediaWikiServices;
 
 return [
@@ -159,6 +160,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();
        },
index 5b19b5f..2c78061 100644 (file)
@@ -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 6a5bbf7..4555f16 100644 (file)
@@ -1729,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] );
index f0619d6..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 ) {
@@ -744,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 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 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 60f2832..ce9587f 100644 (file)
@@ -471,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 );
@@ -1390,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__ );
                }
        }
 
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 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 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 93003cc..e739e51 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();
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 938a61a..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-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.",
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 4e9309e..e4a2c2e 100644 (file)
@@ -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.",
index 5d65c44..657fe3e 100644 (file)
        "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>.",
index b6d69cd..fa8aa03 100644 (file)
@@ -24,7 +24,8 @@
                        "Elfix",
                        "Lbayle",
                        "Verdy p",
-                       "Yasten"
+                       "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]].",
@@ -64,7 +65,7 @@
        "apihelp-clearhasmsg-example-1": "Effacer le drapeau <code>hasmsg</code> pour l’utilisateur courant",
        "apihelp-clientlogin-description": "Se connecter au wiki en utilisant le flux interactif.",
        "apihelp-clientlogin-example-login": "Commencer le processus de connexion au wiki en tant qu’utilisateur <kbd>Exemple</kbd> avec le mot de passe <kbd>ExempleMotDePasse</kbd>.",
-       "apihelp-clientlogin-example-login2": "Continuer la connexion après une réponse de l’IHM pour l’authentification à deux facteurs, en fournissant un <var>OATHToken</var> valant <kbd>987654</kbd>.",
+       "apihelp-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.",
@@ -74,6 +75,7 @@
        "apihelp-compare-param-torev": "Seconde révision à comparer.",
        "apihelp-compare-example-1": "Créer une différence entre les révisions 1 et 2",
        "apihelp-createaccount-description": "Créer un nouveau compte utilisateur.",
+       "apihelp-createaccount-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-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.",
        "api-help-permissions-granted-to": "{{PLURAL:$1|Accordé à}} : $2",
        "api-help-right-apihighlimits": "Utiliser des valeurs plus hautes dans les requêtes de l’API (requêtes lentes : $1 ; requêtes rapides : $2). Les limites pour les requêtes lentes s’appliquent aussi aux paramètres multivalués.",
        "api-help-open-in-apisandbox": "<small>[ouvrir dans le bac à sable]</small>",
-       "api-help-authmanager-general-usage": "La procédure générale pour utiliser ce module est la suivante :\n# Récupérer les champs disponibles avec <kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd> avec <kbd>amirequestsfor=$4</kbd>, et un jeton <kbd>$5</kbd> avec <kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]].\n# Présenter les champs à l’utilisateur, et les lui faire soumettre.\n# Faire un envoi à ce module, en fournissant <var>$1returnurl</var> et les champs appropriés.\n# Vérifier le <samp>status</samp> dans la réponse.\n#* Si vous avez reçu <samp>PASS</samp> ou <samp>FAIL</samp>, c’est terminé. L’opération a soit réussi, soit échoué.\n#* Si vous avez reçu <samp>UI</samp>, affichez les nouveaux champs à l’utilisateur et faites-les-lui soumettre. Puis envoyez-les à ce module avec <var>$1continue</var> et l’ensemble des champs appropriés, et recommencez l’étape 4.\n#* Si vous avez reçu <samp>REDIRECT</samp>, envoyez l’utilisateur vers la cible <samp>redirecttarget</samp> et attendez le retour vers <var>$1returnurl</var>. Puis envoyez à ce module avec <var>$1continue</var> et tous les champs passés à l’URL de retour, puis répétez l’étape 4.\n#* Si vous avez reçu <samp>RESTART</samp>, cela veut dire que l’authentification a fonctionné, mais nous n’avons pas de compte utilisateur lié. Vous pouvez traiter cela comme un <samp>UI</samp> ou un <samp>FAIL</samp>.",
+       "api-help-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.",
index be92dc2..087d2e4 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+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 c6ffe6e..c85a62b 100644 (file)
@@ -51,7 +51,7 @@
        "apihelp-clearhasmsg-example-1": "לנקות את דגל <code>hasmsg</code> עבור המשתמש הנוכחי.",
        "apihelp-clientlogin-description": "כניסה לוויקי באמצעות זרימה הידודית.",
        "apihelp-clientlogin-example-login": "תחילת תהליך כניסה לוויקי בתור משתמש <kbd>Example</kbd> עם הססמה <kbd>ExamplePassword</kbd>.",
-       "apihelp-clientlogin-example-login2": "המשך כניסה אחרי תשובת UI לאימות דו־גורמי, עם <var>OATHToken</var> של <kbd>987654</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": "מס׳ זיהוי של העמוד הראשון להשוואה.",
@@ -61,6 +61,7 @@
        "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-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": "הוספת חותם־הזמן של העריכה האחרונה של הדף.",
        "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]].\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>, זה אומר שהאימות עבד אבל אין חשבון משתמש מקושר. באפשרותך לטפל בזה כמו ב־UI או ב־FAIL.",
+       "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": "תסדיר לשימוש בהחזרת הודעות.",
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..47987c5 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,8 @@
        "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-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 +55,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-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-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-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-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 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 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 389b218..2eb6aba 100644 (file)
@@ -58,7 +58,7 @@
        "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": "在UI响应双因素验证后继续登录,补充<var>OATHToken</var> <kbd>987654</kbd>。",
+       "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。",
        "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>一起使用。",
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..402ea96 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 );
                                $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'] );
 
                // 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,21 @@ 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
+        */
+       private function fillRequests( array &$reqs, $action, $username ) {
+               foreach ( $reqs as $req ) {
+                       $req->action = $action;
+                       if ( $req->username === null ) {
+                               $req->username = $username;
+                       }
+               }
+       }
+
        /**
         * Determine whether a username exists
         * @param string $username
@@ -2124,6 +2121,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 +2301,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 +2310,7 @@ class AuthManager implements LoggerAwareInterface {
                $delay = $session->delaySave();
 
                $session->resetId();
+               $session->resetAllTokens();
                if ( $session->canSetUser() ) {
                        $session->setUser( $user );
                }
@@ -2332,7 +2333,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 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..f48e0a5 100644 (file)
@@ -21,6 +21,7 @@
  * @ingroup Cache
  */
 use MediaWiki\Linker\LinkTarget;
+use MediaWiki\MediaWikiServices;
 
 /**
  * Class representing a list of titles
@@ -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 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 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 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 1f7f3b0..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 ];
                        }
@@ -392,7 +392,7 @@ class LinksUpdate extends SqlDataUpdate implements EnqueueableDataUpdate {
                        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' );
@@ -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 dbb32e6..d38319e 100644 (file)
@@ -204,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.
@@ -211,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 );
        }
 
index 1853b86..babd00b 100644 (file)
@@ -22,6 +22,7 @@
  * @file
  * @ingroup DifferenceEngine
  */
+use MediaWiki\Diff\ComplexityException;
 
 /**
  * This diff implementation is mainly lifted from the LCS algorithm of the Eclipse project which
@@ -51,6 +52,8 @@ class DiffEngine {
        private $tooLong;
        private $powLimit;
 
+       protected $bailoutComplexity = 0;
+
        // State variables
        private $maxDifferences;
        private $lcsLengthCorrectedForHeuristic = false;
@@ -71,6 +74,7 @@ class DiffEngine {
         *
         * @param string[] $from_lines
         * @param string[] $to_lines
+        * @throws ComplexityException
         *
         * @return DiffOp[]
         */
@@ -128,6 +132,14 @@ class DiffEngine {
                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.
@@ -265,6 +277,7 @@ class DiffEngine {
        /**
         * @param string[] $from
         * @param string[] $to
+        * @throws ComplexityException
         */
        protected function diffInternal( array $from, array $to ) {
                // remember initial lengths
@@ -323,6 +336,10 @@ class DiffEngine {
                $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 ) : [];
 
index 12cf376..296e3b7 100644 (file)
@@ -23,6 +23,7 @@
  * @defgroup DifferenceEngine DifferenceEngine
  */
 
+use MediaWiki\Diff\ComplexityException;
 use MediaWiki\Diff\WordAccumulator;
 
 /**
@@ -31,7 +32,10 @@ use MediaWiki\Diff\WordAccumulator;
  * @ingroup DifferenceEngine
  */
 class WordLevelDiff extends \Diff {
-       const MAX_LINE_LENGTH = 10000;
+       /**
+        * @inheritdoc
+        */
+       protected $bailoutComplexity = 40000000; // Roughly 6K x 6K words changed
 
        /**
         * @param string[] $linesBefore
@@ -42,7 +46,12 @@ class WordLevelDiff extends \Diff {
                list( $wordsBefore, $wordsBeforeStripped ) = $this->split( $linesBefore );
                list( $wordsAfter, $wordsAfterStripped ) = $this->split( $linesAfter );
 
-               parent::__construct( $wordsBeforeStripped, $wordsAfterStripped );
+               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 );
@@ -73,28 +82,20 @@ class WordLevelDiff extends \Diff {
                $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;
-                                       }
+                       $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;
                                }
                        }
                }
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 e891c9c..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' ) );
 
@@ -1324,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..9d3cc13 100644 (file)
@@ -59,6 +59,8 @@ class HTMLRadioField extends HTMLFormField {
        }
 
        function formatOptions( $options, $value ) {
+               global $wgUseMediaWikiUIEverywhere;
+
                $html = '';
 
                $attribs = $this->getAttributes( [ 'disabled', 'tabindex' ] );
@@ -71,12 +73,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 85b1013..ae1a2a7 100644 (file)
@@ -1279,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 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 813ab24..c3ccb75 100644 (file)
        "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",
index 7e7ceac..3d5a0a9 100644 (file)
        "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 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 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 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 8702156..cf533d6 100644 (file)
@@ -2993,6 +2993,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.
@@ -3023,7 +3024,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 1718557..01cce02 100644 (file)
@@ -775,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 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 b5e5d80..116b274 100644 (file)
@@ -20,6 +20,8 @@
  * @file
  * @ingroup Parser
  */
+use MediaWiki\Linker\LinkRenderer;
+use MediaWiki\MediaWikiServices;
 
 /**
  * @defgroup Parser Parser
@@ -248,6 +250,11 @@ class Parser {
        /** @var SectionProfiler */
        protected $mProfiler;
 
+       /**
+        * @var LinkRenderer
+        */
+       protected $mLinkRenderer;
+
        /**
         * @param array $conf
         */
@@ -888,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
@@ -1434,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];
@@ -1522,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 );
@@ -1819,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
@@ -1857,11 +1882,11 @@ 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 = [];
                $rel = self::getExternalLinkRel( $url, $this->mTitle );
 
@@ -2329,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 );
@@ -2347,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 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 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 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 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 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 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 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 e745129..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;
@@ -1718,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 ce2ac83..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 );
                                }
                        );
                }
@@ -3875,6 +3851,7 @@ 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;
                }
@@ -3908,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 );
@@ -3922,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 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 ef642ef..60e998c 100644 (file)
        "tog-ccmeonemails": "أرسل إلي نسخا من الرسائل الإلكترونية التي أرسلها إلى المستخدمين الآخرين",
        "tog-diffonly": "لا تعرض محتوى الصفحة أسفل الفرق",
        "tog-showhiddencats": "أظهر التصنيفات المخفية",
-       "tog-norollbackdiff": "بعد Ø§Ù\84إرجاع Ù\84ا ØªØ¹Ø±Ø¶ Ø§Ù\84Ù\81رÙ\82",
+       "tog-norollbackdiff": "أزÙ\84 Ø§Ù\84Ù\81رÙ\82 Ø¨Ø¹Ø¯ Ø¥Ø­Ø¯Ø§Ø« Ø§Ø³ØªØ±Ø¬Ø§Ø¹",
        "tog-useeditwarning": "حذّرني عندما أغادر تحرير صفحة فيها تغييرات لم أحفظها",
        "tog-prefershttps": "دائما استخدم اتصالا آمنا بعد الدخول",
        "underline-always": "دائما",
        "parser-unstrip-recursion-limit": "تعدى حد العودية Unstrip  ($1)",
        "converter-manual-rule-error": "خطأ تم اكتشافه في قاعدة تحويل اللغة اليدوية",
        "undo-success": "يمكن استرجاع التعديل.\nتحقق من المقارنة بالأسفل للتأكد من أن هذا هو ما تريد أن تفعله، ثم احفظ التغييرات بالأسفل للانتهاء من استرجاع التعديل.",
-       "undo-failure": "Ù\84Ù\85 Ù\8aÙ\85Ù\83Ù\86 Ø¥Ù\84غاء Ø§Ù\84تعدÙ\8aÙ\84 Ù\84حدÙ\88Ø« ØªØ¹Ø¯Ù\8aÙ\84ات Ø¹Ù\84Ù\89 Ø§Ù\84صÙ\81حة Ù\85Ù\86 Ø¨Ø¹Ø¯Ù\87.",
+       "undo-failure": "Ù\84Ù\85 Ù\8aÙ\85Ù\83Ù\86 Ø§Ø³ØªØ±Ø¬Ø§Ø¹ Ø§Ù\84تعدÙ\8aÙ\84 Ø¨Ø³Ø¨Ø¨ ØªØ¹Ø¯Ù\8aÙ\84ات Ù\85تعارضة ØªÙ\85ت Ø¹Ù\84Ù\89 Ø§Ù\84صÙ\81حة.",
        "undo-norev": "فشل في الرجوع عن التعديل حيث أنه غير موجود أو تم حذفه.",
        "undo-nochange": "التعديل يبدو أنه قد تم الترجع عنه بالفعل.",
        "undo-summary": "الرجوع عن التعديل $1 بواسطة [[Special:Contributions/$2|$2]] ([[User talk:$2|نقاش]])",
        "lineno": "سطر $1:",
        "compareselectedversions": "قارن بين النسختين المختارتين",
        "showhideselectedversions": "أظهر/أخف المراجعات المختارة",
-       "editundo": "Ø¥Ù\84غاء",
+       "editundo": "رجÙ\88ع",
        "diff-empty": "(لا فرق)",
        "diff-multi-sameuser": "({{PLURAL:$1|لا مراجعات متوسطة|مراجعة متوسطة واحدة|مراجعتان متوسطتان|$1 مراجعات متوسطة|$1 مراجعة متوسطة}} بواسطة نفس المستخدم غير {{PLURAL:$1|معروضة|معروضة|معروضتين|معروضة}})",
        "diff-multi-otherusers": "({{PLURAL:$1|لا مراجعات|مراجعة متوسطة واحدة|مراجعتان متوسطتان|$1 مراجعات متوسطة|$1 مراجعة متوسطة}} بواسطة {{PLURAL:$2|ولا مستخدم|مستخدم واحد آخر|مستخدمين اثنين آخرين|$2 مستخدمين|$2 مستخدماً|$2 مستخدم}} غير {{PLURAL:$1|معروضة|معروضة|معروضتين|معروضة}})",
        "grant-highvolume": "تعديل كبير الحجم",
        "grant-patrol": "تغييرات دورية للصفحات",
        "grant-protect": "حماية وإزالة حماية الصفحات",
-       "grant-rollback": "Ø¥Ù\84غاء Ø§Ù\84تعدÙ\8aÙ\84ات في الصفحات",
+       "grant-rollback": "استرجاع Ø§Ù\84تغÙ\8aÙ\8aرات في الصفحات",
        "grant-sendemail": "إرسال بريد إلكتروني للمستخدمين الآخرين",
        "grant-uploadeditmovefile": "رفع وإزاحة ونقل الملفات",
        "grant-uploadfile": "ارفع ملفات جديدة",
        "delete-warning-toobig": "لهذه الصفحة تاريخ تعديل طويل، أكثر من {{PLURAL:$1||مراجعة واحدة|مراجعتين|$1 مراجعات|$1 مراجعة}}.\nقد يؤدي حذفها إلى اضطراب عمليات قاعدة البيانات في {{SITENAME}}؛\nاستمر مع الحذر.",
        "deleteprotected": "لا يمكنك حذف هذه الصفحة لأنها محمية.",
        "deleting-backlinks-warning": "[[Special:WhatLinksHere/{{FULLPAGENAME}}|تتصل صفحات أخرى]] بالصفحة التي تريد حذفها.",
-       "rollback": "Ø¥Ù\84غاء التعديلات",
-       "rollbacklink": "إرجاع",
-       "rollbacklinkcount": "Ø¥Ù\84غاء {{PLURAL:$1|تعدÙ\8aÙ\84ات|تعدÙ\8aÙ\84|تعدÙ\8aÙ\84Ù\8aÙ\86|$1 ØªØ¹Ø¯Ù\8aÙ\84ات|$1 ØªØ¹Ø¯Ù\8aÙ\84ا|$1 تعديل}}",
-       "rollbacklinkcount-morethan": "Ø£Ù\84غ أكثر من {{PLURAL:$1|تعديل|تعديل|تعديلين|$1 تعديلات|$1 تعديلاً|$1 تعديل}}",
+       "rollback": "استرجاع التعديلات",
+       "rollbacklink": "استرجع",
+       "rollbacklinkcount": "استرجع {{PLURAL:$1|Ù\84ا ØªØ¹Ø¯Ù\8aÙ\84ات|تعدÙ\8aÙ\84ا Ù\88احدا|تعدÙ\8aÙ\84Ù\8aÙ\86|$1 ØªØ¹Ø¯Ù\8aÙ\84ات|$1 ØªØ¹Ø¯Ù\8aÙ\84اÙ\8b|تعديل}}",
+       "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}}]]).",
        "editcomment": "ملخص التعديل كان:<em>$1</em>.",
        "revertpage": "استرجع تعديلات [[Special:Contributions/$2|$2]] ([[User talk:$2|نقاش]]) حتى آخر مراجعة ل[[User:$1|$1]]",
        "revertpage-nouser": "استرجع تعديلات مستخدم مخفيّ حتى آخر مراجعة ل{{GENDER:$1|[[User:$1|$1]]}}",
-       "rollback-success": "Ø¥Ù\84غاء ØªØ¹Ø¯Ù\8aÙ\84ات $1Ø\9b\nÙ\88إرجاع Ø¢Ø®Ø± Ù\86سخة Ù\84â\80\8d$2.",
+       "rollback-success": "استرجع ØªØ¹Ø¯Ù\8aÙ\84ات $1Ø\9b\nاسترجع Ø­ØªÙ\89 Ø¢Ø®Ø± Ù\86سخة Ø¨Ù\88اسطة $2.",
        "sessionfailure-title": "فشل في الجلسة",
        "sessionfailure": "يبدو أنه هناك مشكلة في هذه جلسة الدخول الخاصة بك؛\nلذلك فقد ألغيت هذه العملية كإجراء احترازي ضد الاختراق.\nمن فضلك اضغط على مفتاح \"رجوع\" لتحميل الصفحة التي جئت منها، ثم حاول مرة أخرى.",
        "changecontentmodel": "غير نموذج المحتوى لصفحة",
index 358562f..19907c7 100644 (file)
        "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": "киләһе бит →",
        "authmanager-email-label": "Электрон почта адресы",
        "authmanager-email-help": "Электрон почта адресы",
        "authmanager-realname-label": "Ысын исемегеҙ",
-       "changecredentials-submit": "Үҙгәртергә",
-       "removecredentials-submit-cancel": "Кире алырға"
+       "authprovider-resetpass-skip-label": "Ҡалдырып торорға",
+       "cannotauth-not-allowed": "Һеҙ был битте ҡуллана алмайһығыҙ.",
+       "changecredentials": "Иҫәп мәғлүмәттәрен үҙгәртеү",
+       "changecredentials-submit": "Иҫәп мәғлүмәттәрен үҙгәртеү",
+       "changecredentials-submit-cancel": "Кире алырға",
+       "removecredentials": "Иҫәп мәғлүмәттәрен юйырға",
+       "removecredentials-submit": "Иҫәп мәғлүмәттәрен юйырға",
+       "removecredentials-submit-cancel": "Кире алырға",
+       "credentialsform-account": "Иҫәп хужаһы"
 }
index dba6036..5009027 100644 (file)
        "password-change-forbidden": "Вы ня можаце зьмяняць паролі ў гэтай вікі.",
        "externaldberror": "Адбылася памылка аўтэнтыфікацыі з дапамогай вонкавай базы зьвестак, ці Вам не дазволена абнаўляць свой рахунак.",
        "login": "Увайсьці",
+       "login-security": "Пацьвердзіце вашую асобу",
        "nav-login-createaccount": "Уваход / стварэньне рахунку",
        "userlogin": "Увайсьці ў сыстэму / стварыць рахунак",
        "userloginnocreate": "Увайсьці",
        "createacct-email-ph": "Увядзіце ваш адрас электроннай пошты",
        "createacct-another-email-ph": "Увядзіце адрас электроннай пошты",
        "createaccountmail": "Стварыць часовы адвольны пароль і даслаць яго на пазначаны адрас электроннай пошты",
+       "createaccountmail-help": "Можа выкарыстоўвацца для стварэньня рахунку для іншага чалавека бязь веданьня паролю.",
        "createacct-realname": "Сапраўднае імя (неабавязкова)",
        "createaccountreason": "Прычына:",
        "createacct-reason": "Прычына",
        "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}}}} журнале выдаленьняў].",
index 3936c64..a52e33b 100644 (file)
        "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..a1652b3 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|редакция|редакции}}",
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 c715e9e..00ece2a 100644 (file)
        "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": "দয়া করে নিচে মন্তব্য যোগ করুন।",
        "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": "পাতার বিষয়বস্তুর প্রতিরূপ",
        "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": "ভুল টোকেন",
+       "changecredentials-submit-cancel": "বাতিল",
+       "removecredentials-submit": "পরিচয়পত্র সরান",
+       "removecredentials-submit-cancel": "বাতিল",
+       "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 f8362e4..8d9aa55 100644 (file)
        "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}}",
        "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",
        "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-submit-cancel": "Storno",
+       "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-submit-cancel": "Storno",
+       "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 0981b43..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": "Сайта кĕмелле",
        "linksearch-ok": "Шырамалли",
        "listusers-submit": "Кăтарт",
        "listusers-noresult": "Хутшăнакансем тупăнмарĕç.",
+       "listusers-blocked": "(чарса хунă)",
+       "activeusers-count": "$1 {{PLURAL:$1|тӳрлетни|тӳрлетнисем}} юлашки {{PLURAL:$3|кун|$3 кунсенче}}",
        "activeusers-hidesysops": "Администраторĕсене пытар",
        "listgrouprights-group": "Ушкăн",
        "listgrouprights-helppage": "Help:Ушкăн прависем",
index f8ec0d2..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",
index 3817f79..aa74c03 100644 (file)
        "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",
        "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“",
        "cannotauth-not-allowed-title": "Zugriff verweigert",
        "cannotauth-not-allowed": "Du bist nicht berechtigt, diese Seite zu verwenden.",
        "changecredentials": "Anmeldeinformationen ändern",
-       "changecredentials-submit": "Ändern",
+       "changecredentials-submit": "Anmeldeinformationen ändern",
        "changecredentials-submit-cancel": "Abbrechen",
        "changecredentials-invalidsubpage": "$1 ist kein gültiger Typ für Anmeldeinformationen.",
        "changecredentials-success": "Deine Anmeldeinformationen wurden geändert.",
        "removecredentials": "Anmeldeinformationen entfernen",
-       "removecredentials-submit": "Entfernen",
+       "removecredentials-submit": "Anmeldeinformationen entfernen",
        "removecredentials-submit-cancel": "Abbrechen",
        "removecredentials-invalidsubpage": "$1 ist kein gültiger Typ für Anmeldeinformationen.",
        "removecredentials-success": "Deine Anmeldeinformationen wurden entfernt.",
        "credentialsform-provider": "Typ der Anmeldeinformationen:",
-       "credentialsform-account": "Benutzerkontenname:",
+       "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",
index e882088..c34e9b7 100644 (file)
        "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": "Rocani hadisey",
        "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ê Şélıgi",
+       "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ê.",
        "noname": "Yew nameyo maqbul bınuse.",
        "loginsuccesstitle": "Hesab abıya",
        "loginsuccess": "'''{{SITENAME}} dı name dê \"$1\" şıma hesab akerdo.'''",
-       "nosuchuser": "\"$1\" ya yew namey karberi çıniyo.\nNuştışê namanê karberan de herfa pil u qıce rê diqet kerên.\nNuştışê xo qontrol kerên, ya zi [[Special:CreateAccount|yew hesabo newe akerê]].",
+       "nosuchuser": "Ebe namey \"$1\"i yew karber çıniyo.\nNuştışê namanê karberan de herfa pil u qıce rê diqet kerên.\nNuştışê xo qonrol kerên, ya zi [[Special:CreateAccount|yew hesabo newe akerên]].",
        "nosuchusershort": "No \"$1\" name de yew ten çino. Kontrolê nuştışi bıkere.",
        "nouserspecified": "Şıma gani yew name bıde.",
        "login-userblocked": "No karber/na karbere blokekerdeyo/blokekerdiya. Cıkewtışi rê musade çıniyo.",
        "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ê.",
        "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.",
        "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.",
        "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)",
        "prefs-labs": "Xacetê labs",
        "prefs-user-pages": "Pela Karberi",
        "prefs-personal": "Pela karberi",
-       "prefs-rc": "Vurnayışê peyêni",
+       "prefs-rc": "Vuryayışê 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": "Vuryayışê 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",
        "unwatchedpages": "Pelanê seyrnibiyeyî",
        "listredirects": "Listeya Hetenayışan",
        "listduplicatedfiles": "Lista dosyeyanê ke kopyaya cı vêniyena",
-       "unusedtemplates": "Şablonê ke nêguriyenê",
+       "unusedtemplates": "Şablonê ke nêkarênê",
        "unusedtemplatestext": "no pel, {{ns:template}} pelê ke pelê binan de nêaseni, ninan keno.",
        "unusedtemplateswlh": "linkanê binî",
        "randompage": "Pela raştameyiye",
        "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}}",
        "specialpage-empty": "Seba na rapore netice çıniyo.",
        "lonelypages": "Pelê seyi",
        "lonelypagestext": "Ena pelî link nibiyê ya zi pelanê binî {{SITENAME}} de transclude biy.",
-       "uncategorizedpages": "Pelê ke kategorize nêbiyê",
-       "uncategorizedcategories": "Kategoriyê ke kategorize nêbiyê",
+       "uncategorizedpages": "Pelê ke bêkategoriyê",
+       "uncategorizedcategories": "Kategoriyê ke bêkategoriyê",
        "uncategorizedimages": "Dosyeyê ke bêkategoriyê",
        "uncategorizedtemplates": "Şablonê ke bêkategoriyê",
-       "unusedcategories": "Kategoriyê ke nêgureniyê",
-       "unusedimages": "Dosyeyê ke nêguriyenê",
-       "wantedcategories": "Kategoriyê ke waziyayê",
-       "wantedpages": "Pelê ke waziyayê",
+       "unusedcategories": "Kategoriyê ke nêkarênê",
+       "unusedimages": "Dosyeyê ke nêkarênê",
+       "wantedcategories": "Kategoriyê ke wazênê",
+       "wantedpages": "Pelê ke wazênê",
        "wantedpages-badtitle": "sernuşte meqbul niyo: $1",
        "wantedfiles": "Dosyeyê cıgeyriyayeyi",
        "wantedfiletext-cat": "Dosyaya cêrên karvıstedeya lakin çınya. Mewcud dosyayan de xeriba miyan de liste bena. Xırabiya wınisin dana <del>ateber</del>. Zewbi zi, şırê pela da dosyeyê ke çınyaya [[:$1]].",
        "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",
-       "deadendpages": "Pelê nêgıredayeyi",
+       "deadendpages": "Pelê ke yewna pelan rê gre nêbiyê",
        "deadendpagestext": "Ena pelan ke {{SITENAME}} de zerrî ey de link çini yo.",
        "protectedpages": "Pelê pawıteyi",
        "protectedpages-indef": "têna pawıteyê bêmuddeti",
        "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",
        "maximum-size": "Ebatê maximumî",
        "pagesize": "(bitî)",
        "restriction-edit": "Bıvurne",
-       "restriction-move": "Bere",
+       "restriction-move": "Wegi",
        "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]]''':",
        "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;",
        "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": "Pelê xısusiy",
        "specialpages-note-top": "Kıtabek",
        "specialpages-note": "* Pelê xasê normali.\n* <span class=\"mw-specialpagerestricted\">Pelê xasê nımıtey.</span>",
        "specialpages-group-maintenance": "Raporê pawıtışi",
        "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)",
index 8aa0040..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": "बोट को पासवर्ड अपडेट भयो",
        "passwordreset-emailtitle": "{{SITENAME}}मा खाता विवरण",
        "passwordreset-emailelement": "प्रयोगकर्ताको नाम: \n$1\n\nअस्थाई पासवर्ड: \n$2",
        "passwordreset-emailsentemail": "पासवर्ड परिवर्तनका लागि इमेल पठाइया छ।",
+       "passwordreset-invalideamil": "अबैध ई-मेल ठेगाना",
        "changeemail": "इमेल ठेगाना बदेल वा हटा",
        "changeemail-header": "आफ्नो इमेल ठेगाना परिवर्तन गद्द यो फारम भर । यैलाई पुष्टि गद्द तमीले आफ्नो पासवर्ड हाल्नु पडन्छ।",
        "changeemail-oldemail": "अईलको इमेल-ठेगाना:",
        "sig_tip": "तमरो समयछाप सहितको दस्तखत",
        "hr_tip": "क्षितिजिय रेखा (कम प्रयोग गर्नुहोस्)",
        "summary": "सारांश:",
-       "subject": "विषय/शीर्षक:",
+       "subject": "विषय:",
        "minoredit": "यो नानो सम्पादन हो",
        "watchthis": "यै पानाको ध्यान राख",
        "savearticle": "सङ्ग्रह गर",
        "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": "जाभास्क्रिप्ट",
        "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-watchlist": "मेरो ध्यान सूची",
        "prefs-editwatchlist": "अवलोकनसूची सम्पादन",
        "prefs-editwatchlist-raw": "कच्चा अवलोकनसूची सम्पादन गद्दा",
+       "prefs-editwatchlist-clear": "तमरो अवलोकनसूची मेटा",
        "prefs-watchlist-days": "ध्यान सूचीमी धेकाउने दिनहरू:",
        "prefs-watchlist-edits-max": "सबै है ज्यादा संख्या : १०००",
        "prefs-watchlist-token": "अवलोकन सूची टोकन:",
        "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": "प्रयोगकर्ताको अधिकार परिवर्तनमी मतभेद भयो ! कृपया तमरो परिवर्तन पुनरावलोकन तथा पुष्टि गर ।",
        "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 726a7cb..5affcd4 100644 (file)
        "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 37ad263..e6a8141 100644 (file)
        "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",
        "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 66b168b..57b4a86 100644 (file)
        "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",
        "quotation-marks": "„$1“",
        "imgmultipageprev": "← antaŭa paĝo",
        "imgmultipagenext": "sekva paĝo →",
index 87bb4f0..6fa9816 100644 (file)
        "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-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.",
        "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.",
        "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",
        "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-upload-upload": "Subida nueva",
        "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-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.",
        "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",
+       "changecredentials-submit": "Cambiar credenciales",
        "changecredentials-submit-cancel": "Cancelar",
        "changecredentials-success": "Tus credenciales han sido cambiadas.",
        "removecredentials": "Eliminar credenciales",
-       "removecredentials-submit": "Eliminar",
+       "removecredentials-submit": "Eliminar credenciales",
        "removecredentials-submit-cancel": "Cancelar",
        "removecredentials-success": "Tus credenciales han sido eliminadas.",
        "credentialsform-account": "Nombre de la cuenta:",
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 6324b22..44498b8 100644 (file)
        "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": "ویرایش نمونه محتوای یک صفحه",
        "confirm-watch-top": "این صفحه به فهرست پی‌گیری‌های شما افزوده شود؟",
        "confirm-unwatch-button": "تأیید",
        "confirm-unwatch-top": "این صفحه از فهرست پی‌گیری‌های شما حذف شود؟",
+       "confirm-rollback-button": "باشد",
+       "confirm-rollback-top": "خنثی‌سازی ویرایش‌های این صفحه؟",
        "semicolon-separator": "؛&#32;",
        "comma-separator": "،&#32;",
        "percent": "$1٪",
index f085e45..fd1ca9f 100644 (file)
@@ -50,7 +50,8 @@
                        "Olimar",
                        "Mikahama",
                        "01miki10",
-                       "Matma Rex"
+                       "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",
        "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 ba9ea8f..1ad4081 100644 (file)
                        "Yasten",
                        "Psychoslave",
                        "Trial",
-                       "Matma Rex"
+                       "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.",
        "passwordreset-emailerror-capture2": "L’envoi de courriel à {{GENDER:$2|l’utilisateur|l’utilisatrice}} a échoué : $1 {{PLURAL:$3|Le nom d’utilisateur et le mot de passe sont affichés|La liste des noms d’utilisateur et des mots de passe est affichée}} ci-dessous.",
        "passwordreset-nocaller": "Un appelant doit être fourni",
        "passwordreset-nosuchcaller": "L’appelant n’existe pas : $1",
-       "passwordreset-ignored": "La réinitialisation du mot de passe n’a pas été gérée. Peut-être aucun fournisseur n’a été configuré ?",
+       "passwordreset-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": "Aucun nom d’utilisateur ni adresse de messagerie n’a été fourni",
+       "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.",
        "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-links": "← liens",
        "whatlinkshere-hideredirs": "$1 les redirections",
        "whatlinkshere-hidetrans": "$1 les inclusions",
-       "whatlinkshere-hidelinks": "$1 les liens",
+       "whatlinkshere-hidelinks": "$1 liens",
        "whatlinkshere-hideimages": "$1 les liens vers le fichier",
        "whatlinkshere-filters": "Filtres",
        "whatlinkshere-submit": "Lister",
        "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;%",
        "cannotauth-not-allowed-title": "Autorisation refusée",
        "cannotauth-not-allowed": "Vous n’êtes pas autorisé à utiliser cette page",
        "changecredentials": "Modifier les informations d’identification",
-       "changecredentials-submit": "Modifier",
+       "changecredentials-submit": "Modifier les informations d’identification",
        "changecredentials-submit-cancel": "Annuler",
        "changecredentials-invalidsubpage": "$1 n’est pas un type d’information d’identification valide.",
        "changecredentials-success": "Vos informations d’identification ont été modifiées.",
        "removecredentials": "Supprimer les informations d’identification",
-       "removecredentials-submit": "Supprimer",
+       "removecredentials-submit": "Supprimer les informations d'identification",
        "removecredentials-submit-cancel": "Annuler",
        "removecredentials-invalidsubpage": "$1 n’est pas un type d’information d’identification valide.",
        "removecredentials-success": "Vos informations d’identification ont été supprimées.",
index d8f5d4d..458fa5f 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",
        "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 bb64d80..dcbc97a 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",
        "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-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.",
        "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": "$1 redireccións",
-       "whatlinkshere-hidetrans": "$1 inclusións",
-       "whatlinkshere-hidelinks": "$1 ligazóns",
+       "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",
        "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-reblock": "Supresión de usuario por bloqueo reiterado",
        "log-action-filter-upload-upload": "Nova subida",
        "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",
-       "changecredentials-submit": "Cambiar",
+       "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-submit-cancel": "Cancelar",
-       "removecredentials-submit": "Eliminar",
+       "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-submit-cancel": "Cancelar",
-       "credentialsform-account": "Nome da conta:"
+       "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 e3ae604..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).",
index b79b619..7de3ac8 100644 (file)
        "tog-watchlisthideanons": "הסתרת עריכות של משתמשים אנונימיים ברשימת המעקב",
        "tog-watchlisthidepatrolled": "הסתרת עריכות בדוקות ברשימת המעקב",
        "tog-watchlisthidecategorization": "הסתרת שינויים בקטגוריות של דפים",
-       "tog-ccmeonemails": "לשלוח אליי העתקים של הודעות דוא\"ל שאני {{GENDER:|שולח|שולחת}} למשתמשים אחרים",
-       "tog-diffonly": "×\91×\99×\98×\95×\9c ×\94צ×\92ת ×ª×\95×\9b×\9f ×\94×\93×£ ×\9eת×\97ת ×\9c×\94ש×\95×\95×\90ת הגרסאות",
+       "tog-ccmeonemails": "לשלוח אליי העתקים של הודעות דוא\"ל שאני {{GENDER:|שולח|שולחת}} למשתמשים",
+       "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)",
        "searchbutton": "חיפוש",
        "go": "הצגה",
        "searcharticle": "לדף",
-       "history": "היסטוריית הדף",
+       "history": "×\94×\99ס×\98×\95ר×\99×\99ת ×\94×\92רס×\90×\95ת ×©×\9c ×\94×\93×£",
        "history_short": "היסטוריה",
        "updatedmarker": "עודכן מאז ביקורך האחרון",
        "printableversion": "גרסה להדפסה",
        "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לא ניתן הסבר.",
        "loginerror": "שגיאה בכניסה לאתר",
        "createacct-error": "שגיאה ביצירת חשבון",
        "createaccounterror": "לא ניתן היה ליצור את החשבון: $1",
-       "nocookiesnew": "×\97ש×\91×\95×\9f ×\94×\9eשת×\9eש ×©×\9c×\9b×\9d × ×\95צר, ×\90×\9a ×\9c×\90 × ×\9bנסת×\9d ×\9b×\9eשת×\9eש×\99×\9d ×¨×©×\95×\9e×\99×\9d.\n×\9b×\93×\99 ×\9c×\94×\9b× ×\99ס ×\9eשת×\9eש×\99×\9d ×\9c×\9eער×\9bת ×¢×\95ש×\94 {{SITENAME}} ×©×\99×\9e×\95ש ×\91×¢×\95×\92×\99×\95ת.\n×\91×\93פ×\93פ×\9f ×©×\9c×\9b×\9d ×\94×¢×\95×\92×\99×\95ת ×\9e×\91×\95×\98×\9c×\95ת.\n×\90× ×\90 ×\94פע×\99×\9c×\95 ×\90×\95ת×\9f ×\9e×\97×\93ש, ×\95×\9c×\90×\97ר ×\9e×\9b×\9f ×ª×\95×\9b×\9c×\95 ×\9c×\94×\99×\9bנס ×\9c×\9eער×\9bת ×¢×\9d ×©×\9d ×\94×\9eשת×\9eש ×\95×\94ס×\99ס×\9e×\94 ×\94×\97×\93ש×\99×\9d ×©×\9c×\9b×\9d.",
-       "nocookieslogin": "{{SITENAME}} ×\9eשת×\9eש ×\91×¢×\95×\92×\99×\95ת ×\9b×\93×\99 ×\9c×\94×\9b× ×\99ס ×\9eשת×\9eש×\99×\9d ×\9c×\9eער×\9bת.\n×\91×\93פ×\93פ×\9f ×©×\9c×\9b×\9d ×\94×¢×\95×\92×\99×\95ת ×\9e×\91×\95×\98×\9c×\95ת.\n×\90× ×\90 ×\94פע×\99×\9c×\95 ×\90×\95ת×\9f ×\9e×\97×\93ש ×\95נס×\95 שוב.",
+       "nocookiesnew": "×\94×\97ש×\91×\95×\9f ×©×\9c×\9a × ×\95צר, ×\90×\91×\9c ×\9c×\90 × ×\9bנסת ×\9c×\97ש×\91×\95×\9f.\n{{SITENAME}} ×¢×\95ש×\94 ×©×\99×\9e×\95ש ×\91×¢×\95×\92×\99×\95ת (cookies) ×\9b×\93×\99 ×\9c×\94×\9b× ×\99ס ×\9eשת×\9eש×\99×\9d ×\9c×\9eער×\9bת.\n×\91×\93פ×\93פ×\9f ×©×\9c×\9a ×\94×¢×\95×\92×\99×\95ת ×\9e×\91×\95×\98×\9c×\95ת.\n×\99ש ×\9c×\94פע×\99×\9c ×\90×\95ת×\9f, ×\95רק ×\9c×\90×\97ר ×\9e×\9b×\9f ×\9c×\94×\99×\9bנס ×\9c×\97ש×\91×\95×\9f ×¢×\9d ×©×\9d ×\94×\9eשת×\9eש ×\95×\94ס×\99ס×\9e×\94 ×©×\9c×\9a.",
+       "nocookieslogin": "{{SITENAME}} ×¢×\95ש×\94 ×©×\99×\9e×\95ש ×\91×¢×\95×\92×\99×\95ת (cookies) ×\9b×\93×\99 ×\9c×\94×\9b× ×\99ס ×\9eשת×\9eש×\99×\9d ×\9c×\9eער×\9bת.\n×\91×\93פ×\93פ×\9f ×©×\9c×\9a ×\94×¢×\95×\92×\99×\95ת ×\9e×\91×\95×\98×\9c×\95ת.\n×\99ש ×\9c×\94פע×\99×\9c ×\90×\95ת×\9f ×\95×\9c×\90×\97ר ×\9e×\9b×\9f ×\9cנס×\95ת שוב.",
        "nocookiesfornew": "חשבון המשתמש לא נוצר, כיוון שלא יכולנו לוודא את מקורו.\nודאו שהעוגיות מופעלות בדפדפן שלכם, העלו מחדש דף זה ונסו שוב.",
        "createacct-loginerror": "החשבון נוצר בהצלחה, אבל לא ניתן היה להיכנס אליו באופן אוטומטי. נא [[Special:UserLogin|להיכנס באופן ידני]].",
        "noname": "לא הכנסת שם משתמש תקין",
        "nosuchusershort": "אין משתמש בשם \"$1\".\nנא לוודא שהאיות נכון.",
        "nouserspecified": "יש לציין שם משתמש.",
        "login-userblocked": "משתמש זה חסום. אינכם מורשים להיכנס לחשבון.",
-       "wrongpassword": "×\94ס×\99ס×\9e×\94 ×©×\94ק×\9c×\93ת×\9d ×©×\92×\95×\99×\94.\n×\90× ×\90 × ×¡×\95 שוב.",
+       "wrongpassword": "×\94ס×\99ס×\9e×\94 ×©×\94×\96נת ×©×\92×\95×\99×\94.\n× ×\90 ×\9cנס×\95ת שוב.",
        "wrongpasswordempty": "הסיסמה שהקלדתם ריקה.\nאנא נסו שוב.",
        "passwordtooshort": "סיסמאות חייבות להיות באורך {{PLURAL:$1|תו אחד|$1 תווים}} לפחות.",
        "passwordtoolong": "סיסמאות אינן יכולות להיות ארוכות {{PLURAL:$1|מתו אחד|מ־$1 תווים}}.",
        "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": "המשך כניסה לחשבון",
        "accmailtitle": "הסיסמה נשלחה",
        "accmailtext": "סיסמה אקראית עבור [[User talk:$1|$1]] נשלחה אל $2. ניתן לשנותה בדף '''[[Special:ChangePassword|שינוי הסיסמה]]''' לאחר הכניסה.",
        "newarticle": "(חדש)",
-       "newarticletext": "הגעתם לדף שעדיין אינו קיים.\nכדי ליצור את הדף הזה, התחילו להקליד בתיבת הטקסט שלמטה (ראו את [$1 דף העזרה] למידע נוסף).\nאם הגעתם לכאן בטעות, לחצו על כפתור ה<strong>חזרה</strong> (Back) בדפדפן שלכם.",
+       "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}}}} יומן המחיקות].",
+       "missing-revision": "גרסה #$1 של הדף \"{{FULLPAGENAME}}\" אינה קיימת.\n\nזה נגרם בדרך־כלל עקב לחיצה על קישור ישן לגרסה של דף שנמחק.\nאפשר למצוא פרטים ב[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} יומן המחיקות].",
        "userpage-userdoesnotexist": "חשבון המשתמש \"$1\" אינו רשום.\nאנא בִדקו אם ברצונכם ליצור/לערוך את הדף הזה.",
        "userpage-userdoesnotexist-view": "חשבון המשתמש \"$1\" אינו רשום.",
        "blocked-notice-logextract": "{{GENDER:$1|המשתמש הזה חסום|המשתמשת הזו חסומה}} כרגע.\nהפעולה האחרונה ביומן החסימות מוצגת להלן:",
        "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": "'''כמה חלקים מטופס העריכה לא הגיעו לשרת; בדקו היטב שעריכותיכם לא נפגעו ונסו שוב.'''",
+       "edit_form_incomplete": "<strong>חלקים מסוימים מטופס העריכה לא הגיעו לשרת; אנא {{GENDER:|בדוק|בִדקי|בִדקו}} שהעריכה לא נפגעה ו{{GENDER:|נסה|נסי|נסו}} שוב.</strong>",
        "editing": "עריכת הדף \"$1\"",
        "creating": "יצירת הדף \"$1\"",
        "editingsection": "עריכת הדף \"$1\" (פסקה)",
        "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|רשימת החסומים]] לרשימת החסימות הפעילות כעת.",
        "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": "כותרות דפים תואמות",
        "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": "ההרשאות של {{GENDER:$1|המשתמש|המשתמשת}} \"$1\" נשמרו.",
        "timezonelegend": "אזור זמן:",
        "timezoneregion-europe": "אירופה",
        "timezoneregion-indian": "האוקיינוס ההודי",
        "timezoneregion-pacific": "האוקיינוס השקט",
-       "allowemail": "×\9c×\90פשר ×\9c×\9eשת×\9eש×\99×\9d ×\90×\97ר×\99×\9d ×\9cש×\9c×\95×\97 ×\9c×\99 ×\93×\95×\90ר ×\90×\9cק×\98ר×\95× ×\99",
+       "allowemail": "לאפשר למשתמשים לשלוח לי דואר אלקטרוני",
        "prefs-searchoptions": "חיפוש",
        "prefs-namespaces": "מרחבי שם",
        "default": "ברירת מחדל",
        "gender-unknown": "באזכורים שלך בממשק, המערכת תשתמש במידת האפשר בלשון שאינה תלוית־מגדר",
        "gender-male": "הוא עורך דפים בוויקי",
        "gender-female": "היא עורכת דפים בוויקי",
-       "prefs-help-gender": "×\90×\99×\9f חובה למלא העדפה זו.\nהמערכת משתמשת במידע הזה כדי לפנות אליך/אלייך ולציין את שם המשתמש שלך במין הדקדוקי הנכון.\nהמידע יהיה ציבורי.",
+       "prefs-help-gender": "×\9c×\90 חובה למלא העדפה זו.\nהמערכת משתמשת במידע הזה כדי לפנות אליך/אלייך ולציין את שם המשתמש שלך במין הדקדוקי הנכון.\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": "עריכת הקבוצות של ה{{GENDER:$1|משתמש|משתמשת}}",
+       "editusergroup": "עריכת הקבוצות של ה{{GENDER:$1|משתמש}}",
        "editinguser": "שינוי ההרשאות של {{GENDER:$1|המשתמש|המשתמשת}} <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "עריכת קבוצות משתמש",
        "saveusergroups": "שמירת הקבוצות של ה{{GENDER:$1|משתמש|משתמשת}}",
        "protectedtitles-submit": "הצגת הדפים",
        "listusers": "רשימת משתמשים",
        "listusers-editsonly": "הצגת משתמשים עם עריכות בלבד",
-       "listusers-creationsort": "מיון לפי תאריך היצירה",
+       "listusers-creationsort": "מיון לפי תאריך היצירה של החשבון",
        "listusers-desc": "מיון בסדר יורד",
        "usereditcount": "{{PLURAL:$1|עריכה אחת|$1 עריכות}}",
        "usercreated": "{{GENDER:$3|נוצר|נוצרה}} ב־$2, $1",
        "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": "הודעת הדואר האלקטרוני שלך נשלחה.",
        "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": "שינוי מודל התוכן של דף",
        "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": "הצגת דפים החל מ:",
        "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": "חיפוש",
        "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": "שחרור חסימה של $1",
        "ipb-unblock": "שחרור חסימה של משתמש או כתובת IP",
        "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": "זמן פקיעת החסימה אינו תקין.",
        "tooltip-ca-unprotect": "שינוי ההגנה על דף זה",
        "tooltip-ca-delete": "מחיקת דף זה",
        "tooltip-ca-undelete": "שחזור עריכות שנעשו בדף זה לפני שנמחק",
-       "tooltip-ca-move": "×\94×¢×\91רת דף זה",
+       "tooltip-ca-move": "ש×\99× ×\95×\99 ×\94ש×\9d ×©×\9c דף זה",
        "tooltip-ca-watch": "הוספת דף זה לרשימת המעקב שלך",
        "tooltip-ca-unwatch": "הסרת דף זה מרשימת המעקב שלך",
        "tooltip-search": "חיפוש ב{{grammar:תחילית|{{SITENAME}}}}",
        "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",
        "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-watch-top": "להוסיף את הדף הזה לרשימת המעקב שלך?",
        "confirm-unwatch-button": "אישור",
        "confirm-unwatch-top": "להסיר את הדף הזה מרשימת המעקב שלך?",
+       "confirm-rollback-button": "אישור",
+       "confirm-rollback-top": "לשחזור את השינויים לדף הזה?",
        "quotation-marks": "\"$1\"",
        "imgmultipageprev": "→ לדף הקודם",
        "imgmultipagenext": "לדף הבא ←",
        "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",
        "cannotauth-not-allowed-title": "הגישה נדחתה",
        "cannotauth-not-allowed": "אינך מורשה להשתמש בדף זה",
        "changecredentials": "שינוי האישורים",
-       "changecredentials-submit": "שינוי",
+       "changecredentials-submit": "שינוי האישורים",
        "changecredentials-submit-cancel": "ביטול",
        "changecredentials-invalidsubpage": "$1 אינו סוג אישור תקין.",
        "changecredentials-success": "האישורים שלך שונו.",
        "removecredentials": "הסרת האישורים",
-       "removecredentials-submit": "×\94סר×\94",
+       "removecredentials-submit": "×\94סרת ×\94×\90×\99ש×\95ר×\99×\9d",
        "removecredentials-submit-cancel": "ביטול",
        "removecredentials-invalidsubpage": "$1 אינו סוג אישור תקין.",
        "removecredentials-success": "האישורים שלך הוסרו.",
index 8d8024f..ab176e7 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-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 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 ec08c26..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",
index edbaa7d..ccfae57 100644 (file)
        "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",
        "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 →",
        "cannotauth-not-allowed-title": "Permission refusate",
        "cannotauth-not-allowed": "Tu non es autorisate a usar iste pagina",
        "changecredentials": "Cambiar credentiales",
-       "changecredentials-submit": "Cambiar",
+       "changecredentials-submit": "Cambiar credentiales",
        "changecredentials-submit-cancel": "Cancellar",
        "changecredentials-invalidsubpage": "$1 non es un typo de credential valide.",
        "changecredentials-success": "Tu credentiales ha essite cambiate.",
        "removecredentials": "Remover credentiales",
-       "removecredentials-submit": "Remover",
+       "removecredentials-submit": "Remover credentiales",
        "removecredentials-submit-cancel": "Cancellar",
        "removecredentials-invalidsubpage": "$1 non es un typo de credential valide.",
        "removecredentials-success": "Tu credentiales ha essite removite.",
index 0fc6256..382c01f 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-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.",
        "action-managechangetags": "Membuat dan menghapus tag dari basis data",
        "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",
        "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",
        "feedback-thanks-title": "Terima kasih!",
        "searchsuggest-search": "Cari",
        "searchsuggest-containing": "berisi...",
+       "api-error-autoblocked": "Alamat IP Anda telah diblokir secara otomatis, karena sebelumnya digunakan oleh pengguna yang diblokir.",
        "api-error-badaccess-groups": "Anda tidak diizinkan mengunggah berkas ke wiki ini.",
        "api-error-badtoken": "Kesalahan internal: token buruk.",
+       "api-error-blocked": "Anda telah diblokir dari penyuntingan.",
        "api-error-copyuploaddisabled": "Mengunggah melalui URL dilarang pada peladen ini.",
        "api-error-duplicate": "Sudah ada {{PLURAL:$1|berkas lain|berkas lain}} dengan isi yang sama di situs ini.",
        "api-error-duplicate-archive": "Ada {{PLURAL:$1|berkas lain|berkas lain}} di situs dengan konten yang sama, namun {{PLURAL:$1|berkas|berkas-berkas}} itu telah dihapus.",
index fbb44e2..0e50f6f 100644 (file)
        },
        "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-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": "Са теркама xьат|аяздара хувцамаш къайладаха",
        "tog-watchlisthidebots": "Теркама xьат|аяздар чура б|ата хувцамаш къайладаха",
        "tog-watchlisthideminor": "Са теркама xьат|аяздара з|амига хувцамаш къайладаха",
@@ -64,7 +64,7 @@
        "monday": "оршот",
        "tuesday": "шинара",
        "wednesday": "Кхаьра",
-       "thursday": "ера",
+       "thursday": "éра",
        "friday": "пӀаьраска",
        "saturday": "шоатта",
        "sun": "КIиранди",
        "thu": "Ер",
        "fri": "ПI",
        "sat": "Шоа",
-       "january": "АгIой бутт",
-       "february": "Саь-кур бутт",
-       "march": "Мутт-хьал бутт",
-       "april": "Тушоли бутт",
-       "may_long": "Села бутт",
-       "june": "Этинга бутт",
-       "july": "Баьцамеа бутт",
-       "august": "Мяцхали бутт",
-       "september": "Михий бутт",
-       "october": "АьрхIий бутт",
-       "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": "Михий",
+       "october": "АьрхIий",
+       "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": "Мутт-хьал",
        "jul": "Баьцамеа",
        "aug": "Мяцхали",
        "sep": "Михий",
-       "oct": "Ð\90Ñ\80даÑ\80ий\\Ð\90Ñ\8cÑ\80Ñ\85Iий",
+       "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",
+       "may-date": "Села $1",
        "june-date": "Аьтинг $1",
        "july-date": "К|имарс $1",
        "august-date": "Мангал $1",
        "september-date": "Моажол $1",
-       "october-date": "Тов $1",
-       "november-date": "Лай чилла бутт $1",
+       "october-date": "Ð\90Ñ\8cÑ\80Ñ\85Iий $1",
+       "november-date": "Лай чилла $1",
        "december-date": "Чантар $1",
        "period-am": "ДЦ",
        "period-pm": "ДТ",
        "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": "Са оттамаш",
        "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": "ГӀирсаш",
        "categorypage": "Катага оаг|oн т|а б|аргтасса",
        "viewtalkpage": "Дувцамага б|аргтасса",
        "otherlanguages": "Кхыча меттаех",
-       "redirectedfrom": "($1 тIaра укхаз хьахьожаяь я)",
+       "redirectedfrom": "($1 дIа-сахьожаяьй укхаз)",
        "redirectpagesub": "Д|а-хьа дайта оаг|ув",
        "redirectto": "ДIа-сахьожадар укхаза:",
        "lastmodifiedat": "Укх оагIoн тIеххьара хувцам: $2, $1.",
        "pool-queuefull": "Хаттарий цӀа хьалдизад",
        "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": "Керттера оагӀув",
        "mainpage-description": "Керттера оагӀув",
        "policy-url": "Project:Бокъонаш",
        "portal": "Юкъара ков",
        "editlink": "хувца",
        "viewsourcelink": "Хьажа дIадолалу ко́дага",
        "editsectionhint": "Дáкъа хувца: $1",
-       "toc": "ЧÑ\83лоаÑ\86ам",
+       "toc": "ЧÑ\83даÑ\80",
        "showtoc": "хьахьокха",
        "hidetoc": "къайладаккха",
        "collapsible-collapse": "чудерзаде",
        "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": "Бахьан:",
        "unwatchedpages": "Теркамза оагIувнаш",
        "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-toponly": "ТIехьара доржамаш лоархаш дола хувцамаш мара ма хьокха",
        "sp-contributions-submit": "Хьалáха",
        "whatlinkshere": "ТIахьожаяргаш укхаза",
-       "whatlinkshere-title": "\"$1\" тIахьожавеш йола оагIонаш",
-       "whatlinkshere-page": "ОагIув",
+       "whatlinkshere-title": "\"$1а\" тIахьожавеш йола оагIонаш",
+       "whatlinkshere-page": "ОагIув:",
        "linkshere": "ТIехьайоагIа оагIонаш тIахьожаву «'''[[:$1]]'''»:",
        "nolinkshere": "'''[[:$1]]''' оагIув тIа, кхыдола оагIувашкара Iинкаш йоацаш я",
        "isredirect": "оагIув-д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ега бела дакъалаьцархой",
        "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=Ð\9aÑ\85Ñ\8bйола  Ñ\80азÑ\80еÑ\88ени|Ð\9aÑ\85Ñ\8bйола  Ñ\80азÑ\80еÑ\88енеÑ\88}}: $1.",
+       "show-big-image-other": "{{PLURAL:$2|1=Ð\9aÑ\85Ñ\8bбола Ñ\82IеÑ\80а Ð±Ð¾Ð°Ñ\80ам|Ð\9aÑ\85Ñ\8bбола Ñ\82IеÑ\80а Ð±Ð¾Ð°Ñ\80ам}}: $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-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а разрешени",
-       "exif-yresolution": "УрагIа разрешени",
+       "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 c887479..06fd0b2 100644 (file)
@@ -97,7 +97,8 @@
                        "JackLantern",
                        "Mpiva",
                        "Urielejh",
-                       "Matma Rex"
+                       "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()",
        "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.",
        "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",
        "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-reblock": "Soppressione utente da ri-blocco",
        "log-action-filter-upload-upload": "Nuovo caricamento",
        "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. Collegarli ti consente di effettuare l'accesso tramite di esse. Si prega di selezionare quelli 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-submit-cancel": "Annulla",
-       "removecredentials-submit": "Rimuovi",
-       "removecredentials-submit-cancel": "Annulla"
+       "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-submit-cancel": "Annulla",
+       "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 bc063df..a240fd2 100644 (file)
        "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": "差し戻し",
        "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 f446921..57d4099 100644 (file)
        "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 b9885e0..4ee3c82 100644 (file)
        "whatlinkshere-prev": "{{PLURAL:$1|წინა|წინა $1}}",
        "whatlinkshere-next": "{{PLURAL:$1|შემდეგი|შემდეგი $1}}",
        "whatlinkshere-links": "← ბმულები",
-       "whatlinkshere-hideredirs": "გადამისამართების $1",
-       "whatlinkshere-hidetrans": "$1 á\83©á\83\90á\83 á\83\97á\83\95á\83\94á\83\91ი",
-       "whatlinkshere-hidelinks": "ბმულების $1",
+       "whatlinkshere-hideredirs": "$1 გადამისამართება",
+       "whatlinkshere-hidetrans": "$1 á\83©á\83\90á\83\9cá\83\90á\83 á\83\97ი",
+       "whatlinkshere-hidelinks": "$1 ბმული",
        "whatlinkshere-hideimages": "$1 სურათის ბმულები",
        "whatlinkshere-filters": "ფილტრები",
        "whatlinkshere-submit": "წინ",
index dd471d5..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 fe3d3ad..72b4de5 100644 (file)
        "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소프트웨어의 버그일 수 있습니다.",
        "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>",
        "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": "사용자 이름이나 이메일 주소가 지정되지 않았습니다",
        "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": "문서의 콘텐츠 모델을 변경",
        "confirm-watch-top": "이 문서를 주시문서 목록에 추가할까요?",
        "confirm-unwatch-button": "확인",
        "confirm-unwatch-top": "이 문서를 주시문서 목록에서 뺄까요?",
+       "confirm-rollback-button": "확인",
+       "confirm-rollback-top": "이 문서의 편집을 되돌리시겠습니까?",
        "quotation-marks": "“$1”",
        "imgmultipageprev": "← 이전 페이지",
        "imgmultipagenext": "다음 페이지 →",
        "log-action-filter-upload-upload": "새로 업로드",
        "log-action-filter-upload-overwrite": "다시 업로드",
        "authmanager-authn-not-in-progress": "인증이 진행 중이 아니거나 세션 데이터를 분실했습니다. 처음부터 다시 시작해 주십시오.",
+       "authmanager-authn-no-primary": "제공된 자격 증명으로 인증할 수 없습니다.",
+       "authmanager-authn-no-local-user": "자격 증명으로 이 위키의 어느 사용자로도 로그인 할 수 없습니다.",
+       "authmanager-authn-no-local-user-link": "제공된 자격 증명은 유효하지만 이 위키의 어느 사용자와도 연결되어 있지 않습니다. 다른 방식으로 로그인하거나, 새로운 사용자를 생성하면 자격 증명을 계정에 추가할 수 있게 됩니다.",
+       "authmanager-authn-autocreate-failed": "로컬 계정 자동 생성 실패: $1",
+       "authmanager-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-autocreate-noperm": "자동 계정 만들기는 허용되지 않습니다.",
        "authmanager-autocreate-exception": "이전의 오류들로 인해 자동 계정 만들기를 일시적으로 사용할 수 없습니다.",
        "authmanager-userdoesnotexist": "\"$1\" 사용자 계정은 등록되어 있지 않습니다.",
+       "authmanager-userlogin-remembermypassword-help": "세션 길이보다 더 오랜 시간 비밀번호를 기억할지에 대한 여부",
        "authmanager-username-help": "인증을 위한 사용자 이름.",
        "authmanager-password-help": "인증을 위한 비밀번호",
        "authmanager-domain-help": "외부 인증의 도메인",
        "authmanager-provider-password": "비밀번호 기반 인증",
        "authmanager-provider-password-domain": "비밀번호 및 도메인 기반 인증",
        "authmanager-provider-temporarypassword": "임시 비밀번호",
+       "authprovider-confirmlink-message": "최근의 로그인 시도를 참고하여 다음의 계정들을 사용자의 위키 계정에 연결할 수 있습니다. 이들을 연결하면 이 계정들을 통해 로그인이 가능해집니다. 연결하고자 하는 대상을 선택해 주십시오.",
+       "authprovider-confirmlink-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": "계정 연결을 계속할 수 없습니다. 사용자 세션의 시간이 초과되었을 가능성이 높습니다.",
-       "changecredentials-submit": "수정",
+       "cannotauth-not-allowed-title": "권한이 없음",
+       "cannotauth-not-allowed": "이 문서의 이용을 허용하지 않습니다.",
+       "changecredentials": "자격 증명 수정",
+       "changecredentials-submit": "자격 증명 수정",
        "changecredentials-submit-cancel": "취소",
-       "removecredentials-submit": "제거",
+       "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": "연결할 수 있는 계정이 없습니다."
+       "cannotlink-no-provider": "연결할 수 있는 계정이 없습니다.",
+       "linkaccounts": "계정 연결",
+       "linkaccounts-success-text": "계정이 연결되었습니다.",
+       "linkaccounts-submit": "계정 연결",
+       "unlinkaccounts": "계정 연결 해제",
+       "unlinkaccounts-success": "계정의 연결이 해제되었습니다."
 }
index a21f3e2..ce4419a 100644 (file)
        "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-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",
-       "authmanager-userdoesnotexist": "Ene Metmaacher mem Nahme „$1“ es nit ennjedrahre."
+       "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 557f2f7..e43af93 100644 (file)
@@ -59,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 $1",
+       "whatlinkshere-hideredirs": "$1 Viruleedungen",
        "whatlinkshere-hidetrans": "Agebonne Schabloune $1",
-       "whatlinkshere-hidelinks": "Linken $1",
-       "whatlinkshere-hideimages": "Linken op Fichiere $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-autopromote": "Automatesch Ännerung",
        "log-action-filter-upload-upload": "Neien Upload",
        "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-submit-cancel": "Ofbriechen",
+       "changecredentials-success": "Är Idendifikatiounsinformatioune goufe geännert.",
        "removecredentials-submit": "Ewechhuelen",
-       "removecredentials-submit-cancel": "Ofbriechen"
+       "removecredentials-submit-cancel": "Ofbriechen",
+       "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 3eb98b1..04c0fc7 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",
+       "changecredentials-submit-cancel": "Atcelt",
+       "removecredentials-submit-cancel": "Atcelt"
 }
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 f889a84..8e9b13d 100644 (file)
        "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",
        "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": "Додај параметар:",
        "confirm-watch-top": "Да ја додадам страницава во набљудуваните?",
        "confirm-unwatch-button": "ОК",
        "confirm-unwatch-top": "Да ја отстранам страницава од набљудуваните?",
+       "confirm-rollback-button": "ОК",
+       "confirm-rollback-top": "Да ги отповикам уредувањата на страницава?",
        "percent": "$1&#160;%",
        "quotation-marks": "„$1“",
        "imgmultipageprev": "&larr; претходна страница",
        "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 5b263ea..a84e3e4 100644 (file)
        "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\".'''",
        "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 bb347df..319be59 100644 (file)
        "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",
        "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]].",
        "whatlinkshere-prev": "{{PLURAL:$1|veurige|veurige $1}}",
        "whatlinkshere-next": "{{PLURAL:$1|volgende|volgende $1}}",
        "whatlinkshere-links": "← verwiezingen",
-       "whatlinkshere-hideredirs": "Redirects $1",
+       "whatlinkshere-hideredirs": "$1 deurverwiezingen",
        "whatlinkshere-hidetrans": "Vörlageninbinnungen $1",
        "whatlinkshere-hidelinks": "Lenken $1",
        "whatlinkshere-hideimages": "$1 bestaandsverwiezingen",
index abe72dc..a840651 100644 (file)
        "whatlinkshere-prev": "{{PLURAL:$1|vörige|vörige $1}}",
        "whatlinkshere-next": "{{PLURAL:$1|nächste|nächste $1}}",
        "whatlinkshere-links": "← Lenken",
-       "whatlinkshere-hideredirs": "$1 deurverwiezingen",
+       "whatlinkshere-hideredirs": "$1 Redirects",
        "whatlinkshere-hidetrans": "$1 in-evoegden mallen",
        "whatlinkshere-hidelinks": "$1 verwiezingen",
        "whatlinkshere-hideimages": "$1 bestaandsverwiezingen",
index 4520927..fa03e51 100644 (file)
        "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.",
        "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 985cb3e..18d8a84 100644 (file)
        "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..1b9afb8 100644 (file)
        "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ਜੇ ਤੁਸੀਂ ਇਸਨੂੰ ਬਣਾਉਣਾ/ਸੋਧਣਾ ਚਾਹੁੰਦੇ ਹੋ ਤਾਂ ਮਿਰਬਾਨੀ ਕਰਕੇ ਜਾਂਚ ਕਰ ਲਓ।",
        "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": "ਇਸ ਸਫ਼ੇ ਦੇ ਪਿਛਲੇ ਰੀਵਿਜਨ",
        "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": "ਪ੍ਰਵਾਨਗੀ ਨਹੀਂ ਮਿਲੀ",
+       "changecredentials-submit-cancel": "ਰੱਦ ਕਰੋ",
+       "removecredentials-submit-cancel": "ਰੱਦ ਕਰੋ",
+       "credentialsform-account": "ਖਾਤੇ ਦਾ ਨਾਂ:"
 }
index 6862c00..126fe1c 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ę",
        "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.",
        "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”",
        "specialpage-securitylevel-not-allowed": "Niestety, nie możesz korzystać z tej strony, ponieważ twoja tożsamość nie może zostać zweryfikowana.",
        "authpage-cannot-login-continue": "Nie można kontynuować logowania. Sesja najprawdopodobniej wygasła.",
        "cannotauth-not-allowed-title": "Brak dostępu",
+       "changecredentials-submit": "Zmień poświadczenia",
        "changecredentials-submit-cancel": "Anuluj",
-       "removecredentials-submit": "Usuń",
+       "removecredentials-submit": "Usuń poświadczenia",
        "removecredentials-submit-cancel": "Anuluj",
        "credentialsform-account": "Nazwa konta:"
 }
index 37569e0..3d32f5b 100644 (file)
        "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": "----\n<em>Costa a l'é la pàgina ëd ciaciarade për n'utent anònim che a l'é ancó pa duvertasse un cont, ò pura che a lo deuvra nen.</em>\nAlora i l'oma da dovré ël nùmer d'adrëssa IP për deje n'identificassion a chiel o chila.\nN'adrëssa IP përparèj a peul esse partagià da vàire utent.\nSe chiel a l'é n'utent anònim e a l'ha l'impression d'arsèive dij coment sensa sust, për piasì [[Special:CreateAccount|ch'a crea un cont]] o [[Special:UserLogin|ch'a rintra ant ël sistema]] për evité dë fé confusion con d'àutri utent anònim.''",
-       "noarticletext": "Al moment costa pàgina a l'é veuida.\nA peul [[Special:Search/{{PAGENAME}}|sërché cost tìtol]] andrinta a d'àutre pàgine, <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} sërché ant ij registr colegà],\no purament [{{fullurl:{{FULLPAGENAME}}|action=edit}} modìfiché sta pàgina]</span>.",
+       "noarticletext": "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.",
        "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 d755f65..377b489 100644 (file)
        "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": "چاڼگرونه",
index 4a73349..2a3f404 100644 (file)
        "whatlinkshere-hideredirs": "$1 redirecionamentos",
        "whatlinkshere-hidetrans": "$1 transclusões",
        "whatlinkshere-hidelinks": "$1 ligações",
-       "whatlinkshere-hideimages": "$1 ligações para ficheiros",
+       "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.",
+       "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 d2053db..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",
        "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 24f1c9e..ad9a372 100644 (file)
                        "Frigory",
                        "Psychoslave",
                        "Guycn2",
-                       "2axterix2"
+                       "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.",
        "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-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}}",
+       "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]].",
+       "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]].",
        "whatlinkshere-hideimages": "Filter option in [[Special:WhatLinksHere]].\n\nSee also:\n*{{msg-mw|Isimage}}\n*{{msg-mw|Media tip}}",
        "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.",
        "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]].\n{{Identical|Change}}",
-       "changecredentials-submit-cancel": "Used on [[Special:ChangeCredentials]].\n{{Identical|Cancel}}",
+       "changecredentials-submit": "Used on [[Special:ChangeCredentials]].",
        "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]].\n{{Identical|Remove}}",
-       "removecredentials-submit-cancel": "Used on [[Special:RemoveCredentials]].\n{{Identical|Cancel}}",
+       "removecredentials-submit": "Used on [[Special:RemoveCredentials]].",
        "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..936e6ac 100644 (file)
        "password-change-forbidden": "Nu puteți schimba parole pe acest wiki.",
        "externaldberror": "A fost fie o eroare de bază de date pentru o autentificare extenă sau nu aveți permisiunea să actualizați contul extern.",
        "login": "Autentificare",
+       "login-security": "Verificați-vă identitatea",
        "nav-login-createaccount": "Creare cont / Autentificare",
        "userlogin": "Creare cont / Autentificare",
        "userloginnocreate": "Autentificare",
        "noname": "Numele de utilizator pe care l-ați introdus nu este valid.",
        "loginsuccesstitle": "Autentificat(ă)",
        "loginsuccess": "'''Ați fost autentificat la {{SITENAME}} ca „$1”.'''",
-       "nosuchuser": "Nu există nici un utilizator cu numele „$1”.\nNumele de utilizatori sunt sensibile la majuscule.\nVerifică dacă ai scris corect sau [[Special:CreateAccount|creează un nou cont de utilizator]].",
+       "nosuchuser": "Nu există nici un utilizator cu numele „$1”.\nNumele de utilizatori sunt sensibile la majuscule.\nVerificați dacă ați scris corect sau [[Special:CreateAccount|creați un nou cont de utilizator]].",
        "nosuchusershort": "Nu există niciun utilizator cu numele „$1”.\nVerificați ortografierea.",
        "nouserspecified": "Trebuie să specificați un nume de utilizator.",
        "login-userblocked": "Acest utilizator este blocat. Autentificarea nu este permisă.",
        "right-override-export-depth": "Exportă inclusiv paginile legate până la o adâncime de 5",
        "right-sendemail": "Trimite e-mail altor utilizatori",
        "right-passwordreset": "Vizualizează e-mailurile de reinițializare a parolelor",
-       "right-managechangetags": "Creează și șterge [[Special:Tags|etichete]] din baza de date",
+       "right-managechangetags": "Creează și (dez)activează [[Special:Tags|etichete]]",
        "right-applychangetags": "Aplică [[Special:Tags|etichete]] asociate modificărilor unui utilizator",
        "right-changetags": "Adaugă și înlătură [[Special:Tags|etichete]] arbitrare din versiuni și intrări de jurnal individuale",
+       "right-deletechangetags": "Șterge [[Special:Tags|etichete]] din baza de date",
+       "grant-generic": "set de permisiuni „$1”",
+       "grant-group-page-interaction": "Interacționează cu paginile",
+       "grant-group-file-interaction": "Interacționează cu conținut media",
        "grant-basic": "Drepturi de bază",
        "newuserlogpage": "Jurnal utilizatori noi",
        "newuserlogpagetext": "Acesta este jurnalul creărilor conturilor de utilizator.",
        "action-viewmyprivateinfo": "vă vizualizați informațiile personale",
        "action-editmyprivateinfo": "să vă modificați informațiile personale",
        "action-editcontentmodel": "modificați modelul de conținut al unei pagini",
-       "action-managechangetags": "creați și să ștergeți etichete din baza de date",
+       "action-managechangetags": "creați și să (dez)activați etichete",
        "action-applychangetags": "aplicați etichete asociate modificărilor dumneavoastră",
        "action-changetags": "adăugați și să înlăturați etichete arbitrare din versiuni și intrări de jurnal individuale",
+       "action-deletechangetags": "ștergeți etichete din baza de date",
        "nchanges": "$1 {{PLURAL:$1|modificare|modificări|de modificări}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|de la ultima vizită}}",
        "enhancedrc-history": "istoric",
        "changecontentmodel-success-text": "Tipul de conținut al paginii [[:$1]] a fost modificat.",
        "changecontentmodel-cannot-convert": "Conținutul paginii [[:$1]] nu poate fi convertit în tipul $2.",
        "changecontentmodel-nodirectediting": "Modelul de conținut $1 nu acceptă editarea directă",
+       "changecontentmodel-emptymodels-title": "Nu sunt disponibile modele de conținut",
+       "changecontentmodel-emptymodels-text": "Conținutul paginii [[:$1]] nu poate fi convertit în alt tip.",
        "log-name-contentmodel": "Jurnal modificări model de conținut",
        "log-description-contentmodel": "Evenimente referitoare la modelele de conținut ale paginilor",
        "logentry-contentmodel-change": "$1 {{GENDER:$2|a modificat}} modelul de conținut al paginii $3 din „$4” în „$5”",
        "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",
index e1e8ede..d7e4485 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-another-realname-tip": "Настоящее имя (необязательное поле).\nЕсли вы укажете его, то оно будет использовано для того, чтобы показать, кем была внесена правка страницы.",
        "pt-login": "Войти",
        "pt-login-button": "Войти",
+       "pt-login-continue-button": "Продолжить процедуру входа",
        "pt-createaccount": "Создать учётную запись",
        "pt-userlogout": "Выйти",
        "php-mail-error-unknown": "Неизвестная ошибка в PHP-функции mail()",
        "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-upload-upload": "Новая загрузка",
        "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-submit": "Изменить учётные данные",
        "changecredentials-submit-cancel": "Отмена",
        "changecredentials-invalidsubpage": "$1 является недопустимым типом учётных данных.",
        "changecredentials-success": "Ваши учётные данные были изменены.",
        "removecredentials": "Удалить учётные данные",
-       "removecredentials-submit": "Удалить",
-       "removecredentials-submit-cancel": "Отмена"
+       "removecredentials-submit": "Удалить учётные данные",
+       "removecredentials-submit-cancel": "Отмена",
+       "credentialsform-provider": "Тип учётных данных:",
+       "credentialsform-account": "Имя учётной записи:",
+       "linkaccounts": "Связать учётные записи",
+       "linkaccounts-success-text": "Учетная запись была связана.",
+       "linkaccounts-submit": "Связать учётные записи",
+       "unlinkaccounts": "Отвязать учётные записи",
+       "unlinkaccounts-success": "Учетная запись была отвязан."
 }
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",
index ceb8448..52c8cb6 100644 (file)
        "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 ၵၼ်သိူင်ႇဝႆႉ}}:",
+       "sectioneditnotsupported-title": "ၵၢၼ်မႄးထတ်း တွၼ်ႈၵၼ် ဢမ်ႇလႆႈ ၵမ်ႉထႅမ်ဝႆႉပၼ်။",
+       "sectioneditnotsupported-text": "ၵၢၼ်မႄးထတ်း တွၼ်ႈၵၼ် ဢမ်ႇလႆႈ ၵမ်ႉထႅမ်ဝႆႉပၼ် တီႈၼႃႈလိၵ်ႈၼႆ့။",
        "permissionserrors": "ၵၢၼ်လူတ်းပွႆႇ ၽိတ်းပိူင်ႈ",
        "permissionserrorstext": "ၸဝ်ႈၵဝ်ႇဢမ်ႇမီးသုၼ်ႇ တႃႇႁဵတ်းဢၼ်ၼၼ်ႉ၊ ယွၼ်ႉပိူဝ်ႈဝႃႈ {{PLURAL:$1|လွင်ႈတၢင်း|လွင်ႈတၢင်းၸိူဝ်း}} ၼႆႉ:",
        "permissionserrorstext-withaction": "ၸဝ်ႈၵဝ်ႇဢမ်ႇမီးသုၼ်ႇ တႃႇ $2, တွၼ်ႈတႃႇ ၸိူဝ်း ဢၼ်ပဵၼ် {{PLURAL:$1|reason|လွင်ႈတၢင်း}}:",
        "contentmodelediterror": "ၸဝ်ႈၵဝ်ႇတေဢမ်ႇၸၢင်ႈ မႄးထတ်း ၵၢၼ်ၶူၼ်ႉလူဢၼ်ၼႆႉ၊ ယွၼ်ႉပိူဝ်ႈဝႃႈ ၽၢင်တူဝ် ၶေႃႈၶဝ်ႈပႃး မၼ်းၼႆႉပဵၼ်  <code>$1</code>, ဢၼ် ပႅၵ်ႇပိူင်ႈၵၼ်တၢင်း ၽၢင်တူဝ် ၶေႃႈၶဝ်ႈပႃး ၶွင်ႈၼႃႈလိၵ်ႈ <code>$2</code> ၼႆႉ။",
        "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": "လွင်ႈမႄးထတ်းၸဝ်ႈၵဝ်ႇ သိမ်းပၼ်ယဝ်ႉယဝ်ႈ။",
        "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",
        "revdel-restore": "လႅၵ်ႈလၢႆႈ ၵၢၼ်ႁၼ်လႆႈ",
        "pagehist": "ပိုၼ်းၼႃႈလိၵ်ႈ",
        "deletedhist": "ပိုၼ်း ၸိူဝ်းမွတ်ႇပႅတ်ႈဝႆႉ။",
+       "revdelete-otherreason": "တၢင်ႇၸိူဝ်း / လွင်ႈတၢင်း ထႅမ်သႂ်ႇထႅင်ႈ",
        "revdelete-reasonotherlist": "လွင်ႈတၢင်းတၢင်ႇၸိူဝ်း",
        "revdelete-edit-reasonlist": "မႄးထတ်း လွင်ႈတၢင်း တႃႇမွတ်ႇ",
        "revdelete-offender": "ၽူႈတႅမ်ႈ ၶေႃႈၶူၼ်ႉဢၢၼ်ႇ :",
        "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": "ၼႃႈလိၵ်ႈငဝ်ႈငႃႇၼႆႉ တေလႆႈလီပဵၼ် ႁူဝ်ၶေႃႈ ဢၼ်ၸႂ်ႉလႆႈ။",
        "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)",
        "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": "ၵူတ်ႇတူၺ်း :",
        "prefsnologintext2": "တႃႇတေလႅၵ်ႈလၢႆႈ ငဝ်ႈၵုမ်းပိူင်ၸဝ်ႈၵဝ်ႇၼၼ်ႉ ၶႅၼ်းတေႃႈ ၶဝ်ႈလွၵ်ႉဢိၼ်ႇလႄႈ။",
        "prefs-skin": "ၽိဝ်",
        "skin-preview": "တူၺ်းလူင်ႈၼႃႈ",
+       "datedefault": "ဢမ်ႇမီး ငဝ်ႈၵုမ်းပိူင်",
        "prefs-user-pages": "ၼႃႈလိၵ်ႈ ၽူႈၸႂ်ႉတိုဝ်း",
        "prefs-personal": "ပိုၼ်းၵႅပ်ႈ ၽူႈၸႂ်ႉတိုဝ်း",
        "prefs-rc": "လွင်ႈလႅၵ်ႈလၢႆႈမႂ်ႇမႂ်ႇ",
        "prefs-editwatchlist-raw": "မႄးထတ်း သဵၼ်ႈမၢႆပႂ်ႉတူၺ်းပိူင်လိူင်း",
        "prefs-editwatchlist-clear": "ၽဵဝ်ႈလၢင်ႉ သဵၼ်ႈမၢႆပႂ်ႉတူၺ်းၸဝ်ႈၵဝ်ႇ",
        "prefs-watchlist-days": "ဝၼ်းၸိူဝ်း တႃႇတေၼႄ ၵႃႈတီႈ သဵၼ်ႈမၢႆပႂ်ႉတူၺ်း :",
-       "prefs-watchlist-days-max": "တီႈၼမ်သုတ်း $1 {{PLURAL:$1|ဝၼ်း|ဝၼ်း}}",
+       "prefs-watchlist-days-max": "တီႈၼမ်သုတ်း $1 {{PLURAL:$1|ဝၼ်း|ဝၼ်း}}",
        "prefs-watchlist-edits-max": "တီႈၼမ်သုတ်းမၼ်း : 1000",
        "prefs-watchlist-token": "မၢႆၶပ်ႉ သဵၼ်ႈမၢႆပႂ်ႉတူၺ်း :",
        "prefs-misc": "ဢၼ်ယွႆႈဢၼ်ယမ်း",
        "stub-threshold-sample-link": "တူဝ်ယၢင်ႇ",
        "stub-threshold-disabled": "ဢိုတ်းဝႆႉ",
        "recentchangesdays": "ဝၼ်းၸိူဝ်းဢၼ်တေၼႄ ၵႃႈတီႈၼႂ်း လွင်ႈလႅၵ်ႈလၢႆႈ မႂ်ႇမႂ်ႇ",
-       "recentchangesdays-max": "တီႈၼမ်သုတ်း $1 {{PLURAL:$1|ဝၼ်း|ဝၼ်း}}",
+       "recentchangesdays-max": "တီႈၼမ်သုတ်း $1 {{PLURAL:$1|ဝၼ်း|ဝၼ်း}}",
        "recentchangescount": "တၢင်းၼမ်ၵၢၼ်မႄးထတ်း ဢၼ်တေၼႄဝႆႉၼင်ႇ ပိူင်ၵႅဝ်ႈ :",
        "prefs-help-recentchangescount": "ၼႆ့မၼ်းၶဝ်ႈပႃးဝႆႉ လွင်ႈလႅၵ်ႈလၢႆႈ မႂ်ႇမႂ်ႇ၊ ပိုၼ်းၼႃႈလိၵ်ႈ လႄႈ သဵၼ်ႈမၢႆ။",
        "savedprefs": "လွင်ႈလႆႈၸႂ်ၸဝ်ႈၵဝ်ႇၸိူဝ်းၼၼ်ႉ ထုၵ်ႇသိမ်းဝႆႉပၼ်ယဝ်ႉ။",
        "prefs-emailconfirm-label": "ၶေႃႈၼႄႉၼွၼ်း ဢီးမေးလ် :",
        "youremail": "ဢီးမေးလ် :",
        "username": "{{GENDER:$1|ၸိုဝ်ႈၽူႈၸႂ်ႉတိုဝ်း}}:",
-       "prefs-memberingroups": "{{GENDER:$2|ၽူႈၶဝ်ႈၸုမ်း}} of {{PLURAL:$1|ၸုမ်း|ၸုမ်း}}:",
+       "prefs-memberingroups": "{{GENDER:$2|ၽူႈၶဝ်ႈၸုမ်း}} of {{PLURAL:$1|ၸုမ်း|ၸုမ်း}}:",
        "prefs-registration": "ၶၢဝ်းယၢမ်းတၢင်ႇမၢႆၽၢင် :",
        "yourrealname": "ၶၢဝ်းယၢမ်း တႄႉတႄႉ :",
        "yourlanguage": "ၽႃႇသႃႇၵႂၢမ်း :",
        "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-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-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-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": "ၼႄ",
        "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": "သိူင်ႇ",
        "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]] and [[Special:WhatLinksHere/$1|{{PLURAL:$2|one page|$2 pages}}]] ဢဝ်သႂ်ႇၼႂ်း ပၢႆး",
+       "recentchanges-page-added-to-category-bundled": "[[:$1]] ထႅမ်သႂ်ႇဝႆႉယဝ်ႉ တီႈၼႂ်းတွၼ်ႈၵၼ်, [[Special:WhatLinksHere/$1|ၼႃႈလိၵ်ႈၼႆႉ မၼ်းၶဝ်ႈပႃးဝႆႉ ၵႃႈတီႈၼႂ်း ၼႃႈလိၵ်ႈ တၢင်ႇၸိူဝ်း]]",
        "recentchanges-page-removed-from-category": "[[:$1]] ဢဝ်ဢွၵ်ႇတမ်ႈတီႈ ပၢႆး",
-       "recentchanges-page-removed-from-category-bundled": "[[:$1]] and {{PLURAL:$2|one page|$2 pages}} ဢဝ်ဢွၵ်ႇ တမ်ႈတီႈ ၼႂ်းပၢႆး",
+       "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\" ယဝ်ႈ။",
+       "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-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|ၽူႈၶဝ်ႈၸုမ်း}}",
-       "usercreated": "သၢင်ႈ​ဝႆႉ မိူဝ်ႈ $2 ဝၼ်း​ထီႉ $1",
+       "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": "ၶူၼ်ႉႁႃတႃႇ ငဝ်ႇငႃႇပပ်ႉ",
index 4cae151..dda489d 100644 (file)
        "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 31aab75..ce6805e 100644 (file)
@@ -74,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|измена|измене|измена}}",
        "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": "Промени заштиту ове странице",
index 2bbfa54..132dcac 100644 (file)
        "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",
        "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",
index 100c225..78c343d 100644 (file)
        "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",
        "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",
        "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-reblock": "Användarcensur efter återblockering",
        "log-action-filter-upload-upload": "Ny uppladdning",
        "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.",
        "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",
-       "changecredentials-submit": "Ändra",
+       "cannotauth-not-allowed": "Du har inte behörighet att använda denna sida",
+       "changecredentials": "Ändra inloggningsuppgifter",
+       "changecredentials-submit": "Ändra inloggningsuppgifter",
        "changecredentials-submit-cancel": "Avbryt",
-       "removecredentials-submit": "Ta bort",
+       "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-submit-cancel": "Avbryt",
+       "removecredentials-invalidsubpage": "$1 är inte en giltig typ av inloggningsuppgift.",
+       "removecredentials-success": "Dina inloggningsuppgifter har tagits bort.",
+       "credentialsform-provider": "Typ av inloggningsuppgifter:",
        "credentialsform-account": "Kontonamn:",
        "cannotlink-no-provider-title": "Det finns inga konton som kan länkas",
        "cannotlink-no-provider": "Det finns inga konton som kan länkas.",
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 e24619a..583c560 100644 (file)
        "mainpage-description": "ಮುಖ್ಯ ಪುಟ",
        "policy-url": "Project:ನಿಯಮಾವಳಿ",
        "portal": "ಸಮುದಾಯೊ ಪುಟೊ",
-       "portal-url": "Project:ಸಮುದಾಯೊ ಪುಟೊ",
+       "portal-url": "Project:ಸಮುದಾಯ ಪುಟ",
        "privacy": "ಕಾಸಗಿ ಕಾರ್ಯೊನೀತಿ",
        "privacypage": "Project:ಕಾಸಗಿ ಕಾರ್ಯೊನೀತಿ",
        "badaccess": "ಅನುಮತಿ ದೋಷ",
        "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": "ಈ ಪುಟೊತ್ತ ಆಧುನಿಕ ಮಲ್ಪುನ ಕ್ರಿಯೆನ್ ಸದ್ಯಗ್ ಉಂತಾದ್ಂಡ್. ಮುಲ್ಪ ಉಪ್ಪುನ ಮಾಹಿತಿನ್ ನವೀಕರಣ ಮಲ್ಪರಾಪುಜಿ",
        "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",
index 6450ba1..015cf04 100644 (file)
        "expand_templates_remove_comments": "Ҳазфи тавзеҳот",
        "expand_templates_generate_xml": "Намоиши дарахти таҷзеҳи XML",
        "expand_templates_preview": "Пешнамоиш",
-       "randomrootpage": "Саҳифаи решавии тасодуфӣ"
+       "randomrootpage": "Саҳифаи решавии тасодуфӣ",
+       "changecredentials-submit": "Тағйири ҳисоби корбарӣ",
+       "removecredentials-submit": "Хориҷи эътиборнома"
 }
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 e6771bf..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>» исемле хисап язмасы юк. Сез чынлап та бу битне ясарга яисә үзгәртергә телисезме?",
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 65cae9d..0225abc 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”",
        "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-submit-cancel": "Hủy bỏ",
+       "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-submit-cancel": "Hủy bỏ",
+       "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 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 1b9fbf3..0e9c30e 100644 (file)
        "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": "更改一个页面的内容模型",
        "confirm-watch-top": "将此页添加到您的监视列表吗?",
        "confirm-unwatch-button": "确定",
        "confirm-unwatch-top": "从监视列表中删除此页吗?",
+       "confirm-rollback-button": "确定",
+       "confirm-rollback-top": "回退此页面的编辑么?",
        "semicolon-separator": ";",
        "comma-separator": "、",
        "colon-separator": ":",
        "cannotauth-not-allowed-title": "权限被拒绝",
        "cannotauth-not-allowed": "您不被允许使用此页面",
        "changecredentials": "更改证书",
-       "changecredentials-submit": "更改",
+       "changecredentials-submit": "更改证书",
        "changecredentials-submit-cancel": "取消",
        "changecredentials-invalidsubpage": "$1不是有效的证书类型。",
        "changecredentials-success": "您的证书已被更改。",
        "removecredentials": "移除证书",
-       "removecredentials-submit": "移除",
+       "removecredentials-submit": "移除证书",
        "removecredentials-submit-cancel": "取消",
        "removecredentials-invalidsubpage": "$1不是有效的证书类型。",
        "removecredentials-success": "您的证书已被移除。",
index 9a52c63..c2a6729 100644 (file)
        "createacct-email-ph": "輸入您的電子郵件地址",
        "createacct-another-email-ph": "輸入電子郵件地址",
        "createaccountmail": "使用臨時的隨機密碼,並將它寄至指定的電子郵件地址",
+       "createaccountmail-help": "可用來建立其他人的帳號 (不需要知道密碼)。",
        "createacct-realname": "真實姓名 (選填)",
        "createaccountreason": "原因:",
        "createacct-reason": "原因",
        "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": "變更頁面的內容模型",
        "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-reblock": "由重新封鎖禁止顯示使用者",
        "log-action-filter-upload-upload": "新上傳",
        "log-action-filter-upload-overwrite": "重新上傳",
+       "authmanager-authn-not-in-progress": "認証尚未進行或連線階段資料已遺失,請重頭再開始。",
+       "authmanager-authn-no-primary": "提供的憑證無法用來認証。",
+       "authmanager-authn-no-local-user": "提供的憑證沒有與任何在此 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-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-submit": "更改憑證",
        "changecredentials-submit-cancel": "取消",
        "changecredentials-invalidsubpage": "$1 不是有效的憑証類型。",
        "changecredentials-success": "已更改您的憑證。",
        "removecredentials": "移除憑證",
-       "removecredentials-submit": "移除",
+       "removecredentials-submit": "移除憑證",
        "removecredentials-submit-cancel": "取消",
        "removecredentials-invalidsubpage": "$1 不是有效的憑証類型。",
        "removecredentials-success": "已移除您的憑證。",
index aab2087..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,6 +93,10 @@ 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 ) {
@@ -113,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 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 66f8578..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;
 }
 
 .success-message {
        font-weight: bold;
        font-size: 110%;
-       color: #0f0;
+       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 8bc9ca4..6fde2e0 100644 (file)
     "grunt-contrib-watch": "1.0.0",
     "grunt-jscs": "2.8.0",
     "grunt-jsonlint": "1.0.7",
-    "grunt-karma": "1.0.0",
+    "grunt-karma": "0.12.2",
     "grunt-stylelint": "0.3.0",
     "karma": "0.13.22",
-    "karma-chrome-launcher": "1.0.1",
-    "karma-firefox-launcher": "1.0.0",
-    "karma-qunit": "1.0.0",
+    "karma-chrome-launcher": "0.2.2",
+    "karma-firefox-launcher": "0.1.7",
+    "karma-qunit": "0.1.9",
     "qunitjs": "1.22.0",
     "stylelint-config-wikimedia": "0.1.0"
   }
index 9a5931f..831fb0c 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' ],
@@ -933,6 +937,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 +1060,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 +1705,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 +1729,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 +1739,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',
@@ -1858,7 +1881,6 @@ return [
        ],
        'mediawiki.special.recentchanges' => [
                'scripts' => 'resources/src/mediawiki.special/mediawiki.special.recentchanges.js',
-               'dependencies' => 'mediawiki.special',
                'position' => 'top',
        ],
        'mediawiki.special.search' => [
@@ -1872,6 +1894,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 +1906,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 +1918,7 @@ return [
                        'prefs-editing',
                ],
                'dependencies' => [
+                       'mediawiki.special.upload.styles',
                        'jquery.spinner',
                        'mediawiki.jqueryMsg',
                        'mediawiki.api',
@@ -1903,6 +1929,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 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 5689256..9036dd3 100644 (file)
@@ -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 254836a..d24fcc9 100644 (file)
 
 .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 31158f7..8b4bd7b 100644 (file)
@@ -13,7 +13,7 @@
        font-weight: bold;
        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 {
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 835383e..95e92ae 100644 (file)
@@ -3,7 +3,6 @@
        visibility: hidden;
 }
 
-span.updatedmarker {
-       color: #000;
-       background-color: #0f0;
+.updatedmarker {
+       background-color: #b7f430;
 }
index 450517e..99982e3 100644 (file)
@@ -38,7 +38,7 @@ table.filehistory td.filehistory-selected {
 .filehistory a img,
 #file img:hover {
        /* @embed */
-       background: #fff url(images/checker.png) repeat;
+       background: #fff url( images/checker.png ) repeat;
 }
 
 /*
index a02b4b4..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;
 }
 
        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: #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 83b219a..7ccf59e 100644 (file)
@@ -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;
@@ -293,10 +294,6 @@ span.unpatrolled {
        color: #f00;
 }
 
-.updatedmarker {
-       background-color: #b7f430;
-}
-
 div.gallerybox {
        width: 150px;
 }
index e18ef69..4ff403a 100644 (file)
@@ -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 38f33be..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;
@@ -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 74911b7..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;
 }
 
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 8b07721..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 #c0c0c0;
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.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 d43b62b..bdd45bc 100644 (file)
@@ -34,6 +34,6 @@
 
        $( rc.init );
 
-       mw.special.recentchanges = rc;
+       module.exports = rc;
 
 }( mediaWiki, jQuery ) );
index 1e99361..aad784e 100644 (file)
@@ -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: #0f0;
-       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%;
-}
-
-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 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 #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;
-}
-/* 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..e8fda84
--- /dev/null
@@ -0,0 +1,161 @@
+/* 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%;
+}
+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 87cdb02..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;
 }
 
 /*
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 74c75ea..77f87f7 100644 (file)
@@ -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 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 ee571cb..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;
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 54620f4..3cca6eb 100644 (file)
@@ -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;
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 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 9405f6b..1603130 100644 (file)
@@ -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..47a662f 100644 (file)
@@ -18,7 +18,3 @@
        margin-right: 5%;
        width: 39%;
 }
-
-.oo-ui-fieldLayout .oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline {
-  margin-bottom: 0;
-}
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 5111d96..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;
 }
 
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 e78bd4e..89bbbe7 100644 (file)
@@ -16,7 +16,7 @@
                $patrolLinks.on( 'click', function ( e ) {
                        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.
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 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 785791e..6c3841d 100644 (file)
@@ -2269,9 +2269,11 @@ Entities inside <pre>
 <nowiki> inside of #tag:pre
 !! wikitext
 {{#tag:pre|Foo <nowiki>&rarr;bar</nowiki>}}
-!! html
+!! 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
@@ -2822,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
@@ -4780,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
@@ -7489,7 +7500,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
@@ -9940,7 +9951,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
@@ -13953,7 +13964,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
 
index 9672cdc..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.
         *
@@ -321,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' );
@@ -883,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...?
@@ -934,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' ) );
@@ -1182,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' ] );
@@ -1621,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.
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 1bf8729..b7f7880 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * @group Database
  */
@@ -34,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'
                        ],
@@ -70,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'
                        ],
@@ -361,6 +363,7 @@ class LinkerTest extends MediaWikiLangTestCase {
        }
 
        /**
+        * @covers MediaWiki\Linker\LinkRenderer::runLegacyBeginHook
         * @dataProvider provideLinkBeginHook
         */
        public function testLinkBeginHook( $callback, $expected ) {
@@ -407,6 +410,7 @@ class LinkerTest extends MediaWikiLangTestCase {
        }
 
        /**
+        * @covers MediaWiki\Linker\LinkRenderer::buildAElement
         * @dataProvider provideLinkEndHook
         */
        public function testLinkEndHook( $callback, $expected ) {
@@ -420,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 0e646ea..0e13721 100644 (file)
@@ -1,6 +1,8 @@
 <?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;
@@ -315,6 +317,8 @@ class MediaWikiServicesTest extends MediaWikiTestCase {
                        '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 247b6e4..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();
                }
        }
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 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,
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 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 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 );
        }
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 d4b1587..9bc41c0 100644 (file)
@@ -67,7 +67,8 @@ class BotPasswordSessionProviderTest extends MediaWikiTestCase {
                $passwordFactory->init( \RequestContext::getMain()->getConfig() );
                $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(
@@ -182,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' ) );
@@ -209,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 629c6e5..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' );
@@ -82,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() );
@@ -107,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'
@@ -132,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'
@@ -142,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'
@@ -159,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( [
@@ -200,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() );
 
@@ -212,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' ) );
@@ -221,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 );
 
@@ -235,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 );
 
@@ -257,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
@@ -265,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
                );
 
@@ -275,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!
@@ -289,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();
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 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 );