Merge "parser: inject a Logger into Parser instead of using wfDebug()"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Thu, 25 Jul 2019 10:41:07 +0000 (10:41 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Thu, 25 Jul 2019 10:41:07 +0000 (10:41 +0000)
376 files changed:
.travis.yml
RELEASE-NOTES-1.34
autoload.php
composer.json
docs/hooks.txt
includes/Autopromote.php
includes/DefaultSettings.php
includes/DevelopmentSettings.php
includes/EditPage.php
includes/FeedUtils.php
includes/GlobalFunctions.php
includes/Linker.php
includes/MediaWiki.php
includes/Permissions/PermissionManager.php
includes/ServiceWiring.php
includes/Title.php
includes/TitleArrayFromResult.php
includes/actions/InfoAction.php
includes/actions/RollbackAction.php
includes/actions/pagers/HistoryPager.php
includes/api/ApiCSPReport.php
includes/api/ApiEditPage.php
includes/api/ApiParse.php
includes/api/ApiQueryDeletedrevs.php
includes/api/ApiQuerySearch.php
includes/api/ApiUserrights.php
includes/api/i18n/mk.json
includes/api/i18n/nl.json
includes/auth/LocalPasswordPrimaryAuthenticationProvider.php
includes/block/BlockManager.php
includes/cache/MessageCache.php
includes/cache/localisation/LocalisationCache.php
includes/changes/CategoryMembershipChange.php
includes/changes/ChangesFeed.php
includes/changes/ChangesList.php
includes/changes/EnhancedChangesList.php
includes/changes/RCCacheEntryFactory.php
includes/changes/RecentChange.php
includes/changetags/ChangeTagsLogItem.php
includes/content/ContentHandler.php
includes/deferred/DeferredUpdates.php
includes/diff/DifferenceEngine.php
includes/export/WikiExporter.php
includes/export/XmlDumpWriter.php
includes/filebackend/lockmanager/LockManagerGroup.php
includes/filerepo/ForeignAPIRepo.php
includes/filerepo/file/LocalFileDeleteBatch.php
includes/htmlform/fields/HTMLNamespacesMultiselectField.php
includes/import/ImportableUploadRevisionImporter.php
includes/import/WikiRevision.php
includes/installer/DatabaseInstaller.php
includes/installer/Installer.php
includes/installer/MssqlInstaller.php
includes/installer/MysqlInstaller.php
includes/installer/i18n/af.json
includes/installer/i18n/ar.json
includes/installer/i18n/ast.json
includes/installer/i18n/ba.json
includes/installer/i18n/be-tarask.json
includes/installer/i18n/bg.json
includes/installer/i18n/bn.json
includes/installer/i18n/br.json
includes/installer/i18n/bs.json
includes/installer/i18n/bto.json
includes/installer/i18n/ca.json
includes/installer/i18n/ce.json
includes/installer/i18n/cs.json
includes/installer/i18n/csb.json
includes/installer/i18n/da.json
includes/installer/i18n/de-ch.json
includes/installer/i18n/de.json
includes/installer/i18n/diq.json
includes/installer/i18n/dty.json
includes/installer/i18n/el.json
includes/installer/i18n/en-gb.json
includes/installer/i18n/en.json
includes/installer/i18n/eo.json
includes/installer/i18n/es.json
includes/installer/i18n/eu.json
includes/installer/i18n/fa.json
includes/installer/i18n/fi.json
includes/installer/i18n/fr.json
includes/installer/i18n/frc.json
includes/installer/i18n/frp.json
includes/installer/i18n/gl.json
includes/installer/i18n/gsw.json
includes/installer/i18n/he.json
includes/installer/i18n/hrx.json
includes/installer/i18n/hsb.json
includes/installer/i18n/hu.json
includes/installer/i18n/ia.json
includes/installer/i18n/id.json
includes/installer/i18n/io.json
includes/installer/i18n/is.json
includes/installer/i18n/it.json
includes/installer/i18n/ja.json
includes/installer/i18n/ka.json
includes/installer/i18n/ko.json
includes/installer/i18n/ksh.json
includes/installer/i18n/ku-latn.json
includes/installer/i18n/lb.json
includes/installer/i18n/lij.json
includes/installer/i18n/lki.json
includes/installer/i18n/lt.json
includes/installer/i18n/lv.json
includes/installer/i18n/mg.json
includes/installer/i18n/mk.json
includes/installer/i18n/mr.json
includes/installer/i18n/ms.json
includes/installer/i18n/mt.json
includes/installer/i18n/nan.json
includes/installer/i18n/nap.json
includes/installer/i18n/nb.json
includes/installer/i18n/nl-informal.json
includes/installer/i18n/nl.json
includes/installer/i18n/oc.json
includes/installer/i18n/olo.json
includes/installer/i18n/pl.json
includes/installer/i18n/pms.json
includes/installer/i18n/pt-br.json
includes/installer/i18n/pt.json
includes/installer/i18n/qqq.json
includes/installer/i18n/ro.json
includes/installer/i18n/roa-tara.json
includes/installer/i18n/ru.json
includes/installer/i18n/sco.json
includes/installer/i18n/sh.json
includes/installer/i18n/si.json
includes/installer/i18n/sl.json
includes/installer/i18n/sr-ec.json
includes/installer/i18n/sr-el.json
includes/installer/i18n/sv.json
includes/installer/i18n/te.json
includes/installer/i18n/th.json
includes/installer/i18n/tl.json
includes/installer/i18n/tr.json
includes/installer/i18n/tt-cyrl.json
includes/installer/i18n/uk.json
includes/installer/i18n/vi.json
includes/installer/i18n/war.json
includes/installer/i18n/zh-hans.json
includes/installer/i18n/zh-hant.json
includes/libs/objectcache/APCBagOStuff.php
includes/libs/objectcache/APCUBagOStuff.php
includes/libs/objectcache/BagOStuff.php
includes/libs/objectcache/CachedBagOStuff.php
includes/libs/objectcache/EmptyBagOStuff.php
includes/libs/objectcache/HashBagOStuff.php
includes/libs/objectcache/IStoreKeyEncoder.php
includes/libs/objectcache/MediumSpecificBagOStuff.php [new file with mode: 0644]
includes/libs/objectcache/MemcachedBagOStuff.php
includes/libs/objectcache/MemcachedPeclBagOStuff.php
includes/libs/objectcache/MemcachedPhpBagOStuff.php
includes/libs/objectcache/MultiWriteBagOStuff.php
includes/libs/objectcache/RESTBagOStuff.php
includes/libs/objectcache/RedisBagOStuff.php
includes/libs/objectcache/ReplicatedBagOStuff.php
includes/libs/objectcache/WANObjectCache.php
includes/libs/objectcache/WinCacheBagOStuff.php
includes/logging/DeleteLogFormatter.php
includes/objectcache/SqlBagOStuff.php
includes/page/Article.php
includes/page/WikiPage.php
includes/parser/Parser.php
includes/resourceloader/MessageBlobStore.php
includes/resourceloader/ResourceLoaderFileModule.php
includes/resourceloader/ResourceLoaderWikiModule.php
includes/revisiondelete/RevDelArchivedFileItem.php
includes/revisiondelete/RevDelFileItem.php
includes/revisiondelete/RevDelList.php
includes/revisiondelete/RevDelLogItem.php
includes/revisiondelete/RevDelLogList.php
includes/revisiondelete/RevDelRevisionItem.php
includes/revisiondelete/RevDelRevisionList.php
includes/revisiondelete/RevisionDeleteUser.php
includes/revisiondelete/RevisionDeleter.php
includes/revisionlist/RevisionItem.php
includes/search/AugmentPageProps.php
includes/search/ISearchResultSet.php [new file with mode: 0644]
includes/search/PaginatingSearchEngine.php
includes/search/PerRowAugmentor.php
includes/search/ResultSetAugmentor.php
includes/search/SearchDatabase.php
includes/search/SearchEngine.php
includes/search/SearchNearMatchResultSet.php
includes/search/SearchNearMatcher.php
includes/search/SearchResult.php
includes/search/SearchResultSet.php
includes/search/SqlSearchResultSet.php
includes/shell/Command.php
includes/specialpage/AuthManagerSpecialPage.php
includes/specials/SpecialFewestrevisions.php
includes/specials/SpecialGoToInterwiki.php
includes/specials/SpecialMergeHistory.php
includes/specials/SpecialMute.php
includes/specials/SpecialRevisionDelete.php
includes/specials/SpecialSearch.php
includes/specials/SpecialUndelete.php
includes/specials/SpecialUserrights.php
includes/specials/pagers/ContribsPager.php
includes/specials/pagers/DeletedContribsPager.php
includes/upload/UploadBase.php
includes/upload/UploadFromChunks.php
includes/watcheditem/WatchedItemQueryService.php
includes/widget/search/BasicSearchResultSetWidget.php
includes/widget/search/DidYouMeanWidget.php
includes/widget/search/InterwikiSearchResultSetWidget.php
includes/widget/search/SearchResultSetWidget.php
includes/widget/search/SimpleSearchResultSetWidget.php
languages/LanguageConverter.php
languages/classes/LanguageTr.php
languages/i18n/ar.json
languages/i18n/ast.json
languages/i18n/az.json
languages/i18n/bcc.json
languages/i18n/be-tarask.json
languages/i18n/be.json
languages/i18n/bg.json
languages/i18n/ca.json
languages/i18n/cs.json
languages/i18n/de.json
languages/i18n/en.json
languages/i18n/eo.json
languages/i18n/es-formal.json
languages/i18n/es.json
languages/i18n/et.json
languages/i18n/eu.json
languages/i18n/exif/bg.json
languages/i18n/exif/sdc.json
languages/i18n/exif/sh.json
languages/i18n/fa.json
languages/i18n/fi.json
languages/i18n/fr.json
languages/i18n/gl.json
languages/i18n/gor.json
languages/i18n/he.json
languages/i18n/hr.json
languages/i18n/hu.json
languages/i18n/hy.json
languages/i18n/hyw.json
languages/i18n/ia.json
languages/i18n/io.json
languages/i18n/it.json
languages/i18n/ja.json
languages/i18n/km.json
languages/i18n/ko.json
languages/i18n/lrc.json
languages/i18n/min.json
languages/i18n/mk.json
languages/i18n/ml.json
languages/i18n/ms.json
languages/i18n/my.json
languages/i18n/nb.json
languages/i18n/nds-nl.json
languages/i18n/nl.json
languages/i18n/nn.json
languages/i18n/pl.json
languages/i18n/pt-br.json
languages/i18n/pt.json
languages/i18n/qqq.json
languages/i18n/roa-tara.json
languages/i18n/ru.json
languages/i18n/rue.json
languages/i18n/sd.json
languages/i18n/sdc.json
languages/i18n/sh.json
languages/i18n/sk.json
languages/i18n/sl.json
languages/i18n/sq.json
languages/i18n/sr-ec.json
languages/i18n/sty.json
languages/i18n/sv.json
languages/i18n/te.json
languages/i18n/tg-cyrl.json
languages/i18n/th.json
languages/i18n/tly.json
languages/i18n/tr.json
languages/i18n/tt-cyrl.json
languages/i18n/tyv.json
languages/i18n/uk.json
languages/i18n/ur.json
languages/i18n/yue.json
languages/i18n/zh-hans.json
languages/i18n/zh-hant.json
languages/messages/MessagesHe.php
maintenance/cleanupSpam.php
maintenance/clearInterwikiCache.php
maintenance/copyJobQueue.php
maintenance/dictionary/mediawiki.dic [deleted file]
maintenance/fixDefaultJsonContentPages.php
maintenance/generateSitemap.php
maintenance/getText.php
maintenance/includes/TextPassDumper.php
maintenance/mctest.php
maintenance/namespaceDupes.php
maintenance/populateRevisionLength.php
maintenance/preprocessDump.php
maintenance/refreshLinks.php
maintenance/storage/checkStorage.php
maintenance/storage/recompressTracked.php
maintenance/userDupes.inc
maintenance/userOptions.php
maintenance/view.php
resources/Resources.php
resources/lib/foreign-resources.yaml
resources/lib/ooui/History.md
resources/lib/ooui/oojs-ui-apex.js
resources/lib/ooui/oojs-ui-core-apex.css
resources/lib/ooui/oojs-ui-core-wikimediaui.css
resources/lib/ooui/oojs-ui-core.js
resources/lib/ooui/oojs-ui-toolbars-apex.css
resources/lib/ooui/oojs-ui-toolbars-wikimediaui.css
resources/lib/ooui/oojs-ui-toolbars.js
resources/lib/ooui/oojs-ui-widgets-apex.css
resources/lib/ooui/oojs-ui-widgets-wikimediaui.css
resources/lib/ooui/oojs-ui-widgets.js
resources/lib/ooui/oojs-ui-wikimediaui.js
resources/lib/ooui/oojs-ui-windows-apex.css
resources/lib/ooui/oojs-ui-windows-wikimediaui.css
resources/lib/ooui/oojs-ui-windows.js
resources/lib/ooui/themes/apex/icons-alerts.json
resources/lib/ooui/themes/apex/icons-user.json
resources/lib/ooui/themes/wikimediaui/icons-alerts.json
resources/lib/ooui/themes/wikimediaui/icons-user.json
resources/lib/ooui/themes/wikimediaui/images/icons/bellOutline-invert.png [new file with mode: 0644]
resources/lib/ooui/themes/wikimediaui/images/icons/bellOutline-invert.svg [new file with mode: 0644]
resources/lib/ooui/themes/wikimediaui/images/icons/bellOutline-progressive.png [new file with mode: 0644]
resources/lib/ooui/themes/wikimediaui/images/icons/bellOutline-progressive.svg [new file with mode: 0644]
resources/lib/ooui/themes/wikimediaui/images/icons/bellOutline.png [new file with mode: 0644]
resources/lib/ooui/themes/wikimediaui/images/icons/bellOutline.svg [new file with mode: 0644]
resources/lib/ooui/themes/wikimediaui/images/icons/search-invert.png
resources/lib/ooui/themes/wikimediaui/images/icons/search-invert.svg
resources/lib/ooui/themes/wikimediaui/images/icons/search-progressive.png
resources/lib/ooui/themes/wikimediaui/images/icons/search-progressive.svg
resources/lib/ooui/themes/wikimediaui/images/icons/search.png
resources/lib/ooui/themes/wikimediaui/images/icons/search.svg
resources/lib/ooui/themes/wikimediaui/images/icons/userAvatarOutline-invert.png [new file with mode: 0644]
resources/lib/ooui/themes/wikimediaui/images/icons/userAvatarOutline-invert.svg [new file with mode: 0644]
resources/lib/ooui/themes/wikimediaui/images/icons/userAvatarOutline-progressive.png [new file with mode: 0644]
resources/lib/ooui/themes/wikimediaui/images/icons/userAvatarOutline-progressive.svg [new file with mode: 0644]
resources/lib/ooui/themes/wikimediaui/images/icons/userAvatarOutline.png [new file with mode: 0644]
resources/lib/ooui/themes/wikimediaui/images/icons/userAvatarOutline.svg [new file with mode: 0644]
resources/src/mediawiki.interface.helpers.styles.less
tests/phpunit/MediaWikiUnitTestCase.php
tests/phpunit/README
tests/phpunit/TODO [deleted file]
tests/phpunit/includes/GlobalFunctions/GlobalTest.php
tests/phpunit/includes/Permissions/PermissionManagerTest.php
tests/phpunit/includes/RevisionDbTestBase.php
tests/phpunit/includes/api/ApiCSPReportTest.php [new file with mode: 0644]
tests/phpunit/includes/api/ApiQuerySearchTest.php
tests/phpunit/includes/auth/LocalPasswordPrimaryAuthenticationProviderTest.php
tests/phpunit/includes/block/BlockManagerTest.php
tests/phpunit/includes/cache/MessageCacheTest.php
tests/phpunit/includes/libs/objectcache/BagOStuffTest.php
tests/phpunit/includes/libs/objectcache/CachedBagOStuffTest.php
tests/phpunit/includes/libs/objectcache/MultiWriteBagOStuffTest.php
tests/phpunit/includes/libs/objectcache/WANObjectCacheTest.php
tests/phpunit/includes/resourceloader/ResourceLoaderFilePathTest.php [deleted file]
tests/phpunit/includes/search/SearchEngineTest.php
tests/phpunit/includes/session/TestBagOStuff.php
tests/phpunit/includes/specials/SpecialGoToInterwikiTest.php [new file with mode: 0644]
tests/phpunit/includes/specials/SpecialMuteTest.php
tests/phpunit/includes/specials/SpecialSearchTest.php
tests/phpunit/includes/user/UserTest.php
tests/phpunit/includes/watcheditem/WatchedItemStoreUnitTest.php
tests/phpunit/maintenance/backup_PageTest.php
tests/phpunit/mocks/search/MockSearchEngine.php
tests/phpunit/mocks/search/MockSearchResultSet.php
tests/phpunit/unit/includes/SiteConfigurationTest.php
tests/phpunit/unit/includes/objectcache/RedisBagOStuffTest.php
tests/phpunit/unit/includes/resourceloader/ResourceLoaderFilePathTest.php [new file with mode: 0644]
tests/selenium/specs/rollback.js
tests/selenium/wdio-mediawiki/CHANGELOG.md
tests/selenium/wdio-mediawiki/README.md
tests/selenium/wdio-mediawiki/package.json

index bf905e0..d5607f1 100644 (file)
@@ -28,8 +28,6 @@ matrix:
     - php: 7.2
     - php: 7.1
     - php: 7
-  allow_failures:
-    - php: 7.3
 
 services:
   - mysql
index a92b5c2..9330d10 100644 (file)
@@ -36,6 +36,9 @@ For notes on 1.33.x and older releases, see HISTORY.
 * $wgEnableSpecialMute (T218265) - This configuration controls whether
   Special:Mute is available and whether to include a link to it on emails
   originating from Special:Email.
+* editmyuserjsredirect user right – users without this right now cannot edit JS
+  redirects in their userspace unless the target of the redirect is also in
+  their userspace. By default, this right is given to everyone.
 
 ==== Changed configuration ====
 * $wgUseCdn, $wgCdnServers, $wgCdnServersNoPurge, and $wgCdnMaxAge – These four
@@ -67,6 +70,8 @@ For notes on 1.33.x and older releases, see HISTORY.
 * $wgDebugPrintHttpHeaders - The default of including HTTP headers in the
   debug log channel is no longer configurable. The debug log itself remains
   configurable via $wgDebugLogFile.
+* $wgPasswordSalt – This setting, used for migrating exceptionally old, insecure
+  password setups and deprecated since 1.24, is now removed.
 
 === New user-facing features in 1.34 ===
 * Special:Mute has been added as a quick way for users to block unwanted emails
@@ -77,6 +82,10 @@ For notes on 1.33.x and older releases, see HISTORY.
   of headers in private wikis.
 * Language::formatTimePeriod now supports the new 'avoidhours' option to output
   strings like "5 days ago" instead of "5 days 13 hours ago".
+* (T220163) Added SpecialMuteModifyFormFields hook to allow extensions
+  to add fields to Special:Mute.
+* (T100896) Skin authors can define custom OOUI themes using OOUIThemePaths.
+  See <https://www.mediawiki.org/wiki/OOUI/Themes> for details.
 
 === External library changes in 1.34 ===
 
@@ -85,7 +94,7 @@ For notes on 1.33.x and older releases, see HISTORY.
 
 ==== Changed external libraries ====
 * Updated Mustache from 1.0.0 to v3.0.1.
-* Updated OOUI from v0.31.3 to v0.33.2.
+* Updated OOUI from v0.31.3 to v0.33.4.
 * Updated composer/semver from 1.4.2 to 1.5.0.
 * Updated composer/spdx-licenses from 1.4.0 to 1.5.1 (dev-only).
 * Updated mediawiki/codesniffer from 25.0.0 to 26.0.0 (dev-only).
@@ -300,6 +309,11 @@ because of Phabricator reports.
   deprecated since 1.33.
 * The static properties mw.Api.errors and mw.Api.warnings, deprecated in 1.29,
   have been removed.
+* The UploadVerification hook, deprecated in 1.28, has been removed. Instead,
+  use the UploadVerifyFile hook.
+* UploadBase:: and UploadFromChunks::stashFileGetKey() and stashSession(),
+  deprecated in 1.28, have been removed. Instead, please use the getFileKey()
+  method on the response from doStashFile().
 * …
 
 === Deprecations in 1.34 ===
@@ -368,6 +382,7 @@ because of Phabricator reports.
   and should no longer be passed. Search engine implemenations should be
   responsible for carrying relevant information needed for highlighting with
   their own SearchResultSet/SearchResult sub-classes.
+* SearchResultSet::free() method is deprecated.
 * SearchEngine::$searchTerms protected field is deprecated. Moved to
   SearchDatabase.
 * The use of the $terms param in the ShowSearchHit and ShowSearchHitTitle
@@ -381,6 +396,9 @@ because of Phabricator reports.
   PermissionManager::getUserPermissions() instead.
 * The LocalisationCacheRecache hook no longer allows purging of message blobs
   to be prevented. Modifying the $purgeBlobs parameter now has no effect.
+* The use of $wgProxyList with IP addresses in the array keys, deprecated in
+  1.30, was removed. Instead, $wgProxyList should be an array with IP addresses
+  as the values, or a string path to a file containing one IP address per line.
 
 === Other changes in 1.34 ===
 * …
index 9f9f1a6..e6e6504 100644 (file)
@@ -659,6 +659,7 @@ $wgAutoloadLocalClasses = [
        'IP' => __DIR__ . '/includes/libs/IP.php',
        'IPTC' => __DIR__ . '/includes/media/IPTC.php',
        'IRCColourfulRCFeedFormatter' => __DIR__ . '/includes/rcfeed/IRCColourfulRCFeedFormatter.php',
+       'ISearchResultSet' => __DIR__ . '/includes/search/ISearchResultSet.php',
        'IStoreKeyEncoder' => __DIR__ . '/includes/libs/objectcache/IStoreKeyEncoder.php',
        'IcuCollation' => __DIR__ . '/includes/collation/IcuCollation.php',
        'IdentityCollation' => __DIR__ . '/includes/collation/IdentityCollation.php',
@@ -968,6 +969,7 @@ $wgAutoloadLocalClasses = [
        'MediaWiki\\Widget\\TitlesMultiselectWidget' => __DIR__ . '/includes/widget/TitlesMultiselectWidget.php',
        'MediaWiki\\Widget\\UserInputWidget' => __DIR__ . '/includes/widget/UserInputWidget.php',
        'MediaWiki\\Widget\\UsersMultiselectWidget' => __DIR__ . '/includes/widget/UsersMultiselectWidget.php',
+       'MediumSpecificBagOStuff' => __DIR__ . '/includes/libs/objectcache/MediumSpecificBagOStuff.php',
        'MemcLockManager' => __DIR__ . '/includes/libs/lockmanager/MemcLockManager.php',
        'MemcachedBagOStuff' => __DIR__ . '/includes/libs/objectcache/MemcachedBagOStuff.php',
        'MemcachedClient' => __DIR__ . '/includes/libs/objectcache/MemcachedClient.php',
index dc6d091..98e7ebf 100644 (file)
@@ -27,7 +27,7 @@
                "ext-xml": "*",
                "guzzlehttp/guzzle": "6.3.3",
                "liuggio/statsd-php-client": "1.0.18",
-               "oojs/oojs-ui": "0.33.3",
+               "oojs/oojs-ui": "0.33.4",
                "pear/mail": "1.4.1",
                "pear/mail_mime": "1.10.2",
                "pear/net_smtp": "1.8.1",
index 36e0891..d832012 100644 (file)
@@ -1527,6 +1527,7 @@ $user: User the list is being fetched for
 &$skin: Skin object to be used with the list
 &$list: List object (defaults to NULL, change it to an object instance and
   return false override the list derivative used)
+$groups Array of ChangesListFilterGroup objects (added in 1.34)
 
 'FileDeleteComplete': When a file is deleted.
 &$file: reference to the deleted file
@@ -3200,6 +3201,10 @@ $request: WebRequest object for getting the value provided by the current user
 &$oldTitle: old title (object)
 &$newTitle: new title (object)
 
+'SpecialMuteModifyFormFields': Add more fields to Special:Mute
+$sp: SpecialPage object, for context
+&$fields: Current HTMLForm fields descriptors
+
 'SpecialNewpagesConditions': Called when building sql query for
 Special:NewPages.
 &$special: NewPagesPager object (subclass of ReverseChronologicalPager)
@@ -3300,8 +3305,8 @@ $opts: Array: key => value of hidden options for inclusion in custom forms
 
 'SpecialSearchResults': Called before search result display
 $term: string of search term
-&$titleMatches: empty or SearchResultSet object
-&$textMatches: empty or SearchResultSet object
+&$titleMatches: empty or ISearchResultSet object
+&$textMatches: empty or ISearchResultSet object
 
 'SpecialSearchResultsPrepend': Called immediately before returning HTML
 on the search results page.  Useful for including an external search
@@ -3565,14 +3570,6 @@ $props: (array|null) File properties, as returned by
   MessageSpecifier instance (you might want to use ApiMessage to provide machine
   -readable details for the API).
 
-'UploadVerification': DEPRECATED since 1.28! Use UploadVerifyFile instead.
-Additional chances to reject an uploaded file.
-$saveName: (string) destination file name
-$tempName: (string) filesystem path to the temporary file for checks
-&$error: (string) output: message key for message to show if upload canceled by
-  returning false. May also be an array, where the first element is the message
-  key and the remaining elements are used as parameters to the message.
-
 'UploadVerifyFile': extra file verification, based on MIME type, etc. Preferred
 in most cases over UploadVerification.
 $upload: (object) an instance of UploadBase, with all info about the upload
index a413037..b17f1ab 100644 (file)
@@ -198,8 +198,7 @@ class Autopromote {
                        case APCOND_IPINRANGE:
                                return IP::isInRange( $user->getRequest()->getIP(), $cond[1] );
                        case APCOND_BLOCKED:
-                               // @TODO Should partial blocks prevent auto promote?
-                               return (bool)$user->getBlock();
+                               return $user->getBlock() && $user->getBlock()->isSitewide();
                        case APCOND_ISBOT:
                                return in_array( 'bot', User::getGroupPermissions( $user->getGroups() ) );
                        default:
index 3bfc8f8..d23cc7b 100644 (file)
@@ -4710,12 +4710,6 @@ $wgRemoveCredentialsBlacklist = [
        \MediaWiki\Auth\PasswordAuthenticationRequest::class,
 ];
 
-/**
- * For compatibility with old installations set to false
- * @deprecated since 1.24 will be removed in future
- */
-$wgPasswordSalt = true;
-
 /**
  * Specifies the minimal length of a user password. If set to 0, empty pass-
  * words are allowed.
@@ -5173,6 +5167,7 @@ $wgGroupPermissions['user']['minoredit'] = true;
 $wgGroupPermissions['user']['editmyusercss'] = true;
 $wgGroupPermissions['user']['editmyuserjson'] = true;
 $wgGroupPermissions['user']['editmyuserjs'] = true;
+$wgGroupPermissions['user']['editmyuserjsredirect'] = true;
 $wgGroupPermissions['user']['purge'] = true;
 $wgGroupPermissions['user']['sendemail'] = true;
 $wgGroupPermissions['user']['applychangetags'] = true;
@@ -6007,9 +6002,8 @@ $wgSecretKey = false;
  * Big list of banned IP addresses.
  *
  * This can have the following formats:
- * - An array of addresses, either in the values
- *   or the keys (for backward compatibility, deprecated since 1.30)
- * - A string, in that case this is the path to a file
+ * - An array of addresses
+ * - A string, in which case this is the path to a file
  *   containing the list of IP addresses, one per line
  */
 $wgProxyList = [];
index d2f26b3..103ff45 100644 (file)
@@ -57,3 +57,6 @@ unset( $logDir );
 // Disable rate-limiting to allow integration tests to run unthrottled
 // in CI and for devs locally (T225796)
 $wgRateLimits = [];
+
+// Disable legacy javascript globals in CI and for devs (T72470)
+$wgLegacyJavaScriptGlobals = false;
index d27ef9c..f288327 100644 (file)
@@ -25,6 +25,7 @@ use MediaWiki\EditPage\TextboxBuilder;
 use MediaWiki\EditPage\TextConflictHelper;
 use MediaWiki\Logger\LoggerFactory;
 use MediaWiki\MediaWikiServices;
+use MediaWiki\Storage\RevisionRecord;
 use Wikimedia\ScopedCallback;
 
 /**
@@ -1222,8 +1223,8 @@ class EditPage {
                                # the revisions exist and they were not deleted.
                                # Otherwise, $content will be left as-is.
                                if ( !is_null( $undorev ) && !is_null( $oldrev ) &&
-                                       !$undorev->isDeleted( Revision::DELETED_TEXT ) &&
-                                       !$oldrev->isDeleted( Revision::DELETED_TEXT )
+                                       !$undorev->isDeleted( RevisionRecord::DELETED_TEXT ) &&
+                                       !$oldrev->isDeleted( RevisionRecord::DELETED_TEXT )
                                ) {
                                        if ( WikiPage::hasDifferencesOutsideMainSlot( $undorev, $oldrev )
                                                || !$this->isSupportedContentModel( $oldrev->getContentModel() )
@@ -1245,7 +1246,7 @@ class EditPage {
                                        }
 
                                        if ( $undoMsg === null ) {
-                                               $oldContent = $this->page->getContent( Revision::RAW );
+                                               $oldContent = $this->page->getContent( RevisionRecord::RAW );
                                                $popts = ParserOptions::newFromUserAndLang(
                                                        $user, MediaWikiServices::getInstance()->getContentLanguage() );
                                                $newContent = $content->preSaveTransform( $this->mTitle, $user, $popts );
@@ -1371,7 +1372,7 @@ class EditPage {
                        $handler = ContentHandler::getForModelID( $this->contentModel );
                        return $handler->makeEmptyContent();
                }
-               $content = $revision->getContent( Revision::FOR_THIS_USER, $user );
+               $content = $revision->getContent( RevisionRecord::FOR_THIS_USER, $user );
                return $content;
        }
 
@@ -1405,7 +1406,7 @@ class EditPage {
         */
        protected function getCurrentContent() {
                $rev = $this->page->getRevision();
-               $content = $rev ? $rev->getContent( Revision::RAW ) : null;
+               $content = $rev ? $rev->getContent( RevisionRecord::RAW ) : null;
 
                if ( $content === false || $content === null ) {
                        $handler = ContentHandler::getForModelID( $this->contentModel );
@@ -1496,7 +1497,7 @@ class EditPage {
                }
 
                $parserOptions = ParserOptions::newFromUser( $user );
-               $content = $page->getContent( Revision::RAW );
+               $content = $page->getContent( RevisionRecord::RAW );
 
                if ( !$content ) {
                        // TODO: somehow show a warning to the user!
@@ -3139,12 +3140,12 @@ ERROR;
                                if ( $revision ) {
                                        // Let sysop know that this will make private content public if saved
 
-                                       if ( !$revision->userCan( Revision::DELETED_TEXT, $user ) ) {
+                                       if ( !$revision->userCan( RevisionRecord::DELETED_TEXT, $user ) ) {
                                                $out->wrapWikiMsg(
                                                        "<div class='mw-warning plainlinks'>\n$1\n</div>\n",
                                                        'rev-deleted-text-permission'
                                                );
-                                       } elseif ( $revision->isDeleted( Revision::DELETED_TEXT ) ) {
+                                       } elseif ( $revision->isDeleted( RevisionRecord::DELETED_TEXT ) ) {
                                                $out->wrapWikiMsg(
                                                        "<div class='mw-warning plainlinks'>\n$1\n</div>\n",
                                                        'rev-deleted-text-view'
index 59efc98..8efae4f 100644 (file)
@@ -21,6 +21,8 @@
  * @ingroup Feed
  */
 
+use MediaWiki\Storage\RevisionRecord;
+
 /**
  * Helper functions for feeds
  *
@@ -68,7 +70,7 @@ class FeedUtils {
                return self::formatDiffRow( $titleObj,
                        $row->rc_last_oldid, $row->rc_this_oldid,
                        $timestamp,
-                       $row->rc_deleted & Revision::DELETED_COMMENT
+                       $row->rc_deleted & RevisionRecord::DELETED_COMMENT
                                ? wfMessage( 'rev-deleted-comment' )->escaped()
                                : CommentStore::getStore()->getComment( 'rc_comment', $row )->text,
                        $actiontext
index c6c386c..7b4b502 100644 (file)
@@ -2521,6 +2521,7 @@ function wfForeignMemcKey( $db, $prefix, ...$args ) {
  * @return string
  */
 function wfGlobalCacheKey( ...$args ) {
+       wfDeprecated( __METHOD__, '1.30' );
        return ObjectCache::getLocalClusterInstance()->makeGlobalKey( ...$args );
 }
 
index f20795d..db3e2f5 100644 (file)
@@ -21,6 +21,7 @@
  */
 use MediaWiki\Linker\LinkTarget;
 use MediaWiki\MediaWikiServices;
+use MediaWiki\Storage\RevisionRecord;
 
 /**
  * Some internal bits split of from Skin.php. These functions are used
@@ -1093,15 +1094,15 @@ class Linker {
         * @return string HTML fragment
         */
        public static function revUserLink( $rev, $isPublic = false ) {
-               if ( $rev->isDeleted( Revision::DELETED_USER ) && $isPublic ) {
+               if ( $rev->isDeleted( RevisionRecord::DELETED_USER ) && $isPublic ) {
                        $link = wfMessage( 'rev-deleted-user' )->escaped();
-               } elseif ( $rev->userCan( Revision::DELETED_USER ) ) {
-                       $link = self::userLink( $rev->getUser( Revision::FOR_THIS_USER ),
-                               $rev->getUserText( Revision::FOR_THIS_USER ) );
+               } elseif ( $rev->userCan( RevisionRecord::DELETED_USER ) ) {
+                       $link = self::userLink( $rev->getUser( RevisionRecord::FOR_THIS_USER ),
+                               $rev->getUserText( RevisionRecord::FOR_THIS_USER ) );
                } else {
                        $link = wfMessage( 'rev-deleted-user' )->escaped();
                }
-               if ( $rev->isDeleted( Revision::DELETED_USER ) ) {
+               if ( $rev->isDeleted( RevisionRecord::DELETED_USER ) ) {
                        return '<span class="history-deleted">' . $link . '</span>';
                }
                return $link;
@@ -1116,11 +1117,11 @@ class Linker {
         * @return string HTML
         */
        public static function revUserTools( $rev, $isPublic = false, $useParentheses = true ) {
-               if ( $rev->userCan( Revision::DELETED_USER ) &&
-                       ( !$rev->isDeleted( Revision::DELETED_USER ) || !$isPublic )
+               if ( $rev->userCan( RevisionRecord::DELETED_USER ) &&
+                       ( !$rev->isDeleted( RevisionRecord::DELETED_USER ) || !$isPublic )
                ) {
-                       $userId = $rev->getUser( Revision::FOR_THIS_USER );
-                       $userText = $rev->getUserText( Revision::FOR_THIS_USER );
+                       $userId = $rev->getUser( RevisionRecord::FOR_THIS_USER );
+                       $userText = $rev->getUserText( RevisionRecord::FOR_THIS_USER );
                        if ( $userId || (string)$userText !== '' ) {
                                $link = self::userLink( $userId, $userText )
                                        . self::userToolLinks( $userId, $userText, false, 0, null,
@@ -1132,7 +1133,7 @@ class Linker {
                        $link = wfMessage( 'rev-deleted-user' )->escaped();
                }
 
-               if ( $rev->isDeleted( Revision::DELETED_USER ) ) {
+               if ( $rev->isDeleted( RevisionRecord::DELETED_USER ) ) {
                        return ' <span class="history-deleted mw-userlink">' . $link . '</span>';
                }
                return $link;
@@ -1571,18 +1572,18 @@ class Linker {
        public static function revComment( Revision $rev, $local = false, $isPublic = false,
                $useParentheses = true
        ) {
-               if ( $rev->getComment( Revision::RAW ) == "" ) {
+               if ( $rev->getComment( RevisionRecord::RAW ) == "" ) {
                        return "";
                }
-               if ( $rev->isDeleted( Revision::DELETED_COMMENT ) && $isPublic ) {
+               if ( $rev->isDeleted( RevisionRecord::DELETED_COMMENT ) && $isPublic ) {
                        $block = " <span class=\"comment\">" . wfMessage( 'rev-deleted-comment' )->escaped() . "</span>";
-               } elseif ( $rev->userCan( Revision::DELETED_COMMENT ) ) {
-                       $block = self::commentBlock( $rev->getComment( Revision::FOR_THIS_USER ),
+               } elseif ( $rev->userCan( RevisionRecord::DELETED_COMMENT ) ) {
+                       $block = self::commentBlock( $rev->getComment( RevisionRecord::FOR_THIS_USER ),
                                $rev->getTitle(), $local, null, $useParentheses );
                } else {
                        $block = " <span class=\"comment\">" . wfMessage( 'rev-deleted-comment' )->escaped() . "</span>";
                }
-               if ( $rev->isDeleted( Revision::DELETED_COMMENT ) ) {
+               if ( $rev->isDeleted( RevisionRecord::DELETED_COMMENT ) ) {
                        return " <span class=\"history-deleted comment\">$block</span>";
                }
                return $block;
@@ -1875,10 +1876,10 @@ class Linker {
                $editCount = 0;
                $moreRevs = false;
                foreach ( $res as $row ) {
-                       if ( $rev->getUserText( Revision::RAW ) != $row->rev_user_text ) {
+                       if ( $rev->getUserText( RevisionRecord::RAW ) != $row->rev_user_text ) {
                                if ( $verify &&
-                                       ( $row->rev_deleted & Revision::DELETED_TEXT
-                                               || $row->rev_deleted & Revision::DELETED_USER
+                                       ( $row->rev_deleted & RevisionRecord::DELETED_TEXT
+                                               || $row->rev_deleted & RevisionRecord::DELETED_USER
                                ) ) {
                                        // If the user or the text of the revision we might rollback
                                        // to is deleted in some way we can't rollback. Similar to
@@ -2107,7 +2108,7 @@ class Linker {
                        return '';
                }
 
-               if ( !$rev->userCan( Revision::DELETED_RESTRICTED, $user ) ) {
+               if ( !$rev->userCan( RevisionRecord::DELETED_RESTRICTED, $user ) ) {
                        return self::revDeleteLinkDisabled( $canHide ); // revision was hidden from sysops
                }
                $prefixedDbKey = MediaWikiServices::getInstance()->getTitleFormatter()->
@@ -2130,7 +2131,7 @@ class Linker {
                        ];
                }
                return self::revDeleteLink( $query,
-                       $rev->isDeleted( Revision::DELETED_RESTRICTED ), $canHide );
+                       $rev->isDeleted( RevisionRecord::DELETED_RESTRICTED ), $canHide );
        }
 
        /**
index 69f23c1..7a6987e 100644 (file)
@@ -260,8 +260,16 @@ class MediaWiki {
                                        ) {
                                                list( , $subpage ) = $spFactory->resolveAlias( $title->getDBkey() );
                                                $target = $specialPage->getRedirect( $subpage );
-                                               // target can also be true. We let that case fall through to normal processing.
+                                               // Target can also be true. We let that case fall through to normal processing.
                                                if ( $target instanceof Title ) {
+                                                       if ( $target->isExternal() ) {
+                                                               // Handle interwiki redirects
+                                                               $target = SpecialPage::getTitleFor(
+                                                                       'GoToInterwiki',
+                                                                       'force/' . $target->getPrefixedDBkey()
+                                                               );
+                                                       }
+
                                                        $query = $specialPage->getRedirectQuery( $subpage ) ?: [];
                                                        $request = new DerivativeRequest( $this->context->getRequest(), $query );
                                                        $request->setRequestURL( $this->context->getRequest()->getRequestURL() );
index 5a3dae3..a04b29c 100644 (file)
@@ -23,6 +23,8 @@ use Action;
 use Exception;
 use Hooks;
 use MediaWiki\Linker\LinkTarget;
+use MediaWiki\Revision\RevisionLookup;
+use MediaWiki\Revision\RevisionRecord;
 use MediaWiki\Session\SessionManager;
 use MediaWiki\Special\SpecialPageFactory;
 use MediaWiki\User\UserIdentity;
@@ -55,6 +57,9 @@ class PermissionManager {
        /** @var SpecialPageFactory */
        private $specialPageFactory;
 
+       /** @var RevisionLookup */
+       private $revisionLookup;
+
        /** @var string[] List of pages names anonymous user may see */
        private $whitelistRead;
 
@@ -130,6 +135,7 @@ class PermissionManager {
                'editmyusercss',
                'editmyuserjson',
                'editmyuserjs',
+               'editmyuserjsredirect',
                'editmywatchlist',
                'editsemiprotected',
                'editsitecss',
@@ -184,6 +190,7 @@ class PermissionManager {
 
        /**
         * @param SpecialPageFactory $specialPageFactory
+        * @param RevisionLookup $revisionLookup
         * @param string[] $whitelistRead
         * @param string[] $whitelistReadRegexp
         * @param bool $emailConfirmToEdit
@@ -195,6 +202,7 @@ class PermissionManager {
         */
        public function __construct(
                SpecialPageFactory $specialPageFactory,
+               RevisionLookup $revisionLookup,
                $whitelistRead,
                $whitelistReadRegexp,
                $emailConfirmToEdit,
@@ -205,6 +213,7 @@ class PermissionManager {
                NamespaceInfo $nsInfo
        ) {
                $this->specialPageFactory = $specialPageFactory;
+               $this->revisionLookup = $revisionLookup;
                $this->whitelistRead = $whitelistRead;
                $this->whitelistReadRegexp = $whitelistReadRegexp;
                $this->emailConfirmToEdit = $emailConfirmToEdit;
@@ -1134,6 +1143,20 @@ class PermissionManager {
                                && !$user->isAllowedAny( 'editmyuserjs', 'edituserjs' )
                        ) {
                                $errors[] = [ 'mycustomjsprotected', $action ];
+                       } elseif (
+                               $page->isUserJsConfigPage()
+                               && !$user->isAllowedAny( 'edituserjs', 'editmyuserjsredirect' )
+                       ) {
+                               // T207750 - do not allow users to edit a redirect if they couldn't edit the target
+                               $rev = $this->revisionLookup->getRevisionByTitle( $page );
+                               $content = $rev ? $rev->getContent( 'main', RevisionRecord::RAW ) : null;
+                               $target = $content ? $content->getUltimateRedirectTarget() : null;
+                               if ( $target && (
+                                               !$target->inNamespace( NS_USER )
+                                               || !preg_match( '/^' . preg_quote( $user->getName(), '/' ) . '\//', $target->getText() )
+                               ) ) {
+                                       $errors[] = [ 'mycustomjsredirectprotected', $action ];
+                               }
                        }
                } else {
                        // Users need editmyuser* to edit their own CSS/JSON/JS subpages, except for
index 018c371..b6500a4 100644 (file)
@@ -466,6 +466,7 @@ return [
                $config = $services->getMainConfig();
                return new PermissionManager(
                        $services->getSpecialPageFactory(),
+                       $services->getRevisionLookup(),
                        $config->get( 'WhitelistRead' ),
                        $config->get( 'WhitelistReadRegexp' ),
                        $config->get( 'EmailConfirmToEdit' ),
index 95ccd9a..12d6641 100644 (file)
@@ -23,6 +23,7 @@
  */
 
 use MediaWiki\Permissions\PermissionManager;
+use MediaWiki\Storage\RevisionRecord;
 use Wikimedia\Assert\Assert;
 use Wikimedia\Rdbms\Database;
 use Wikimedia\Rdbms\IDatabase;
@@ -3947,17 +3948,18 @@ class Title implements LinkTarget, IDBAccessObject {
                if ( $old->getId() === $new->getId() ) {
                        return ( $old_cmp === '>' && $new_cmp === '<' ) ?
                                [] :
-                               [ $old->getUserText( Revision::RAW ) ];
+                               [ $old->getUserText( RevisionRecord::RAW ) ];
                } elseif ( $old->getId() === $new->getParentId() ) {
                        if ( $old_cmp === '>=' && $new_cmp === '<=' ) {
-                               $authors[] = $old->getUserText( Revision::RAW );
-                               if ( $old->getUserText( Revision::RAW ) != $new->getUserText( Revision::RAW ) ) {
-                                       $authors[] = $new->getUserText( Revision::RAW );
+                               $authors[] = $oldUserText = $old->getUserText( RevisionRecord::RAW );
+                               $newUserText = $new->getUserText( RevisionRecord::RAW );
+                               if ( $oldUserText != $newUserText ) {
+                                       $authors[] = $newUserText;
                                }
                        } elseif ( $old_cmp === '>=' ) {
-                               $authors[] = $old->getUserText( Revision::RAW );
+                               $authors[] = $old->getUserText( RevisionRecord::RAW );
                        } elseif ( $new_cmp === '<=' ) {
-                               $authors[] = $new->getUserText( Revision::RAW );
+                               $authors[] = $new->getUserText( RevisionRecord::RAW );
                        }
                        return $authors;
                }
index ee60f7b..80fdf9d 100644 (file)
@@ -41,7 +41,7 @@ class TitleArrayFromResult extends TitleArray implements Countable {
        }
 
        /**
-        * @param bool|IResultWrapper $row
+        * @param bool|stdClass $row
         * @return void
         */
        protected function setCurrent( $row ) {
index f8ba08c..279c13b 100644 (file)
@@ -23,6 +23,7 @@
  */
 
 use MediaWiki\MediaWikiServices;
+use MediaWiki\Storage\RevisionRecord;
 use Wikimedia\Rdbms\Database;
 
 /**
@@ -543,7 +544,7 @@ class InfoAction extends FormlessAction {
                $batch = new LinkBatch;
 
                if ( $firstRev ) {
-                       $firstRevUser = $firstRev->getUserText( Revision::FOR_THIS_USER );
+                       $firstRevUser = $firstRev->getUserText( RevisionRecord::FOR_THIS_USER );
                        if ( $firstRevUser !== '' ) {
                                $firstRevUserTitle = Title::makeTitle( NS_USER, $firstRevUser );
                                $batch->addObj( $firstRevUserTitle );
@@ -552,7 +553,7 @@ class InfoAction extends FormlessAction {
                }
 
                if ( $lastRev ) {
-                       $lastRevUser = $lastRev->getUserText( Revision::FOR_THIS_USER );
+                       $lastRevUser = $lastRev->getUserText( RevisionRecord::FOR_THIS_USER );
                        if ( $lastRevUser !== '' ) {
                                $lastRevUserTitle = Title::makeTitle( NS_USER, $lastRevUser );
                                $batch->addObj( $lastRevUserTitle );
index e2fc265..519da61 100644 (file)
@@ -20,6 +20,8 @@
  * @ingroup Actions
  */
 
+use MediaWiki\Storage\RevisionRecord;
+
 /**
  * User interface for the rollback action
  *
@@ -167,8 +169,8 @@ class RollbackAction extends FormAction {
                $this->getOutput()->addHTML(
                        $this->msg( 'rollback-success' )
                                ->rawParams( $old, $new )
-                               ->params( $current->getUserText( Revision::FOR_THIS_USER, $user ) )
-                               ->params( $target->getUserText( Revision::FOR_THIS_USER, $user ) )
+                               ->params( $current->getUserText( RevisionRecord::FOR_THIS_USER, $user ) )
+                               ->params( $target->getUserText( RevisionRecord::FOR_THIS_USER, $user ) )
                                ->parseAsBlock()
                );
 
index 99c57e1..c5c090d 100644 (file)
@@ -22,6 +22,7 @@
  */
 
 use MediaWiki\MediaWikiServices;
+use MediaWiki\Revision\RevisionRecord;
 
 /**
  * @ingroup Pager
@@ -338,7 +339,9 @@ class HistoryPager extends ReverseChronologicalPager {
                        $this->preventClickjacking();
                        // If revision was hidden from sysops and we don't need the checkbox
                        // for anything else, disable it
-                       if ( !$this->showTagEditUI && !$rev->userCan( Revision::DELETED_RESTRICTED, $user ) ) {
+                       if ( !$this->showTagEditUI
+                               && !$rev->userCan( RevisionRecord::DELETED_RESTRICTED, $user )
+                       ) {
                                $del = Xml::check( 'deleterevisions', false, [ 'disabled' => 'disabled' ] );
                        // Otherwise, enable the checkbox...
                        } else {
@@ -348,14 +351,14 @@ class HistoryPager extends ReverseChronologicalPager {
                // User can only view deleted revisions...
                } elseif ( $rev->getVisibility() && $user->isAllowed( 'deletedhistory' ) ) {
                        // If revision was hidden from sysops, disable the link
-                       if ( !$rev->userCan( Revision::DELETED_RESTRICTED, $user ) ) {
+                       if ( !$rev->userCan( RevisionRecord::DELETED_RESTRICTED, $user ) ) {
                                $del = Linker::revDeleteLinkDisabled( false );
                        // Otherwise, show the link...
                        } else {
                                $query = [ 'type' => 'revision',
                                        'target' => $this->getTitle()->getPrefixedDBkey(), 'ids' => $rev->getId() ];
                                $del .= Linker::revDeleteLink( $query,
-                                       $rev->isDeleted( Revision::DELETED_RESTRICTED ), false );
+                                       $rev->isDeleted( RevisionRecord::DELETED_RESTRICTED ), false );
                        }
                }
                if ( $del ) {
@@ -409,8 +412,8 @@ class HistoryPager extends ReverseChronologicalPager {
                                }
                        }
 
-                       if ( !$rev->isDeleted( Revision::DELETED_TEXT )
-                               && !$prevRev->isDeleted( Revision::DELETED_TEXT )
+                       if ( !$rev->isDeleted( RevisionRecord::DELETED_TEXT )
+                               && !$prevRev->isDeleted( RevisionRecord::DELETED_TEXT )
                        ) {
                                # Create undo tooltip for the first (=latest) line only
                                $undoTooltip = $latest
@@ -491,7 +494,9 @@ class HistoryPager extends ReverseChronologicalPager {
        function curLink( $rev ) {
                $cur = $this->historyPage->message['cur'];
                $latest = $this->getWikiPage()->getLatest();
-               if ( $latest === $rev->getId() || !$rev->userCan( Revision::DELETED_TEXT, $this->getUser() ) ) {
+               if ( $latest === $rev->getId()
+                       || !$rev->userCan( RevisionRecord::DELETED_TEXT, $this->getUser() )
+               ) {
                        return $cur;
                } else {
                        return MediaWikiServices::getInstance()->getLinkRenderer()->makeKnownLink(
@@ -539,8 +544,8 @@ class HistoryPager extends ReverseChronologicalPager {
 
                $nextRev = new Revision( $next, 0, $this->getTitle() );
 
-               if ( !$prevRev->userCan( Revision::DELETED_TEXT, $this->getUser() )
-                       || !$nextRev->userCan( Revision::DELETED_TEXT, $this->getUser() )
+               if ( !$prevRev->userCan( RevisionRecord::DELETED_TEXT, $this->getUser() )
+                       || !$nextRev->userCan( RevisionRecord::DELETED_TEXT, $this->getUser() )
                ) {
                        return $last;
                }
@@ -579,7 +584,7 @@ class HistoryPager extends ReverseChronologicalPager {
                                $checkmark = [ 'checked' => 'checked' ];
                        } else {
                                # Check visibility of old revisions
-                               if ( !$rev->userCan( Revision::DELETED_TEXT, $this->getUser() ) ) {
+                               if ( !$rev->userCan( RevisionRecord::DELETED_TEXT, $this->getUser() ) ) {
                                        $radio['disabled'] = 'disabled';
                                        $checkmark = []; // We will check the next possible one
                                } elseif ( !$this->oldIdChecked ) {
index f53d2b9..be2da34 100644 (file)
@@ -54,7 +54,7 @@ class ApiCSPReport extends ApiBase {
                        // XXX Is it ok to put untrusted data into log??
                        'csp-report' => $report,
                        'method' => __METHOD__,
-                       'user_id' => $this->getUser()->getId() || 'logged-out',
+                       'user_id' => $this->getUser()->getId() ?: 'logged-out',
                        'user-agent' => $userAgent,
                        'source' => $this->getParameter( 'source' ),
                ] );
index 96aea04..3f63a00 100644 (file)
@@ -20,6 +20,8 @@
  * @file
  */
 
+use MediaWiki\Storage\RevisionRecord;
+
 /**
  * A module that allows for editing and creating pages.
  *
@@ -52,7 +54,7 @@ class ApiEditPage extends ApiBase {
                                $oldTitle = $titleObj;
 
                                $titles = Revision::newFromTitle( $oldTitle, false, Revision::READ_LATEST )
-                                       ->getContent( Revision::FOR_THIS_USER, $user )
+                                       ->getContent( RevisionRecord::FOR_THIS_USER, $user )
                                        ->getRedirectChain();
                                // array_shift( $titles );
 
@@ -193,14 +195,14 @@ class ApiEditPage extends ApiBase {
                                $undoafterRev = Revision::newFromId( $params['undoafter'] );
                        }
                        $undoRev = Revision::newFromId( $params['undo'] );
-                       if ( is_null( $undoRev ) || $undoRev->isDeleted( Revision::DELETED_TEXT ) ) {
+                       if ( is_null( $undoRev ) || $undoRev->isDeleted( RevisionRecord::DELETED_TEXT ) ) {
                                $this->dieWithError( [ 'apierror-nosuchrevid', $params['undo'] ] );
                        }
 
                        if ( $params['undoafter'] == 0 ) {
                                $undoafterRev = $undoRev->getPrevious();
                        }
-                       if ( is_null( $undoafterRev ) || $undoafterRev->isDeleted( Revision::DELETED_TEXT ) ) {
+                       if ( is_null( $undoafterRev ) || $undoafterRev->isDeleted( RevisionRecord::DELETED_TEXT ) ) {
                                $this->dieWithError( [ 'apierror-nosuchrevid', $params['undoafter'] ] );
                        }
 
index 84fff96..a7390e6 100644 (file)
@@ -21,6 +21,7 @@
  */
 
 use MediaWiki\MediaWikiServices;
+use MediaWiki\Storage\RevisionRecord;
 
 /**
  * @ingroup API
@@ -105,7 +106,7 @@ class ApiParse extends ApiBase {
                                }
 
                                $this->checkTitleUserPermissions( $rev->getTitle(), 'read' );
-                               if ( !$rev->userCan( Revision::DELETED_TEXT, $this->getUser() ) ) {
+                               if ( !$rev->userCan( RevisionRecord::DELETED_TEXT, $this->getUser() ) ) {
                                        $this->dieWithError(
                                                [ 'apierror-permissiondenied', $this->msg( 'action-deletedtext' ) ]
                                        );
@@ -562,23 +563,23 @@ class ApiParse extends ApiBase {
                WikiPage $page, $popts, $suppressCache, $pageId, $rev, $getContent
        ) {
                $revId = $rev ? $rev->getId() : null;
-               $isDeleted = $rev && $rev->isDeleted( Revision::DELETED_TEXT );
+               $isDeleted = $rev && $rev->isDeleted( RevisionRecord::DELETED_TEXT );
 
                if ( $getContent || $this->section !== false || $isDeleted ) {
                        if ( $rev ) {
-                               $this->content = $rev->getContent( Revision::FOR_THIS_USER, $this->getUser() );
+                               $this->content = $rev->getContent( RevisionRecord::FOR_THIS_USER, $this->getUser() );
                                if ( !$this->content ) {
                                        $this->dieWithError( [ 'apierror-missingcontent-revid', $revId ] );
                                }
                        } else {
-                               $this->content = $page->getContent( Revision::FOR_THIS_USER, $this->getUser() );
+                               $this->content = $page->getContent( RevisionRecord::FOR_THIS_USER, $this->getUser() );
                                if ( !$this->content ) {
                                        $this->dieWithError( [ 'apierror-missingcontent-pageid', $page->getId() ] );
                                }
                        }
                        $this->contentIsDeleted = $isDeleted;
                        $this->contentIsSuppressed = $rev &&
-                               $rev->isDeleted( Revision::DELETED_TEXT | Revision::DELETED_RESTRICTED );
+                               $rev->isDeleted( RevisionRecord::DELETED_TEXT | RevisionRecord::DELETED_RESTRICTED );
                }
 
                if ( $this->section !== false ) {
index 4fbc157..a6366f2 100644 (file)
@@ -22,6 +22,7 @@
 
 use MediaWiki\MediaWikiServices;
 use MediaWiki\Storage\NameTableAccessException;
+use MediaWiki\Storage\RevisionRecord;
 
 /**
  * Query module to enumerate all deleted revisions.
@@ -197,9 +198,9 @@ class ApiQueryDeletedrevs extends ApiQueryBase {
                        // (shouldn't be able to get here without 'deletedhistory', but
                        // check it again just in case)
                        if ( !$user->isAllowed( 'deletedhistory' ) ) {
-                               $bitmask = Revision::DELETED_USER;
+                               $bitmask = RevisionRecord::DELETED_USER;
                        } elseif ( !$user->isAllowedAny( 'suppressrevision', 'viewsuppressed' ) ) {
-                               $bitmask = Revision::DELETED_USER | Revision::DELETED_RESTRICTED;
+                               $bitmask = RevisionRecord::DELETED_USER | RevisionRecord::DELETED_RESTRICTED;
                        } else {
                                $bitmask = 0;
                        }
@@ -288,11 +289,11 @@ class ApiQueryDeletedrevs extends ApiQueryBase {
                                $rev['parentid'] = (int)$row->ar_parent_id;
                        }
                        if ( $fld_user || $fld_userid ) {
-                               if ( $row->ar_deleted & Revision::DELETED_USER ) {
+                               if ( $row->ar_deleted & RevisionRecord::DELETED_USER ) {
                                        $rev['userhidden'] = true;
                                        $anyHidden = true;
                                }
-                               if ( Revision::userCanBitfield( $row->ar_deleted, Revision::DELETED_USER, $user ) ) {
+                               if ( Revision::userCanBitfield( $row->ar_deleted, RevisionRecord::DELETED_USER, $user ) ) {
                                        if ( $fld_user ) {
                                                $rev['user'] = $row->ar_user_text;
                                        }
@@ -303,11 +304,11 @@ class ApiQueryDeletedrevs extends ApiQueryBase {
                        }
 
                        if ( $fld_comment || $fld_parsedcomment ) {
-                               if ( $row->ar_deleted & Revision::DELETED_COMMENT ) {
+                               if ( $row->ar_deleted & RevisionRecord::DELETED_COMMENT ) {
                                        $rev['commenthidden'] = true;
                                        $anyHidden = true;
                                }
-                               if ( Revision::userCanBitfield( $row->ar_deleted, Revision::DELETED_COMMENT, $user ) ) {
+                               if ( Revision::userCanBitfield( $row->ar_deleted, RevisionRecord::DELETED_COMMENT, $user ) ) {
                                        $comment = $commentStore->getComment( 'ar_comment', $row )->text;
                                        if ( $fld_comment ) {
                                                $rev['comment'] = $comment;
@@ -326,11 +327,11 @@ class ApiQueryDeletedrevs extends ApiQueryBase {
                                $rev['len'] = $row->ar_len;
                        }
                        if ( $fld_sha1 ) {
-                               if ( $row->ar_deleted & Revision::DELETED_TEXT ) {
+                               if ( $row->ar_deleted & RevisionRecord::DELETED_TEXT ) {
                                        $rev['sha1hidden'] = true;
                                        $anyHidden = true;
                                }
-                               if ( Revision::userCanBitfield( $row->ar_deleted, Revision::DELETED_TEXT, $user ) ) {
+                               if ( Revision::userCanBitfield( $row->ar_deleted, RevisionRecord::DELETED_TEXT, $user ) ) {
                                        if ( $row->ar_sha1 != '' ) {
                                                $rev['sha1'] = Wikimedia\base_convert( $row->ar_sha1, 36, 16, 40 );
                                        } else {
@@ -339,11 +340,11 @@ class ApiQueryDeletedrevs extends ApiQueryBase {
                                }
                        }
                        if ( $fld_content ) {
-                               if ( $row->ar_deleted & Revision::DELETED_TEXT ) {
+                               if ( $row->ar_deleted & RevisionRecord::DELETED_TEXT ) {
                                        $rev['texthidden'] = true;
                                        $anyHidden = true;
                                }
-                               if ( Revision::userCanBitfield( $row->ar_deleted, Revision::DELETED_TEXT, $user ) ) {
+                               if ( Revision::userCanBitfield( $row->ar_deleted, RevisionRecord::DELETED_TEXT, $user ) ) {
                                        ApiResult::setContentValue( $rev, 'text', Revision::getRevisionText( $row, 'ar_' ) );
                                }
                        }
@@ -358,7 +359,7 @@ class ApiQueryDeletedrevs extends ApiQueryBase {
                                }
                        }
 
-                       if ( $anyHidden && ( $row->ar_deleted & Revision::DELETED_RESTRICTED ) ) {
+                       if ( $anyHidden && ( $row->ar_deleted & RevisionRecord::DELETED_RESTRICTED ) ) {
                                $rev['suppressed'] = true;
                        }
 
index 23f702c..9228d9a 100644 (file)
@@ -180,13 +180,13 @@ class ApiQuerySearch extends ApiQueryGeneratorBase {
                $canAddInterwiki = (bool)$params['enablerewrites'] && ( $resultPageSet === null );
                if ( $canAddInterwiki ) {
                        $this->addInterwikiResults( $matches, $apiResult, $prop, 'additional',
-                               SearchResultSet::INLINE_RESULTS );
+                               ISearchResultSet::INLINE_RESULTS );
                }
 
                // Interwiki results outside main result set
                if ( $interwiki && $resultPageSet === null ) {
                        $this->addInterwikiResults( $matches, $apiResult, $prop, 'interwiki',
-                               SearchResultSet::SECONDARY_RESULTS );
+                               ISearchResultSet::SECONDARY_RESULTS );
                }
 
                if ( $resultPageSet === null ) {
@@ -278,7 +278,7 @@ class ApiQuerySearch extends ApiQueryGeneratorBase {
 
        /**
         * Add interwiki results as a section in query results.
-        * @param SearchResultSet $matches
+        * @param ISearchResultSet $matches
         * @param ApiResult       $apiResult
         * @param array           $prop Props to extract (as keys)
         * @param string          $section Section name where results would go
@@ -286,7 +286,7 @@ class ApiQuerySearch extends ApiQueryGeneratorBase {
         * @return int|null Number of total hits in the data or null if none was produced
         */
        private function addInterwikiResults(
-               SearchResultSet $matches, ApiResult $apiResult, $prop,
+               ISearchResultSet $matches, ApiResult $apiResult, $prop,
                $section, $type
        ) {
                $totalhits = null;
index acb3da8..8f3c404 100644 (file)
@@ -52,10 +52,8 @@ class ApiUserrights extends ApiBase {
                // Deny if the user is blocked and doesn't have the full 'userrights' permission.
                // This matches what Special:UserRights does for the web UI.
                if ( !$pUser->isAllowed( 'userrights' ) ) {
-                       // @TODO Should the user be blocked from changing user rights if they
-                       //       are partially blocked?
                        $block = $pUser->getBlock();
-                       if ( $block ) {
+                       if ( $block && $block->isSitewide() ) {
                                $this->dieBlocked( $block );
                        }
                }
index f91cf3d..9fb5f02 100644 (file)
@@ -54,6 +54,7 @@
        "apihelp-delete-param-title": "Наслов на страницата што сакате да ја избришете. Не може да се користи заедно со <var>$1pageid</var>.",
        "apihelp-delete-param-pageid": "Назнака на страницата што сакате да ја избришете. Не може да се користи заедно со <var>$1title</var>.",
        "apihelp-delete-param-reason": "Причина за бришење. Ако не се зададе, ќе се наведе автоматска причина.",
+       "apihelp-delete-param-tags": "Ознаки за примена врз ставката во дневникот на бришења.",
        "apihelp-delete-param-watch": "Додај ја страницата во набљудуваните на тековниот корисник.",
        "apihelp-delete-param-watchlist": "Безусловно додај или отстрани ја страницата од набљудуваните на тековниот корисник, користете ги нагодувањата или не ги менувајте набљудуваните.",
        "apihelp-delete-param-unwatch": "Отстрани ја страницата од набљудуваните на тековниот корисник.",
        "apihelp-query+allcategories-param-dir": "Насока на подредувањето.",
        "apihelp-query+allcategories-param-limit": "Колку категории да се дадат.",
        "apihelp-query+allcategories-param-prop": "Кои својства да се дадат:",
+       "apihelp-query+alldeletedrevisions-param-start": "Од кој датум и време да почне набројувањето.",
+       "apihelp-query+alldeletedrevisions-param-end": "На кој датум и време да запре набројувањето.",
        "apihelp-query+alldeletedrevisions-param-from": "Почни го исписот од овој наслов.",
        "apihelp-query+alldeletedrevisions-param-to": "Запри го исписот на овој наслов.",
+       "apihelp-query+alldeletedrevisions-param-prefix": "Пребарај ги сите наслови на страници што почнуваат со оваа вредност.",
        "apihelp-query+alldeletedrevisions-example-user": "Список на последните 50 избришани придонеси на корисникот <kbd>Example</kbd>.",
        "apihelp-query+alldeletedrevisions-example-ns-main": "Список на последните 50 избришани преработки во главниот именски простор.",
+       "apihelp-query+allfileusages-param-from": "Наслов на податотеката од која ќе почне набројувањето.",
+       "apihelp-query+allfileusages-param-to": "Наслов на податотеката на која ќе запре набројувањето.",
+       "apihelp-query+allfileusages-param-prefix": "Пребарај ги сите наслови на податотеки што почнуваат со оваа вредност.",
+       "apihelp-query+allfileusages-param-unique": "Прикажувај само различни податотечни наслови. Не може да се користи со $1prop=ids.\nКога се користи како создавач, дава целни страници наместо изворни.",
        "apihelp-query+allfileusages-param-prop": "Кои информации да се вклучат:",
+       "apihelp-query+allfileusages-paramvalue-prop-ids": "Ја додава назнаката на страницата од страниците што ја користат (не може да се користи со $1unique).",
        "apihelp-query+allfileusages-paramvalue-prop-title": "Го додава насловот на податотеката.",
        "apihelp-query+allfileusages-param-limit": "Колку вкупно ставки да се дадат.",
        "apihelp-query+allfileusages-param-dir": "Насока на исписот.",
        "apihelp-query+allfileusages-example-unique-generator": "Ги дава сите наслови на податотеки, означувајќи ги отсутните.",
        "apihelp-query+allfileusages-example-generator": "Дава страници што ги содржат податотеките.",
        "apihelp-query+allimages-param-dir": "Насока на исписот.",
+       "apihelp-query+allimages-param-minsize": "Ограничи на слики со барем олку бајти.",
+       "apihelp-query+allimages-param-maxsize": "Ограничи на слики со највеќе олку бајти.",
        "apihelp-query+allimages-example-b": "Прикажи список на податотеки што почнуваат со буквата <kbd>B</kbd>.",
        "apihelp-query+allimages-example-recent": "Прикажи список на неодамна подигнати податотеки сличен на [[Special:NewFiles]]",
        "apihelp-query+allimages-example-generator": "Прикажи информации за околу 4 податотеки што почнуваат со буквата <kbd>T</kbd>.",
        "apihelp-query+allredirects-param-namespace": "Именскиот простор што се набројува.",
        "apihelp-query+allredirects-param-limit": "Колку вкупно ставки да се дадат.",
        "apihelp-query+allredirects-param-dir": "Насока на исписот.",
+       "apihelp-query+allredirects-example-unique-generator": "Ги дава сите целни страници, означувајќи ги отсутните.",
        "apihelp-query+allrevisions-param-start": "Од кој датум и време да почне набројувањето.",
        "apihelp-query+allrevisions-param-end": "На кој датум и време да запре набројувањето.",
        "apihelp-query+alltransclusions-param-prop": "Кои информации да се вклучат:",
index 968920b..1fa4751 100644 (file)
        "apihelp-query+filearchive-example-simple": "Toon een lijst met alle verwijderde bestanden.",
        "apihelp-query+fileusage-paramvalue-prop-pageid": "Pagina-ID van elke pagina.",
        "apihelp-query+fileusage-paramvalue-prop-title": "Titel van elke pagina.",
+       "apihelp-query+imageinfo-paramvalue-prop-mime": "Voegt het MIME-type van het bestand toe.",
        "apihelp-query+imageinfo-paramvalue-prop-mediatype": "Voegt het mediatype van het bestand toe.",
        "apihelp-query+imageusage-param-namespace": "De door te lopen naamruimte.",
        "apihelp-query+imageusage-example-simple": "Toon pagina's die [[:File:Albert Einstein Head.jpg]] gebruiken.",
        "apihelp-query+iwbacklinks-param-prefix": "Voorvoegsel voor de interwiki.",
        "apihelp-query+iwlinks-paramvalue-prop-url": "Voegt de volledige URL toe.",
        "apihelp-query+langbacklinks-example-simple": "Toon de pagina's die verwijzen naar [[:fr:Test]].",
+       "apihelp-query+langbacklinks-example-generator": "Informatie verkrijgen over pagina's die gekoppeld zijn aan [[:fr:Test]].",
+       "apihelp-query+langlinks-param-limit": "Hoeveel intertaalkoppelingen er getoont moeten worden.",
        "apihelp-query+langlinks-paramvalue-prop-url": "Voegt de volledige URL toe.",
+       "apihelp-query+languageinfo-paramvalue-prop-bcp47": "De BCP-47 taalcode.",
+       "apihelp-query+languageinfo-paramvalue-prop-dir": "De schrijfrichting van de taal (<code>ltr</code> of <code>rtl</code>).",
        "apihelp-query+linkshere-paramvalue-prop-pageid": "Pagina-ID van elke pagina.",
        "apihelp-query+linkshere-paramvalue-prop-title": "Titel van elke pagina.",
        "apihelp-query+linkshere-param-namespace": "Toon alleen pagina's in deze naamruimten.",
index 7d02a82..aebfb22 100644 (file)
@@ -113,11 +113,7 @@ class LocalPasswordPrimaryAuthenticationProvider
                // Check for *really* old password hashes that don't even have a type
                // The old hash format was just an md5 hex hash, with no type information
                if ( preg_match( '/^[0-9a-f]{32}$/', $row->user_password ) ) {
-                       if ( $this->config->get( 'PasswordSalt' ) ) {
-                               $row->user_password = ":B:{$row->user_id}:{$row->user_password}";
-                       } else {
-                               $row->user_password = ":A:{$row->user_password}";
-                       }
+                       $row->user_password = ":B:{$row->user_id}:{$row->user_password}";
                }
 
                $status = $this->checkPasswordValidity( $username, $req->password );
index 68141a1..c82ed1c 100644 (file)
@@ -293,32 +293,7 @@ class BlockManager {
                        $proxyList = array_map( 'trim', file( $proxyList ) );
                }
 
-               $resultProxyList = [];
-               $deprecatedIPEntries = [];
-
-               // backward compatibility: move all ip addresses in keys to values
-               foreach ( $proxyList as $key => $value ) {
-                       $keyIsIP = IP::isIPAddress( $key );
-                       $valueIsIP = IP::isIPAddress( $value );
-                       if ( $keyIsIP && !$valueIsIP ) {
-                               $deprecatedIPEntries[] = $key;
-                               $resultProxyList[] = $key;
-                       } elseif ( $keyIsIP && $valueIsIP ) {
-                               $deprecatedIPEntries[] = $key;
-                               $resultProxyList[] = $key;
-                               $resultProxyList[] = $value;
-                       } else {
-                               $resultProxyList[] = $value;
-                       }
-               }
-
-               if ( $deprecatedIPEntries ) {
-                       wfDeprecated(
-                               'IP addresses in the keys of $wgProxyList (found the following IP addresses in keys: ' .
-                               implode( ', ', $deprecatedIPEntries ) . ', please move them to values)', '1.30' );
-               }
-
-               $proxyListIPSet = new IPSet( $resultProxyList );
+               $proxyListIPSet = new IPSet( $proxyList );
                return $proxyListIPSet->match( $ip );
        }
 
index b0716b1..a8bcfc6 100644 (file)
@@ -525,9 +525,8 @@ class MessageCache {
                        __METHOD__ . "($code)-big"
                );
                foreach ( $res as $row ) {
-                       $name = $this->contLang->lcfirst( $row->page_title );
                        // Include entries/stubs for all keys in $mostused in adaptive mode
-                       if ( $wgAdaptiveMessageCache || $this->isMainCacheable( $name, $overridable ) ) {
+                       if ( $wgAdaptiveMessageCache || $this->isMainCacheable( $row->page_title, $overridable ) ) {
                                $cache[$row->page_title] = '!TOO BIG';
                        }
                        // At least include revision ID so page changes are reflected in the hash
@@ -549,9 +548,8 @@ class MessageCache {
                        $revQuery['joins']
                );
                foreach ( $res as $row ) {
-                       $name = $this->contLang->lcfirst( $row->page_title );
                        // Include entries/stubs for all keys in $mostused in adaptive mode
-                       if ( $wgAdaptiveMessageCache || $this->isMainCacheable( $name, $overridable ) ) {
+                       if ( $wgAdaptiveMessageCache || $this->isMainCacheable( $row->page_title, $overridable ) ) {
                                try {
                                        $rev = $revisionStore->newRevisionFromRow( $row );
                                        $content = $rev->getContent( MediaWiki\Revision\SlotRecord::MAIN );
@@ -592,14 +590,17 @@ class MessageCache {
        }
 
        /**
-        * @param string $name Message name with lowercase first letter
+        * @param string $name Message name (possibly with /code suffix)
         * @param array $overridable Map of (key => unused) for software-defined messages
         * @return bool
         */
        private function isMainCacheable( $name, array $overridable ) {
+               // Convert first letter to lowercase, and strip /code suffix
+               $name = $this->contLang->lcfirst( $name );
+               $msg = preg_replace( '/\/[a-z0-9-]{2,}$/', '', $name );
                // Include common conversion table pages. This also avoids problems with
                // Installer::parse() bailing out due to disallowed DB queries (T207979).
-               return ( isset( $overridable[$name] ) || strpos( $name, 'conversiontable/' ) === 0 );
+               return ( isset( $overridable[$msg] ) || strpos( $name, 'conversiontable/' ) === 0 );
        }
 
        /**
@@ -1069,8 +1070,7 @@ class MessageCache {
                        );
                } else {
                        // Message page either does not exist or does not override a software message
-                       $name = $this->contLang->lcfirst( $title );
-                       if ( !$this->isMainCacheable( $name, $this->overridable ) ) {
+                       if ( !$this->isMainCacheable( $title, $this->overridable ) ) {
                                // Message page does not override any software-defined message. A custom
                                // message might be defined to have content or settings specific to the wiki.
                                // Load the message page, utilizing the individual message cache as needed.
index a0f3d8e..ffc7cd0 100644 (file)
@@ -407,7 +407,7 @@ class LocalisationCache {
         */
        public function isExpired( $code ) {
                if ( $this->forceRecache && !isset( $this->recachedLangs[$code] ) ) {
-                       $this->logger->debug( __METHOD__ . "($code): forced reload\n" );
+                       $this->logger->debug( __METHOD__ . "($code): forced reload" );
 
                        return true;
                }
@@ -417,7 +417,7 @@ class LocalisationCache {
                $preload = $this->store->get( $code, 'preload' );
                // Different keys may expire separately for some stores
                if ( $deps === null || $keys === null || $preload === null ) {
-                       $this->logger->debug( __METHOD__ . "($code): cache missing, need to make one\n" );
+                       $this->logger->debug( __METHOD__ . "($code): cache missing, need to make one" );
 
                        return true;
                }
@@ -429,7 +429,7 @@ class LocalisationCache {
                        // When this happens, always expire the cache
                        if ( !$dep instanceof CacheDependency || $dep->isExpired() ) {
                                $this->logger->debug( __METHOD__ . "($code): cache for $code expired due to " .
-                                       get_class( $dep ) . "\n" );
+                                       get_class( $dep ) );
 
                                return true;
                        }
@@ -836,10 +836,10 @@ class LocalisationCache {
                # Load the primary localisation from the source file
                $data = $this->readSourceFilesAndRegisterDeps( $code, $deps );
                if ( $data === false ) {
-                       $this->logger->debug( __METHOD__ . ": no localisation file for $code, using fallback to en\n" );
+                       $this->logger->debug( __METHOD__ . ": no localisation file for $code, using fallback to en" );
                        $coreData['fallback'] = 'en';
                } else {
-                       $this->logger->debug( __METHOD__ . ": got localisation for $code from source\n" );
+                       $this->logger->debug( __METHOD__ . ": got localisation for $code from source" );
 
                        # Merge primary localisation
                        foreach ( $data as $key => $value ) {
index f1e61bb..2ef9c9f 100644 (file)
@@ -1,4 +1,7 @@
 <?php
+
+use MediaWiki\Storage\RevisionRecord;
+
 /**
  * Helper class for category membership changes
  *
@@ -158,7 +161,7 @@ class CategoryMembershipChange {
                $revision,
                $added
        ) {
-               $deleted = $revision ? $revision->getVisibility() & Revision::SUPPRESSED_USER : 0;
+               $deleted = $revision ? $revision->getVisibility() & RevisionRecord::SUPPRESSED_USER : 0;
                $newRevId = $revision ? $revision->getId() : 0;
 
                /**
@@ -214,9 +217,9 @@ class CategoryMembershipChange {
         */
        private function getUser() {
                if ( $this->revision ) {
-                       $userId = $this->revision->getUser( Revision::RAW );
+                       $userId = $this->revision->getUser( RevisionRecord::RAW );
                        if ( $userId === 0 ) {
-                               return User::newFromName( $this->revision->getUserText( Revision::RAW ), false );
+                               return User::newFromName( $this->revision->getUserText( RevisionRecord::RAW ), false );
                        } else {
                                return User::newFromId( $userId );
                        }
index 69c709c..79092ee 100644 (file)
@@ -21,6 +21,7 @@
  */
 
 use MediaWiki\MediaWikiServices;
+use MediaWiki\Storage\RevisionRecord;
 
 /**
  * Feed to Special:RecentChanges and Special:RecentChangesLinked.
@@ -117,7 +118,7 @@ class ChangesFeed {
                                FeedUtils::formatDiff( $obj ),
                                $url,
                                $obj->rc_timestamp,
-                               ( $obj->rc_deleted & Revision::DELETED_USER )
+                               ( $obj->rc_deleted & RevisionRecord::DELETED_USER )
                                        ? wfMessage( 'rev-deleted-user' )->escaped() : $obj->rc_user_text,
                                $talkpage
                        );
index 34adea9..d97abca 100644 (file)
@@ -23,6 +23,7 @@
  */
 use MediaWiki\Linker\LinkRenderer;
 use MediaWiki\MediaWikiServices;
+use MediaWiki\Storage\RevisionRecord;
 use Wikimedia\Rdbms\IResultWrapper;
 
 class ChangesList extends ContextSource {
@@ -87,7 +88,7 @@ class ChangesList extends ContextSource {
                $user = $context->getUser();
                $sk = $context->getSkin();
                $list = null;
-               if ( Hooks::run( 'FetchChangesList', [ $user, &$sk, &$list ] ) ) {
+               if ( Hooks::run( 'FetchChangesList', [ $user, &$sk, &$list, $groups ] ) ) {
                        $new = $context->getRequest()->getBool( 'enhanced', $user->getOption( 'usenewrc' ) );
 
                        return $new ?
@@ -409,7 +410,7 @@ class ChangesList extends ContextSource {
        public static function revDateLink( Revision $rev, User $user, Language $lang, $title = null ) {
                $ts = $rev->getTimestamp();
                $date = $lang->userTimeAndDate( $ts, $user );
-               if ( $rev->userCan( Revision::DELETED_TEXT, $user ) ) {
+               if ( $rev->userCan( RevisionRecord::DELETED_TEXT, $user ) ) {
                        $link = MediaWikiServices::getInstance()->getLinkRenderer()->makeKnownLink(
                                $title ?? $rev->getTitle(),
                                $date,
@@ -419,7 +420,7 @@ class ChangesList extends ContextSource {
                } else {
                        $link = htmlspecialchars( $date );
                }
-               if ( $rev->isDeleted( Revision::DELETED_TEXT ) ) {
+               if ( $rev->isDeleted( RevisionRecord::DELETED_TEXT ) ) {
                        $link = "<span class=\"history-deleted mw-changeslist-date\">$link</span>";
                }
                return $link;
@@ -468,7 +469,7 @@ class ChangesList extends ContextSource {
                        $rc->mAttribs['rc_type'] == RC_CATEGORIZE
                ) {
                        $diffLink = $this->message['diff'];
-               } elseif ( !self::userCan( $rc, Revision::DELETED_TEXT, $this->getUser() ) ) {
+               } elseif ( !self::userCan( $rc, RevisionRecord::DELETED_TEXT, $this->getUser() ) ) {
                        $diffLink = $this->message['diff'];
                } else {
                        $query = [
@@ -524,7 +525,7 @@ class ChangesList extends ContextSource {
                        [ 'class' => 'mw-changeslist-title' ],
                        $params
                );
-               if ( $this->isDeleted( $rc, Revision::DELETED_TEXT ) ) {
+               if ( $this->isDeleted( $rc, RevisionRecord::DELETED_TEXT ) ) {
                        $articlelink = '<span class="history-deleted">' . $articlelink . '</span>';
                }
                # To allow for boldening pages watched by this user
@@ -576,7 +577,7 @@ class ChangesList extends ContextSource {
         * @param RecentChange &$rc
         */
        public function insertUserRelatedLinks( &$s, &$rc ) {
-               if ( $this->isDeleted( $rc, Revision::DELETED_USER ) ) {
+               if ( $this->isDeleted( $rc, RevisionRecord::DELETED_USER ) ) {
                        $s .= ' <span class="history-deleted">' .
                                $this->msg( 'rev-deleted-user' )->escaped() . '</span>';
                } else {
@@ -613,7 +614,7 @@ class ChangesList extends ContextSource {
         * @return string
         */
        public function insertComment( $rc ) {
-               if ( $this->isDeleted( $rc, Revision::DELETED_COMMENT ) ) {
+               if ( $this->isDeleted( $rc, RevisionRecord::DELETED_COMMENT ) ) {
                        return ' <span class="history-deleted">' .
                                $this->msg( 'rev-deleted-comment' )->escaped() . '</span>';
                } else {
@@ -709,7 +710,8 @@ class ChangesList extends ContextSource {
                                        'actor' => $rc->mAttribs['rc_actor'] ?? null,
                                        'deleted' => $rc->mAttribs['rc_deleted']
                                ] );
-                               $s .= ' ' . Linker::generateRollback( $rev, $this->getContext() );
+                               $s .= ' ' . Linker::generateRollback( $rev, $this->getContext(),
+                                       [ 'noBrackets' ] );
                        }
                }
        }
index 8f32ba2..62cf39e 100644 (file)
@@ -1,4 +1,7 @@
 <?php
+
+use MediaWiki\Storage\RevisionRecord;
+
 /**
  * Generates a list of changes using an Enhanced system (uses javascript).
  *
@@ -409,7 +412,7 @@ class EnhancedChangesList extends ChangesList {
                if ( $type == RC_LOG ) {
                        $link = htmlspecialchars( $rcObj->timestamp );
                        # Revision link
-               } elseif ( !ChangesList::userCan( $rcObj, Revision::DELETED_TEXT, $this->getUser() ) ) {
+               } elseif ( !ChangesList::userCan( $rcObj, RevisionRecord::DELETED_TEXT, $this->getUser() ) ) {
                        $link = Html::element( 'span', [ 'class' => 'history-deleted' ], $rcObj->timestamp );
                } else {
                        $link = $this->linkRenderer->makeKnownLink(
@@ -418,7 +421,7 @@ class EnhancedChangesList extends ChangesList {
                                [],
                                $params
                        );
-                       if ( static::isDeleted( $rcObj, Revision::DELETED_TEXT ) ) {
+                       if ( static::isDeleted( $rcObj, RevisionRecord::DELETED_TEXT ) ) {
                                $link = '<span class="history-deleted">' . $link . '</span> ';
                        }
                }
@@ -552,7 +555,7 @@ class EnhancedChangesList extends ChangesList {
                        if (
                                $isnew ||
                                $rcObj->mAttribs['rc_type'] == RC_CATEGORIZE ||
-                               !ChangesList::userCan( $rcObj, Revision::DELETED_TEXT, $this->getUser() )
+                               !ChangesList::userCan( $rcObj, RevisionRecord::DELETED_TEXT, $this->getUser() )
                        ) {
                                $links['total-changes'] = Html::rawElement( 'span', [], $nchanges[$n] );
                        } else {
index 2d60ca2..d448eae 100644 (file)
@@ -20,6 +20,7 @@
  * @file
  */
 use MediaWiki\Linker\LinkRenderer;
+use MediaWiki\Storage\RevisionRecord;
 
 class RCCacheEntryFactory {
 
@@ -79,7 +80,7 @@ class RCCacheEntryFactory {
                // Make user links
                $cacheEntry->userlink = $this->getUserLink( $cacheEntry );
 
-               if ( !ChangesList::isDeleted( $cacheEntry, Revision::DELETED_USER ) ) {
+               if ( !ChangesList::isDeleted( $cacheEntry, RevisionRecord::DELETED_USER ) ) {
                        $cacheEntry->usertalklink = Linker::userToolLinks(
                                $cacheEntry->mAttribs['rc_user'],
                                $cacheEntry->mAttribs['rc_user_text'],
@@ -104,7 +105,7 @@ class RCCacheEntryFactory {
         * @return bool
         */
        private function showDiffLinks( RecentChange $cacheEntry, User $user ) {
-               return ChangesList::userCan( $cacheEntry, Revision::DELETED_TEXT, $user );
+               return ChangesList::userCan( $cacheEntry, RevisionRecord::DELETED_TEXT, $user );
        }
 
        /**
@@ -281,7 +282,7 @@ class RCCacheEntryFactory {
         * @return string
         */
        private function getUserLink( RecentChange $cacheEntry ) {
-               if ( ChangesList::isDeleted( $cacheEntry, Revision::DELETED_USER ) ) {
+               if ( ChangesList::isDeleted( $cacheEntry, RevisionRecord::DELETED_USER ) ) {
                        $userLink = ' <span class="history-deleted">' .
                                $this->context->msg( 'rev-deleted-user' )->escaped() . '</span>';
                } else {
index eed159d..95c9fa6 100644 (file)
@@ -369,13 +369,6 @@ class RecentChange implements Taggable {
        public function save( $send = self::SEND_FEED ) {
                global $wgPutIPinRC, $wgUseEnotif, $wgShowUpdatedMarker;
 
-               if ( is_string( $send ) ) {
-                       // Callers used to pass undocumented strings like 'noudp'
-                       // or 'pleasedontudp' instead of self::SEND_NONE (true).
-                       // @deprecated since 1.31 Use SEND_NONE instead.
-                       $send = self::SEND_NONE;
-               }
-
                $dbw = wfGetDB( DB_MASTER );
                if ( !is_array( $this->mExtra ) ) {
                        $this->mExtra = [];
index 2bac909..1827aab 100644 (file)
@@ -20,6 +20,7 @@
  */
 
 use MediaWiki\MediaWikiServices;
+use MediaWiki\Storage\RevisionRecord;
 
 /**
  * Item class for a logging table row with its associated change tags.
@@ -49,7 +50,9 @@ class ChangeTagsLogItem extends RevisionItemBase {
        }
 
        public function canView() {
-               return LogEventsList::userCan( $this->row, Revision::SUPPRESSED_ALL, $this->list->getUser() );
+               return LogEventsList::userCan(
+                       $this->row, RevisionRecord::SUPPRESSED_ALL, $this->list->getUser()
+               );
        }
 
        public function canViewContent() {
index 65a7b7d..48dfc70 100644 (file)
@@ -26,6 +26,7 @@
  * @author Daniel Kinzler
  */
 
+use MediaWiki\Storage\RevisionRecord;
 use Wikimedia\Assert\Assert;
 use MediaWiki\Logger\LoggerFactory;
 use MediaWiki\MediaWikiServices;
@@ -1025,7 +1026,7 @@ abstract class ContentHandler {
                        [ 'rev_user_text' => $revQuery['fields']['rev_user_text'] ],
                        [
                                'rev_page' => $title->getArticleID(),
-                               $dbr->bitAnd( 'rev_deleted', Revision::DELETED_USER ) . ' = 0'
+                               $dbr->bitAnd( 'rev_deleted', RevisionRecord::DELETED_USER ) . ' = 0'
                        ],
                        __METHOD__,
                        [ 'LIMIT' => 20 ],
index c754cff..d43ffbc 100644 (file)
@@ -28,6 +28,7 @@ use MediaWiki\MediaWikiServices;
 use Wikimedia\Rdbms\LBFactory;
 use Wikimedia\Rdbms\ILBFactory;
 use Wikimedia\Rdbms\LoadBalancer;
+use Wikimedia\Rdbms\DBTransactionError;
 
 /**
  * Class for managing the deferred updates
@@ -352,28 +353,30 @@ class DeferredUpdates {
         * @since 1.34
         */
        public static function attemptUpdate( DeferrableUpdate $update, ILBFactory $lbFactory ) {
+               $ticket = $lbFactory->getEmptyTransactionTicket( __METHOD__ );
+               if ( !$ticket || $lbFactory->hasTransactionRound() ) {
+                       throw new DBTransactionError( null, "A database transaction round is pending." );
+               }
+
                if ( $update instanceof DataUpdate ) {
-                       $update->setTransactionTicket( $lbFactory->getEmptyTransactionTicket( __METHOD__ ) );
+                       $update->setTransactionTicket( $ticket );
                }
 
-               if (
+               $fnameTrxOwner = get_class( $update ) . '::doUpdate';
+               $useExplicitTrxRound = !(
                        $update instanceof TransactionRoundAwareUpdate &&
                        $update->getTransactionRoundRequirement() == $update::TRX_ROUND_ABSENT
-               ) {
-                       $fnameTrxOwner = null;
+               );
+               // Flush any pending changes left over from an implicit transaction round
+               if ( $useExplicitTrxRound ) {
+                       $lbFactory->beginMasterChanges( $fnameTrxOwner ); // new explicit round
                } else {
-                       $fnameTrxOwner = get_class( $update ) . '::doUpdate';
+                       $lbFactory->commitMasterChanges( $fnameTrxOwner ); // new implicit round
                }
-
-               if ( $fnameTrxOwner !== null ) {
-                       $lbFactory->beginMasterChanges( $fnameTrxOwner );
-               }
-
+               // Run the update after any stale master view snapshots have been flushed
                $update->doUpdate();
-
-               if ( $fnameTrxOwner !== null ) {
-                       $lbFactory->commitMasterChanges( $fnameTrxOwner );
-               }
+               // Commit any pending changes from the explicit or implicit transaction round
+               $lbFactory->commitMasterChanges( $fnameTrxOwner );
        }
 
        /**
index 86d1a43..37ec39a 100644 (file)
@@ -508,7 +508,7 @@ class DifferenceEngine extends ContextSource {
 
                # Check if one of the revisions is deleted/suppressed
                $deleted = $suppressed = false;
-               $allowed = $this->mNewRev->userCan( Revision::DELETED_TEXT, $user );
+               $allowed = $this->mNewRev->userCan( RevisionRecord::DELETED_TEXT, $user );
 
                $revisionTools = [];
 
@@ -547,15 +547,16 @@ class DifferenceEngine extends ContextSource {
                                if ( $this->mNewRev->isCurrent() && $permissionManager->userCan(
                                        'rollback', $user, $this->mNewPage
                                ) ) {
-                                       $rollbackLink = Linker::generateRollback( $this->mNewRev, $this->getContext() );
+                                       $rollbackLink = Linker::generateRollback( $this->mNewRev, $this->getContext(),
+                                               [ 'noBrackets' ] );
                                        if ( $rollbackLink ) {
                                                $out->preventClickjacking();
                                                $rollback = "\u{00A0}\u{00A0}\u{00A0}" . $rollbackLink;
                                        }
                                }
 
-                               if ( !$this->mOldRev->isDeleted( Revision::DELETED_TEXT ) &&
-                                       !$this->mNewRev->isDeleted( Revision::DELETED_TEXT )
+                               if ( !$this->mOldRev->isDeleted( RevisionRecord::DELETED_TEXT ) &&
+                                       !$this->mNewRev->isDeleted( RevisionRecord::DELETED_TEXT )
                                ) {
                                        $undoLink = Html::element( 'a', [
                                                        'href' => $this->mNewPage->getLocalURL( [
@@ -605,15 +606,15 @@ class DifferenceEngine extends ContextSource {
                        Hooks::run( 'DifferenceEngineOldHeader', [ $this, &$oldHeader, $prevlink, $oldminor,
                                $diffOnly, $ldel, $this->unhide ] );
 
-                       if ( $this->mOldRev->isDeleted( Revision::DELETED_TEXT ) ) {
+                       if ( $this->mOldRev->isDeleted( RevisionRecord::DELETED_TEXT ) ) {
                                $deleted = true; // old revisions text is hidden
-                               if ( $this->mOldRev->isDeleted( Revision::DELETED_RESTRICTED ) ) {
+                               if ( $this->mOldRev->isDeleted( RevisionRecord::DELETED_RESTRICTED ) ) {
                                        $suppressed = true; // also suppressed
                                }
                        }
 
                        # Check if this user can see the revisions
-                       if ( !$this->mOldRev->userCan( Revision::DELETED_TEXT, $user ) ) {
+                       if ( !$this->mOldRev->userCan( RevisionRecord::DELETED_TEXT, $user ) ) {
                                $allowed = false;
                        }
                }
@@ -675,9 +676,9 @@ class DifferenceEngine extends ContextSource {
                Hooks::run( 'DifferenceEngineNewHeader', [ $this, &$newHeader, $formattedRevisionTools,
                        $nextlink, $rollback, $newminor, $diffOnly, $rdel, $this->unhide ] );
 
-               if ( $this->mNewRev->isDeleted( Revision::DELETED_TEXT ) ) {
+               if ( $this->mNewRev->isDeleted( RevisionRecord::DELETED_TEXT ) ) {
                        $deleted = true; // new revisions text is hidden
-                       if ( $this->mNewRev->isDeleted( Revision::DELETED_RESTRICTED ) ) {
+                       if ( $this->mNewRev->isDeleted( RevisionRecord::DELETED_RESTRICTED ) ) {
                                $suppressed = true; // also suppressed
                        }
                }
@@ -1011,11 +1012,11 @@ class DifferenceEngine extends ContextSource {
                        if ( !$this->loadRevisionData() ) {
                                return false;
                        } elseif ( $this->mOldRev &&
-                               !$this->mOldRev->userCan( Revision::DELETED_TEXT, $this->getUser() )
+                               !$this->mOldRev->userCan( RevisionRecord::DELETED_TEXT, $this->getUser() )
                        ) {
                                return false;
                        } elseif ( $this->mNewRev &&
-                               !$this->mNewRev->userCan( Revision::DELETED_TEXT, $this->getUser() )
+                               !$this->mNewRev->userCan( RevisionRecord::DELETED_TEXT, $this->getUser() )
                        ) {
                                return false;
                        }
@@ -1465,7 +1466,7 @@ class DifferenceEngine extends ContextSource {
                        $users = $this->mNewPage->getAuthorsBetween( $oldRev, $newRev, $limit );
                        $numUsers = count( $users );
 
-                       if ( $numUsers == 1 && $users[0] == $newRev->getUserText( Revision::RAW ) ) {
+                       if ( $numUsers == 1 && $users[0] == $newRev->getUserText( RevisionRecord::RAW ) ) {
                                $numUsers = 0; // special case to say "by the same user" instead of "by one other user"
                        }
 
@@ -1530,7 +1531,7 @@ class DifferenceEngine extends ContextSource {
                $header = Linker::linkKnown( $title, $header, [],
                        [ 'oldid' => $rev->getId() ] );
 
-               if ( $rev->userCan( Revision::DELETED_TEXT, $user ) ) {
+               if ( $rev->userCan( RevisionRecord::DELETED_TEXT, $user ) ) {
                        $editQuery = [ 'action' => 'edit' ];
                        if ( !$rev->isCurrent() ) {
                                $editQuery['oldid'] = $rev->getId();
@@ -1545,7 +1546,7 @@ class DifferenceEngine extends ContextSource {
                                [ 'class' => 'mw-diff-edit' ],
                                $editLink
                        );
-                       if ( $rev->isDeleted( Revision::DELETED_TEXT ) ) {
+                       if ( $rev->isDeleted( RevisionRecord::DELETED_TEXT ) ) {
                                $header = Html::rawElement(
                                        'span',
                                        [ 'class' => 'history-deleted' ],
@@ -1869,13 +1870,17 @@ class DifferenceEngine extends ContextSource {
                }
 
                if ( $this->mOldRev ) {
-                       $this->mOldContent = $this->mOldRev->getContent( Revision::FOR_THIS_USER, $this->getUser() );
+                       $this->mOldContent = $this->mOldRev->getContent(
+                               RevisionRecord::FOR_THIS_USER, $this->getUser()
+                       );
                        if ( $this->mOldContent === null ) {
                                return false;
                        }
                }
 
-               $this->mNewContent = $this->mNewRev->getContent( Revision::FOR_THIS_USER, $this->getUser() );
+               $this->mNewContent = $this->mNewRev->getContent(
+                       RevisionRecord::FOR_THIS_USER, $this->getUser()
+               );
                Hooks::run( 'DifferenceEngineLoadTextAfterNewContentIsLoaded', [ $this ] );
                if ( $this->mNewContent === null ) {
                        return false;
@@ -1900,7 +1905,9 @@ class DifferenceEngine extends ContextSource {
                        return false;
                }
 
-               $this->mNewContent = $this->mNewRev->getContent( Revision::FOR_THIS_USER, $this->getUser() );
+               $this->mNewContent = $this->mNewRev->getContent(
+                       RevisionRecord::FOR_THIS_USER, $this->getUser()
+               );
 
                Hooks::run( 'DifferenceEngineAfterLoadNewText', [ $this ] );
 
index 8b0ed00..fe6dadf 100644 (file)
@@ -28,6 +28,7 @@
  */
 
 use MediaWiki\MediaWikiServices as MediaWikiServicesAlias;
+use MediaWiki\Storage\RevisionRecord;
 use Wikimedia\Rdbms\IResultWrapper;
 use Wikimedia\Rdbms\IDatabase;
 
@@ -253,7 +254,7 @@ class WikiExporter {
                                'rev_user' => $revQuery['fields']['rev_user'],
                        ],
                        [
-                               $this->db->bitAnd( 'rev_deleted', Revision::DELETED_USER ) . ' = 0',
+                               $this->db->bitAnd( 'rev_deleted', RevisionRecord::DELETED_USER ) . ' = 0',
                                $cond,
                        ],
                        __METHOD__,
index f71b0d5..0003506 100644 (file)
@@ -291,6 +291,35 @@ class XmlDumpWriter {
                return MediaWikiServices::getInstance()->getBlobStore();
        }
 
+       /**
+        * Invokes the given method on the given object, catching and logging any storage related
+        * exceptions.
+        *
+        * @param object $obj
+        * @param string $method
+        * @param array $args
+        * @param string $warning The warning to output in case of a storage related exception.
+        *
+        * @return mixed Returns the method's return value,
+        *         or null in case of a storage related exception.
+        * @throws Exception
+        */
+       private function invokeLenient( $obj, $method, $args = [], $warning ) {
+               try {
+                       return call_user_func_array( [ $obj, $method ], $args );
+               } catch ( SuppressedDataException $ex ) {
+                       return null;
+               } catch ( Exception $ex ) {
+                       if ( $ex instanceof MWException || $ex instanceof RuntimeException ||
+                               $ex instanceof InvalidArgumentException ) {
+                               MWDebug::warning( $warning . ': ' . $ex->getMessage() );
+                               return null;
+                       } else {
+                               throw $ex;
+                       }
+               }
+       }
+
        /**
         * Dumps a "<revision>" section on the output stream, with
         * data filled in from the given database row.
@@ -320,7 +349,7 @@ class XmlDumpWriter {
 
                $out .= $this->writeTimestamp( $rev->getTimestamp() );
 
-               if ( $rev->isDeleted( Revision::DELETED_USER ) ) {
+               if ( $rev->isDeleted( RevisionRecord::DELETED_USER ) ) {
                        $out .= "      " . Xml::element( 'contributor', [ 'deleted' => 'deleted' ] ) . "\n";
                } else {
                        // empty values get written out as uid 0, see T224221
@@ -334,7 +363,7 @@ class XmlDumpWriter {
                if ( $rev->isMinor() ) {
                        $out .= "      <minor/>\n";
                }
-               if ( $rev->isDeleted( Revision::DELETED_COMMENT ) ) {
+               if ( $rev->isDeleted( RevisionRecord::DELETED_COMMENT ) ) {
                        $out .= "      " . Xml::element( 'comment', [ 'deleted' => 'deleted' ] ) . "\n";
                } else {
                        if ( $rev->getComment()->text != '' ) {
@@ -344,22 +373,39 @@ class XmlDumpWriter {
                        }
                }
 
-               $contentMode = $rev->isDeleted( Revision::DELETED_TEXT ) ? self::WRITE_STUB_DELETED
+               $contentMode = $rev->isDeleted( RevisionRecord::DELETED_TEXT ) ? self::WRITE_STUB_DELETED
                        : $this->contentMode;
 
                foreach ( $rev->getSlots()->getSlots() as $slot ) {
                        $out .= $this->writeSlot( $slot, $contentMode );
                }
 
-               if ( $rev->isDeleted( Revision::DELETED_TEXT ) ) {
+               if ( $rev->isDeleted( RevisionRecord::DELETED_TEXT ) ) {
                        $out .= "      <sha1/>\n";
                } else {
-                       $out .= "      " . Xml::element( 'sha1', null, strval( $rev->getSha1() ) ) . "\n";
+                       $sha1 = $this->invokeLenient(
+                               $rev,
+                               'getSha1',
+                               [],
+                               'failed to determine sha1 for revision ' . $rev->getId()
+                       );
+                       $out .= "      " . Xml::element( 'sha1', null, strval( $sha1 ) ) . "\n";
                }
 
                // Avoid PHP 7.1 warning from passing $this by reference
                $writer = $this;
-               $text = $rev->getContent( SlotRecord::MAIN, RevisionRecord::RAW );
+               $text = '';
+               if ( $contentMode === self::WRITE_CONTENT ) {
+                       /** @var Content $content */
+                       $content = $this->invokeLenient(
+                               $rev,
+                               'getContent',
+                               [ SlotRecord::MAIN, RevisionRecord::RAW ],
+                               'Failed to load main slot content of revision ' . $rev->getId()
+                       );
+
+                       $text = $content ? $content->serialize() : '';
+               }
                Hooks::run( 'XmlDumpWriterWriteRevision', [ &$writer, &$out, $row, $text, $rev ] );
 
                $out .= "    </revision>\n";
@@ -407,37 +453,38 @@ class XmlDumpWriter {
 
                $textAttributes = [
                        'xml:space' => 'preserve',
-                       'bytes' => $slot->getSize(),
+                       'bytes' => $this->invokeLenient(
+                               $slot,
+                               'getSize',
+                               [],
+                               'failed to determine size for slot ' . $slot->getRole() . ' of revision '
+                               . $slot->getRevision()
+                       ) ?: '0'
                ];
 
                if ( $isV11 ) {
-                       $textAttributes['sha1'] = $slot->getSha1();
+                       $textAttributes['sha1'] = $this->invokeLenient(
+                               $slot,
+                               'getSha1',
+                               [],
+                               'failed to determine sha1 for slot ' . $slot->getRole() . ' of revision '
+                               . $slot->getRevision()
+                       ) ?: '';
                }
 
                if ( $contentMode === self::WRITE_CONTENT ) {
-                       try {
-                               // write <text> tag
-                               $out .= $this->writeText( $slot->getContent(), $textAttributes, $indent );
-                       } catch ( SuppressedDataException $ex ) {
-                               // NOTE: this shouldn't happen, since the caller is supposed to have checked
-                               // for suppressed content!
-                               // write <text> placeholder tag
-                               $textAttributes['deleted'] = 'deleted';
+                       $content = $this->invokeLenient(
+                               $slot,
+                               'getContent',
+                               [],
+                               'failed to load content for slot ' . $slot->getRole() . ' of revision '
+                               . $slot->getRevision()
+                       );
+
+                       if ( $content === null ) {
                                $out .= $indent . Xml::element( 'text', $textAttributes ) . "\n";
-                       }
-                       catch ( Exception $ex ) {
-                               if ( $ex instanceof MWException || $ex instanceof RuntimeException ) {
-                                       // there's no provision in the schema for an attribute that will let
-                                       // the user know this element was unavailable due to error; an empty
-                                       // tag is the best we can do
-                                       $out .= $indent . Xml::element( 'text' ) . "\n";
-                                       wfLogWarning(
-                                               'failed to load content slot ' . $slot->getRole() . ' for revision '
-                                               . $slot->getRevision() . "\n"
-                                       );
-                               } else {
-                                       throw $ex;
-                               }
+                       } else {
+                               $out .= $this->writeText( $content, $textAttributes, $indent );
                        }
                } elseif ( $contentMode === self::WRITE_STUB_DELETED ) {
                        // write <text> placeholder tag
@@ -452,14 +499,21 @@ class XmlDumpWriter {
                        // Output the numerical text ID if possible, for backwards compatibility.
                        // Note that this is currently the ONLY reason we have a BlobStore here at all.
                        // When removing this line, check whether the BlobStore has become unused.
-                       $textId = $this->getBlobStore()->getTextIdFromAddress( $slot->getAddress() );
+                       try {
+                               // NOTE: this will only work for addresses of the form "tt:12345".
+                               // If we want to support other kinds of addresses in the future,
+                               // we will have to silently ignore failures here.
+                               // For now, this fails for "tt:0", which is present in the WMF production
+                               // database of of Juli 2019, due to data corruption.
+                               $textId = $this->getBlobStore()->getTextIdFromAddress( $slot->getAddress() );
+                       } catch ( InvalidArgumentException $ex ) {
+                               MWDebug::warning( 'Bad content address for slot ' . $slot->getRole()
+                                       . ' of revision ' . $slot->getRevision() . ': ' . $ex->getMessage() );
+                               $textId = 0;
+                       }
+
                        if ( $textId ) {
                                $textAttributes['id'] = $textId;
-                       } elseif ( !$isV11 ) {
-                               throw new InvalidArgumentException(
-                                       'Cannot produce stubs for non-text-table content blobs with schema version '
-                                       . $this->schemaVersion
-                               );
                        }
 
                        $out .= $indent . Xml::element( 'text', $textAttributes ) . "\n";
index 43f6010..957af3e 100644 (file)
@@ -121,10 +121,13 @@ class LockManagerGroup {
                        $config = $this->managers[$name]['config'];
                        if ( $class === DBLockManager::class ) {
                                $lbFactory = MediaWikiServices::getInstance()->getDBLoadBalancerFactory();
-                               $lb = $lbFactory->newMainLB( $config['domain'] );
-                               $dbw = $lb->getLazyConnectionRef( DB_MASTER, [], $config['domain'] );
-
-                               $config['dbServers']['localDBMaster'] = $dbw;
+                               $lb = $lbFactory->getMainLB( $config['domain'] );
+                               $config['dbServers']['localDBMaster'] = $lb->getLazyConnectionRef(
+                                       DB_MASTER,
+                                       [],
+                                       $config['domain'],
+                                       $lb::CONN_TRX_AUTOCOMMIT
+                               );
                                $config['srvCache'] = ObjectCache::getLocalServerInstance( 'hash' );
                        }
                        $config['logger'] = LoggerFactory::getInstance( 'LockManager' );
index 8ff8143..314c4c3 100644 (file)
@@ -580,7 +580,7 @@ class ForeignAPIRepo extends FileRepo {
 
                                return $html;
                        },
-                       [ 'pcTTL' => WANObjectCache::TTL_PROC_LONG ]
+                       [ 'pcGroup' => 'http-get:3', 'pcTTL' => WANObjectCache::TTL_PROC_LONG ]
                );
        }
 
index d447945..61faa09 100644 (file)
@@ -22,6 +22,7 @@
  */
 
 use MediaWiki\MediaWikiServices;
+use MediaWiki\Storage\RevisionRecord;
 
 /**
  * Helper class for file deletion
@@ -195,7 +196,7 @@ class LocalFileDeleteBatch {
 
                // Bitfields to further suppress the content
                if ( $this->suppress ) {
-                       $bitfield = Revision::SUPPRESSED_ALL;
+                       $bitfield = RevisionRecord::SUPPRESSED_ALL;
                } else {
                        $bitfield = 'oi_deleted';
                }
index cbcd3ba..860a351 100644 (file)
@@ -28,7 +28,7 @@ class HTMLNamespacesMultiselectField extends HTMLSelectNamespace {
        }
 
        public function validate( $value, $alldata ) {
-               if ( !$this->mParams['exists'] ) {
+               if ( !$this->mParams['exists'] || $value === '' ) {
                        return true;
                }
 
index 40c9417..4be13b0 100644 (file)
@@ -139,9 +139,9 @@ class ImportableUploadRevisionImporter implements UploadRevisionImporter {
 
        /**
         * @deprecated DO NOT CALL ME.
-        * This method was introduced when factoring UploadImporter out of WikiRevision.
-        * It only has 1 use by the deprecated downloadSource method in WikiRevision.
-        * Do not use this in new code.
+        * This method was introduced when factoring (Importable)UploadRevisionImporter out of
+        * WikiRevision. It only has 1 use by the deprecated downloadSource method in WikiRevision.
+        * Do not use this in new code, it will be made private soon.
         *
         * @param ImportableUploadRevision $wikiRevision
         *
index c006874..cae9542 100644 (file)
@@ -636,7 +636,7 @@ class WikiRevision implements ImportableUploadRevision, ImportableOldRevision {
 
        /**
         * @since 1.12.2
-        * @deprecated in 1.31. Use UploadImporter::import
+        * @deprecated in 1.31. Use UploadRevisionImporter::import
         * @return bool
         */
        public function importUpload() {
@@ -647,7 +647,7 @@ class WikiRevision implements ImportableUploadRevision, ImportableOldRevision {
 
        /**
         * @since 1.12.2
-        * @deprecated in 1.31. Use UploadImporter::downloadSource
+        * @deprecated in 1.31. No replacement
         * @return bool|string
         */
        public function downloadSource() {
index f947979..ba5da6d 100644 (file)
@@ -20,6 +20,8 @@
  * @file
  * @ingroup Deployment
  */
+
+use MediaWiki\MediaWikiServices;
 use Wikimedia\Rdbms\LBFactorySingle;
 use Wikimedia\Rdbms\Database;
 use Wikimedia\Rdbms\IDatabase;
@@ -359,8 +361,8 @@ abstract class DatabaseInstaller {
                        throw new MWException( __METHOD__ . ': unexpected DB connection error' );
                }
 
-               \MediaWiki\MediaWikiServices::resetGlobalInstance();
-               $services = \MediaWiki\MediaWikiServices::getInstance();
+               MediaWikiServices::resetGlobalInstance();
+               $services = MediaWikiServices::getInstance();
 
                $connection = $status->value;
                $services->redefineService( 'DBLoadBalancerFactory', function () use ( $connection ) {
index 33d4fcc..f6a5c41 100644 (file)
@@ -1764,7 +1764,9 @@ abstract class Installer {
        public static function overrideConfig() {
                // Use PHP's built-in session handling, since MediaWiki's
                // SessionHandler can't work before we have an object cache set up.
-               define( 'MW_NO_SESSION_HANDLER', 1 );
+               if ( !defined( 'MW_NO_SESSION_HANDLER' ) ) {
+                       define( 'MW_NO_SESSION_HANDLER', 1 );
+               }
 
                // Don't access the database
                $GLOBALS['wgUseDatabaseMessages'] = false;
index ffa17ed..8b5ff11 100644 (file)
@@ -212,6 +212,7 @@ class MssqlInstaller extends DatabaseInstaller {
                }
 
                try {
+                       /** @var DatabaseMssql $db */
                        $db = Database::factory( 'mssql', [
                                'host' => $this->getVar( 'wgDBserver' ),
                                'port' => $this->getVar( 'wgDBport' ),
@@ -236,7 +237,7 @@ class MssqlInstaller extends DatabaseInstaller {
 
                $status = $this->getConnection();
                if ( !$status->isOK() ) {
-                       $this->parent->showStatusError( $status );
+                       $this->parent->showStatusMessage( $status );
 
                        return;
                }
@@ -594,7 +595,7 @@ class MssqlInstaller extends DatabaseInstaller {
 
                // Try to grant to all the users we know exist or we were able to create
                $this->db->selectDB( $dbName );
-               foreach ( $grantableNames as $name ) {
+               if ( $grantableNames ) {
                        try {
                                // First try to grant full permissions
                                $fullPrivArr = [
index 3013db7..69d03bd 100644 (file)
@@ -48,7 +48,7 @@ class MysqlInstaller extends DatabaseInstaller {
                '_InstallUser' => 'root',
        ];
 
-       public $supportedEngines = [ 'InnoDB', 'MyISAM' ];
+       public $supportedEngines = [ 'InnoDB' ];
 
        public static $minimumVersion = '5.5.8';
        protected static $notMinimumVersionMessage = 'config-mysql-old';
@@ -142,6 +142,7 @@ class MysqlInstaller extends DatabaseInstaller {
        public function openConnection() {
                $status = Status::newGood();
                try {
+                       /** @var DatabaseMysqlBase $db */
                        $db = Database::factory( 'mysql', [
                                'host' => $this->getVar( 'wgDBserver' ),
                                'user' => $this->getVar( '_InstallUser' ),
@@ -162,7 +163,7 @@ class MysqlInstaller extends DatabaseInstaller {
 
                $status = $this->getConnection();
                if ( !$status->isOK() ) {
-                       $this->parent->showStatusError( $status );
+                       $this->parent->showStatusMessage( $status );
 
                        return;
                }
@@ -364,45 +365,6 @@ class MysqlInstaller extends DatabaseInstaller {
                        $this->setVar( '_MysqlEngine', reset( $engines ) );
                }
 
-               $s .= Xml::openElement( 'div', [
-                       'id' => 'dbMyisamWarning'
-               ] );
-               $myisamWarning = 'config-mysql-myisam-dep';
-               if ( count( $engines ) === 1 ) {
-                       $myisamWarning = 'config-mysql-only-myisam-dep';
-               }
-               $s .= $this->parent->getWarningBox( wfMessage( $myisamWarning )->text() );
-               $s .= Xml::closeElement( 'div' );
-
-               if ( $this->getVar( '_MysqlEngine' ) != 'MyISAM' ) {
-                       $s .= Xml::openElement( 'script' );
-                       $s .= '$(\'#dbMyisamWarning\').hide();';
-                       $s .= Xml::closeElement( 'script' );
-               }
-
-               if ( count( $engines ) >= 2 ) {
-                       // getRadioSet() builds a set of labeled radio buttons.
-                       // For grep: The following messages are used as the item labels:
-                       // config-mysql-innodb, config-mysql-myisam
-                       $s .= $this->getRadioSet( [
-                               'var' => '_MysqlEngine',
-                               'label' => 'config-mysql-engine',
-                               'itemLabelPrefix' => 'config-mysql-',
-                               'values' => $engines,
-                               'itemAttribs' => [
-                                       'MyISAM' => [
-                                               'class' => 'showHideRadio',
-                                               'rel' => 'dbMyisamWarning'
-                                       ],
-                                       'InnoDB' => [
-                                               'class' => 'hideShowRadio',
-                                               'rel' => 'dbMyisamWarning'
-                                       ]
-                               ]
-                       ] );
-                       $s .= $this->parent->getHelpBox( 'config-mysql-engine-help' );
-               }
-
                // If the current default charset is not supported, use a charset that is
                $charsets = $this->getCharsets();
                if ( !in_array( $this->getVar( '_MysqlCharset' ), $charsets ) ) {
index c74f637..04aba37 100644 (file)
@@ -74,7 +74,6 @@
        "config-db-web-account": "Databasisgebruiker vir toegang tot die web",
        "config-mysql-engine": "Stoor-enjin:",
        "config-mysql-innodb": "InnoDB",
-       "config-mysql-myisam": "MyISAM",
        "config-site-name": "Naam van die wiki:",
        "config-site-name-blank": "Verskaf 'n naam vir u webwerf.",
        "config-project-namespace": "Projeknaamruimte:",
index 60e78b4..46b9c21 100644 (file)
@@ -51,7 +51,7 @@
        "config-help-restart": "هل تريد إزالة البيانات المحفوظة التي قد قمت بإدخالها وإعادة تشغيل عملية التثبيت؟",
        "config-restart": "نعم، إعادة التشغيل",
        "config-welcome": "=== التحقق من البيئة ===\nسوف يتم الآن التحقق من أن البيئة مناسبة لتنصيب ميديا ويكي.\nتذكر تضمين هذه المعلومات اذا اردت طلب المساعدة عن كيفية إكمال التنصيب.",
-       "config-copyright": "=== حقوق النسخ والشروط ===\n\n$1\n\nهذا البرنامج هو برنامج حر؛ يمكنك إعادة توزيعه و/أو تعديله تحت شروط رخصة جنو العامة على أن هذا البرنامج قد نُشر من قِبل مؤسسة البرمجيات الحرة؛ إما النسخة 2 من الرخصة، أو أي نسخة أخرى بعدها (من اختيارك).\n\nتم توزيع هذا البرنامج على أمل ان يكون مفيدًا ولكن <strong>دون أية ضمانات</strong>؛ دون حتى أية ضمانات مفهومة ضمنيًا أو رواجات أو أية أسباب محددة.\nانظر رخصة جنو العامة لمزيد من المعلومات.\n\nمن المفترض أنك استملت <doclink href=Copying> نسخة عن رخصة جنو العامة </doclink> مع هذا البرنامج؛ إذا لم تقعل اكتب رسالة إلى مؤسسة البرمجيات الحرة المحدودة، شارع 51 فرانكلين الطابق الخامس، بوسطن  MA 02110-1301 الولايات المتخدة أو [https://www.gnu.org/copyleft/gpl.html read it online].",
+       "config-welcome-section-copyright": "=== حقوق النسخ والشروط ===\n\n$1\n\nهذا البرنامج هو برنامج حر؛ يمكنك إعادة توزيعه و/أو تعديله تحت شروط رخصة جنو العامة على أن هذا البرنامج قد نُشر من قِبل مؤسسة البرمجيات الحرة؛ إما النسخة 2 من الرخصة، أو أي نسخة أخرى بعدها (من اختيارك).\n\nتم توزيع هذا البرنامج على أمل ان يكون مفيدًا ولكن <strong>دون أية ضمانات</strong>؛ دون حتى أية ضمانات مفهومة ضمنيًا أو رواجات أو أية أسباب محددة.\nانظر رخصة جنو العامة لمزيد من المعلومات.\n\nمن المفترض أنك استملت [$2  نسخة عن رخصة جنو العامة] مع هذا البرنامج؛ إذا لم تقعل اكتب رسالة إلى مؤسسة البرمجيات الحرة المحدودة، شارع 51 فرانكلين الطابق الخامس، بوسطن  MA 02110-1301 الولايات المتخدة أو [https://www.gnu.org/copyleft/gpl.html read it online].",
        "config-sidebar": "* [https://www.mediawiki.org موقع ميدياويكي]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents دليل المستخدم]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents دليل الإداري]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ الأسئلة المتكررة]",
        "config-sidebar-readme": "اقرأني",
        "config-sidebar-relnotes": "ملاحظات الإصدار",
        "config-db-web-no-create-privs": "الحساب الذي حددته لتركيب ليس لديه امتيازات كافية لإنشاء حساب.\nالحساب الذي حددته هنا موجود بالفعل.",
        "config-mysql-engine": "محرك التخزين",
        "config-mysql-innodb": "InnoDB (مستحسن)",
-       "config-mysql-myisam": "ماي إسام",
-       "config-mysql-myisam-dep": "<strong>تحذير:</strong> لقد اخترت MyISAM كمحرك تخزين لـMySQL، والذي لا يُنصَح باستخدامه مع ميدياويكي; لأنه:\n* بالكاد يدعم التزامن بسبب قفل الجدول \n* أكثر عرضة للفساد من المحركات الأخرى\n* لا يقوم الكود الأساسي لميدياويكي بمعالجة MyISAM دائما كما يجب\n\nإذا كان تثبيت MySQL يدعم InnoDB، فمن المستحسن جدا أن تختاره بدلا منه، \nإذا كان تثبيت MySQL لا يدعم InnoDB، فربما حان الوقت للترقية.",
-       "config-mysql-only-myisam-dep": "<strong>تحذير:</strong> MyISAMهو محرك التخزين الوحيد المتاح لـMySQL على هذا الجهاز، ولا يُنصَح باستخدامه مع ميدياويكي; لأنه:\n* بالكاد يدعم التزامن بسبب قفل الجدول \n* أكثر عرضة للفساد من المحركات الأخرى\n* لا يقوم الكود الأساسي لميدياويكي بمعالجة MyISAM دائما كما يجب\n\nتثبيت MySQL لا يدعم InnoDB; ربما حان الوقت للترقية.",
        "config-mysql-engine-help": "<strong>InnoDB</strong> هو دائما الخيار الأفضل; لأنه يحتوي على دعم تزامن جيد.\n\nقد يكون <strong>MyISAM</strong> أسرع في تثبيت المستخدم الفردي أو للقراءة فقط،\nتميل قواعد بيانات MyISAM للتلف أكثر من قواعد بيانات InnoDB.",
        "config-mssql-auth": "نوع الاستيثاق:",
        "config-mssql-install-auth": "حدد نوع المصادقة الذي سيتم استخدامه للاتصال بقاعدة البيانات أثناء عملية التثبيت. \nإذا حددت \"{{int:config-mssql-windowsauth}}\"، فسيتم استخدام بيانات اعتماد أي مستخدم يعمل عليه خادم الويب.",
index 512f032..6b2024f 100644 (file)
@@ -44,7 +44,7 @@
        "config-help-restart": "¿Quies llimpiar tolos datos guardaos qu'introduxesti y reaniciar el procesu d'instalación?",
        "config-restart": "Sí, reanicialu",
        "config-welcome": "=== Comprobaciones del entornu ===\nAgora van facese unes comprobaciones básiques para ver si l'entornu ye afayadizu pa la instalación de MediaWiki.\nAlcuérdese d'incluir esta información si necesita encontu pa completar la instalación.",
-       "config-copyright": "=== Drechos d'autor y condiciones d'usu ===\n\n$1\n\nEsti programa ye software llibre; puedes redistribuilu y/o camudalu baxo les condiciones de la llicencia pública xeneral GNU tal como la publica la Free Software Foundation; versión 2 o (como prefieras) cualquier versión posterior.\n\nEsti programa distribúese cola esperanza de que pueda ser útil, pero <strong>ensin garantía denguna</strong>; nin siquiera la garantía implícita de <strong>comercialidá</strong> o \n<strong>adautación a un fin determináu</strong>.\nVer la Llicencia pública xeneral GNU pa más detalles.\n\nHabríes de tener recibío <doclink href=Copying>una copia de la llicencia pública xeneral GNU</doclink> xunto con esti programa; sinón, escribi a la Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA, o [https://www.gnu.org/copyleft/gpl.html lléila en llinia].",
+       "config-welcome-section-copyright": "=== Drechos d'autor y condiciones d'usu ===\n\n$1\n\nEsti programa ye software llibre; puedes redistribuilu y/o camudalu baxo les condiciones de la llicencia pública xeneral GNU tal como la publica la Free Software Foundation; versión 2 o (como prefieras) cualquier versión posterior.\n\nEsti programa distribúese cola esperanza de que pueda ser útil, pero <strong>ensin garantía denguna</strong>; nin siquiera la garantía implícita de <strong>comercialidá</strong> o \n<strong>adautación a un fin determináu</strong>.\nVer la Llicencia pública xeneral GNU pa más detalles.\n\nHabríes de tener recibío [$2 una copia de la llicencia pública xeneral GNU] xunto con esti programa; sinón, escribi a la Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA, o [https://www.gnu.org/copyleft/gpl.html lléila en llinia].",
        "config-sidebar": "* [https://www.mediawiki.org/wiki/MediaWiki/gl Páxina principal de MediaWiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Guía del usuariu]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents Guía del alministrador]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Entrugues frecuentes]\n----\n* <doclink href=Readme>Lléame</doclink>\n* <doclink href=ReleaseNotes>Notes de llanzamientu</doclink>\n* <doclink href=Copying>Copia</doclink>\n* <doclink href=UpgradeDoc>Anovamientu</doclink>",
        "config-env-good": "Comprobóse l'entornu.\nPues instalar MediaWiki.",
        "config-env-bad": "Comprobóse l'entornu.\nNun pues instalar MediaWiki.",
        "config-db-web-no-create-privs": "La cuenta qu'especificasti pa la instalación nun tien permisos abondo pa crear una cuenta.\nLa cuenta qu'especifiques equí yá tien d'esistir.",
        "config-mysql-engine": "Motor d'almacenamientu:",
        "config-mysql-innodb": "InnoDB (aconséyase)",
-       "config-mysql-myisam": "MyISAM",
        "config-mssql-auth": "Triba d'autenticación:",
        "config-mssql-sqlauth": "Autenticación de SQL Server",
        "config-mssql-windowsauth": "Autenticación de Windows",
index e0d2bc9..23e5388 100644 (file)
@@ -51,7 +51,7 @@
        "config-help-restart": "Һеҙ үҙегеҙ индергән һәм  һаҡланған әлеге мәғлүмәттәрҙе юйып, урынлаштырыуҙың яңы процессын ебәрергә теләйһегеҙме?",
        "config-restart": "Эйе, яңынан башларға",
        "config-welcome": "=== Даирәне тикшереү ===",
-       "config-copyright": "=== Авторлыҡ хоҡуҡтары һәм шарттар ===\n\n$1\n\nMediaWiki - ирекле программа тьәминәте. Һеҙ уны ирекле программа тьәминәте фонды баҫып сығарған GNU General Public License лицензия талаптарына ярашлы рәүештә тарата һәм/йәки үҙгәртә алаһығыҙ;икенсе версияһына йәки ниндәйҙә булһа һуңғы версияһына ярашлы рәүештә.\nMediaWiki - файҙалы булыу өмөтө менән таратыла, ләкин <strong> бер ниндәй ҙә гарантияларһыҙ</strong>, хатта күҙ уңында тотолған гарантияларһыҙ <strong> коммерция ҡимәтенән тыш </strong> йәки </strong> ниндәй ҙә булһа маҡсатҡа яраҡһыҙ </strong>. Ҡара. тулыраҡ мәғлүмәт алыу өсөн GNU General Public License лицезияһы. \nҺеҙ <doclink href=Copying> копияһын GNU General Public License</doclink>ошо программа менән бергә алырға тейеш инегеҙ, әгәр алмаһағыҙ, Free Software Foundation, Inc. ошо адрес буйынса яҙығыҙ:51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA йәки  [https://www.gnu.org/copyleft/gpl.html уны онлайнда уҡығыҙ].",
+       "config-welcome-section-copyright": "=== Авторлыҡ хоҡуҡтары һәм шарттар ===\n\n$1\n\nMediaWiki - ирекле программа тьәминәте. Һеҙ уны ирекле программа тьәминәте фонды баҫып сығарған GNU General Public License лицензия талаптарына ярашлы рәүештә тарата һәм/йәки үҙгәртә алаһығыҙ;икенсе версияһына йәки ниндәйҙә булһа һуңғы версияһына ярашлы рәүештә.\nMediaWiki - файҙалы булыу өмөтө менән таратыла, ләкин <strong> бер ниндәй ҙә гарантияларһыҙ</strong>, хатта күҙ уңында тотолған гарантияларһыҙ <strong> коммерция ҡимәтенән тыш </strong> йәки </strong> ниндәй ҙә булһа маҡсатҡа яраҡһыҙ </strong>. Ҡара. тулыраҡ мәғлүмәт алыу өсөн GNU General Public License лицезияһы. \nҺеҙ [$2  копияһын GNU General Public License]ошо программа менән бергә алырға тейеш инегеҙ, әгәр алмаһағыҙ, Free Software Foundation, Inc. ошо адрес буйынса яҙығыҙ:51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA йәки  [https://www.gnu.org/copyleft/gpl.html уны онлайнда уҡығыҙ].",
        "config-sidebar": "* [https://www.mediawiki.org Сайт MediaWiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents/ru Ҡулланыусылар өсөн белешмә]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents/ru Администраторҙар өсөн белешмә]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ/ru FAQ]\n----\n* <doclink href=Readme>Readme-файл</doclink>\n* <doclink href=ReleaseNotes>Сығарылыш тураһында мәғлүмәт</doclink>\n* <doclink href=Copying>Лицензия</doclink>\n* <doclink href=UpgradeDoc>Яңыртыуҙар</doclink>",
        "config-env-good": "Мөхитте тикшереү уңышлы тамамланды. MediaWiki урынлаштырырға мөмкин.",
        "config-env-bad": "Мөхит тикшерелде. Һеҙ MediaWiki урынлаштыра алмайһығыҙ.",
        "config-db-web-no-create-privs": "Ҡуйылыш өсөн күрһәтелгән иҫәп яҙмағыҙҙың уны барлыҡҡа килтереү өсөн етерлек хоҡуҡтары юҡ. \nКүрһәтелгән иҫәп яҙма бында булырға тейеш инде.",
        "config-mysql-engine": "Мәғлүмәт базаһы шыуҙырмаһы",
        "config-mysql-innodb": "InnoDB",
-       "config-mysql-myisam": "MyISAM",
-       "config-mysql-myisam-dep": "\"Иғтибар\" Һеҙ MySQL мәғлүмәтен һаҡлау өсөн MyISAM механизмын һайланығыҙ. Түбәндәге сәбәптәр арҡаһында уны ҡулланыу тәҡдим ителмәй:\n* параллелизмда эшләп булмай;\n* башҡа механизмдар менән сағыштырғанда мәғлүмәттәр юғала;\n* MediaWiki коды  MyISAM үҙенсәләген иҫәпкә алмай.\n\nҺеҙҙең MySQL InnoDB менән яраҡлы эшләһә ошо механизмды һайларға тәҡдим итебеҙ.\n\nҺеҙҙең MySQL InnoDB менән яраҡһыҙ эшләһә  механизмды яңыртырға тәҡдим итебеҙ.",
-       "config-mysql-only-myisam-dep": "<strong>Иҫкәртеү:</strong> MyISAM — был компьютерҙә MySQL өсөн берҙән-бер асыҡ мәғлүмәттәр һаҡлау системаһы, һәм  MediaWiki менән берлектә ҡулланырға рөхсәт ителмәй,сөнки:\n* таблицаларҙы блокировкалау һөҙөмтәһендә параллелизмды көсһөҙ тота;\n* башҡа системаларға ҡарағанда, ватылыуға күберәк дусар ителгән;\n* MediaWiki код базаһы MyISAM -ды ғәҙәттәгесә эшкәртеп бөтә алмай\nҺеҙҙең MySQL  InnoDB -ды тотмай, бәлки, яңыртыу ваҡыты еткәндер.",
        "config-mysql-engine-help": "Параллель рәүештә яҡшыраҡ эшләгәне өсөн '''InnoDB''' өҫтөнлөрәк.\n\nБер ҡулланыусы йәки төҙәтеүҙәр әҙ булғанда вики өсөн '''MyISAM'''тың тиҙлеге  шәберәк, әммә унда мәғлүмәт базаһы InnoDB-ҡа ҡарағанда йышыраҡ сафтан сыға.",
        "config-mssql-auth": "Аутентификация төрө :",
        "config-mssql-install-auth": "Ҡуйыу процесында мәғлүмәт базаһына инеү өсөн файҙаланылған төп нөсхәне тикшереү тибын һайлағыҙ. \n\nӘгәр «{{int:config-mssql-windowsauth}}» һайлаһығыҙ, ҡулланыусының веб-сервер эшләгән иҫәп яҙмаһы файҙаланыласаҡ.",
index 136f3a2..c29f5f7 100644 (file)
@@ -47,7 +47,7 @@
        "config-help-restart": "Ці жадаеце выдаліць усе ўведзеныя зьвесткі і пачаць працэс усталяваньня зноў?",
        "config-restart": "Так, пачаць зноў",
        "config-welcome": "== Праверка асяродзьдзя ==\nЗараз будуць праведзеныя праверкі для запэўніваньня, што гэтае асяродзьдзе адпаведнае для ўсталяваньня MediaWiki.\nНе забудзьце далучыць гэтую інфармацыю, калі вам спатрэбіцца дапамога для завяршэньня ўсталяваньня.",
-       "config-copyright": "== Аўтарскае права і ўмовы ==\n\n$1\n\nThis program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but '''without any warranty'''; without even the implied warranty of '''merchantability''' or '''fitness for a particular purpose'''.\nSee the GNU General Public License for more details.\n\nYou should have received <doclink href=Copying>a copy of the GNU General Public License</doclink> along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. or [https://www.gnu.org/copyleft/gpl.html read it online].",
+       "config-welcome-section-copyright": "== Аўтарскае права і ўмовы ==\n\n$1\n\nThis program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but '''without any warranty'''; without even the implied warranty of '''merchantability''' or '''fitness for a particular purpose'''.\nSee the GNU General Public License for more details.\n\nYou should have received [$2 a copy of the GNU General Public License] along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. or [https://www.gnu.org/copyleft/gpl.html read it online].",
        "config-sidebar": "* [https://www.mediawiki.org Хатняя старонка MediaWiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Даведка для ўдзельнікаў]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents Даведка для адміністратараў]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Адказы на частыя пытаньні]",
        "config-sidebar-readme": "Прачытай мяне",
        "config-sidebar-relnotes": "Заўвагі да выпуску",
        "config-db-web-no-create-privs": "Рахунак, які Вы пазначылі для ўсталяваньня ня мае правоў для стварэньня рахунку.\nРахунак, які Вы пазначылі тут, мусіць ужо існаваць.",
        "config-mysql-engine": "Рухавік сховішча:",
        "config-mysql-innodb": "InnoDB (рэкамэндавана)",
-       "config-mysql-myisam": "MyISAM",
-       "config-mysql-myisam-dep": "'''Папярэджаньне''': Вы выбралі MyISAM у якасьці рухавіка для захоўваньня зьвестак у MySQL, які не рэкамэндуецца да выкарыстаньня з MediaWiki па прычынах:\n* кепская падтрымка паралельнай апрацоўкі з-за таблічных блякаваньняў;\n* большая імавернасьць пашкоджаньня зьвестак у параўнаньні зь іншымі рухавікамі;\n* код MediaWiki не ва ўсіх выпадках улічвае асаблівасьці MyISAM.\n\nКалі Ваш MySQL-сэрвэр падтрымлівае InnoDB, вельмі рэкамэндуецца выкарыстаньне менавіта гэтага рухавіка.\nКалі MySQL-сэрвэр не падтрымлівае InnoDB, пэўна, настаў час абнавіць яго.",
-       "config-mysql-only-myisam-dep": "<strong>Папярэджаньне:</strong> MyISAM — адзіная даступная сыстэма захоўваньня зьвестак для MySQL на гэтым кампутары, яна не рэкамэндуецца для ўжываньня з MediaWiki, таму што:\n* слаба падтрымлівае паралельнасьць праз блякаваньне табліцаў\n* больш за іншыя сыстэмы схільная да пашкоджаньняў\n* кодавая база MediaWiki не заўсёды належна апрацоўвае MyISAM\n\nВашае ўсталяваньне MySQL не падтрымлівае InnoDB, магчыма, час для абнаўленьня.",
        "config-mysql-engine-help": "'''InnoDB''' — звычайна найбольш слушны варыянт, таму што добра падтрымлівае паралелізм.\n\n'''MyISAM''' можа быць хутчэйшай у вікі з адным удзельнікам, ці толькі для чытаньня.\nБазы зьвестак на MyISAM вядомыя тым, што ў іх зьвесткі шкодзяцца нашмат часьцей за InnoDB.",
        "config-mssql-auth": "Тып аўтэнтыфікацыі:",
        "config-mssql-install-auth": "Абярыце тып аўтэнтыфікацыі, які будзе выкарыстаны для злучэньня з базай зьвестак падчас працэсу ўсталяваньня.\nКалі вы абярэце «{{int:config-mssql-windowsauth}}», будуць выкарыстаныя ўліковыя зьвесткі карыстальніка, пад якім працуе вэб-сэрвэр.",
index 8074a14..de2f0cb 100644 (file)
        "config-help-restart": "Необходимо е потвърждение за изтриване на всички въведени и съхранени данни и започване отначало на процеса по инсталация.",
        "config-restart": "Да, започване отначало",
        "config-welcome": "=== Проверка на условията ===\nЩе бъдат извършени основни проверки, които да установят дали условията са подходящи за инсталиране на МедияУики.\nАко е необходима помощ по време на инсталацията, резултатите от направените проверки трябва също да бъдат предоставени.",
-       "config-copyright": "=== Авторски права и условия ===\n\n$1\n\nТази програма е свободен софтуер, който може да се променя и/или разпространява според Общия публичен лиценз на GNU, както е публикуван от Free Software Foundation във версия на Лиценза 2 или по-късна версия.\n\nТази програма се разпространява с надеждата, че ще е полезна, но <strong>без каквито и да е гаранции</strong>; без дори косвена гаранция за <strong>продаваемост</strong>  или <strong>пригодност за конкретна употреба</strong> .\nЗа повече подробности се препоръчва преглеждането на Общия публичен лиценз на GNU.\n\nКъм програмата трябва да е приложено <doclink href=Copying>копие на Общия публичен лиценз на GNU</doclink>; ако не, можете да пишете на Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA, или да [https://www.gnu.org/copyleft/gpl.html го прочетете онлайн].",
-       "config-sidebar": "* [https://www.mediawiki.org Сайт на МедияУики]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Наръчник на потребителя]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents Наръчник на администратора]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ ЧЗВ]\n----\n* <doclink href=Readme>Документация</doclink>\n* <doclink href=ReleaseNotes>Бележки за версията</doclink>\n* <doclink href=Copying>Авторски права</doclink>\n* <doclink href=UpgradeDoc>Обновяване</doclink>",
+       "config-welcome-section-copyright": "=== Авторски права и условия ===\n\n$1\n\nТази програма е свободен софтуер, който може да се променя и/или разпространява според Общия публичен лиценз на GNU, както е публикуван от Free Software Foundation във версия на Лиценза 2 или по-късна версия.\n\nТази програма се разпространява с надеждата, че ще е полезна, но <strong>без каквито и да е гаранции</strong>; без дори косвена гаранция за <strong>продаваемост</strong>  или <strong>пригодност за конкретна употреба</strong> .\nЗа повече подробности се препоръчва преглеждането на Общия публичен лиценз на GNU.\n\nКъм програмата трябва да е приложено [$2 копие на Общия публичен лиценз на GNU]; ако не, можете да пишете на Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA, или да [https://www.gnu.org/copyleft/gpl.html го прочетете онлайн].",
+       "config-sidebar": "* [https://www.mediawiki.org Сайт на МедияУики]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Наръчник на потребителя]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents Наръчник на администратора]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ ЧЗВ]",
+       "config-sidebar-readme": "Прочети ме",
+       "config-sidebar-relnotes": "Бележки за версията",
+       "config-sidebar-license": "Копиране",
+       "config-sidebar-upgrade": "Надграждане",
        "config-env-good": "Средата беше проверена.\nИнсталирането на МедияУики е възможно.",
        "config-env-bad": "Средата беше проверена.\nНе е възможна инсталация на МедияУики.",
        "config-env-php": "PHP $1 е инсталирано.",
        "config-env-hhvm": "HHVM $1 е инсталиран.",
-       "config-unicode-using-intl": "Използване на разширението [https://pecl.php.net/intl intl PECL] за нормализация на Уникод.",
-       "config-unicode-pure-php-warning": "<strong>Внимание:</strong> [https://pecl.php.net/intl Разширението intl PECL] не е налично за справяне с нормализацията на Уникод, превключване към по-бавното изпълнение на чист PHP.\nАко сайтът е с голям трафик, препоръчително е да се запознаете с [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations нормализацията на Уникод].",
+       "config-unicode-using-intl": "Използване на разширението [https://php.net/manual/en/book.intl.php intl PECL] за нормализация на Уникод.",
+       "config-unicode-pure-php-warning": "<strong>Внимание:</strong> [https://php.net/manual/en/book.intl.php Разширението intl PECL] не е налично за справяне с нормализацията на Уникод, превключване към по-бавното изпълнение на чист PHP.\nАко сайтът е с голям трафик, препоръчително е да се запознаете с [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations нормализацията на Уникод].",
        "config-unicode-update-warning": "<strong>Предупреждение</strong>: Инсталираната версия на Обвивката за нормализация на Unicode използва по-старата версия на библиотеката на [http://site.icu-project.org/ проекта ICU].\nНеобходимо е да [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations инсталирате по-нова версия], в случай че сте загрижени за използването на Unicode.",
        "config-no-db": "Не може да бъде открит подходящ драйвер за база данни! Необходимо е да инсталирате драйвер за база данни за PHP.\n{{PLURAL:$2|Поддържа се следния тип|Поддържат се следните типове}} бази от данни: $1.\n\nАко сами сте компилирали PHP, преконфигурирайте го с включен клиент за база данни, например чрез използване на <code>./configure --with-mysqli</code>.\nАко сте инсталирали PHP от пакет за Debian или Ubuntu, необходимо е също така да инсталирате и модула <code>php-mysql</code>.",
-       "config-outdated-sqlite": "<strong>Внимание:</strong> имате инсталиран SQLite  $1, а минималната допустима версия е $2. SQLite ще бъде недостъпна за ползване.",
+       "config-outdated-sqlite": "<strong>Внимание:</strong> имате инсталиран SQLite $2, а минималната допустима версия е $1. SQLite ще бъде недостъпна за ползване.",
        "config-no-fts3": "<strong>Предупреждение:</strong> SQLite е компилирана без [//sqlite.org/fts3.html модула FTS3], затова възможностите за търсене няма да са достъпни.",
        "config-pcre-old": "<strong>Фатална грешка:</strong> Изисква се PCRE версия $1 или по-нова.\nИзпълнимият файл на PHP е свързан с PCRE версия $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/Повече информация за PCRE].",
        "config-pcre-no-utf8": "<strong>Фатално:</strong> Модулът PCRE на PHP изглежда е компилиран без поддръжка на PCRE_UTF8.\nЗа да функционира правилно, МедияУики изисква поддръжка на UTF-8.",
        "config-db-web-no-create-privs": "Посочената сметка за инсталацията не разполага с достатъчно права за създаване на нова сметка.\nНеобходимо е посочената сметка вече да съществува.",
        "config-mysql-engine": "Хранилище на данни:",
        "config-mysql-innodb": "InnoDB (препоръчително)",
-       "config-mysql-myisam": "MyISAM",
-       "config-mysql-myisam-dep": "<strong>Внимание:</strong> Избрана е MyISAM като система за складиране в MySQL, която не се препоръчва за използване с МедияУики, защото:\n* почти не поддържа паралелност заради заключване на таблиците\n* е по-податлива на повреди в сравнение с други системи\n* кодът на МедияУики не винаги поддържа MyISAM коректно\n\nАко инсталацията на MySQL поддържа InnoDB, силно е препоръчително да се използва тя.\nАко инсталацията на MySQL не поддържа InnoDB, вероятно е време за обновяване.",
-       "config-mysql-only-myisam-dep": "<strong>Внимание:</strong> MyISAM e единственият наличен на тази машина тип на таблиците за MySQL и не е препоръчителен за употреба при МедияУики защото:\n* има слаба поддръжка на конкурентност на заявките, поради закючването на таблиците\n* е много по-податлив на грешки в базите от данни от другите типове таблици\n* кодът на МедияУики не винаги работи с MyISAM както трябва\n\nВашият MySQL не поддържа InnoDB, така че може би е дошло време за актуализиране.",
        "config-mysql-engine-help": "<strong>InnoDB</strong> почти винаги е най-добрата възможност заради навременната си поддръжка.\n\n<strong>MyISAM</strong> може да е по-бърза при инсталации с един потребител или само за четене.\nБазите от данни MyISAM се повреждат по-често от InnoDB.",
        "config-mssql-auth": "Тип на удостоверяването:",
        "config-mssql-install-auth": "Изберете начин за удостоверяване, който ще бъде използван за връзка с базата от данни по време на инсталацията.\nАко изберете \"{{int:config-mssql-windowsauth}}\", ще се използват идентификационните данни на потребителя под който работи уеб сървъра.",
        "config-install-done": "<strong>Поздравления!</strong>\nИнсталирането на МедияУики приключи успешно.\n\nИнсталаторът създаде файл <code>LocalSettings.php</code>.\nТой съдържа всичката необходима основна конфигурация на уикито.\n\nНеобходимо е той да бъде изтеглен и поставен в основната директория на уикито (директорията, в която е и index.php). Изтеглянето би трябвало да започне автоматично.\n\nАко изтеглянето не започне автоматично или е било прекратено, файлът може да бъде изтеглен чрез щракване на препратката по-долу:\n\n$3\n\n<strong>Забележка:</strong> Ако това не бъде извършено сега, генерираният конфигурационен файл няма да е достъпен на по-късен етап ако не бъде изтеглен сега или инсталацията приключи без изтеглянето му.\n\nКогато файлът вече е в основната директория, <strong>[$2 уикито ще е достъпно на този адрес]</strong>.",
        "config-install-done-path": "<strong>Поздравления!</strong>\nИнсталирането на МедияУики приключи успешно.\n\nИнсталаторът създаде файл <code>LocalSettings.php</code>.\nТой съдържа всички ваши настройки.\n\nНеобходимо е той да бъде изтеглен и поставен в <code>$4</code>. Изтеглянето би трябвало да започне автоматично.\n\nАко изтеглянето не започне автоматично или е било прекратено, файлът може да бъде изтеглен чрез щракване на препратката по-долу:\n\n$3\n\n<strong>Забележка:</strong> Ако това не бъде направено сега, генерираният конфигурационен файл няма да е достъпен на по-късен етап ако не бъде изтеглен сега или инсталацията приключи без изтеглянето му.\n\nКогато файлът вече е в основната директория, <strong>[$2 уикито ще е достъпно на този адрес]</strong>.",
        "config-install-success": "МедияУики беше успешно инсталиран. Можете да посетите <$1$2> за да видите Вашето уики.\n\nАко имате въпроси, вижте списъка с често задавани въпроси:\n<https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ> или използвайте някой от форумите за поддръжка на тази страница.",
+       "config-install-db-success": "Базата от данни е успешно настроена",
        "config-download-localsettings": "Изтегляне на <code>LocalSettings.php</code>",
        "config-help": "помощ",
        "config-help-tooltip": "щракнете за разгръщане",
index 2392f73..0debe4a 100644 (file)
@@ -87,7 +87,6 @@
        "config-regenerate": "LocalSettings.php পুনরূত্পাদিত করুন →",
        "config-mysql-engine": "সংগ্রহস্থল ইঞ্জিন:",
        "config-mysql-innodb": "InnoDB (সুপারিশকৃত)",
-       "config-mysql-myisam": "MyISAM",
        "config-mssql-windowsauth": "উইন্ডোজ প্রমাণীকরণ",
        "config-site-name": "উইকির নাম:",
        "config-site-name-blank": "একটি সাইটের নাম প্রবেশ করান।",
index 91f9bdb..de6655b 100644 (file)
@@ -46,7 +46,7 @@
        "config-help-restart": "Ha c'hoant hoc'h eus da ziverkañ an holl roadennoù hoc'h eus ebarzhet ha da adlañsañ an argerzh staliañ ?",
        "config-restart": "Ya, adloc'hañ anezhañ",
        "config-welcome": "=== Gwiriadennoù a denn d'an endro ===\nRekis eo un nebeud gwiriadennoù diazez da welet hag azas eo an endro evit gallout staliañ MediaWiki.\nHo pet soñj merkañ disoc'hoù ar gwiriadennoù-se m'ho pez ezhomm skoazell e-pad ar staliadenn.",
-       "config-copyright": "=== Gwiriañ aozer ha Termenoù implijout ===\n\n$1\n\nUr meziant frank eo ar programm-mañ; gallout a rit skignañ anezhañ ha/pe kemmañ anezhañ dindan termenoù ar GNU Aotre-implijout Foran Hollek evel m'emañ embannet gant Diazezadur ar Meziantoù Frank; pe diouzh stumm 2 an aotre-implijout, pe (evel mar karit) diouzh ne vern pe stumm nevesoc'h.\n\nIngalet eo ar programm gant ar spi e vo talvoudus met n'eus '''tamm gwarant ebet'''; hep zoken gwarant empleg ar '''varc'hadusted''' pe an '''azaster ouzh ur pal bennak'''. Gwelet ar GNU Aotre-Implijout Foran Hollek evit muioc'h a ditouroù.\n\nSañset oc'h bezañ resevet <doclink href=Copying>un eilskrid eus ar GNU Aotre-implijout Foran Hollek</doclink> a-gevret gant ar programm-mañ; ma n'hoc'h eus ket, skrivit da Diazezadur ar Meziantoù Frank/Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, SUA pe [https://www.gnu.org/licenses/old-licenses/gpl-2.0.html lennit anezhañ enlinenn].",
+       "config-welcome-section-copyright": "=== Gwiriañ aozer ha Termenoù implijout ===\n\n$1\n\nUr meziant frank eo ar programm-mañ; gallout a rit skignañ anezhañ ha/pe kemmañ anezhañ dindan termenoù ar GNU Aotre-implijout Foran Hollek evel m'emañ embannet gant Diazezadur ar Meziantoù Frank; pe diouzh stumm 2 an aotre-implijout, pe (evel mar karit) diouzh ne vern pe stumm nevesoc'h.\n\nIngalet eo ar programm gant ar spi e vo talvoudus met n'eus '''tamm gwarant ebet'''; hep zoken gwarant empleg ar '''varc'hadusted''' pe an '''azaster ouzh ur pal bennak'''. Gwelet ar GNU Aotre-Implijout Foran Hollek evit muioc'h a ditouroù.\n\nSañset oc'h bezañ resevet [$2 un eilskrid eus ar GNU Aotre-implijout Foran Hollek] a-gevret gant ar programm-mañ; ma n'hoc'h eus ket, skrivit da Diazezadur ar Meziantoù Frank/Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, SUA pe [https://www.gnu.org/licenses/old-licenses/gpl-2.0.html lennit anezhañ enlinenn].",
        "config-sidebar": "* [https://www.mediawiki.org MediaWiki degemer]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Sturlevr an implijerien]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents Sturlevr ar verourien]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ FAG]\n----\n* <doclink href=Readme>Lennit-me</doclink>\n* <doclink href=ReleaseNotes>Notennoù embann</doclink>\n* <doclink href=Copying>Oc'h eilañ</doclink>\n* <doclink href=UpgradeDoc>O hizivaat</doclink>",
        "config-env-good": "Gwiriet eo bet an endro.\nGallout a rit staliañ MediaWiki.",
        "config-env-bad": "Gwiriet eo bet an endro.\nNe c'hallit ket staliañ MediaWiki.",
        "config-db-web-no-create-privs": "Ar gont ho peus diferet evit ar staliañ n'he deus ket gwirioù a-walc'h evit krouiñ ur gont.\nRet eo d'ar gont diferet amañ bezañ anezhi dija.",
        "config-mysql-engine": "Lusker stokañ :",
        "config-mysql-innodb": "InnoDB",
-       "config-mysql-myisam": "MyISAM",
-       "config-mysql-myisam-dep": "<strong>Diwallit :</strong> Diuzet eo bet ganeoc'h MyISAM evel keflusker stokañ evit MySQL, ar pezh n'eo ket erbedet evit implijout gant MediaWiki, rak :\n* a-boan m'eo skoret gantañ ober meur a dra war un dro peogwir eo prennet an taolennoù\n* techetoc'h eo d'ar gwastoù eget kefluskerioù all\n* kod diazez MediaWiki n'eo ket atav embreget MyISAM gantañ evel m'eo dleet\n\nM'eo skoret InnoDB gant ho staliadur MySQL, ez eo kuzuliet c'hwek deoc'h dibab hennezh kentoc'h.\nMa n'eo ket skoret InnoDB gant ho staliadur MySQL, e c'hallfe bezañ poent deoc'h ober un hizivadenn.",
-       "config-mysql-only-myisam-dep": "<strong>Taolit evezh :</strong> MyISAM eo ar c'heflusker stokañ nemetañ a c'haller ober gantañ war ar mekanik-mañ evit MySQL, padal n'eo ket erbedet e implij gant MediaWiki, rak :\n* a-boan ma skor ar c'hevezerezh abalamour m'eo prennet an taolennoù\n* aesoc'h eo e wastañ eget kefluskerioù all\n* n'eo ket atav embreget MyIsam evel ma tlefe bezañ gant kod diazez MediaWiki\n\nN'eo ket skoret InnoDB gant ho staliadur MySQL. Poent eo hizivaat anezhañ marteze.",
        "config-mysql-engine-help": "<strong>InnoDB</strong> eo an dibab gwellañ koulz lavaret atav, kemer a ra e kont ar monedoù kevezus.\n\n<strong>MyISAM</strong> a c'hall bezañ fonnusoc'h evit ar staliadurioù unpost pe ar re lenn hepken.\nDiazoù roadennoù MyISAM zo techet da vezañ gwastet aliesoc'h eget re InnoDB.",
        "config-mssql-auth": "Seut anaoudadur :",
        "config-mssql-install-auth": "Diuzañ ar seurt dilesa a vo implijet evit kevreañ ouzh an diaz roadennoù e-pad ar staliañ.\nMa tibabit \"{{int:config-mssql-windowsauth}}\", e vo implijet titouroù anaout an implijer a laka ar servijer da dreiñ.",
index e6118f8..50421ab 100644 (file)
        "config-db-web-create": "Napravi račun ako već ne postoji",
        "config-mysql-engine": "Skladišni pogon:",
        "config-mysql-innodb": "InnoDB",
-       "config-mysql-myisam": "MyISAM",
        "config-mssql-auth": "Vrsta autentifikacije:",
        "config-site-name": "Ime wikija:",
        "config-site-name-blank": "Upišite ime sajta.",
index 6fb1bbe..19d6e45 100644 (file)
@@ -38,7 +38,6 @@
        "config-header-oracle": "Oracle settings",
        "config-header-mssql": "Microsoft SQL Server settings",
        "config-mysql-innodb": "InnoDB",
-       "config-mysql-myisam": "MyISAM",
        "config-site-name": "Ngaran ka wiki",
        "config-site-name-blank": "Ibutang a ngaran ka site.",
        "config-project-namespace": "Bibutangan ka proyekto:",
index 44cd45e..d49fd9f 100644 (file)
        "config-help-restart": "Voleu esborrar totes les dades que heu introduït i tornar a començar el procés d'instal·lació?",
        "config-restart": "Sí, torna a començar",
        "config-welcome": "=== Comprovacions de l'entorn ===\nS'efectuaran comprovacions bàsiques per veure si l'entorn és adequat per a la instal·lació del MediaWiki.\nRecordeu d'incloure aquesta informació si heu de demanar ajuda sobre com completar la instal·lació.",
-       "config-copyright": "=== Drets d'autor i condicions ===\n\n$1\n\nAquest programa és de programari lliure; podeu redistribuir-lo i/o modificar-lo sota les condicions de la Llicència Pública General GNU com es publicada per la Free Software Foundation; qualsevol versió 2 de la llicència, o (opcionalment) qualsevol versió posterior.\n\nAquest programa és distribueix amb l'esperança que serà útil, però <strong>sense cap garantia</strong>; sense ni tan sols la garantia implícita de <strong>\ncomerciabilitat</strong> o <strong>idoneïtat per a un propòsit particular</strong>.\nConsulteu la Llicència Pública General GNU, per a més detalls.\n\nHauríeu d'haver rebut <doclink href=\"Copying\">una còpia de la Llicència Pública General GNU</doclink> amb aquest programa; si no, escriviu a la Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA o [https://www.gnu.org/copyleft/gpl.html per llegir-lo en línia].",
+       "config-welcome-section-copyright": "=== Drets d'autor i condicions ===\n\n$1\n\nAquest programa és de programari lliure; podeu redistribuir-lo i/o modificar-lo sota les condicions de la Llicència Pública General GNU com es publicada per la Free Software Foundation; qualsevol versió 2 de la llicència, o (opcionalment) qualsevol versió posterior.\n\nAquest programa és distribueix amb l'esperança que serà útil, però <strong>sense cap garantia</strong>; sense ni tan sols la garantia implícita de <strong>\ncomerciabilitat</strong> o <strong>idoneïtat per a un propòsit particular</strong>.\nConsulteu la Llicència Pública General GNU, per a més detalls.\n\nHauríeu d'haver rebut [$2 una còpia de la Llicència Pública General GNU] amb aquest programa; si no, escriviu a la Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA o [https://www.gnu.org/copyleft/gpl.html per llegir-lo en línia].",
        "config-sidebar": "* [https://www.mediawiki.org la Pàgina d'inici]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Guia de l'usuari]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents Guia de l'administrador]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ PMF]\n----\n* <doclink href=Readme>Llegeix-me</doclink>\n* <doclink href=ReleaseNotes>Notes de la versió</doclink>\n* <doclink href=Còpia>Còpia</doclink>\n* <doclink href=UpgradeDoc>Actualització</doclink>",
+       "config-sidebar-readme": "Llegeix-me",
+       "config-sidebar-relnotes": "Notes de la versió",
+       "config-sidebar-license": "Còpia",
+       "config-sidebar-upgrade": "Actualització",
        "config-env-good": "S'ha comprovat l'entorn.\nPodeu instal·lar el MediaWiki.",
        "config-env-bad": "S'ha comprovat l'entorn.\nNo podeu instal·lar el MediaWiki.",
        "config-env-php": "El PHP $1 està instal·lat.",
@@ -82,6 +86,7 @@
        "config-using-server": "S'utilitza el nom del servidor «<nowiki>$1</nowiki>».",
        "config-using-uri": "S'utilitza l'URL del servidor «<nowiki>$1$2</nowiki>».",
        "config-uploads-not-safe": "<strong>Avís:</strong> El directori de càrregues per defecte <code>$1</code> és vulnerable a l'execució d'scripts arbitraris.\nEncara que el MediaWiki comprova tots els fitxers que es carreguen davant d'amenaces de seguretat, és molt recomanable [https://www.mediawiki.org/ wiki/Special:MyLanguage/Manual:Security#Upload_security tancar aquesta vulnerabilitat de seguretat] abans d'habilitar les càrregues.",
+       "config-no-cli-uploads-check": "<strong>Avís</strong>: no s'ha comprovat el directori per defecte per a càrregues (<code><span class=\"notranslate\">$1</span></code>$) per vulnerabilitats en l'execució arbitrària durant la instal·lació amb la línia d'ordres.",
        "config-brokenlibxml": "El vostre sistema té una combinació de versions de PHP i libxml2 que són problemàtiques i que poden causar corrupció de dades no aparent a MediaWiki i a altres aplicacions web.\nActualitzeu-vos a libxml2 2.7.3 o superior ([https://bugs.php.net/bug.php?id=45996 informe d'error al projecte PHP]).\nS'ha interromput la instal·lació.",
        "config-db-type": "Tipus de base de dades:",
        "config-db-host": "Servidor de la base de dades:",
        "config-db-schema-help": "Aquest esquema normalment ja serveix.\nNomés canvieu-lo si sabeu què us feu.",
        "config-pg-test-error": "No es pot connectar a la base de dades '''$1''': $2",
        "config-sqlite-dir": "Directori de dades de l'SQLite",
+       "config-sqlite-dir-help": "L'SQLite emmagatzema totes les dades en un únic fitxer.\n\nEl directori que proporcioneu ha de ser escrivible pel servidor durant la instal·lació.\n\n<strong>No</strong> hauria de ser accessible des del web. Aquest és el motiu perquè no el posem on són els fitxers PHP.\n\nL'instal·lador escriurà un fitxer <code>.htaccess</code> al mateix temps, però si això fallés, seria possible que s'accedís a la base de dades crua.\nAixò inclou dades d'usuari crues (adreces electròniques, contrasenyes en resum) així com revisions eliminades i altres dades restringida en el wiki.\n\nConsidereu posar la base de dades en algun altre lloc tot plegat, per exemple a <code>/var/lib/mediawiki/yourwiki</code>.",
        "config-oracle-def-ts": "Espai de taules per defecte:",
        "config-oracle-temp-ts": "Espai de taules temporal:",
        "config-type-mysql": "MariaDB, MySQL o compatible",
        "config-db-web-no-create-privs": "El compte que heu especificat a la instal·lació no té suficients privilegis per crear un compte. El compte que especifiqueu aquí ja ha d'existir.",
        "config-mysql-engine": "Motor d'emmagatzemament:",
        "config-mysql-innodb": "InnoDB (recomanat)",
-       "config-mysql-myisam": "MyISAM",
-       "config-mysql-myisam-dep": "<strong>Avís:</strong> Heu seleccionat MyISAM com a motor d'emmagatzemament de MySQL, que no és recomanat per utilitzar amb MediaWiki, perquè:\n* no té un bon suport de concurrència a causa del blocatge de les taules\n* té més tendència a corrompre's que altres motors\n* el codi base de MediaWiki no sempre gestiona MyISAM adequadament\n\nSi la vostra instal·lació de MySQL permet l'ús d'InnoDB, és molt més recomanable que l'utilitzeu.\nSi, per contra, no el permet. Potser val la pena que considereu actualitzar-la.",
-       "config-mysql-only-myisam-dep": "<strong>Avís:</strong> MyISAM és l'únic motor d'emmagatzemament de MySQL d'aquesta màquina, que no és recomanat per utilitzar amb MediaWiki, perquè:\n* no té un bon suport de concurrència a causa del blocatge de les taules\n* té més tendència a corrompre's que altres motors\n* el codi base de MediaWiki no sempre gestiona MyISAM adequadament\n\nLa vostra instal·lació de MySQL no permet l'ús d'InnoDB. Potser val la pena que considereu actualitzar-la.",
        "config-mysql-engine-help": "<strong>InnoDB</strong> és gairebé sempre la millor opció perquè té una bona implementació de concurrència.\n\n<strong>MyISAM</strong> pot ser més ràpid en instal·lacions d'un únic usuari o de només lectura.\nLes bases de dades MyISAM tendeixen a corrompre's més sovint que les InnoDB.",
        "config-mssql-auth": "Tipus d'autenticació:",
        "config-mssql-install-auth": "Seleccioneu el tipus d'autenticació que s'utilitzarà per connectar-se amb el servidor de base de dades durant el procés d'instal·lació.\nSi seleccioneu «{{int:config-mssql-windowsauth}}», s'utilitzaran les credencials de l'usuari amb què s'executa el servidor web.",
        "config-license-gfdl": "GNU Free Documentation License 1.3 o posterior",
        "config-license-pd": "Domini públic",
        "config-license-cc-choose": "Selecció d'una llicència personalitzada de Creative Commons",
+       "config-license-help": "Molts wikis públics posen totes llurs contribucions sota una [https://freedomdefined.org/Definició llicència lliure].\nAixò ajuda a crear un sentit de propietat de comunitat i anima les contribucions de llarg termini.\nNo és generalment necessari per a un wiki privat o corporatiu.\n\nSi voleu ser capaç d'utilitzar text de la Viquipèdia, i voleu que la Viquipèdia pugui acceptar text copiat del vostre wiki, hauríeu de triar <strong>{{int:config-license-cc-by-sa}}</strong>.\n\nLa Viquipèdia abans utilitzava la Llicència de documentació lliure de GNU.\nEl GFDL és una llicència vàlida, però difícil d'entendre.\nÉs també difícil reutilitzar contingut sota la GFDL.",
        "config-email-settings": "Paràmetres del correu electrònic",
        "config-enable-email": "Habilita el correu sortint",
        "config-enable-email-help": "Si voleu que el correu electrònic funcioni, cal configurar [https://www.php.net/manual/en/mail.configuration.php PHP's els paràmetres de correu] correctament.\nSi no voleu cap funcionalitat de correu, podeu inhabilitar-ho.",
index be482e9..baba3e2 100644 (file)
@@ -27,7 +27,7 @@
        "config-page-copying": "Лицензи",
        "config-page-upgradedoc": "Карлаяккхар",
        "config-page-existingwiki": "Йолуш йолу вики",
-       "config-copyright": "=== Авторан бакъонаш а хьал а ===\n\n$1\nMediaWiki ю маьрша программин латораг, шу йиш ю фондас арахецна йолу GNU General Public License лицензица и яржо я хийца а.\n\nMediaWiki яржош ю и шуна пайдане хир яц те аьлла, амма цхьа юкъарахилар доцуш. Хь. кхин. лицензи мадарра GNU General Public License .\n\nШоьга кхача езаш яра [{{SERVER}}{{SCRIPTPATH}}/COPYING копи GNU General Public License] хӀокху программица, кхаьчна яцахь язъе Free Software Foundation, Inc., адрес тӀе: 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA я [https://www.gnu.org/licenses/old-licenses/gpl-2.0.html еша и онлайнехь].",
+       "config-welcome-section-copyright": "=== Авторан бакъонаш а хьал а ===\n\n$1\nMediaWiki ю маьрша программин латораг, шу йиш ю фондас арахецна йолу GNU General Public License лицензица и яржо я хийца а.\n\nMediaWiki яржош ю и шуна пайдане хир яц те аьлла, амма цхьа юкъарахилар доцуш. Хь. кхин. лицензи мадарра GNU General Public License .\n\nШоьга кхача езаш яра [$2 копи GNU General Public License] хӀокху программица, кхаьчна яцахь язъе Free Software Foundation, Inc., адрес тӀе: 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA я [https://www.gnu.org/licenses/old-licenses/gpl-2.0.html еша и онлайнехь].",
        "config-no-fts3": "'''Тергам бе''': SQLite гулйина хуттург йоцуш [//sqlite.org/fts3.html FTS3] — лахар болхбеш хир дац оцу бухца.",
        "config-no-cli-uri": "'''ДӀахьедар''': <code>--scriptpath</code> параметр язйина яц, иза Ӏадйитаран кепаца лелош ю: <code>$1</code> .",
        "config-db-name": "Хаамийн базан цӀе:",
index ad412d7..aef912c 100644 (file)
@@ -53,7 +53,7 @@
        "config-help-restart": "Chcete smazat všechny údaje, které jste zadali, a spustit proces instalace znovu od začátku?",
        "config-restart": "Ano, restartovat",
        "config-welcome": "=== Kontrola prostředí ===\nNyní se provedou základní kontroly, aby se zjistilo, zda je toto prostředí použitelné k instalaci MediaWiki.\nPokud budete potřebovat k dokončení instalace pomoc, nezapomeňte sdělit výsledky těchto testů.",
-       "config-copyright": "=== Licence a podmínky ===\n$1\n\nTento program je svobodný software; můžete jej šířit nebo modifikovat podle podmínek GNU General Public License, vydávané Free Software Foundation; buď verze 2 této licence anebo (podle vašeho uvážení) kterékoli pozdější verze.\n\nTento program je distribuován v naději, že bude užitečný, avšak '''bez jakékoli záruky'''; neposkytují se ani odvozené záruky '''prodejnosti''' anebo '''vhodnosti pro určitý účel'''.\nPodrobnosti se dočtete v textu GNU General Public License.\n\n<doclink href=Copying>Kopii GNU General Public License</doclink> jste měli obdržet spolu s tímto programem; pokud ne, napište na Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA nebo [https://www.gnu.org/copyleft/gpl.html si ji přečtěte online].",
+       "config-welcome-section-copyright": "=== Licence a podmínky ===\n$1\n\nTento program je svobodný software; můžete jej šířit nebo modifikovat podle podmínek GNU General Public License, vydávané Free Software Foundation; buď verze 2 této licence anebo (podle vašeho uvážení) kterékoli pozdější verze.\n\nTento program je distribuován v naději, že bude užitečný, avšak '''bez jakékoli záruky'''; neposkytují se ani odvozené záruky '''prodejnosti''' anebo '''vhodnosti pro určitý účel'''.\nPodrobnosti se dočtete v textu GNU General Public License.\n\n[$2 Kopii GNU General Public License] jste měli obdržet spolu s tímto programem; pokud ne, napište na Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA nebo [https://www.gnu.org/copyleft/gpl.html si ji přečtěte online].",
        "config-sidebar": "* [https://www.mediawiki.org Oficiální web MediaWiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Uživatelská příručka]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents Administrátorská příručka]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ FAQ]",
        "config-sidebar-readme": "Čti mě",
        "config-sidebar-relnotes": "Poznámky k vydání",
        "config-db-web-no-create-privs": "Účet uvedený pro instalaci nemá oprávnění dostatečná pro založení nového účtu.\nÚčet, který zde uvedete, již musí existovat.",
        "config-mysql-engine": "Typ úložiště:",
        "config-mysql-innodb": "InnoDB (doporučeno)",
-       "config-mysql-myisam": "MyISAM",
-       "config-mysql-myisam-dep": "<strong>Upozornění:</strong> Jako typ úložiště pro MySQL jste zvolili MyISAM, které není pro použití v MediaWiki doporučeno, neboť:\n* stěží podporuje současný přístup kvůli zamykání tabulek,\n* je náchylnější na poškození dat než jiná úložiště,\n* kód MediaWiki nepodporuje MyISAM vždy tak dobře, jak by měl.\n\nPokud vaše instalace MySQL podporuje InnoDB, důrazně doporučujeme použít spíše to.\nPokud vaše instalace MySQL InnoDB nepodporuje, možná je čas na aktualizaci.",
-       "config-mysql-only-myisam-dep": "<strong>Upozornění:</strong> Jediným dostupným úložištěm dat pro MySQL je MyISAM, který se k užití s MediaWiki nedoporučuje, neboť:\n* téměř nepodporuje paralelní přístup kvůli zamykání tabulek,\n* oproti jiným formátům je náchylnější k poškození,\n* MediaWiki nepodporuje MyISAM tak dobře, jak by bylo třeba.\n\nVaše instalace MySQL nepodporuje InnoDB, možná je na čase upgradovat.",
        "config-mysql-engine-help": "'''InnoDB''' je téměř vždy nejlepší volba, neboť má dobrou podporu současného přístupu.\n\n'''MyISAM''' může být rychlejší u instalací pro jednoho uživatele nebo jen pro čtení.\nDatabáze MyISAM bývají poškozeny častěji než databáze InnoDB.",
        "config-mssql-auth": "Typ autentizace:",
        "config-mssql-install-auth": "Zvolte si typ autentizace, který se bude používat pro připojení k databázi v průběhu instalace.\nPokud zvolíte možnost „{{int:config-mssql-windowsauth}}“, použijí se přihlašovací údaje uživatele, pod kterým běží webový server.",
index f7df024..38bb36b 100644 (file)
@@ -39,7 +39,6 @@
        "config-wincache": "[https://www.iis.net/downloads/microsoft/wincache-extension WinCache] je wjinstalowóny",
        "config-diff3-bad": "Felënk GNU diff3.",
        "config-mysql-innodb": "InnoDB",
-       "config-mysql-myisam": "MyISAM",
        "config-site-name": "Miono wiki:",
        "config-site-name-blank": "Wpiszë miono starnów.",
        "config-ns-other-default": "MòjôWiki",
index 3798468..8924964 100644 (file)
@@ -69,7 +69,6 @@
        "config-sqlite-cant-create-db": "Kunne ikke oprette databasefilen <code>$1</code>.",
        "config-db-web-create": "Opret kontoen hvis den ikke allerede findes",
        "config-mysql-innodb": "InnoDB (anbefalet)",
-       "config-mysql-myisam": "MyISAM",
        "config-mssql-windowsauth": "Windows-godkendelse",
        "config-site-name": "Navn på wiki:",
        "config-site-name-blank": "Indtast et hjemmesidenavn.",
index d307c8d..f10530e 100644 (file)
@@ -5,7 +5,7 @@
                        "Das Schäfchen"
                ]
        },
-       "config-copyright": "=== Lizenz und Nutzungsbedingungen ===\n\n$1\n\nDieses Programm ist freie Software, d. h. es kann, gemäss den Bedingungen der von der Free Software Foundation veröffentlichten ''GNU General Public License'', weiterverteilt und/oder modifiziert werden. Dabei kann die Version 2, oder nach eigenem Ermessen, jede neuere Version der Lizenz verwendet werden.\n\nDieses Programm wird in der Hoffnung verteilt, dass es nützlich sein wird, allerdings '''ohne jegliche Garantie''' und sogar ohne die implizierte Garantie einer '''Marktgängigkeit''' oder '''Eignung für einen bestimmten Zweck'''. Hierzu sind weitere Hinweise in der ''GNU General Public License'' enthalten.\n\nEine <doclink href=Copying>Kopie der GNU General Public License</doclink> sollte zusammen mit diesem Programm verteilt worden sein. Sofern dies nicht der Fall war, kann eine Kopie bei der Free Software Foundation Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA, schriftlich angefordert oder auf deren Website [https://www.gnu.org/copyleft/gpl.html online gelesen] werden.",
+       "config-welcome-section-copyright": "=== Lizenz und Nutzungsbedingungen ===\n\n$1\n\nDieses Programm ist freie Software, d. h. es kann, gemäss den Bedingungen der von der Free Software Foundation veröffentlichten ''GNU General Public License'', weiterverteilt und/oder modifiziert werden. Dabei kann die Version 2, oder nach eigenem Ermessen, jede neuere Version der Lizenz verwendet werden.\n\nDieses Programm wird in der Hoffnung verteilt, dass es nützlich sein wird, allerdings '''ohne jegliche Garantie''' und sogar ohne die implizierte Garantie einer '''Marktgängigkeit''' oder '''Eignung für einen bestimmten Zweck'''. Hierzu sind weitere Hinweise in der ''GNU General Public License'' enthalten.\n\nEine [$2 Kopie der GNU General Public License] sollte zusammen mit diesem Programm verteilt worden sein. Sofern dies nicht der Fall war, kann eine Kopie bei der Free Software Foundation Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA, schriftlich angefordert oder auf deren Website [https://www.gnu.org/copyleft/gpl.html online gelesen] werden.",
        "config-unicode-pure-php-warning": "'''Warnung:''' Die [https://pecl.php.net/intl PECL-Erweiterung intl] ist für die Unicode-Normalisierung nicht verfügbar, so dass stattdessen die langsame pure-PHP-Implementierung genutzt wird.\nSofern eine Website mit grosser Benutzeranzahl betrieben wird, sollten weitere Informationen auf der Webseite [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations Unicode-Normalisierung (en)] gelesen werden.",
        "config-uploads-not-safe": "'''Warnung:''' Das Standardverzeichnis für hochgeladene Dateien <code>$1</code> ist für die willkürliche Ausführung von Skripten anfällig.\nObwohl MediaWiki die hochgeladenen Dateien auf Sicherheitsrisiken überprüft, wird dennoch dringend empfohlen, diese [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security#Upload_security Sicherheitslücke] zu schliessen, bevor das Hochladen von Dateien aktiviert wird.",
        "config-license-help": "Viele öffentliche Wikis publizieren alle Beiträge unter einer [https://freedomdefined.org/Definition/De freien Lizenz.]\nDies trägt dazu bei, ein Gefühl von Gemeinschaft zu schaffen, und ermutigt zu längerfristiger Mitarbeit.\nHingegen ist im Allgemeinen eine freie Lizenz auf geschlossenen Wikis nicht notwendig.\n\nSofern man Texte aus der Wikipedia verwenden möchte und umgekehrt, sollte die ''Creative-Commons''-Lizenz „Namensnennung – Weitergabe unter gleichen Bedingungen“ gewählt werden.\n\nDie Wikipedia nutzte vormals die GNU-Lizenz für freie Dokumentation (GFDL).\nDie GFDL ist eine gültige Lizenz, die allerdings schwer zu verstehen ist.\nEs ist zudem schwierig, gemäss dieser Lizenz lizenzierte Inhalte wiederzuverwenden."
index 6bf9921..bdf1c6f 100644 (file)
@@ -56,7 +56,7 @@
        "config-help-restart": "Sollen alle bereits eingegebenen Daten gelöscht und der Installationsvorgang erneut gestartet werden?",
        "config-restart": "Ja, erneut starten",
        "config-welcome": "=== Prüfung der Installationsumgebung ===\nDie Basisprüfungen werden jetzt durchgeführt, um festzustellen, ob die Installationsumgebung für MediaWiki geeignet ist.\nNotiere diese Informationen und gib sie an, sofern du Hilfe beim Installieren benötigst.",
-       "config-copyright": "=== Lizenz und Nutzungsbedingungen ===\n\n$1\n\nDieses Programm ist freie Software, d. h. es kann, gemäß den Bedingungen der von der Free Software Foundation veröffentlichten ''GNU General Public License'', weiterverteilt und/oder modifiziert werden. Dabei kann die Version 2, oder nach eigenem Ermessen, jede neuere Version der Lizenz verwendet werden.\n\nDieses Programm wird in der Hoffnung verteilt, dass es nützlich sein wird, allerdings '''ohne jegliche Garantie''' und sogar ohne die implizierte Garantie einer '''Marktgängigkeit''' oder '''Eignung für einen bestimmten Zweck'''. Hierzu sind weitere Hinweise in der ''GNU General Public License'' enthalten.\n\nEine <doclink href=Copying>Kopie der GNU General Public License</doclink> sollte zusammen mit diesem Programm verteilt worden sein. Sofern dies nicht der Fall war, kann eine Kopie bei der Free Software Foundation Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA, schriftlich angefordert oder auf deren Website [https://www.gnu.org/copyleft/gpl.html online gelesen] werden.",
+       "config-welcome-section-copyright": "=== Lizenz und Nutzungsbedingungen ===\n\n$1\n\nDieses Programm ist freie Software, d. h. es kann, gemäß den Bedingungen der von der Free Software Foundation veröffentlichten ''GNU General Public License'', weiterverteilt und/oder modifiziert werden. Dabei kann die Version 2, oder nach eigenem Ermessen, jede neuere Version der Lizenz verwendet werden.\n\nDieses Programm wird in der Hoffnung verteilt, dass es nützlich sein wird, allerdings '''ohne jegliche Garantie''' und sogar ohne die implizierte Garantie einer '''Marktgängigkeit''' oder '''Eignung für einen bestimmten Zweck'''. Hierzu sind weitere Hinweise in der ''GNU General Public License'' enthalten.\n\nEine [$2 Kopie der GNU General Public License] sollte zusammen mit diesem Programm verteilt worden sein. Sofern dies nicht der Fall war, kann eine Kopie bei der Free Software Foundation Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA, schriftlich angefordert oder auf deren Website [https://www.gnu.org/copyleft/gpl.html online gelesen] werden.",
        "config-sidebar": "* [https://www.mediawiki.org/wiki/MediaWiki/de Website von MediaWiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents/de Benutzer­anleitung]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents/de Administratoren­anleitung]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ/de Häufig gestellte Fragen]\n----\n* <doclink href=Readme>Lies mich</doclink>\n* <doclink href=ReleaseNotes>Versions­informationen</doclink>\n* <doclink href=Copying>Lizenz­bestimmungen</doclink>\n* <doclink href=UpgradeDoc>Aktualisierung</doclink>",
        "config-env-good": "Die Installationsumgebung wurde geprüft.\nMediaWiki kann installiert werden.",
        "config-env-bad": "Die Installationsumgebung wurde geprüft.\nMediaWiki kann nicht installiert werden.",
        "config-db-web-no-create-privs": "Das angegebene und für den Installationsvorgang vorgesehene Datenbankkonto verfügt nicht über ausreichend Berechtigungen, um ein weiteres Datenbankkonto zu erstellen.\nDas hier angegebene Datenbankkonto muss daher bereits vorhanden sein.",
        "config-mysql-engine": "Datenbanksystem:",
        "config-mysql-innodb": "InnoDB (empfohlen)",
-       "config-mysql-myisam": "MyISAM",
-       "config-mysql-myisam-dep": "<strong>Warnung:</strong> Es wurde MyISAM als Speichersubsystem für das Datenbanksystem MySQL ausgewählt. Aus folgenden Gründen wird es nicht für den Einsatz mit MediaWiki empfohlen:\n* Es unterstützt aufgrund von Tabellensperrungen kaum die nebenläufige Ausführung von Aktionen.\n* Es ist anfälliger für Datenprobleme.\n* Es wird von MediaWiki nicht immer adäquat unterstützt.\n\nSofern die vorhandene MySQL-Installation das Speichersubsystem InnoDB unterstützt, wird deren Verwendung eindringlich empfohlen.\nSofern sie es nicht unterstützt, sollte nunmehr eine entsprechende Aktualisierung in Erwägung gezogen werden.",
-       "config-mysql-only-myisam-dep": "<strong>Warnung:</strong> MyISAM ist das einzige verfügbare Speichersubsystem für das Datenbanksystem MySQL auf diesem Server. Es wird nicht für die Verwendung mit MediaWiki empfohlen, da es\n* aufgrund von Tabellensperrungen kaum die nebenläufige Ausführung von Aktionen unterstützt,\n* anfälliger für Datenprobleme ist und\n* von MediaWiki nicht immer adäquat unterstützt wird.\n\nDeine MySQL-Installation unterstützt nicht das Speichersubsystem InnoDB. Eine Aktualisierung wird nunmehr empfohlen.",
        "config-mysql-engine-help": "<strong>InnoDB</strong> als Speichersubsystem für das Datenbanksystem MySQL ist fast immer die bessere Wahl, da es gleichzeitige Zugriffe gut unterstützt.\n\n<strong>MyISAM</strong> als Speichersubsystem für das Datenbanksystem MySQL ist hingegen in Einzelnutzerumgebungen oder bei schreibgeschützten Wikis schneller.\nDatenbanken, die MyISAM verwenden, sind indes tendenziell fehleranfälliger als solche, die InnoDB verwenden.",
        "config-mssql-auth": "Authentifikationstyp:",
        "config-mssql-install-auth": "Wähle den Authentifikationstyp aus, der zur Verbindung mit der Datenbank während des Installationsprozesses verwendet wird.\nFalls du „{{int:config-mssql-windowsauth}}“ auswählst, werden die Anmeldeinformationen eines beliebigen Benutzers verwendet, der den Webserver ausführt.",
index 21c7249..d596784 100644 (file)
@@ -58,7 +58,6 @@
        "config-missing-db-server-oracle": "\"{{int:config-db-host-oracle}}\" rë jew erc gerek keno",
        "config-mysql-engine": "Motorë depok kerdışi",
        "config-mysql-innodb": "InnoDB",
-       "config-mysql-myisam": "MyISAM",
        "config-mssql-sqlauth": "SQL Server araştnayış",
        "config-mssql-windowsauth": "Windows kamiye araştnayış",
        "config-site-name": "Namey wiki:",
index 896a453..c5b07fa 100644 (file)
@@ -41,7 +41,7 @@
        "config-help-restart": "Do you want to clear all saved data that you have entered and restart the installation process?",
        "config-restart": "हुन्छ, पुनः सुचारू गद्दे",
        "config-welcome": "=== Environmental checks ===\nBasic checks will now be performed to see if this environment is suitable for MediaWiki installation.\nRemember to include this information if you seek support on how to complete the installation.",
-       "config-copyright": "=== Copyright and Terms ===\n\n$1\n\nThis program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but <strong>without any warranty</strong>; without even the implied warranty of <strong>merchantability</strong> or <strong>fitness for a particular purpose</strong>.\nSee the GNU General Public License for more details.\n\nYou should have received <doclink href=Copying>a copy of the GNU General Public License</doclink> along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA, or [https://www.gnu.org/copyleft/gpl.html read it online].",
+       "config-welcome-section-copyright": "=== Copyright and Terms ===\n\n$1\n\nThis program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but <strong>without any warranty</strong>; without even the implied warranty of <strong>merchantability</strong> or <strong>fitness for a particular purpose</strong>.\nSee the GNU General Public License for more details.\n\nYou should have received [$2 a copy of the GNU General Public License] along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA, or [https://www.gnu.org/copyleft/gpl.html read it online].",
        "config-sidebar": "* [https://www.mediawiki.org MediaWiki home]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents User's Guide]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents Administrator's Guide]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ FAQ]\n----\n* <doclink href=Readme>Read me</doclink>\n* <doclink href=ReleaseNotes>Release notes</doclink>\n* <doclink href=Copying>Copying</doclink>\n* <doclink href=UpgradeDoc>Upgrading</doclink>",
        "config-env-good": "The environment has been checked.\nYou can install MediaWiki.",
        "config-env-bad": "The environment has been checked.\nYou cannot install MediaWiki.",
index b7a4e06..97b4fd3 100644 (file)
@@ -52,7 +52,7 @@
        "config-help-restart": "Θέλετε να καταργήσετε όλα τα αποθηκευμένα δεδομένα που έχετε εισαγάγει και να επανεκκινήσετε τη διαδικασία εγκατάστασης;",
        "config-restart": "Ναι, επανεκκίνηση",
        "config-welcome": "=== Έλεγχοι του περιβάλλοντος ===\nΤώρα θα γίνουν βασικοί έλεγχοι για να δούμε αν αυτό το περιβάλλον είναι κατάλληλο για την εγκατάσταση του MediaWiki.\nΘυμηθείτε να συμπεριλάβετε αυτές τις πληροφορίες εάν αναζητήσετε υποστήριξη για να ολοκληρώσετε την εγκατάσταση.",
-       "config-copyright": "=== Πνευματικά δικαιώματα και όροι ===\n\n$1\n\nΑυτό το πρόγραμμα είναι ελεύθερο λογισμικό· μπορείτε να το αναδιανείμετε ή/και να το τροποποιήσετε υπό τους όρους της Γενικής Άδειας Δημόσιας Χρήσης GNU, όπως αυτή δημοσιεύεται από το Ίδρυμα Ελεύθερου Λογισμικού· είτε της έκδοσης 2 της Άδειας, είτε (κατ' επιλογήν σας) οποιασδήποτε μεταγενέστερης έκδοσης.\n\nΑυτό το πρόγραμμα διανέμεται με την ελπίδα ότι θα είναι χρήσιμο, αλλά <strong>χωρίς καμία εγγύηση</strong>· χωρίς καν τη σιωπηρή εγγύηση της <strong>εμπορευσιμότητας</strong> ή <strong>καταλληλότητας για συγκεκριμένο σκοπό</strong>.\nΔείτε τη Γενική Άδεια Δημόσιας Χρήσης GNU για περισσότερες λεπτομέρειες.\n\nΘα πρέπει να έχετε παραλάβει <doclink href=\"Copying\">ένα αντίγραφο της Γενικής Άδειας Δημόσιας Χρήσης GNU</doclink> μαζί με αυτό το πρόγραμμα· αν όχι, στείλτε ένα γράμμα στο Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA, ή [https://www.gnu.org/copyleft/gpl.html διαβάστε το διαδικτυακά].",
+       "config-welcome-section-copyright": "=== Πνευματικά δικαιώματα και όροι ===\n\n$1\n\nΑυτό το πρόγραμμα είναι ελεύθερο λογισμικό· μπορείτε να το αναδιανείμετε ή/και να το τροποποιήσετε υπό τους όρους της Γενικής Άδειας Δημόσιας Χρήσης GNU, όπως αυτή δημοσιεύεται από το Ίδρυμα Ελεύθερου Λογισμικού· είτε της έκδοσης 2 της Άδειας, είτε (κατ' επιλογήν σας) οποιασδήποτε μεταγενέστερης έκδοσης.\n\nΑυτό το πρόγραμμα διανέμεται με την ελπίδα ότι θα είναι χρήσιμο, αλλά <strong>χωρίς καμία εγγύηση</strong>· χωρίς καν τη σιωπηρή εγγύηση της <strong>εμπορευσιμότητας</strong> ή <strong>καταλληλότητας για συγκεκριμένο σκοπό</strong>.\nΔείτε τη Γενική Άδεια Δημόσιας Χρήσης GNU για περισσότερες λεπτομέρειες.\n\nΘα πρέπει να έχετε παραλάβει [$2 ένα αντίγραφο της Γενικής Άδειας Δημόσιας Χρήσης GNU] μαζί με αυτό το πρόγραμμα· αν όχι, στείλτε ένα γράμμα στο Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA, ή [https://www.gnu.org/copyleft/gpl.html διαβάστε το διαδικτυακά].",
        "config-sidebar": "* [https://www.mediawiki.org Αρχική MediaWiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Οδηγός Χρήστη]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents Οδηγός Διαχειριστή]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Συχνές ερωτήσεις]\n----\n* <doclink href=\"Readme\">Διαβάστε με</doclink>\n* <doclink href=\"ReleaseNotes\">Σημειώσεις έκδοσης</doclink>\n* <doclink href=\"Copying\">Αντιγραφή</doclink>\n* <doclink href=\"UpgradeDoc\">Αναβάθμιση</doclink>",
        "config-env-good": "Το περιβάλλον έχει ελεγχθεί.\nΜπορείτε να εγκαταστήσετε το MediaWiki.",
        "config-env-bad": "Το περιβάλλον έχει ελεγχθεί.\nΔεν μπορείτε να εγκαταστήσετε το MediaWiki.",
        "config-db-web-create": "Να δημιουργηθεί ο λογαριασμός αν δεν υπάρχει ήδη",
        "config-mysql-engine": "Μηχανή αποθήκευσης:",
        "config-mysql-innodb": "InnoDB",
-       "config-mysql-myisam": "MyISAM",
        "config-mysql-engine-help": "Το <strong>InnoDB</strong> είναι σχεδόν πάντα η καλύτερη επιλογή, αφού έχει καλή υποστήριξη ταυτόχρονης λειτουργίας.\n\nΤο <strong>MyISAM</strong> μπορεί να είναι ταχύτερο σε εγκαταστάσεις του ενός χρήστη ή μόνο ανάγνωσης. \nΟι βάσεις δεδομένων MyISAM τείνουν να φθείρονται συχνότερα από τις βάσεις δεδομένων InnoDB.",
        "config-mssql-auth": "Τύπος ελέγχου ταυτότητας:",
        "config-mssql-sqlauth": "Έλεγχος ταυτότητας του SQL Server",
index 7476c89..7f81a88 100644 (file)
@@ -8,7 +8,7 @@
        "config-desc": "The installer for MediaWiki",
        "config-title": "MediaWiki $1 installation",
        "config-information": "Information",
-       "config-copyright": "=== Copyright and Terms ===\n\n$1\n\nThis program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public Licence as published by the Free Software Foundation; either version 2 of the Licence, or (at your option) any later version.\n\nThis 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'''.\nSee the GNU General Public Licence for more details.\n\nYou should have received <doclink href=Copying>a copy of the GNU General Public Licence</doclink> along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. or [https://www.gnu.org/copyleft/gpl.html read it online].",
+       "config-welcome-section-copyright": "=== Copyright and Terms ===\n\n$1\n\nThis program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public Licence as published by the Free Software Foundation; either version 2 of the Licence, or (at your option) any later version.\n\nThis 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'''.\nSee the GNU General Public Licence for more details.\n\nYou should have received [$2 a copy of the GNU General Public Licence] along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. or [https://www.gnu.org/copyleft/gpl.html read it online].",
        "config-unicode-using-intl": "Using the [https://pecl.php.net/intl intl PECL extension] for Unicode normalisation.",
        "config-unicode-pure-php-warning": "'''Warning:''' The [https://pecl.php.net/intl intl PECL extension] is not available to handle Unicode normalisation, falling back to slow pure-PHP implementation.\nIf you run a high-traffic site, you should read a little on [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations Unicode normalisation].",
        "config-unicode-update-warning": "'''Warning:''' The installed version of the Unicode normalisation wrapper uses an older version of [http://site.icu-project.org/ the ICU project's] library.\nYou should [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations upgrade] if you are at all concerned about using Unicode.",
index 52d8d3d..a9da56d 100644 (file)
        "config-db-web-no-create-privs": "The account you specified for installation does not have enough privileges to create an account.\nThe account you specify here must already exist.",
        "config-mysql-engine": "Storage engine:",
        "config-mysql-innodb": "InnoDB (recommended)",
-       "config-mysql-myisam": "MyISAM",
-       "config-mysql-myisam-dep": "<strong>Warning:</strong> You have selected MyISAM as storage engine for MySQL, which is not recommended for use with MediaWiki, because:\n* it barely supports concurrency due to table locking\n* it is more prone to corruption than other engines\n* the MediaWiki codebase does not always handle MyISAM as it should\n\nIf your MySQL installation supports InnoDB, it is highly recommended that you choose that instead.\nIf your MySQL installation does not support InnoDB, maybe it's time for an upgrade.",
-       "config-mysql-only-myisam-dep": "<strong>Warning:</strong> MyISAM is the only available storage engine for MySQL on this machine, and this is not recommended for use with MediaWiki, because:\n* it barely supports concurrency due to table locking\n* it is more prone to corruption than other engines\n* the MediaWiki codebase does not always handle MyISAM as it should\n\nYour MySQL installation does not support InnoDB, maybe it's time for an upgrade.",
        "config-mysql-engine-help": "<strong>InnoDB</strong> is almost always the best option, since it has good concurrency support.\n\n<strong>MyISAM</strong> may be faster in single-user or read-only installations.\nMyISAM databases tend to get corrupted more often than InnoDB databases.",
        "config-mssql-auth": "Authentication type:",
        "config-mssql-install-auth": "Select the authentication type that will be used to connect to the database during the installation process.\nIf you select \"{{int:config-mssql-windowsauth}}\", the credentials of whatever user the webserver is running as will be used.",
index 6d52241..3f83612 100644 (file)
@@ -75,7 +75,6 @@
        "config-regenerate": "Refari dosieron LocalSettings.php →",
        "config-mysql-engine": "Konservada modulo:",
        "config-mysql-innodb": "InnoDB (rekomendata)",
-       "config-mysql-myisam": "MyISAM",
        "config-mssql-auth": "Speco de aŭtentokontrolo:",
        "config-mssql-sqlauth": "Aŭtentokontrolo de Microsoft SQL-Servilo",
        "config-mssql-windowsauth": "Aŭtentokontrolo de Windows",
index 196e2d4..5e3d3a1 100644 (file)
@@ -81,7 +81,7 @@
        "config-help-restart": "¿Deseas borrar todos los datos guardados que has escrito y reiniciar el proceso de instalación?",
        "config-restart": "Sí, reiniciarlo",
        "config-welcome": "=== Comprobación del entorno ===\nAhora se van a realizar comprobaciones básicas para ver si el entorno es adecuado para la instalación de MediaWiki.\nRecuerda suministrar los resultados de tales comprobaciones si necesitas ayuda para completar la instalación.",
-       "config-copyright": "=== Derechos de autor y Términos de uso ===\n\n$1\n\nEste programa es software libre; puedes redistribuirlo y/o modificarlo en los términos de la Licencia Pública General de GNU, tal como aparece publicada por la Fundación para el Software Libre, tanto la versión 2 de la Licencia, como cualquier versión posterior (según prefieras).\n\nEste programa es distribuido con la esperanza de que sea útil, pero <strong>sin ninguna garantía</strong>; inclusive, sin la garantía implícita de la <strong>posibilidad de ser comercializado</strong> o de <strong>idoneidad para cualquier finalidad específica</strong>.\nConsulta la Licencia Pública General de GNU para más detalles.\n\nEn conjunto con este programa debes haber recibido <doclink href=Copying>una copia de la Licencia Pública General de GNU</doclink>; caso contrario, pídela por escrito a la Fundación para el Software Libre, Inc., 51 Franklin Street, Fifth Floor, Boston, ME La 02110-1301, USA o [https://www.gnu.org/copyleft/gpl.html léela en Internet].",
+       "config-welcome-section-copyright": "=== Derechos de autor y Términos de uso ===\n\n$1\n\nEste programa es software libre; puedes redistribuirlo y/o modificarlo en los términos de la Licencia Pública General de GNU, tal como aparece publicada por la Fundación para el Software Libre, tanto la versión 2 de la Licencia, como cualquier versión posterior (según prefieras).\n\nEste programa es distribuido con la esperanza de que sea útil, pero <strong>sin ninguna garantía</strong>; inclusive, sin la garantía implícita de la <strong>posibilidad de ser comercializado</strong> o de <strong>idoneidad para cualquier finalidad específica</strong>.\nConsulta la Licencia Pública General de GNU para más detalles.\n\nEn conjunto con este programa debes haber recibido [$2 una copia de la Licencia Pública General de GNU]; caso contrario, pídela por escrito a la Fundación para el Software Libre, Inc., 51 Franklin Street, Fifth Floor, Boston, ME La 02110-1301, USA o [https://www.gnu.org/copyleft/gpl.html léela en Internet].",
        "config-sidebar": "* [https://www.mediawiki.org Página principal de MediaWiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Guía de usuario]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents Guía para administradores]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Preguntas frecuentes]",
        "config-sidebar-readme": "Léeme",
        "config-sidebar-relnotes": "Informe de novedades",
        "config-db-web-no-create-privs": "La cuenta que has especificado para la instalación no tiene privilegios suficientes para crear una cuenta.\nLa cuenta que especifiques aquí ya debe existir.",
        "config-mysql-engine": "Motor de almacenamiento:",
        "config-mysql-innodb": "InnoDB",
-       "config-mysql-myisam": "MyISAM",
-       "config-mysql-myisam-dep": "<strong>Atención:</strong> has seleccionado MyISAM como motor de almacenamiento de MySQL, el cual no está recomendado para usarse con MediaWiki, porque:\n* apenas admite la concurrencia debido al bloqueo de tablas\n* es más propenso a daños que otros motores\n* el código MediaWiki no siempre controla MyISAM como debería\n\nSi tu instalación de MySQL admite InnoDB, es muy recomendable que lo elijas en su lugar.\nSi tu instalación de MySQL no admite InnoDB, quizás es el momento de una modernización.",
-       "config-mysql-only-myisam-dep": "<strong>Advertencia:</strong> solo se ha encontrado el motor de almacenamiento MyISAM para MySQL en esta máquina, y no se recomienda su uso con MediaWiki, porque:\n* apenas admite la concurrencia debido al bloqueo de tablas\n* es más propenso a daños que otros motores\n* el código de MediaWiki no siempre controla MyISAM como debería\n\nTu instalación de MySQL no admite InnoDB; quizás es el momento de una actualización.",
        "config-mysql-engine-help": "<strong>InnoDB</strong> es casi siempre la mejor opción, dado que soporta bien los accesos simultáneos.\n\n<strong>MyISAM</strong> puede ser más rápido en instalaciones con usuario único o de sólo lectura.\nLas bases de datos MyISAM tienden a corromperse más a menudo que las bases de datos InnoDB.",
        "config-mssql-auth": "Tipo de autenticación:",
        "config-mssql-install-auth": "Selecciona el tipo de autenticación que se utilizará para conectarse a la base de datos durante el proceso de instalación.\nSi seleccionas \"{{int:config-mssql-windowsauth}}\", se usarán las credenciales del usuario con el que se ejecuta el servidor web.",
index 61a1d2f..4e004f9 100644 (file)
@@ -46,7 +46,7 @@
        "config-help-restart": "Ezabatu nahi duzu gorde duzun  informazio guztia eta berrebiarazi instalazio prozesua?",
        "config-restart": "Bai, berriz hasi",
        "config-welcome": "=== Ingurumen-egiaztapenak ===\n\nOinarrizko kontrola burutzen ari da, ikusteko ia ingurumena aproposa da MediaWikia instalatzeko.\nLaguntza behar izanez gero instalazio prozesua amaitzeko ez ahaztu sartzea informazio hau .",
-       "config-copyright": "=== Copyright eta terminoak ===\n\n$1\n\nPrograma hau software librea da; birbana eta / edo alda dezakezu GNU Lizentzia Publiko Orokorraren baldintzapean, Free Software Foundation-ek argitaratutakoaren arabera; Lizentziaren 2. bertsioa edo (nahiago baduzu) bertsio berriago bat.\n\nPrograma hau baliagarria izango delakoan elkarbantzen da, baina <strong> bermerik gabe </ strong>; <strong> merkaturatze </ strong> edo <strong>  helburu jakin baterako gaitasuna</ strong> berme inplizitua ere izan gabe.\nIkus GNU Lizentzia Publiko Orokorra xehetasun gehiagorako.\n\n<Doclink href = Kopiatzea> izan beharko zenuke GNU Lizentzia Publiko Orokorraren kopia </ doclink> programa honekin batera; bestela, idatzi Free Software Foundation-en, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, AEB, edo [https://www.gnu.org/copyleft/gpl.html irakurri ezazu online]. .",
+       "config-welcome-section-copyright": "=== Copyright eta terminoak ===\n\n$1\n\nPrograma hau software librea da; birbana eta / edo alda dezakezu GNU Lizentzia Publiko Orokorraren baldintzapean, Free Software Foundation-ek argitaratutakoaren arabera; Lizentziaren 2. bertsioa edo (nahiago baduzu) bertsio berriago bat.\n\nPrograma hau baliagarria izango delakoan elkarbantzen da, baina <strong> bermerik gabe </ strong>; <strong> merkaturatze </ strong> edo <strong>  helburu jakin baterako gaitasuna</ strong> berme inplizitua ere izan gabe.\nIkus GNU Lizentzia Publiko Orokorra xehetasun gehiagorako.\n\n[$2 izan beharko zenuke GNU Lizentzia Publiko Orokorraren kopia] programa honekin batera; bestela, idatzi Free Software Foundation-en, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, AEB, edo [https://www.gnu.org/copyleft/gpl.html irakurri ezazu online]. .",
        "config-sidebar": "* [https://www.mediawiki.org MediaWiki nagusia]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Erabiltzaileentzako Gida]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents Administratzaileentzako Gida]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MEG]\n----\n* <doclink href=Readme>Irakur nazazu</doclink>\n* <doclink href=ReleaseNotes>Oharren argitalpena</doclink>\n* <doclink href=Copying>Kopiaketa</doclink>\n* <doclink href=UpgradeDoc>Eguneratzea</doclink>",
        "config-env-good": "Ingurumena egiaztatu egin da. \nMediaWiki instalatu ahal duzu.",
        "config-env-bad": "Ingurumena egiaztatu egin da.\nEzin duzu MediaWiki-a instalatu.",
        "config-db-web-no-create-privs": "Zehaztu duzun kontuak ez dauka pribilegio nahikoak kontu bat sortzeko.\nZehaztu duzun kontua existitu behar da.",
        "config-mysql-engine": "Biltegiratze motorea:",
        "config-mysql-innodb": "InnoDB",
-       "config-mysql-myisam": "MyISAM",
-       "config-mysql-myisam-dep": "<strong>Oharra:</strong> MyISAM MySQL biltegiratze-motor gisa aukeratu duzu, MediaWikirekin erabiltzeko gomendagarria ez dena honengatik:\n*taula blokeoak direla-eta gauza gutxi onartu ohi du\n*beste motore batzuek baino ustelkeria gehiago izateko aukerak ditu\n*MediaWiki-ren kode baseak ez du beti kudeatzen MyISAM behar bezala\n\nZure MySQL instalazioa InnoDB onartzen badu, hori aukeratzeko gomendatzen da.\nZure MySQL instalazioa InnoDB ez badu onartzen, baliteke bertsioa berritzeko ordua izatea.",
-       "config-mysql-only-myisam-dep": "<strong> Oharra: </strong> MyISAM makinaren MySQL biltegiratze motarako bakarra da, eta hau ez da MediaWiki-rekin erabiltzeko gomendatzen, honengatik:\n* maiztasunez taula blokeoek konkurrentzia ez dute onartzen \n* Beste motore batzuek baino ustelkeria gehiago izaten dute\n* MediaWiki-ren kodekak ez du beti kudeatzen MyISAM behar bezala\n\nZure MySQL instalazioak ez du InnoDB onartzen, agian bertsio berritzeko ordua da.",
        "config-mysql-engine-help": "<strong>InnoDB</strong> ia beti aukerarik onena da, konkurrentzia-laguntza ona duelako.\n\n<strong>MyISAM</strong> erabiltzaile bakarreko edo irakurketa bakarreko instalazioetan azkarragoa izan daiteke.\nMyISAM datu-basea gehiagokotan hondatuta ageri da InnoDB datu-baseareakin baino.",
        "config-mssql-auth": "Autentifikazio mota:",
        "config-mssql-install-auth": "Aukeratu instalazio prozesuan zehar datu-basera konektatzeko erabiliko den autentifikazio mota.\n\"{{Int: config-mssql-windowsauth}}\" hautatzen baduzu, web zerbitzariak duen edozein erabiltzailek erabiliko duen kredentziala erabiliko da.",
index a36635d..7cac681 100644 (file)
@@ -58,7 +58,7 @@
        "config-help-restart": "آیا می‌خواهید همهٔ اطلاعات ذخیره شده‌ای که وارد کرده‌اید را پاک کنید و دوباره روند نصب را شروع کنید؟",
        "config-restart": "بله، دوباره شروع کن",
        "config-welcome": "===بررسی‌های محیطی===\nبرای فهمیدن اینکه این محیط برای نصب مدیاویکی مناسب است، اکنون بررسی‌های اساسی انجام خواهد‌شد.\nاگر به دنبال پشتیبانی در چگونگی تکمیل نصب هستید،به یاد داشته باشید این اطلاعات را بگنجانید.",
-       "config-copyright": "=== حق رونوشت و شرایط ===\n\n$1\n\nاین برنامه، نرم‌افزاری آزاد است. می‌توانید تحت شرایط نگارش ۲ یا (بنا به نظر خود) هر نگارش جدیدتری از پروانهٔ جامع همگانی گنو که توسط بنیاد نرم‌افزار آزاد منتشر شده، بازنشرش کرده و/یا تغییرش دهید.\n\n\nاین برنامه با این امید توزیع شده که مفید باشد، ولی <strong>بدون هیچ ضمانتی</strong>، حتا ضمانت ضمنی <strong>معامله‌پذیری</strong> یا <strong>تناسب برای کاربردی خاص </strong>.\n\nبرای جزئیات بیشتر، پروانهٔ جامع همگانی گنو را ببینید.\n\n\nباید همراه این برنامه، <doclink href=Copying>نگارشی از پروانهٔ جامع همگانی گنو</doclink> را گرفته باشید. اگر چنین نیست، با بنیاد نرم‌افزار آزاد به نشانی 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA مکاتبه کرده یا [https://www.gnu.org/copyleft/gpl.html پروانه را برخط بخوانید].",
+       "config-welcome-section-copyright": "=== حق رونوشت و شرایط ===\n\n$1\n\nاین برنامه، نرم‌افزاری آزاد است. می‌توانید تحت شرایط نگارش ۲ یا (بنا به نظر خود) هر نگارش جدیدتری از پروانهٔ جامع همگانی گنو که توسط بنیاد نرم‌افزار آزاد منتشر شده، بازنشرش کرده و/یا تغییرش دهید.\n\n\nاین برنامه با این امید توزیع شده که مفید باشد، ولی <strong>بدون هیچ ضمانتی</strong>، حتا ضمانت ضمنی <strong>معامله‌پذیری</strong> یا <strong>تناسب برای کاربردی خاص </strong>.\n\nبرای جزئیات بیشتر، پروانهٔ جامع همگانی گنو را ببینید.\n\n\nباید همراه این برنامه، [$2 نگارشی از پروانهٔ جامع همگانی گنو] را گرفته باشید. اگر چنین نیست، با بنیاد نرم‌افزار آزاد به نشانی 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA مکاتبه کرده یا [https://www.gnu.org/copyleft/gpl.html پروانه را برخط بخوانید].",
        "config-sidebar": "* [//www.mediawiki.org صفحهٔ اصلی مدیاویکی]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents راهنمای کاربر]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents راهنمای مدیر]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ پرسش‌های رایج]\n----\n* <doclink href=Readme>مرا بخوان</doclink>\n* <doclink href=ReleaseNotes>یادداشت‌های انتشار</doclink>\n* <doclink href=Copying>نسخه برداری</doclink>\n* <doclink href=UpgradeDoc>ارتقا</doclink>",
        "config-env-good": "محیط بررسی شده‌است.\nشما می‌توانید مدیاویکی را نصب کنید.",
        "config-env-bad": "محیط بررسی شده‌است.\nشما نمی‌توانید مدیاویکی را نصب کنید.",
        "config-db-web-no-create-privs": "حسابی که شما برای نصب تعیین کردید،مزایای کافی برای ایجاد یک حساب را ندارد.\nحسابی که شما اینجا تعیین کرده‌اید باید در حال حاضر وجود داشته باشد.",
        "config-mysql-engine": "موتور ذخیره سازی:",
        "config-mysql-innodb": "اینودی‌بی (پیشنهاد می‌شود)",
-       "config-mysql-myisam": "می‌ای‌سم",
-       "config-mysql-myisam-dep": "'''هشدار:''' شما مای‌آی‌اس‌ای‌ام را به عنوان موتور ذخیره برای مای‌آی‌اس‌ای‌ام انتخاب کرده‌اید، که برای استفاده با مدیاویکی توصیه نمی‌شود زیرا:\n* به‌علت قفل شدن جدول اجمالاً به طور همزمان پشتیبانی می کند\n* بیشتر از دیگر موتورها برای از بین‌ رفتن مستعد است.\n* مبنای رمز مدیاویکی همیشه مای‌آی‌اس‌ای‌ام را همان طور که باید باشد،کنترل نمی‌کند\nاگر نصب مای‌اس‌کیو‌ال شما اینودی‌بی را پشتیبانی می‌کند،بسیار توصیه می‌شود  که در عوض ،آن را انتخاب کنید.\nاگر نصب مای‌اس‌کیو‌ال شما، اینودی‌بی را پشتیبانی نمی‌کند، ممکن است زمان ارتقاء رسیده باشد.",
-       "config-mysql-only-myisam-dep": "'''هشدار:''' مای‌آی‌اس‌ای‌ام تنها موتور ذخیره‌سازی اطلاعات برای مای‌اس‌کیو‌ال در این دستگاه است، و برای استفاده با مدیاویکی توصیه نمی‌شود، زیرا:\n* به‌علت قفل شدن جدول اجمالاً به طور همزمان پشتیبانی می کند\n* بیشتر از دیگر موتورها برای از بین‌ رفتن مستعد است.\n* مبنای رمز مدیاویکی همیشه مای‌آی‌اس‌ای‌ام را همان طور که باید باشد،کنترل نمی‌کند\nنصب مای‌اس‌کیو‌ال شما اینودی‌بی را پشتیبانی نمی‌کند،ممکن است زمان یک ارتقاء رسیده باشد.",
        "config-mysql-engine-help": "'''اینودی‌بی''' تقریباً همیشه بهترین گزینه است،زیرا پشتیبانی همزمان خوبی دارد.\n'''مای‌آی‌اس‌ای‌ام''' ممکن است در نصب‌های کاربر جداگانه یا فقط خواندنی سریع‌تر باشد.\nپایگاه‌های اطلاعاتی مای‌آی‌اس‌ای‌ام اغلب بیشتر از پایگاه‌های اطلاعاتی اینودی‌بی مستعد ازبین رفتن هستند.",
        "config-mssql-auth": "نوع تأیید:",
        "config-mssql-install-auth": "نوع تأییدی را که برای اتصال به پایگاه اطلاعاتی حین فرآیند نصب مورد استفاده قرار گیرد را انتخاب کنید.\nاگر \"{{int:config-mssql-windowsauth}}\" را انتخاب می‌کنید، اعتبارات هرآنچه کاربر وب سرور به عنوان آن  مورد استفاده قرار می‌دهد مورد استفاده قرار خواهد گرفت.",
index fbc80f8..8c338f8 100644 (file)
@@ -63,7 +63,7 @@
        "config-help-restart": "Haluatko poistaa kaikki annetut tiedot ja aloittaa asennuksen alusta?",
        "config-restart": "Kyllä",
        "config-welcome": "=== Ympäristön tarkistukset ===\nVarmistetaan MediaWikin asennettavuus tähän ympäristöön.\nMuista antaa nämä tiedot, jos tarvitset apua asennuksen aikana.",
-       "config-copyright": "=== Tekijänoikeudet ja käyttöehdot ===\n\n$1\n\nTämä ohjelma on vapaa ohjelmisto; voit levittää sitä ja/tai muokata sitä Free Software Foundationin GNU General Public Licensen ehdoilla, joko version 2 tai (halutessasi) minkä tahansa myöhemmän version mukaisesti.\n\nTätä ohjelmaa levitetään siinä toivossa, että se olisi hyödyllinen, mutta <strong>ilman mitään takuuta</strong>; ilman edes hiljaista takuuta <strong>kaupallisesti hyväksyttävästä laadusta</strong> tai <strong>soveltuvuudesta tiettyyn tarkoitukseen.</strong\nKatso GNU Generel Public Licensestä lisää yksityiskohtia.\n\nSinun olisi pitänyt saada <doclink href=Copying>kopio GNU General Public Licensestä</doclink> tämän ohjelman mukana; jos et, kirjoita siitä osoitteeseen Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA tai [https://www.gnu.org/copyleft/gpl.html lue se verkossa].",
+       "config-welcome-section-copyright": "=== Tekijänoikeudet ja käyttöehdot ===\n\n$1\n\nTämä ohjelma on vapaa ohjelmisto; voit levittää sitä ja/tai muokata sitä Free Software Foundationin GNU General Public Licensen ehdoilla, joko version 2 tai (halutessasi) minkä tahansa myöhemmän version mukaisesti.\n\nTätä ohjelmaa levitetään siinä toivossa, että se olisi hyödyllinen, mutta <strong>ilman mitään takuuta</strong>; ilman edes hiljaista takuuta <strong>kaupallisesti hyväksyttävästä laadusta</strong> tai <strong>soveltuvuudesta tiettyyn tarkoitukseen.</strong\nKatso GNU Generel Public Licensestä lisää yksityiskohtia.\n\nSinun olisi pitänyt saada [$2 kopio GNU General Public Licensestä] tämän ohjelman mukana; jos et, kirjoita siitä osoitteeseen Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA tai [https://www.gnu.org/copyleft/gpl.html lue se verkossa].",
        "config-sidebar": "* [https://www.mediawiki.org MediaWikin kotisivu]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Käyttöopas]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents Hallintaopas]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ UKK]\n----\n* <doclink href=Readme>Lue minut</doclink>\n* <doclink href=ReleaseNotes>Julkaisutiedot</doclink>\n* <doclink href=Copying>Kopiointi</doclink>\n* <doclink href=UpgradeDoc>Päivittäminen</doclink>",
        "config-env-good": "Asennusympäristö on tarkastettu.\nVoit asentaa MediaWikin.",
        "config-env-bad": "Asennusympäristö on tarkastettu.\nEt voi asentaa MediaWikiä.",
        "config-db-web-no-create-privs": "Tilillä jota käytetään asennuksessa ei ole oikeuksia luoda uutta tiliä.\nTähän määriteltävä tili täytyy olla jo olemassa.",
        "config-mysql-engine": "Tallennusmoottori",
        "config-mysql-innodb": "InnoDB (suositeltu)",
-       "config-mysql-myisam": "MyISAM",
        "config-mssql-auth": "Varmennuksen tyyppi:",
        "config-mssql-install-auth": "Valitse varmennuksen tyyppi, jota käytetään yhdistäessä tietokantaan asennuksen aikana.\nJos valitset \"{{int:config-mssql-windowsauth}}\", käytetään verkkopalvelimen käyttäjän kirjautumistietoja.",
        "config-mssql-web-auth": "Valitse varmennuksen tyyppi, jota verkkopalvelin käyttää yhdistäessään tietokantapalvelimeen wikin tavallisen toiminnan aikana.\nJos valitset \"{{int:config-mssql-windowsauth}}\", käytetään verkkopalvelimen käyttäjän kirjautumistietoja.",
index 697e165..b07c83e 100644 (file)
@@ -71,7 +71,7 @@
        "config-help-restart": "Voulez-vous effacer toutes les données enregistrées que vous avez entrées et relancer le processus d'installation ?",
        "config-restart": "Oui, le relancer",
        "config-welcome": "=== Vérifications liées à l’environnement ===\nDes vérifications de base vont maintenant être effectuées pour voir si cet environnement est adapté à l’installation de MediaWiki.\nRappelez-vous d’inclure ces informations si vous recherchez de l’aide sur la manière de terminer l’installation.",
-       "config-copyright": "=== Droit d’auteur et conditions ===\n\n$1\n\nCe programme est un logiciel libre : vous pouvez le redistribuer ou le modifier selon les termes de la Licence Publique Générale GNU telle que publiée par la Free Software Foundation (version 2 de la Licence, ou, à votre choix, toute version ultérieure).\n\nCe programme est distribué dans l’espoir qu’il sera utile, mais '''sans aucune garantie''' : sans même les garanties implicites de '''commercialisabilité''' ou d’'''adéquation à un usage particulier'''.\nVoir la Licence Publique Générale GNU pour plus de détails.\n\nVous devriez avoir reçu <doclink href=Copying>une copie de la Licence Publique Générale GNU</doclink> avec ce programme ; dans le cas contraire, écrivez à la Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. ou [https://www.gnu.org/copyleft/gpl.html lisez-la en ligne].",
+       "config-welcome-section-copyright": "=== Droit d’auteur et conditions ===\n\n$1\n\nCe programme est un logiciel libre : vous pouvez le redistribuer ou le modifier selon les termes de la Licence Publique Générale GNU telle que publiée par la Free Software Foundation (version 2 de la Licence, ou, à votre choix, toute version ultérieure).\n\nCe programme est distribué dans l’espoir qu’il sera utile, mais '''sans aucune garantie''' : sans même les garanties implicites de '''commercialisabilité''' ou d’'''adéquation à un usage particulier'''.\nVoir la Licence Publique Générale GNU pour plus de détails.\n\nVous devriez avoir reçu [$2 une copie de la Licence Publique Générale GNU] avec ce programme ; dans le cas contraire, écrivez à la Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. ou [https://www.gnu.org/copyleft/gpl.html lisez-la en ligne].",
        "config-sidebar": "* [https://www.mediawiki.org Accueil MediaWiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Guide de l’utilisateur]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents Guide de l’administrateur]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ FAQ]",
        "config-sidebar-readme": "Me lire",
        "config-sidebar-relnotes": "Notes de version",
        "config-db-web-no-create-privs": "Le compte que vous avez spécifié pour l'installation n'a pas de privilèges suffisants pour créer un compte.\nLe compte que vous spécifiez ici doit déjà exister.",
        "config-mysql-engine": "Moteur de stockage :",
        "config-mysql-innodb": "InnoDB (recommandé)",
-       "config-mysql-myisam": "MyISAM",
-       "config-mysql-myisam-dep": "<strong> Avertissement </strong>: vous avez sélectionné MyISAM comme moteur de stockage pour MySQL, ce qui n’est pas recommandé pour une utilisation avec MediaWiki, parce que :\n * il prend à peine en charge la simultanéité en raison de verrouillage de table\n * il est plus sujet à la corruption que les autres moteurs\n * le code de base MediaWiki ne gère pas toujours MyISAM comme il se doit\n\nSi votre installation MySQL prenden charge InnoDB, il est fortement recommandé que vous le choisissiez plutôt. \nSi votre installation MySQL ne prend pas en charge les tables InnoDB, il est peut-être temps de faire une mise à niveau.",
-       "config-mysql-only-myisam-dep": "<strong>Attention :</strong> MyISAM est le seul moteur de stockage disponible pour MySQL sur cette machine, et cela n’est pas recommandé pour une utilisation avec MédiaWiki, car :\n* il prend très peu en charge les accès concurrents à cause du verrouillage des tables\n* il est plus sujet à corruption que les autres moteurs\n* le code de base de MédiaWiki ne gère pas toujours MyISAM comme il faudrait\n\nVotre installation MySQL ne prend pas en charge InnoDB ; il est peut-être temps de la mettre à jour.",
        "config-mysql-engine-help": "<strong>InnoDB</strong> est presque toujours la meilleure option, car il prend bien en charge les accès concurrents.\n\n<strong>MyISAM</strong> peut être plus rapide dans les installations monoposte ou en lecture seule.\nLes bases de données MyISAM ont tendance à se corrompre plus souvent que les bases d’InnoDB.",
        "config-mssql-auth": "Type d’authentification :",
        "config-mssql-install-auth": "Sélectionner le type d’authentification qui sera utilisé pour se connecter à la base de données pendant le processus d’installation.\nSi vous sélectionnez « {{int:config-mssql-windowsauth}} », les informations d’identification de l’utilisateur faisant tourner le serveur seront utilisées.",
index c0e86f7..7126f90 100644 (file)
@@ -49,7 +49,6 @@
        "config-invalid-db-type": "Type de base de données non valide",
        "config-sqlite-name-help": "Choisir un nom qui identifie ton wiki.\nFait user pas ni d'espaces ni des traits d'union\nIl va user pour fichier de données SQLite.",
        "config-mysql-innodb": "InnoDB",
-       "config-mysql-myisam": "MyISAM",
        "config-site-name": "Nom du wiki:",
        "config-ns-generic": "Projet",
        "config-ns-other-default": "MonWiki",
index 033692a..bc35fc2 100644 (file)
@@ -67,7 +67,6 @@
        "config-db-web-create": "Féte lo compto s’ègziste p’oncor",
        "config-mysql-engine": "Motor de stocâjo :",
        "config-mysql-innodb": "InnoDB",
-       "config-mysql-myisam": "MyISAM",
        "config-site-name": "Nom du vouiqui :",
        "config-site-name-blank": "Buchiéd un nom de seto.",
        "config-project-namespace": "Èspâço de noms du projèt :",
index 86c0c57..c75d129 100644 (file)
@@ -7,7 +7,8 @@
                        "Vivaelcelta",
                        "Macofe",
                        "Banjo",
-                       "Seb35"
+                       "Seb35",
+                       "Maria zaos"
                ]
        },
        "config-desc": "O programa de instalación de MediaWiki",
@@ -47,7 +48,7 @@
        "config-help-restart": "Quere eliminar todos os datos gardados e reiniciar o proceso de instalación?",
        "config-restart": "Si, reiniciala",
        "config-welcome": "=== Comprobación da contorna ===\nCómpre realizar agora unhas comprobacións básicas para ver se a contorna é axeitada para a instalación de MediaWiki.\nLembre incluír esta información se necesita axuda para completar a instalación.",
-       "config-copyright": "=== Dereitos de autor e termos de uso ===\n\n$1\n\nEste programa é software libre; pode redistribuílo e/ou modificalo segundo os termos da licenza pública xeral GNU publicada pola Free Software Foundation; versión 2 ou (na súa escolla) calquera outra posterior.\n\nEste programa distribúese coa esperanza de que poida ser útil, pero <strong>sen garantía ningunha</strong>; nin sequera a garantía implícita de <strong>comercialización</strong> ou <strong>adecuación a unha finalidade específica</strong>.\nOlle a licenza pública xeral GNU para obter máis detalles.\n\nDebería recibir <doclink href=Copying>unha copia da licenza pública xeral GNU</doclink> xunto ao programa; se non é así, escriba á Free Software Foundation, Inc., rúa Franklin, número 51, quinto andar, Boston, Massachusetts, 02110-1301, Estados Unidos de América ou [https://www.gnu.org/copyleft/gpl.html lea a licenza en liña].",
+       "config-welcome-section-copyright": "=== Dereitos de autoría e termos de uso ===\n\n$1\n\nEste programa é software libre; pode redistribuílo e/ou modificalo segundo os termos da licenza pública xeral GNU publicada pola Free Software Foundation; versión 2 ou (na súa escolla) calquera outra posterior.\n\nEste programa distribúese coa esperanza de que poida ser útil, pero <strong>sen garantía ningunha</strong>; nin sequera a garantía implícita de <strong>comercialización</strong> ou <strong>adecuación a unha finalidade específica</strong>.\nOlle a licenza pública xeral GNU para obter máis detalles.\n\nDebería recibir [$2 unha copia da licenza pública xeral GNU] xunto ao programa; se non é así, escriba á Free Software Foundation, Inc., rúa Franklin, número 51, quinto andar, Boston, Massachusetts, 02110-1301, Estados Unidos de América ou [https://www.gnu.org/copyleft/gpl.html lea a licenza en liña].",
        "config-sidebar": "* [https://www.mediawiki.org/wiki/MediaWiki/gl Páxina principal de MediaWiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Guía de usuario]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents Guía de administrador]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Preguntas máis frecuentes]\n----\n* <doclink href=Readme>Léame</doclink>\n* <doclink href=ReleaseNotes>Notas de lanzamento</doclink>\n* <doclink href=Copying>Copia</doclink>\n* <doclink href=UpgradeDoc>Actualizacións</doclink>",
        "config-env-good": "Rematou a comprobación da contorna.\nPode instalar MediaWiki.",
        "config-env-bad": "Rematou a comprobación da contorna.\nNon pode instalar MediaWiki.",
        "config-db-web-no-create-privs": "A conta que especificou para a instalación non ten os privilexios suficientes para crear unha conta.\nA conta que se especifique aquí xa debe existir.",
        "config-mysql-engine": "Motor de almacenamento:",
        "config-mysql-innodb": "InnoDB (recomendado)",
-       "config-mysql-myisam": "MyISAM",
-       "config-mysql-myisam-dep": "<strong>Atención:</strong> Seleccionou MyISAM como o motor de almacenamento para MySQL, unha combinación non recomendada para MediaWiki, porque:\n* practicamente non soporta os accesos simultáneos debido ao bloqueo de táboas\n* é máis propenso a corromperse ca outros motores\n* o código base de MediaWiki non sempre manexa o MyISAM como debera\n\nSe a súa instalación MySQL soporta InnoDB, recoméndase elixilo no canto de MyISAM.\nSe a súa instalación MySQL non soporta InnoDB, quizais sexa boa idea realizar unha actualización.",
-       "config-mysql-only-myisam-dep": "<strong>Atención:</strong> MyISAM é o único motor de almacenamento para MySQL nesta máquina, unha combinación non recomendada para MediaWiki, porque:\n* practicamente non soporta os accesos simultáneos debido ao bloqueo de táboas\n* é máis propenso a corromperse ca outros motores\n* o código base de MediaWiki non sempre manexa o MyISAM como debera\n\nA súa instalación MySQL non soporta InnoDB, quizais sexa boa idea realizar unha actualización.",
        "config-mysql-engine-help": "<strong>InnoDB</strong> é case sempre a mellor opción, dado que soporta ben os accesos simultáneos.\n\n<strong>MyISAM</strong> é máis rápido en instalacións de usuario único e de só lectura.\nAs bases de datos MyISAM tenden a se corromper máis a miúdo ca as bases de datos InnoDB.",
        "config-mssql-auth": "Tipo de autenticación:",
        "config-mssql-install-auth": "Seleccione o tipo de autenticación que se utilizará para conectarse á base de datos durante o proceso de instalación.\nSe selecciona \"{{int:config-mssql-windowsauth}}\", usaranse as credenciais do usuario co que se está a executar o servidor web.",
index 337a179..a9d0c1c 100644 (file)
@@ -36,7 +36,7 @@
        "config-help-restart": "Witt alli Date, wu Du yygee hesch, lesche un d Inschtallation nomol aafange?",
        "config-restart": "Jo, nomol aafange",
        "config-welcome": "=== Priefig vu dr Inschtallationsumgäbig ===\nBasispriefige wäre durgfiert zum Feschtstelle, eb d Inschtallationsumgäbig fir d Inschtallation vu MediaWiki geignet isch.\nDu sottsch d Ergebnis vu däre Priefig aagee, wänn Du bi dr Inschtallation Hilf bruchsch.",
-       "config-copyright": "=== Copyright un Nutzigsbedingige ===\n\n$1\n\nDes Programm isch e freji Software, d. h. s cha, no dr Bedingige vu dr GNU General Public-Lizänz, wu vu dr Free Software Foundation vereffentligt woren isch, wyterverteilt un/oder modifiziert wäre. Doderbyy cha d Version 2, oder no eigenem Ermässe, jedi nejeri Version vu dr Lizänz brucht wäre.\n\nDes Programm wird in dr Hoffnig verteilt, ass es nitzli isch, aber '''ohni jedi Garanti''' un sogar ohni di impliziert Garanti vun ere '''Märtgängigkeit''' oder '''Eignig fir e bstimmte Zwäck'''. Doderzue git meh Hiiwys in dr GNU General Public-Lizänz.\n\nE <doclink href=Copying>Kopi vu dr GNU General Public-Lizänz</doclink> sott zämme mit däm Programm verteilt wore syy. Wänn des nit eso isch, cha ne Kopi bi dr Free Software Foundation Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA, schriftli aagforderet oder [https://www.gnu.org/copyleft/gpl.html online gläse] wäre.",
+       "config-welcome-section-copyright": "=== Copyright un Nutzigsbedingige ===\n\n$1\n\nDes Programm isch e freji Software, d. h. s cha, no dr Bedingige vu dr GNU General Public-Lizänz, wu vu dr Free Software Foundation vereffentligt woren isch, wyterverteilt un/oder modifiziert wäre. Doderbyy cha d Version 2, oder no eigenem Ermässe, jedi nejeri Version vu dr Lizänz brucht wäre.\n\nDes Programm wird in dr Hoffnig verteilt, ass es nitzli isch, aber '''ohni jedi Garanti''' un sogar ohni di impliziert Garanti vun ere '''Märtgängigkeit''' oder '''Eignig fir e bstimmte Zwäck'''. Doderzue git meh Hiiwys in dr GNU General Public-Lizänz.\n\nE [$2 Kopi vu dr GNU General Public-Lizänz] sott zämme mit däm Programm verteilt wore syy. Wänn des nit eso isch, cha ne Kopi bi dr Free Software Foundation Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA, schriftli aagforderet oder [https://www.gnu.org/copyleft/gpl.html online gläse] wäre.",
        "config-sidebar": "* [https://www.mediawiki.org MediaWiki Websyte vu MediaWiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Nutzeraaleitig zue MediaWiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents Adminischtratoreaaleitig zue MediaWiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Vilmol gstellti Froge zue MediaWiki]",
        "config-env-good": "D Inschtallationsumgäbig isch prieft wore.\nDu chasch MediaWiki inschtalliere.",
        "config-env-bad": "D Inschtallationsumgäbigisch prieft wore.\nDu chasch MediaWiki nit inschtalliere.",
index 08e56e0..7d361bc 100644 (file)
@@ -51,7 +51,7 @@
        "config-help-restart": "האם ברצונך לנקות את כל הנתונים שהזנת ולהתחיל מחדש את תהליך ההתקנה?",
        "config-restart": "כן, להפעיל מחדש",
        "config-welcome": "=== בדיקות סביבה ===\nבדיקות בסיסיות תתבצענה עכשיו כדי לראות אם הסביבה הזאת מתאימה להתקנת מדיה־ויקי.\nנא לזכור לכלול את המידע הזה בעת בקשת תמיכה עם השלמת ההתקנה.",
-       "config-copyright": "=== זכויות יוצרים ותנאים ===\n\n$1\n\nתכנית זו היא תכנה חופשית; באפשרותך להפיצה מחדש ו/או לשנות אותה על פי תנאי הרישיון הציבורי הכללי של GNU כפי שפורסם על ידי קרן התכנה החופשית; בין אם גרסה 2 של הרישיון, ובין אם (לפי בחירתך) כל גרסה מאוחרת שלו.\n\nתכנית זו מופצת בתקווה שתהיה מועילה, אבל '''בלא אחריות כלשהי'''; ואפילו ללא האחריות המשתמעת בדבר '''מסחריותה''' או '''התאמתה למטרה '''מסוימת'''. לפרטים נוספים, ניתן לעיין ברישיון הציבורי הכללי של GNU.\n\nלתכנית זו אמור היה להיות מצורף <doclink href=Copying>עותק של הרישיון הציבורי הכללי של GNU</doclink>; אם לא קיבלת אותו, אפשר לכתוב ל־Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA או [https://www.gnu.org/copyleft/gpl.html לקרוא אותו דרך האינטרנט].",
+       "config-welcome-section-copyright": "=== זכויות יוצרים ותנאים ===\n\n$1\n\nתכנית זו היא תכנה חופשית; באפשרותך להפיצה מחדש ו/או לשנות אותה על פי תנאי הרישיון הציבורי הכללי של GNU כפי שפורסם על ידי קרן התכנה החופשית; בין אם גרסה 2 של הרישיון, ובין אם (לפי בחירתך) כל גרסה מאוחרת שלו.\n\nתכנית זו מופצת בתקווה שתהיה מועילה, אבל '''בלא אחריות כלשהי'''; ואפילו ללא האחריות המשתמעת בדבר '''מסחריותה''' או '''התאמתה למטרה '''מסוימת'''. לפרטים נוספים, ניתן לעיין ברישיון הציבורי הכללי של GNU.\n\nלתכנית זו אמור היה להיות מצורף [$2 עותק של הרישיון הציבורי הכללי של GNU]; אם לא קיבלת אותו, אפשר לכתוב ל־Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA או [https://www.gnu.org/copyleft/gpl.html לקרוא אותו דרך האינטרנט].",
        "config-sidebar": "* [https://www.mediawiki.org אתר הבית של מדיה־ויקי]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents המדריך למשתמש]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents המדריך למנהל]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ שו״ת]\n----\n* <doclink href=Readme>קרא אותי</doclink>\n* <doclink href=ReleaseNotes>הערות גרסה</doclink>\n* <doclink href=Copying>העתקה</doclink>\n* <doclink href=UpgradeDoc>שדרוג</doclink>",
        "config-env-good": "הסביבה שלכם נבדקה.\nאפשר להתקין מדיה־ויקי.",
        "config-env-bad": "הסביבה שלכם נבדקה.\nאי־אפשר להתקין מדיה־ויקי.",
        "config-db-web-no-create-privs": "לחשבון שהקלדת להתקנה אין מספיק הרשאות ליצירת חשבון.\nהחשבון שאתם מקלידים כאן צריך להיות קיים.",
        "config-mysql-engine": "מנוע האחסון:",
        "config-mysql-innodb": "InnoDB (מומלץ)",
-       "config-mysql-myisam": "MyISAM",
-       "config-mysql-myisam-dep": "'''אזהרה''': בחרתם ב־MyISAM בתור מנוע אחסון של MySQL, וזה לא מומלץ מהסיבות הבאות:\n* המנוע הזה בקושי תומך בעיבוד מקבילי בגלל נעילת טבלאות\n* הוא פחות עמיד בפני אובדן מידע ממנועים אחרים\n* הקוד של מדיה־ויקי לא תמיד מטפל ב־MyISAM כפי שצריך\n\nאם התקנת MySQL שלכם תומכת ב־InnoDB, מומלץ מאוד שתבחרו באפשרות הזאת.\nאם התקנת MySQL שלכם אינה תומכת ב־InnoDB, אולי זה הזמן לשקול לשדרג אותה.",
-       "config-mysql-only-myisam-dep": "'''אזהרה:''' MyISAM הוא מנוע האחסון היחיד שזמין ל־MySQL במכונה הזאת, וזה לא מומלץ לשימוש עם מדיה־ויקי, כי:\n* הוא כמעט שאינו תומך בחיבורים מרובים בגלל נעילת טבלאות\n* הוא פגיע יותר לקלקול ממנועים אחרים\n* הקוד של מדיה־ויקי לא תמיד מטפל ב־MyISAM כפי שצריך\n\nהתקנת MySQL אינה תומכת ב־InnoDB, ואולי הגיע הזמן לשדרג אותה.",
        "config-mysql-engine-help": "'''InnoDB''' היא כמעט תמיד האפשרות הטובה ביותר, כי במנוע הזה יש תמיכה טובה ביותר בעיבוד מקבילי.\n\n'''MyISAM''' עשוי להיות בהתקנות שמיועדות למשתמש אחד ולהתקנות לקריאה בלבד.\nמסדי נתונים עם MyISAM נוטים להיהרס לעתים קרובות יותר מאשר מסדי נתונים עם InnoDB.",
        "config-mssql-auth": "סוג אימות:",
        "config-mssql-install-auth": "נא לבחור את סוג האימות שישמש להתחברות למסד הנתונים בזמן תהליך ההתקנה. בחירה ב־\"{{int:config-mssql-windowsauth}}\" תשתמש בהרשאות של החשבון שמריץ את השרת הנוכחי.",
index 75a76b1..1914600 100644 (file)
@@ -42,7 +42,7 @@
        "config-help-restart": "Solle all bereits ingebne Daten gelöscht und der Installationsvoargang erneit oogefäng sin?",
        "config-restart": "Jo, erneit oonfänge",
        "config-welcome": "=== Prüfung von die Installationsumgebung ===\nDie Basisprüfunge were jetzt doorrichgefüahrt, um festzustelle, ob die Installationsumgebung für MediaWiki geeichnet ist.\nNotier die Informatione und geb se an, sofern du Hellf beim Installiere  benötichst.",
-       "config-copyright": "=== Lizenz und Nutzungsbedingunge ===\n\n$1\n\nDas Programm ist freie Software, d. h. es kann, gemäss den Bedingunge der von der Free Software Foundation veröffentlichte ''GNU General Public License'', weiterverteilt und/oder modifiziert sin. Dabei kann die Version 2, orrer noh eichnem Ermess, jede neuire Version von der Lizenz verwennet sin.\n\nDas Programm weard in der Hoffnung verteilt, dass das nützlich sein weard, dennoch '''ohne jechliche Garantie''' und sogoor ohne die implizierte Garantie von ener '''Marrektgängigkeit''' orrer '''Eichnung für en bestimmte Zweck'''. Hierzu sind weitre Hinweise in der ''GNU General Public License'' enthalt.\n\nEn <doclink href=Copying>Kopie von der GNU General Public License</doclink> sollt zusammer mit dem Programm verteilt woard sin. Sofern das net der Fall woar, kann en Kopie bei der Free Software Foundation Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA, schriftlich verlangt sin orrer uff ehre Website [https://www.gnu.org/copyleft/gpl.html online gelesen] sin.",
+       "config-welcome-section-copyright": "=== Lizenz und Nutzungsbedingunge ===\n\n$1\n\nDas Programm ist freie Software, d. h. es kann, gemäss den Bedingunge der von der Free Software Foundation veröffentlichte ''GNU General Public License'', weiterverteilt und/oder modifiziert sin. Dabei kann die Version 2, orrer noh eichnem Ermess, jede neuire Version von der Lizenz verwennet sin.\n\nDas Programm weard in der Hoffnung verteilt, dass das nützlich sein weard, dennoch '''ohne jechliche Garantie''' und sogoor ohne die implizierte Garantie von ener '''Marrektgängigkeit''' orrer '''Eichnung für en bestimmte Zweck'''. Hierzu sind weitre Hinweise in der ''GNU General Public License'' enthalt.\n\nEn [$2 Kopie von der GNU General Public License] sollt zusammer mit dem Programm verteilt woard sin. Sofern das net der Fall woar, kann en Kopie bei der Free Software Foundation Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA, schriftlich verlangt sin orrer uff ehre Website [https://www.gnu.org/copyleft/gpl.html online gelesen] sin.",
        "config-sidebar": "* [https://www.mediawiki.org/wiki/MediaWiki/de Website von MediaWiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents/de Benutzeroonleitung]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents/de Administratorenoonleitung]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ/de Häifig gestellte Frache]\n----\n* <doclink href=Readme>Lies mich</doclink>\n* <doclink href=ReleaseNotes>Versionsinformatione</doclink>\n* <doclink href=Copying>Lizenzbestimmunge</doclink>\n* <doclink href=UpgradeDoc>Aktualisierung</doclink>",
        "config-env-good": "Die Installationsumgebung woard geprüft.\nMediaWiki kann installiert sin.",
        "config-env-bad": "Die Installationsumgebung woard geprüft.\nMediaWiki kann net installiert sin.",
        "config-db-web-no-create-privs": "Das oongebne und für den Installationsvoargang voargesiehne Datebankkonto verfücht nwt üwer ausreichend Berechtichunge, um en weitres Datebankkonto zu erstelle.\nDas hier oongebne Datebankkonto muss dohear bereits voarhand sin.",
        "config-mysql-engine": "Speicher-Engine:",
        "config-mysql-innodb": "InnoDB",
-       "config-mysql-myisam": "MyISAM",
-       "config-mysql-myisam-dep": "'''Warnung:''' Es woard MyISAM als Speicher-Engine für MySQL ausgewählt, die aus follichend Gründe net für den Insatz mit MediaWiki rekommendiert ist:\n* Sie unnerstützt uffgrund von Tabellesperrunge koom die neweloofiche Ausführung von Aktione.\n* Sie ist oonfällicher für Dateprobleme.\n* Sie weard von MediaWiki net immer adäquat unnerstützt.\n\nSoweit die voarhandne MySQL-Installation die Speicher-Engine InnoDB unnerstützt, weard sei Verwennung eindringlich rekommendiert.\nSoweit sie sie net unnerstützt, sollt en entsprechend Aktualisierung nunmeahr Erwächung gezoh sin.",
-       "config-mysql-only-myisam-dep": "'''Warnung:''' MyISAM ist die einziche verfüchbare Speicher-Engine für MySQL uff dem Rechner, und das weard net für die Verwennung mit MediaWiki rekommendiert, weil sie\n* uffgrund von Tabellesperrunge koom die neweloofiche Ausführung von Aktione unnerstützt,\n* oonfällicher für Dateprobleme ist und\n* von MediaWiki net immer adäquat unnerstützt weard.\n\nDein MySQL-Installation unnerstützt net InnoDB. Eventuell muss en Aktualisierung dorrichgeführt werre.",
        "config-mysql-engine-help": "'''InnoDB''' ist nächst immer die bessre Wähl, weil es gleichzeitiche Zugriffe gut unnerstützt.\n\n'''MyISAM''' ist in Enzelnutzerumgebunge sowie bei schreibgeschützte Wikis schneller.\nBei MyISAM-Datebanke treten tendenziell häuficher Fehler uff als bei InnoDB-Datebanke.",
        "config-mssql-auth": "Authentifikationstyp:",
        "config-mssql-install-auth": "Wähl den Authentifikationstyp aus, der zur Verbinnung mit der Datebank während von der Installationsprozesses verwennt weard.\nFalls du „{{int:config-mssql-windowsauth}}“ auswählst, werre die Oonmeldeinformatione von en beliebiche Benutzer verwennt, wo den Webserver ausführt.",
index f2b2a7f..5a5f109 100644 (file)
        "config-db-web-no-create-privs": "Konto, kotrež sy za instalaciju podał, nima dosć woprawnjenjow, zo by konto wutworiło.\nKonto, kotrež tu podawaće, dyrbi hižo eksistować.",
        "config-mysql-engine": "Składowanska mašina:",
        "config-mysql-innodb": "InnoDB",
-       "config-mysql-myisam": "MyISAM",
        "config-site-name": "Mjeno wikija:",
        "config-site-name-help": "To zjewi so w titulowej lejstwje wobhladaka kaž tež na wšelakich druhich městnach.",
        "config-site-name-blank": "Zapodaj sydłowe mjeno.",
index a2a4e3b..fed6854 100644 (file)
@@ -53,7 +53,7 @@
        "config-help-restart": "Szeretnéd törölni az eddig megadott összes adatot és újraindítani a telepítési folyamatot?",
        "config-restart": "Igen, újraindítás",
        "config-welcome": "=== A környezet ellenőrzése ===\nNéhány alapvető ellenőrzés hajtódik végre, hogy kiderüljön, hogy ez a környezet alkalmas-e a MediaWiki telepítésére.\nHa segítséget kérsz a telepítéssel kapcsolatban, add meg ezen ellenőrzések eredményét.",
-       "config-copyright": "=== Licenc és feltételek ===\n\n$1\n\nEz a program szabad szoftver; terjeszthető, illetve módosítható a Free Software Foundation által kiadott GNU General Public License dokumentumában leírtak; akár a licenc 2-es, akár (tetszőleges) későbbi változata szerint.\n\nEz a program abban a reményben kerül közreadásra, hogy hasznos lesz, de minden egyéb <strong>garancia nélkül</strong>, az <strong>eladhatóságra</strong> vagy <strong>valamely célra való alkalmazhatóságra</strong> való származtatott garanciát is beleértve. További részleteket a GNU General Public License tartalmaz.\n\nA felhasználónak a programmal együtt meg kell kapnia a <doclink href=Copying>GNU General Public License egy példányát</doclink>; ha mégsem kapta meg, akkor írjon a Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. címre, vagy [https://www.gnu.org/copyleft/gpl.html tekintse meg online].",
+       "config-welcome-section-copyright": "=== Licenc és feltételek ===\n\n$1\n\nEz a program szabad szoftver; terjeszthető, illetve módosítható a Free Software Foundation által kiadott GNU General Public License dokumentumában leírtak; akár a licenc 2-es, akár (tetszőleges) későbbi változata szerint.\n\nEz a program abban a reményben kerül közreadásra, hogy hasznos lesz, de minden egyéb <strong>garancia nélkül</strong>, az <strong>eladhatóságra</strong> vagy <strong>valamely célra való alkalmazhatóságra</strong> való származtatott garanciát is beleértve. További részleteket a GNU General Public License tartalmaz.\n\nA felhasználónak a programmal együtt meg kell kapnia a [$2 GNU General Public License egy példányát]; ha mégsem kapta meg, akkor írjon a Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. címre, vagy [https://www.gnu.org/copyleft/gpl.html tekintse meg online].",
        "config-sidebar": "* [https://www.mediawiki.org A MediaWiki honlapja]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Felhasználói kézikönyv]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents Útmutató adminisztrátoroknak]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ GyIK]\n----\n* <doclink href=Readme>Ismertető</doclink>\n* <doclink href=ReleaseNotes>Kiadási megjegyzések</doclink>\n* <doclink href=Copying>Másolás</doclink>\n* <doclink href=UpgradeDoc>Frissítés</doclink>",
        "config-env-good": "A környezet ellenőrzése befejeződött.\nA MediaWiki telepíthető.",
        "config-env-bad": "A környezet ellenőrzése befejeződött.\nA MediaWiki nem telepíthető.",
        "config-db-web-no-create-privs": "A telepítéshez megadott fiók nem rendelkezik megfelelő jogosultságokkal új felhasználó létrehozásához.\nAz itt megadott fióknak léteznie kell.",
        "config-mysql-engine": "Tárolómotor:",
        "config-mysql-innodb": "InnoDB",
-       "config-mysql-myisam": "MyISAM",
-       "config-mysql-myisam-dep": "'''Figyelmeztetés''': A MyISAM tárolómotort választottad, ami nem ajánlott a MediaWiki használatánál, mert:\n* nagyon rosszul kezeli a párhuzamos lekéréseket a táblák zárolása miatt\n* sokkal nagyobb az esélye az adatkorrupció kialakulásának\n* a MediaWiki kódbázisa nem mindig úgy kezeli a MyISAM-ot, ahogyan kellene\n\nHa a feltelepített MySQL támogatja az InnoDB-t, erősen ajánlott, hogy inkább azt válaszd.\nHa nem, akkor lehet, hogy itt az ideje a frissítésnek.",
        "config-mysql-engine-help": "A legtöbb esetben az '''InnoDB''' a legjobb választás, mivel megfelelően támogatja a párhuzamosságot.\n\nA '''MyISAM''' gyorsabb megoldás lehet egyfelhasználós vagy csak olvasható környezetekben, azonban a MyISAM-adatbázisok sokkal gyakrabban sérülnek meg, mint az InnoDB-adatbázisok.",
        "config-mssql-auth": "Hitelesítés típusa:",
        "config-mssql-sqlauth": "SQL Server hitelesítés",
index 2b85baa..9e08055 100644 (file)
@@ -45,7 +45,7 @@
        "config-help-restart": "Vole tu rader tote le datos salveguardate que tu ha entrate e reinitiar le processo de installation?",
        "config-restart": "Si, reinitia lo",
        "config-welcome": "=== Verificationes del ambiente ===\nVerificationes de base essera ora exequite pro determinar si iste ambiente es apte pro le installation de MediaWiki.\nNon oblida de includer iste information si tu cerca adjuta pro completar le installation.",
-       "config-copyright": "=== Copyright and Terms ===\n\n$1\n\nIste programma es software libere; vos pote redistribuer lo e/o modificar lo sub le conditiones del Licentia Public General de GNU publicate per le Free Software Foundation; version 2 del Licentia, o (a vostre option) qualcunque version posterior.\n\nIste programma es distribuite in le sperantia que illo sia utile, ma '''sin garantia''', sin mesmo le implicite garantia de '''commercialisation''' o '''aptitude pro un proposito particular'''.\nVide le Licentia Public General de GNU pro plus detalios.\n\nVos deberea haber recipite <doclink href=Copying>un exemplar del Licentia Public General de GNU</doclink> con iste programma; si non, scribe al Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA, o [https://www.gnu.org/copyleft/gpl.html lege lo in linea].",
+       "config-welcome-section-copyright": "=== Copyright and Terms ===\n\n$1\n\nIste programma es software libere; vos pote redistribuer lo e/o modificar lo sub le conditiones del Licentia Public General de GNU publicate per le Free Software Foundation; version 2 del Licentia, o (a vostre option) qualcunque version posterior.\n\nIste programma es distribuite in le sperantia que illo sia utile, ma '''sin garantia''', sin mesmo le implicite garantia de '''commercialisation''' o '''aptitude pro un proposito particular'''.\nVide le Licentia Public General de GNU pro plus detalios.\n\nVos deberea haber recipite [$2 un exemplar del Licentia Public General de GNU] con iste programma; si non, scribe al Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA, o [https://www.gnu.org/copyleft/gpl.html lege lo in linea].",
        "config-sidebar": "* [https://www.mediawiki.org Pagina principal de MediaWiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Guida pro usatores]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents Guida pro administratores]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ FAQ]\n----\n* <doclink href=Readme>Lege me</doclink>\n* <doclink href=ReleaseNotes>Notas de iste version</doclink>\n* <doclink href=Copying>Conditiones de copia</doclink>\n* <doclink href=UpgradeDoc>Actualisation</doclink>",
        "config-env-good": "Le ambiente ha essite verificate.\nTu pote installar MediaWiki.",
        "config-env-bad": "Le ambiente ha essite verificate.\nTu non pote installar MediaWiki.",
        "config-db-web-no-create-privs": "Le conto que tu specificava pro installation non ha sufficiente privilegios pro crear un conto.\nLe conto que tu specifica hic debe jam exister.",
        "config-mysql-engine": "Motor de immagazinage:",
        "config-mysql-innodb": "InnoDB (recommendate)",
-       "config-mysql-myisam": "MyISAM",
-       "config-mysql-myisam-dep": "* '''Attention:''' Tu ha seligite MyISAM como motor de immagazinage pro MySQL, lo que non es recommendate pro uso con MediaWiki, perque:\n* illo a pena supporta le processamento simultanee a causa del blocada le tabulas\n* illo es plus susceptibile al corruption que altere motores\n* le base de codice de MediaWiki non sempre manea MyISAM como illo deberea\n\nSi tu installation de MySQL supporta InnoDB, es multo recommendate que tu selige iste in su loco.\nSi tu installation de MySQL non supporta InnoDB, forsan isto es un bon occasion pro actualisar lo.",
-       "config-mysql-only-myisam-dep": "'''Attention:''' MyISAM es le unic motor de immagazinage disponibile pro MySQL in iste machina, ma isto non es recommendate pro le uso con MediaWiki, perque:\n* a pena supporto le accesso simultanee a causa del blocage de tabellas\n* es plus propense a corrumper se que altere motores\n* le codice base de MediaWiki non sempre gere MyISAM como deberea\n\nTu installation de MySQL non supporta InnoDB; forsan il es tempore de actualisar lo.",
        "config-mysql-engine-help": "'''InnoDB''' es quasi sempre le melior option, post que illo ha bon supporto pro simultaneitate.\n\n'''MyISAM''' pote esser plus rapide in installationes a usator singule o a lectura solmente.\nLe bases de datos MyISAM tende a esser corrumpite plus frequentemente que le base de datos InnoDB.",
        "config-mssql-auth": "Typo de authentication:",
        "config-mssql-install-auth": "Selige le typo de authentication a usar pro connecter al base de datos durante le processo de installation.\nSi tu selige \"{{int:config-mssql-windowsauth}}\", le credentiales del usator que executa le servitor web essera usate.",
index 0071634..7fd77ee 100644 (file)
@@ -55,7 +55,7 @@
        "config-help-restart": "Apakah Anda ingin menghapus semua data tersimpan yang telah Anda masukkan dan mengulang proses instalasi?",
        "config-restart": "Ya, nyalakan ulang",
        "config-welcome": "=== Pengecekan lingkungan ===\nPengecekan dasar kini akan dilakukan untuk melihat apakah lingkungan ini memadai untuk instalasi MediaWiki.\nIngatlah untuk menyertakan informasi ini jika Anda mencari bantuan tentang cara menyelesaikan instalasi.",
-       "config-copyright": "=== Hak cipta dan persyaratan ===\n\n$1\n\nProgram ini adalah perangkat lunak bebas; Anda dapat mendistribusikan dan/atau memodifikasi di bawah persyaratan GNU General Public License seperti yang diterbitkan oleh Free Software Foundation; baik versi 2 lisensi, atau (sesuai pilihan Anda) versi yang lebih baru.\n\nProgram ini didistribusikan dengan harapan bahwa itu akan berguna, tetapi <strong>tanpa jaminan apa pun</strong>; bahkan tanpa jaminan tersirat untuk <strong>dapat diperjualbelikan</strong> atau <strong>sesuai untuk tujuan tertentu</strong>.\nLihat GNU General Public License untuk lebih jelasnya.\n\nAnda seharusnya telah menerima <doclink href=\"Copying\">salinan dari GNU General Public License</doclink> bersama dengan program ini; jika tidak, kirimkan surat untuk Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA, atau [https://www.gnu.org/copyleft/gpl.html baca versi daring].",
+       "config-welcome-section-copyright": "=== Hak cipta dan persyaratan ===\n\n$1\n\nProgram ini adalah perangkat lunak bebas; Anda dapat mendistribusikan dan/atau memodifikasi di bawah persyaratan GNU General Public License seperti yang diterbitkan oleh Free Software Foundation; baik versi 2 lisensi, atau (sesuai pilihan Anda) versi yang lebih baru.\n\nProgram ini didistribusikan dengan harapan bahwa itu akan berguna, tetapi <strong>tanpa jaminan apa pun</strong>; bahkan tanpa jaminan tersirat untuk <strong>dapat diperjualbelikan</strong> atau <strong>sesuai untuk tujuan tertentu</strong>.\nLihat GNU General Public License untuk lebih jelasnya.\n\nAnda seharusnya telah menerima [$2 salinan dari GNU General Public License] bersama dengan program ini; jika tidak, kirimkan surat untuk Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA, atau [https://www.gnu.org/copyleft/gpl.html baca versi daring].",
        "config-sidebar": "* [https://www.mediawiki.org/wiki/MediaWiki/id Situs MediaWiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents/id Pedoman Pengguna]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents/id Pedoman Administrator]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ/id FAQ]\n----\n* <doclink href=Readme>Read me</doclink>\n* <doclink href=ReleaseNotes>Release notes</doclink>\n* <doclink href=Copying>Copying</doclink>\n* <doclink href=UpgradeDoc>Upgrading</doclink>",
        "config-env-good": "Kondisi telah diperiksa.\nAnda dapat menginstal MediaWiki.",
        "config-env-bad": "Kondisi telah diperiksa.\nAnda tidak dapat menginstal MediaWiki.",
        "config-db-web-no-create-privs": "Akun Anda berikan untuk instalasi tidak memiliki hak yang cukup untuk membuat akun.\nAkun yang Anda berikan harus sudah ada.",
        "config-mysql-engine": "Mesin penyimpanan:",
        "config-mysql-innodb": "InnoDB",
-       "config-mysql-myisam": "MyISAM",
-       "config-mysql-myisam-dep": "<strong>Peringatan:</strong> Anda telah memilih MyISAM sebagai mesin penyimpanan MySQL, yang tidak dianjurkan untuk digunakan dengan MediaWiki, karena:\n * nyaris tidak mendukung operasi bersamaan karena penguncian tabel\n * lebih rentan terhadap korupsi daripada mesin lain\n * basis kode MediaWiki tidak selalu menangani MyISAM sebagaimana mestinya\n\nJika instalasi MySQL Anda mendukung InnoDB, sangat disarankan bagi Anda memilih itu.\nJika instalasi MySQL tidak mendukung InnoDB, mungkin sudah waktunya untuk pemutakhiran.",
-       "config-mysql-only-myisam-dep": "<strong>Peringatan:</strong> MyISAM adalah satu-satunya mesin penyimpanan yang tersedia untuk MySQL pada mesin ini, dan hal ini tidak dianjurkan untuk digunakan dengan MediaWiki, karena:\n* hampir tidak mendukung konkurensi karena penguncian tabel\n* basis kode MediaWiki tidak selalu menangani MyISAM sebagaimana mestinya\n\nInstalasi MySQL Anda tidak mendukung InnoDB, mungkin sudah waktunya untuk peningkatan.",
        "config-mysql-engine-help": "'''InnoDB''' hampir selalu merupakan pilihan terbaik karena memiliki dukungan konkurensi yang baik.\n\n'''MyISAM''' mungkin lebih cepat dalam instalasi pengguna-tunggal atau hanya-baca.\nBasis data MyISAM cenderung lebih sering rusak daripada basis data InnoDB.",
        "config-mssql-auth": "Jenis otentikasi:",
        "config-mssql-install-auth": "Pilih jenis otentikasi yang akan digunakan untuk menyambung ke database selama proses instalasi.\nJika Anda memilih \"{{int:config-mssql-windowsauth}}\", kredensial dari pengguna apapun pada server web yang berjalan akan digunakan.",
index f1e441b..fac0ad7 100644 (file)
@@ -35,7 +35,7 @@
        "config-page-existingwiki": "Existanta wiki",
        "config-help-restart": "Ka vu deziras efacar omna dati qui vu sparis, e rikomencar la procedi pri instalo?",
        "config-restart": "Yes, rikomencez ol",
-       "config-copyright": "=== Autoroyuro e termini ===\n\n$1\n\nCa informatikoprogramo esas libera; vu povas ridistributar ol e/o modifikar ol segun la termini de la Generala Licenco Publika GNU, quale stipulata da Free Software Foundation; segun lua versiono 2 o sequanta.\n\nNi expektas ke ca programo esas utila, kande ni distributas ol. <strong>Tamen, ni ne povas grantar ke ol fakte esos utila</strong>. Ni anke ne povas afirmar ke ol esos <strong>vendebla</strong> o <strong>ke ol esos utila por specifika intenco</strong>.\nLektez la Generala Licenco Publika GNU por plusa detali.\n\nKune ica programo vu certe recevis <doclink href=Copying> kopiuro di la Generala Licenco Publika GNU</doclink>. Se vu ne recevis ol, voluntez skribar a la fonduro Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA, o [https://www.gnu.org/copyleft/gpl.html lektez ol che l'interreto].",
+       "config-welcome-section-copyright": "=== Autoroyuro e termini ===\n\n$1\n\nCa informatikoprogramo esas libera; vu povas ridistributar ol e/o modifikar ol segun la termini de la Generala Licenco Publika GNU, quale stipulata da Free Software Foundation; segun lua versiono 2 o sequanta.\n\nNi expektas ke ca programo esas utila, kande ni distributas ol. <strong>Tamen, ni ne povas grantar ke ol fakte esos utila</strong>. Ni anke ne povas afirmar ke ol esos <strong>vendebla</strong> o <strong>ke ol esos utila por specifika intenco</strong>.\nLektez la Generala Licenco Publika GNU por plusa detali.\n\nKune ica programo vu certe recevis [$2  kopiuro di la Generala Licenco Publika GNU]. Se vu ne recevis ol, voluntez skribar a la fonduro Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA, o [https://www.gnu.org/copyleft/gpl.html lektez ol che l'interreto].",
        "config-env-good": "Omno verifikesis.\nVu povas intalar MediaWiki.",
        "config-env-bad": "Omno verifikesis.\nVu NE POVAS intalar MediaWiki.",
        "config-env-php": "PHP $1 instalesis.",
@@ -56,7 +56,6 @@
        "config-header-oracle": "Ajusti por Oracle-sistemo:",
        "config-header-mssql": "Ajusti por Microsoft SQL Server",
        "config-invalid-db-type": "Nevalida tipo di datumaro.",
-       "config-mysql-myisam": "MyISAM",
        "config-ns-generic": "Projeto",
        "config-ns-site-name": "Sama kam la wiki-nomo: $1",
        "config-ns-other": "Altra (definez precise)",
index 3af2fc0..59c2317 100644 (file)
@@ -31,7 +31,7 @@
        "config-page-upgradedoc": "Uppfærsla",
        "config-page-existingwiki": "Fyrirliggjandi wiki",
        "config-restart": "Já, endurræsa",
-       "config-copyright": "=== Höfundarréttur og skilmálar ===\n\n$1\n\nÞetta er frjáls hugbúnaður; þú mátt dreifa honum og/eða breyta samkvæmt skilmálum í almenna GNU GPL notkunarleyfinu eins og það er gefið út af Frjálsu hugbúnaðarstofnuninni; annaðhvort útgáfu 2 af GPL-leyfinu, eða (ef þér sýnist svo) einhverri nýrri útgáfu leyfisins.\n\nHugbúnaði þessum er dreift í þeirri von að hann geti verið gagnlegur, en <strong>ÁN ALLRAR ÁBYRGÐAR</strong>; einnig án þeirrar ábyrgðar sem gefin er í skyn með <strong>SELJANLEIKA</strong> eða <strong>EIGINLEIKUM TIL TILTEKINNA NOTA</strong>. Sjá almenna GNU GPL notkunarleyfið fyrir nánari upplýsingar.\n\nÞað ætti að hafa fylgt afrit af almenna <doclink href=Copying>GNU GPL notkunarleyfinu</doclink> með forritinu; ef ekki skrifið þá Fjálsu hugbúnarstofnuninni: Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA, eða [https://www.gnu.org/copyleft/gpl.html lestu það á netinu].",
+       "config-welcome-section-copyright": "=== Höfundarréttur og skilmálar ===\n\n$1\n\nÞetta er frjáls hugbúnaður; þú mátt dreifa honum og/eða breyta samkvæmt skilmálum í almenna GNU GPL notkunarleyfinu eins og það er gefið út af Frjálsu hugbúnaðarstofnuninni; annaðhvort útgáfu 2 af GPL-leyfinu, eða (ef þér sýnist svo) einhverri nýrri útgáfu leyfisins.\n\nHugbúnaði þessum er dreift í þeirri von að hann geti verið gagnlegur, en <strong>ÁN ALLRAR ÁBYRGÐAR</strong>; einnig án þeirrar ábyrgðar sem gefin er í skyn með <strong>SELJANLEIKA</strong> eða <strong>EIGINLEIKUM TIL TILTEKINNA NOTA</strong>. Sjá almenna GNU GPL notkunarleyfið fyrir nánari upplýsingar.\n\nÞað ætti að hafa fylgt afrit af almenna [$2 GNU GPL notkunarleyfinu] með forritinu; ef ekki skrifið þá Fjálsu hugbúnarstofnuninni: Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA, eða [https://www.gnu.org/copyleft/gpl.html lestu það á netinu].",
        "config-env-php": "PHP $1 er uppsett.",
        "config-env-hhvm": "HHVM $1 er uppsett.",
        "config-apc": "[https://www.php.net/apc APC] er uppsett",
@@ -62,7 +62,6 @@
        "config-db-web-account": "Gagnagrunnsreikningur fyrir vefaðgang",
        "config-mysql-engine": "Gagnagrunnshýsing:",
        "config-mysql-innodb": "InnoDB (mælt með)",
-       "config-mysql-myisam": "MyISAM",
        "config-mssql-auth": "Tegund auðkenningar:",
        "config-mssql-sqlauth": "SQL Server auðkenning",
        "config-mssql-windowsauth": "Windows auðkenning",
index ce38338..165a057 100644 (file)
@@ -63,7 +63,7 @@
        "config-help-restart": "Vuoi cancellare tutti i dati salvati che hai inserito e riavviare il processo di installazione?",
        "config-restart": "Sì, riavvia",
        "config-welcome": "=== Controllo dell'ambiente ===\nSaranno eseguiti controlli di base per vedere se questo ambiente è adatto per l'installazione di MediaWiki.\nRicordati di includere queste informazioni se chiedi assistenza su come completare l'installazione.",
-       "config-copyright": "=== Copyright e termini ===\n\n$1\n\nQuesto programma è un software libero; puoi redistribuirlo e/o modificarlo secondo i termini della GNU General Public License, come pubblicata dalla Free Software Foundation; o la versione 2 della Licenza o (a propria scelta) qualunque versione successiva.\n\nQuesto programma è distribuito nella speranza che sia utile, ma SENZA ALCUNA GARANZIA; senza neppure la garanzia implicita di NEGOZIABILITÀ o di APPLICABILITÀ PER UN PARTICOLARE SCOPO.\nSi veda la GNU General Public License per maggiori dettagli.\n\nQuesto programma deve essere distribuito assieme ad <doclink href=Copying>una copia della GNU General Public License</doclink>; in caso contrario, se ne può ottenere una scrivendo alla Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA oppure [https://www.gnu.org/copyleft/gpl.html leggerla in rete].",
+       "config-welcome-section-copyright": "=== Copyright e termini ===\n\n$1\n\nQuesto programma è un software libero; puoi redistribuirlo e/o modificarlo secondo i termini della GNU General Public License, come pubblicata dalla Free Software Foundation; o la versione 2 della Licenza o (a propria scelta) qualunque versione successiva.\n\nQuesto programma è distribuito nella speranza che sia utile, ma SENZA ALCUNA GARANZIA; senza neppure la garanzia implicita di NEGOZIABILITÀ o di APPLICABILITÀ PER UN PARTICOLARE SCOPO.\nSi veda la GNU General Public License per maggiori dettagli.\n\nQuesto programma deve essere distribuito assieme ad [$2 una copia della GNU General Public License]; in caso contrario, se ne può ottenere una scrivendo alla Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA oppure [https://www.gnu.org/copyleft/gpl.html leggerla in rete].",
        "config-sidebar": "* [https://www.mediawiki.org Pagina principale MediaWiki]\n* [https://www.mediawiki.org/Special:MyLanguage/Help:Contents Guida ai contenuti per utenti]\n* [https://www.mediawiki.org/Special:MyLanguage/Manual:Contents Guida ai contenuti per admin]\n* [https://www.mediawiki.org/Special:MyLanguage/Manual:FAQ FAQ]",
        "config-sidebar-readme": "Leggimi",
        "config-sidebar-relnotes": "Note di versione",
        "config-db-web-no-create-privs": "L'account usato per l'installazione non dispone dei privilegi necessari per creare un altro account.\nL'account indicato qui deve già esistere.",
        "config-mysql-engine": "Storage engine:",
        "config-mysql-innodb": "InnoDB (consigliato)",
-       "config-mysql-myisam": "MyISAM",
-       "config-mysql-myisam-dep": "<strong>Attenzione:</strong> hai selezionato MyISAM come motore di archiviazione per MySQL, che non è raccomandato per l'uso con  MediaWiki, perché:\n* supporta debolmente la concorrenza per il blocco della tabella\n* è più incline alla corruzione di altri motori\n* il codice di base MediaWiki non gestisce sempre MyISAM come dovrebbe\n\nSe la tua installazione MySQL supporta InnoDB, è altamente raccomandato che lo si scelga al suo posto.\nSe la tua installazione MySQL non supporta InnoDB, forse è il momento per un aggiornamento.",
-       "config-mysql-only-myisam-dep": "<strong>Attenzione:</strong> MyISAM è l'unico motore di archiviazione disponibile per MySQL su questa macchina, e questo non è consigliato per l'uso con MediaWiki, perché:\n* supporta debolmente la concorrenza per il blocco della tabella\n* è più incline alla corruzione di altri motori\n* il codice di base MediaWiki non gestisce sempre MyISAM come dovrebbe\n\nSe la tua installazione MySQL non supporta InnoDB, forse è il momento per un aggiornamento.",
        "config-mysql-engine-help": "<strong>InnoDB</strong> è quasi sempre l'opzione migliore, in quanto ha un buon supporto della concorrenza.\n\n<strong>MyISAM</strong> potrebbe essere più veloce nelle installazioni monoutente o in sola lettura.\nI database MyISAM tendono a danneggiarsi più spesso dei database InnoDB.",
        "config-mssql-auth": "Tipo di autenticazione:",
        "config-mssql-install-auth": "Seleziona il tipo di autenticazione che verrà utilizzato per connettersi al database durante il processo di installazione.\nSe si seleziona \"{{int:config-mssql-windowsauth}}\", saranno utilizzate le credenziali dell'utente con cui viene eseguito il server web, qualunque esso sia.",
index 7f7c801..9516433 100644 (file)
@@ -65,7 +65,7 @@
        "config-help-restart": "入力した保存データをすべて消去して、インストール作業を再起動しますか?",
        "config-restart": "はい、再起動します",
        "config-welcome": "=== 環境の確認 ===\n基本的な確認では、現在の環境が MediaWiki のインストールに適しているかを確認します。\nインストール方法について助けが必要になった場合は、必ずこの確認結果を添えてください。",
-       "config-copyright": "=== 著作権および規約 ===\n$1\n\nこの作品はフリーソフトウェアです。あなたは、フリーソフトウェア財団の発行する GNU 一般公衆利用許諾書 (GNU General Public License) (バージョン 2、またはそれ以降のライセンス) の規約に基づき、このライブラリを再配布および改変できます。\n\nこの作品は、有用であることを期待して配布されていますが、<strong>商用または特定の目的に適するかどうか</strong>も含めて、暗黙的にも、<strong>一切保証されません</strong>。\n詳しくは、 GNU 一般公衆利用許諾書をご覧ください。\n\nあなたはこのプログラムと共に、<doclink href=Copying>GNU 一般公衆利用許諾契約書の複製</doclink>を受け取ったはずです。受け取っていない場合は、フリーソフトウェア財団 (宛先は the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA) まで請求するか、または[https://www.gnu.org/copyleft/gpl.html オンラインでお読みください]。",
+       "config-welcome-section-copyright": "=== 著作権および規約 ===\n$1\n\nこの作品はフリーソフトウェアです。あなたは、フリーソフトウェア財団の発行する GNU 一般公衆利用許諾書 (GNU General Public License) (バージョン 2、またはそれ以降のライセンス) の規約に基づき、このライブラリを再配布および改変できます。\n\nこの作品は、有用であることを期待して配布されていますが、<strong>商用または特定の目的に適するかどうか</strong>も含めて、暗黙的にも、<strong>一切保証されません</strong>。\n詳しくは、 GNU 一般公衆利用許諾書をご覧ください。\n\nあなたはこのプログラムと共に、[$2 GNU 一般公衆利用許諾契約書の複製]を受け取ったはずです。受け取っていない場合は、フリーソフトウェア財団 (宛先は the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA) まで請求するか、または[https://www.gnu.org/copyleft/gpl.html オンラインでお読みください]。",
        "config-sidebar": "* [https://www.mediawiki.org MediaWikiのホーム]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents 利用者向け案内]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents 管理者向け案内]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ FAQ]\n----\n* <doclink href=Readme>お読みください</doclink>\n* <doclink href=ReleaseNotes>リリースノート</doclink>\n* <doclink href=Copying>コピー</doclink>\n* <doclink href=UpgradeDoc>アップグレード</doclink>",
        "config-env-good": "環境を確認しました。\nMediaWiki をインストールできます。",
        "config-env-bad": "環境を確認しました。\nMediaWiki のインストールはできません。",
        "config-db-web-no-create-privs": "あなたがインストールのために定義したアカウントは、アカウント作成のための特権としては不充分です。\nあなたがここで指定したアカウントは既に存在している必要があります。",
        "config-mysql-engine": "ストレージ エンジン:",
        "config-mysql-innodb": "InnoDB(推奨)",
-       "config-mysql-myisam": "MyISAM",
-       "config-mysql-myisam-dep": "<strong>警告:</strong> MySQLのストレージエンジンとして MyISAM を選択していますが、これをMediaWikiで利用するのは推奨されていません。その理由は: \n* テーブルロックによる並列性をほとんどサポートしていない\n* 他のエンジンに比べて壊れやすい\n* MediaWiki のコードベースは必ずしも MyISAM を本来あるべきほどには扱っていない\n\nあなたがインストールした MySQL が InnoDB をサポートしている場合、代わりにそちらをお使いになることを強くお勧めします。\nあなたがインストールした MySQL が InnoDB をサポートしていない場合、アップグレードした方がいいでしょう。",
-       "config-mysql-only-myisam-dep": "<strong>警告:</strong> MyISAM がこのマシンの MySQL の唯一のストレージエンジンですが、これをMediaWikiで利用するのは推奨されていません。その理由は: \n* テーブルロックによる並列性をほとんどサポートしていない\n* 他のエンジンに比べて壊れやすい\n* MediaWiki のコードベースは必ずしも MyISAM を本来あるべきほどには扱っていない\n\nあなたがインストールした MySQL が InnoDB をサポートしていない場合、アップグレードした方がいいでしょう。",
        "config-mysql-engine-help": "<strong>InnoDB</strong>は、並行処理のサポートに優れているので、ほとんどの場合において最良の選択肢です。\n\n<strong>MyISAM</strong>は、利用者が1人の場合、あるいは読み込み専用でインストールする場合に、より処理が早くなるでしょう。\nただし、MyISAMのデータベースは、InnoDBより高頻度で破損する傾向があります。",
        "config-mssql-auth": "認証の種類:",
        "config-mssql-install-auth": "インストール過程でデータベースに接続するために使用する認証の種類を選択してください。\n「{{int:config-mssql-windowsauth}}」を選択した場合、ウェブサーバーを実行しているユーザーの認証情報が使用されます。",
index 856fa6f..9c4c3fb 100644 (file)
@@ -46,7 +46,6 @@
        "config-invalid-db-type": "არასწორი მონაცემთა ბაზის ტიპი",
        "config-sqlite-readonly": "ფაილი <code>$1</code> ჩასაწერად მიუწვდომელია.",
        "config-mysql-innodb": "InnoDB",
-       "config-mysql-myisam": "MyISAM",
        "config-site-name": "ვიკის სახელი:",
        "config-site-name-blank": "შეიყვანეთ ვებ-გვერდის სახელი.",
        "config-project-namespace": "პროექტის სახელთა სივრცე:",
index f952045..a891d19 100644 (file)
@@ -53,7 +53,7 @@
        "config-help-restart": "입력한 모든 저장된 데이터를 지우고 설치 과정을 다시 시작하겠습니까?",
        "config-restart": "예, 다시 시작합니다",
        "config-welcome": "=== 사용 환경 검사 ===\n기본 검사는 지금 이 환경이 미디어위키 설치에 적합한지 수행합니다.\n설치를 완료하는 방법에 대한 지원을 찾는다면 이 정보를 포함해야 하는 것을 기억하세요.",
-       "config-copyright": "=== 저작권 및 약관 ===\n\n$1\n\n이 프로그램은 자유 소프트웨어입니다. 당신은 자유 소프트웨어 재단이 발표한 GNU 일반 공중 사용 허가서 버전 2나 그 이후 버전에 따라 이 프로그램을 재배포하거나 수정할 수 있습니다.\n\n이 프로그램이 유용하게 사용될 수 있기를 바라지만 <strong>상용으로 사용</strong>되거나 <strong>특정 목적에 맞을 것</strong>이라는 것을 <strong>보증하지 않습니다</strong>.\n자세한 내용은 GNU 일반 공중 사용 허가서를 참조하십시오.\n\n당신은 이 프로그램을 통해 <doclink href=Copying>GNU 일반 공중 사용 허가서 전문</doclink>을 받았습니다. 그렇지 않다면, Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA로 편지를 보내주시거나 [https://www.gnu.org/copyleft/gpl.html 온라인으로 읽어보시기] 바랍니다.",
+       "config-welcome-section-copyright": "=== 저작권 및 약관 ===\n\n$1\n\n이 프로그램은 자유 소프트웨어입니다. 당신은 자유 소프트웨어 재단이 발표한 GNU 일반 공중 사용 허가서 버전 2나 그 이후 버전에 따라 이 프로그램을 재배포하거나 수정할 수 있습니다.\n\n이 프로그램이 유용하게 사용될 수 있기를 바라지만 <strong>상용으로 사용</strong>되거나 <strong>특정 목적에 맞을 것</strong>이라는 것을 <strong>보증하지 않습니다</strong>.\n자세한 내용은 GNU 일반 공중 사용 허가서를 참조하십시오.\n\n당신은 이 프로그램을 통해 [$2 GNU 일반 공중 사용 허가서 전문]을 받았습니다. 그렇지 않다면, Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA로 편지를 보내주시거나 [https://www.gnu.org/copyleft/gpl.html 온라인으로 읽어보시기] 바랍니다.",
        "config-sidebar": "* [https://www.mediawiki.org 미디어위키 홈]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents 사용자 가이드]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents 관리자 가이드]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ FAQ]\n----\n* <doclink href=Readme>읽어보기</doclink>\n* <doclink href=ReleaseNotes>릴리스 노트</doclink>\n* <doclink href=Copying>전문</doclink>\n* <doclink href=UpgradeDoc>업그레이드하기</doclink>",
        "config-env-good": "환경이 확인되었습니다.\n미디어위키를 설치할 수 있습니다.",
        "config-env-bad": "환경이 확인되었습니다.\n미디어위키를 설치할 수 없습니다.",
        "config-db-web-no-create-privs": "설치를 위해 지정한 계정이 계정을 만들 수 있는 충분한 권한이 없습니다.\n여기서 지정한 계정은 이미 존재해야 합니다.",
        "config-mysql-engine": "저장소 엔진:",
        "config-mysql-innodb": "InnoDB (권장)",
-       "config-mysql-myisam": "MyISAM",
-       "config-mysql-myisam-dep": "<strong>경고:</strong> MySQL을 위한 저장소 엔진으로 MyISAM을 선택하였습니다. MyISAM을 미디어위키에 사용하는 것은 좋지 않습니다.  이유는:\n* 테이블 잠금 때문에 동시 실행을 지원하지 않습니다\n* 다른 엔진보다 더 손상되는 경향이 있습니다\n* 미디어위키 코드베이스가 항상 정상적으로 MyISAM을 처리하지 않습니다\n\nMySQL이 InnoDB를 지원한다면, InnoDB를 선택할 것을 매우 권장합니다.\nMySQL이 InnoDB를 지원하지 않는다면, 업그레이드를 하시는 편이 좋습니다.",
-       "config-mysql-only-myisam-dep": "<strong>경고:</strong> MyISAM은 이 기계에  유일하게 사용할 수 있는 MySQL용 저장소 엔진이며, 미디어위키에 사용하는 것은 좋지 않습니다. 이유는:\n* 테이블 잠금 때문에 동시 실행을 지원하지 않습니다\n* 다른 엔진보다 더 손상시키는 경향이 있습니다\n* 미디어위키 코드베이스가 항상 정상적으로 MyISAM을 처리하지 않습니다\n\n당신의 MySQL은 InnoDB를 지원하지 않으며, 업그레이드를 하는 것이 좋습니다.",
        "config-mysql-engine-help": "<strong>InnoDB</strong>는 동시 실행 지원이 우수하기 때문에 대부분의 경우 최고의 옵션입니다.\n\n<strong>MyISAM</strong>은 단일 사용자나 읽기 전용 설치에서 더 빠를 수 있습니다.\nMyISAM 데이터베이스는 InnoDB 데이터베이스보다 더 자주 손실될 수 있습니다.",
        "config-mssql-auth": "인증 형식:",
        "config-mssql-install-auth": "설치 과정 중 데이터베이스에 연결하는 데 사용할 인증 형식을 선택하세요.\n\"{{int:config-mssql-windowsauth}}\"을 선택하시면 웹서버를 실행 중인 아무 사용자의 자격 증명이 사용됩니다.",
index 50cf468..2a23c6d 100644 (file)
@@ -44,7 +44,7 @@
        "config-help-restart": "Wells De all Ding enjejovve Saache fottjeschmeße han, un dä janze Vörjang vun fürre aan neu aanfange?",
        "config-restart": "Joh, neu aanfange!",
        "config-welcome": "=== Ömjevong Pröhfe ===\nMer maache en Aanzahl jrundlääje Pröhvunge, öm erus ze fenge, ov di Ömjävvong heh paß för Mediawiki opzesäze.\nWann de Hölp bem Opsäze hölls, saach wigger, wat heh erus kohm, alsu wat heh schteiht.",
-       "config-copyright": "=== Urhävverrääsch un Lizänzbedengunge ===\n\n$1\n\nDat  Projramm heh es frei, mer kann et wiggerjävve un verdeijle un och verändere onger dä Bedengunge vun de  GNU <i lang=\"en\">General Public License</i> (Alljemeine öffentlesche Lizänz) wi se vun de <i lang=\"en\">Free Software Foundation</i> (de Schteftung för frei Projramme) veröffentlesch woode es. Dobei kanns De Der de Version 2 vun dä Lizanz ußsöhke, udder jeede Version donoh, wi et Der jefällt.\n\nDat Projramm weed wigger jejovve met dä Hoffnung, dat et jät nöz, ävver <strong>der ohne Jarrantie</strong>, sujaa der ohne de onußjeshproche Jarantie, <strong>verkoufbaa</strong> ze sin, udder <strong>för öhnds_ene beshtemmpte Zweck ze bruche</strong> ze sin.\nLiß de GNU <i lang=\"en\">General Public License</i> sellver, öm mieh ze erfahre.\n\nDo sullts en <doclink href=Copying>Kopie vun dä alljemene öffentlesche Lizänz vun dä GNU</doclink> (<i lang=\"en\">GNU General Public License</i>) zosamme met heh däm Projramm krääje han. Wann dat nit esu es, schrief aan de <i lang=\"en\">Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA</i>, udder [https://www.gnu.org/copyleft/gpl.html liß se online övver et Internet].",
+       "config-welcome-section-copyright": "=== Urhävverrääsch un Lizänzbedengunge ===\n\n$1\n\nDat  Projramm heh es frei, mer kann et wiggerjävve un verdeijle un och verändere onger dä Bedengunge vun de  GNU <i lang=\"en\">General Public License</i> (Alljemeine öffentlesche Lizänz) wi se vun de <i lang=\"en\">Free Software Foundation</i> (de Schteftung för frei Projramme) veröffentlesch woode es. Dobei kanns De Der de Version 2 vun dä Lizanz ußsöhke, udder jeede Version donoh, wi et Der jefällt.\n\nDat Projramm weed wigger jejovve met dä Hoffnung, dat et jät nöz, ävver <strong>der ohne Jarrantie</strong>, sujaa der ohne de onußjeshproche Jarantie, <strong>verkoufbaa</strong> ze sin, udder <strong>för öhnds_ene beshtemmpte Zweck ze bruche</strong> ze sin.\nLiß de GNU <i lang=\"en\">General Public License</i> sellver, öm mieh ze erfahre.\n\nDo sullts en [$2 Kopie vun dä alljemene öffentlesche Lizänz vun dä GNU] (<i lang=\"en\">GNU General Public License</i>) zosamme met heh däm Projramm krääje han. Wann dat nit esu es, schrief aan de <i lang=\"en\">Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA</i>, udder [https://www.gnu.org/copyleft/gpl.html liß se online övver et Internet].",
        "config-sidebar": "* [https://www.mediawiki.org MediaWiki sing Hompäjdsch]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Handbohch för Aanwänder]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents Handbohch för Administratohre un Wiki_Köbesse]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Öff jeschtallte Frohre met Antwoote]\n----\n* <doclink href=Readme>Liß Mesch! (<i lang=\"en\">Read me</i>)</doclink>\n* <doclink href=ReleaseNotes><i lang=\"en\">Release notes</i> Övver heh di Projrammversion</doclink>\n* <doclink href=Copying><i lang=\"en\">Copying</i> — Lizänzbeshtemmunge</doclink>\n* <doclink href=UpgradeDoc><i lang=\"en\">Upgrading</i> — Ob en neu Projrammversion jonn</doclink>",
        "config-env-good": "De Ömjävvöng es jepröhf.\nDo kanns MehdijaWikki opsäze.",
        "config-env-bad": "De Ömjävong es jeprööf.\nDo kanns MehdijaWikki nit opsäze.",
        "config-db-web-no-create-privs": "Dä Zohjang för et Opsäze es nit berääschtesch, ene ander Zohjan enzereeschte.\nDä aanjejovve Zohjang för der Nomaalbedrief moß dröm schunn enjersht sen!",
        "config-mysql-engine": "De Zoot udder et Fommaat vun de Tabälle:",
        "config-mysql-innodb": "InnoDB",
-       "config-mysql-myisam": "MyISAM",
-       "config-mysql-myisam-dep": "'''Opjepaß:''' <i lang=\"en\">MyISAM</i> es als Speicher för <i lang=\"en\">MySQL</i> nit besönders joot för et Zosammeschpell met MediaWiki zo bruche:\n* Dorj_et kumplätte Sperre vun Tabälle, künne koum ens Saache parrallel en dä Daatebangk jedonn wääde.\n* Dat Fomaat es anfällesch för Probleme met de Daate.\n* Et weed vun MediaWiki nit ėmmer zopaß ongerschtöz.\n\nWann Ding <i lang=\"en\">MySQL</i> et Schpeischere en <i lang=\"en\">InnoDB</i>-Datteije ongerschtöze deiht, dom_mer dat nohdröcklesch ämfähle.\nKann dä ẞööver dat nit, künnd et joode jelääjeheit sin, dä ens op der neuste Schtand ze bränge.",
-       "config-mysql-only-myisam-dep": "'''Opjepaß:''' <i lang=\"en\" xml:lang=\"en\">MyISAM</i> es de einzeje Zoot Schpeischerprojramm för <i lang=\"en\" xml:lang=\"en\">MySQL</i> op dä Maschiin. Di es nit för MediaWiki ze ämfähle es, weil:\n* wääje dem Schpärre vun jannze Tabälle sin koum paralleele Axjuhne en dä Daatebangk möjjelesch,\n* ed es aanfällesch för Probleeme met de Daate es, un\n* et weed vun MediaWiki nit emmer jood ongerschtöz.\n\nDing Enschtallazjuhn vum <i lang=\"en\" xml:lang=\"en\">MySQL</i> kann nit met <i lang=\"en\" xml:lang=\"en\">InnoDB</i> ömjonn.\nWi wöhr et med ene neuere Väsjohn vum <i lang=\"en\" xml:lang=\"en\">MySQL</i>?",
        "config-mysql-engine-help": "<strong>InnoDB</strong> es fö jewöhnlesch et beß, weil vill Zohjreffe op eijmohl joot ongershtöz wääde.\n\n<strong>MyISAM</strong> es flöcker op Rääschnere met bloß einem Minsch draan, un bei Wikis, di mer bloß lässe un nit schrieeve kann.\nMyISAM-Daatebangke han em Schnett mih Fähler un jon flöcker kappott, wi InnoDB-Daatebangke.",
        "config-mssql-auth": "De Zoot Aanmäldong:",
        "config-mssql-install-auth": "Söhk us, wi dat Aanmälde aan dä Daatebangk vor sesch jonn sull för de Enschtallazjuhn.\nWann De <em>{{int:Config-mssql-windowsauth}}</em> nemms, weed jenumme, met wat emmer dä Wäbßööver aam loufe es.",
index 11b662e..231271c 100644 (file)
@@ -40,7 +40,6 @@
        "config-sqlite-readonly": "Dosyeya <code>$1</code> ne nivîsbar e.",
        "config-db-web-account": "Hesabê danegehê bô têgihiştina tora înternetê",
        "config-mysql-innodb": "InnoDB",
-       "config-mysql-myisam": "MyISAM",
        "config-site-name": "Navê wîkiyê:",
        "config-site-name-blank": "Navê malperek têkeve.",
        "config-ns-generic": "Proje",
index 5cd5344..e6e12f1 100644 (file)
        "config-db-web-account-same": "Dee selwechte Kont wéi bei der Installatioun benotzen",
        "config-db-web-create": "De Kont uleeë wann et e net scho gëtt",
        "config-mysql-innodb": "InnoDB (recommandéiert)",
-       "config-mysql-myisam": "MyISAM",
        "config-mssql-auth": "Typ vun der Authentifikatioun:",
        "config-mssql-sqlauth": "SOL-Server-Authentifikatioun",
        "config-mssql-windowsauth": "Windows-Authentifikatioun",
index b686444..d555bc7 100644 (file)
@@ -42,7 +42,7 @@
        "config-help-restart": "Ti voeu scassâ tutti i dæti sarvæ che ti t'hæ inseio e riavviâ o processo de installaçion?",
        "config-restart": "Scì, riavvia",
        "config-welcome": "=== Controllo de l'ambiente ===\nSaiâ eseguio di controlli de base pe vedde se questo ambiente o l'è adatto pe l'installaçion de MediaWiki.\nRegordite de includde queste informaçioin se ti domandi ascistença insce comme completâ l'installaçion.",
-       "config-copyright": "=== Copyright e termini ===\n\n$1\n\nQuesto programma o l'è un software libero; ti poeu redistriboîlo e/ò modificâlo segondo i termi da GNU General Public License, comme pubbricâ da-a Free Software Foundation; ò a verscion 2 da Liçença ò (a proppia scelta) qualunque verscion succesciva.\n\nQuesto programma o l'è distribuio inta sperança ch'o segge utile, ma SENSA ARCUNA GARANTIA; sença manco a garantia impliçita de NEGOSSIABILITÆ o de APPRICABILITÆ PE UN PARTICOL SCOPO.\nS'amie a GNU General Public License pe maggioî dettaggi.\n\nQuesto programma o dev'ese distribuio insemme a <doclink href=Copying>una copia da GNU General Public License</doclink>; in caxo contraio, se ne poeu otegnî un-a scrivendo a-a Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA oppù [https://www.gnu.org/copyleft/gpl.html lezila inta ræ'].",
+       "config-welcome-section-copyright": "=== Copyright e termini ===\n\n$1\n\nQuesto programma o l'è un software libero; ti poeu redistriboîlo e/ò modificâlo segondo i termi da GNU General Public License, comme pubbricâ da-a Free Software Foundation; ò a verscion 2 da Liçença ò (a proppia scelta) qualunque verscion succesciva.\n\nQuesto programma o l'è distribuio inta sperança ch'o segge utile, ma SENSA ARCUNA GARANTIA; sença manco a garantia impliçita de NEGOSSIABILITÆ o de APPRICABILITÆ PE UN PARTICOL SCOPO.\nS'amie a GNU General Public License pe maggioî dettaggi.\n\nQuesto programma o dev'ese distribuio insemme a [$2 una copia da GNU General Public License]; in caxo contraio, se ne poeu otegnî un-a scrivendo a-a Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA oppù [https://www.gnu.org/copyleft/gpl.html lezila inta ræ'].",
        "config-sidebar": "* [https://www.mediawiki.org Paggina prinçipâ MediaWiki]\n* [https://www.mediawiki.org/wiki/Agiutto:Guidda a-i contegnui pe utenti]\n* [https://www.mediawiki.org/wiki/Manoâ:Guidda ai contegnui per admin]\n* [https://www.mediawiki.org/wiki/Manoâ:FAQ FAQ]\n----\n* <doclink href=Readme>Lezime</doclink>\n* <doclink href=ReleaseNotes>Notte de verscion</doclink>\n* <doclink href=Copying>Copie</doclink>\n* <doclink href=UpgradeDoc>Aggiornamenti</doclink>",
        "config-env-good": "L'ambiente o l'è stæto controllou.\nL'è poscibile installâ MediaWiki.",
        "config-env-bad": "L'ambiente o l'è stæto controllou.\nNon l'è poscibbile installâ MediaWiki.",
        "config-db-web-no-create-privs": "L'account doeuviou pe l'installaçion o no dispon-e di privileggi necessai pe creâ un atro account.\nL'account indicou chì o deve za existe.",
        "config-mysql-engine": "Motô d'archiviaçion:",
        "config-mysql-innodb": "InnoDB",
-       "config-mysql-myisam": "MyISAM",
-       "config-mysql-myisam-dep": "<strong>Atençion:</strong> t'hæ seleçionou MyISAM comme motô d'archiviaçion pe MySQL, ch'o no l'è racomandou pe l'uso con  MediaWiki, percose:\n* o supporta debolmente a concorença pe-o blocco da tabella\n* o l'è ciu inclinou a-a corruçion di atri motoî\n* o codiçe de base MediaWiki o no gestisce sempre MyISAM comm'o doviæ\n\nSe a to instalaçion MySQL a supporta InnoDB, l'è atamente racomandou che ti o çerni a-o so posto.\nSe a to installaçion MySQL a no supporta InnoDB, foscia l'è o momento pe 'n agiornamento.",
-       "config-mysql-only-myisam-dep": "<strong>Atençion:</strong> MyISAM o l'è l'unnico motô d'archiviaçion disponibbile pe MySQL insce sta macchina, e questo no l'è consegiou pe doeuviâlo con MediaWiki, percose:\n* o supporta debolmente a concorenza pe-o blocco da tabella\n* o l''è ciu inclinou a-a corruçion di atri motoî\n* o coddiçe de base MediaWiki MyISAM  o no-o gestisce sempre comm'o doviæ\n\nS'a to installaçion MySQL a no supporta InnoDB, foscia l'è o momento pe 'n agiornamento.",
        "config-mysql-engine-help": "<strong>InnoDB</strong> o l'è quæxi sempre a megio opçion, in quante o g'ha 'n bon supporto da concorença.\n\n<strong>MyISAM</strong> o poriæ vese ciu veloçe inte installaçioin mono-utente ò in sola-lettua.\nI database MyISAM tendan a dannezâse ciu soventi di database InnoDB.",
        "config-mssql-auth": "Tipo d'aotenticaçion:",
        "config-mssql-install-auth": "Seleçion-a o tipo d'aotenticaçion ch'o saiâ doeuviou pe conettise a-o database durante o processo de instalaçion.\nSe ti seleçion-i \"{{int:config-mssql-windowsauth}}\", saiâ doeuviou e credençiæ de quæ se segge utente segge aproeuv'a fâ giâ o serviou web.",
index 9547e42..a637c09 100644 (file)
@@ -44,7 +44,7 @@
        "config-help-restart": "آیا می‌خواهید همهٔ اطلاعات ذخیره شده‌ای که وارد کرده‌اید را پاک کنید و دوباره روند نصب را شروع کنید؟",
        "config-restart": "أرێ، دوواره راه‌اندازی کة",
        "config-welcome": "===بررسی‌های محیطی===\nبرای فهمیدن اینکه این محیط برای نصب مدیاویکی مناسب است، اکنون بررسی‌های اساسی انجام خواهد‌شد.\nاگر به دنبال پشتیبانی در چگونگی تکمیل نصب هستید،به یاد داشته باشید این اطلاعات را بگنجانید.",
-       "config-copyright": "===حق چاپ و شرایط===\n$1\nاین برنامه، یک نرم‌افزاری آزاد است. شما می‌توانید آن را بازتوزیع کرده و/یا با شرایط نگارش ۲ یا (با نظر خودتان) هر نگارش جدیدتری از پروانه جامع همگانی گنو که توسط بنیاد نرم‌افزار آزاد منتشر شده، تغییر دهید.\n\nاین برنامه با امید این که مفید واقع‌ شود توزیع شده‌است،اما '''بدون هیچ ضمانتی'''; حتی بدون اشارهٔ ضمانتی از '''قابلیت عرضه''' یا ''' صلاحیت برای یک هدف خاص'''.\nبرای جزئیات بیش‌تر پروانه جامع همگانی گنو را مشاهده کنید.\n\nشما باید <doclink href=Copying> یک نگارش ازمجوز عمومی کلی </doclink> همراه این برنامه دریافت کرده باشید. در غیر این صورت با بنیاد نرم‌افزار آزاد، ایالات متحده امریکا، بوستون، خیابان فرانکلین، پلاک ۵۱، طبقه پنجم، صندوق پستی MA۰۲۱۱۰-۱۳۰ مکاتبه کنید، یا [https://www.gnu.org/copyleft/gpl.html در این‌جا به صورت برخط بخوانید].",
+       "config-welcome-section-copyright": "===حق چاپ و شرایط===\n$1\nاین برنامه، یک نرم‌افزاری آزاد است. شما می‌توانید آن را بازتوزیع کرده و/یا با شرایط نگارش ۲ یا (با نظر خودتان) هر نگارش جدیدتری از پروانه جامع همگانی گنو که توسط بنیاد نرم‌افزار آزاد منتشر شده، تغییر دهید.\n\nاین برنامه با امید این که مفید واقع‌ شود توزیع شده‌است،اما '''بدون هیچ ضمانتی'''; حتی بدون اشارهٔ ضمانتی از '''قابلیت عرضه''' یا ''' صلاحیت برای یک هدف خاص'''.\nبرای جزئیات بیش‌تر پروانه جامع همگانی گنو را مشاهده کنید.\n\nشما باید [$2  یک نگارش ازمجوز عمومی کلی ] همراه این برنامه دریافت کرده باشید. در غیر این صورت با بنیاد نرم‌افزار آزاد، ایالات متحده امریکا، بوستون، خیابان فرانکلین، پلاک ۵۱، طبقه پنجم، صندوق پستی MA۰۲۱۱۰-۱۳۰ مکاتبه کنید، یا [https://www.gnu.org/copyleft/gpl.html در این‌جا به صورت برخط بخوانید].",
        "config-sidebar": "* [https://www.mediawiki.org وةڵگة اصلی مدیاویکی]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents راهنمای کاربر]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents راهنمای مدیر]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ پرسش‌های رایج]\n----\n* <doclink href=Readme>مرا بخوان</doclink>\n* <doclink href=ReleaseNotes>یادداشت‌های انتشار</doclink>\n* <doclink href=Copying>نسخه برداری</doclink>\n* <doclink href=UpgradeDoc>ارتقا</doclink>",
        "config-env-good": "محیط بررسی شده‌است.\nشما می‌توانید مدیاویکی را نصب کنید.",
        "config-env-bad": "محیط بررسی شده‌است.\nشما نمی‌توانید مدیاویکی را نصب کنید.",
index fcb39df..a4c524b 100644 (file)
@@ -99,7 +99,6 @@
        "config-db-web-create": "Sukurti paskyrą, jeigu jos nėra",
        "config-mysql-engine": "Saugojimo variklis:",
        "config-mysql-innodb": "InnoDB",
-       "config-mysql-myisam": "MyISAM",
        "config-mssql-auth": "Autentifikavimo tipas:",
        "config-mssql-sqlauth": "SQL Serverio autentifikavimas",
        "config-mssql-windowsauth": "Windows autentifikavimas",
index e744495..675e3db 100644 (file)
@@ -43,7 +43,6 @@
        "config-header-oracle": "Oracle iestatījumi",
        "config-header-mssql": "Microsoft SQL servera iestatījumi",
        "config-mysql-innodb": "InnoDB",
-       "config-mysql-myisam": "MyISAM",
        "config-mssql-windowsauth": "Windows Autentifikācija",
        "config-ns-generic": "Projekts",
        "config-ns-site-name": "Tāds pats kā viki nosaukums: $1",
index 44930c5..a3d824b 100644 (file)
@@ -37,7 +37,7 @@
        "config-help-restart": "Tianao hofafana avokoa ve ny data voaangona natsofokao ary hamerina ny fizotran'ny fametrahana ?",
        "config-restart": "Eny, avereno atao",
        "config-welcome": "=== Fanamarinana mikasika ny tontolo ===\nNy fanamarihana tsotsotra dia atao hijerena raha mety ho ana rindrankajy Mediawiki ny tontolo.\nTadidio ny mametraka ireto torohay ireo raha mitady fanohanana mikasika ny fomba famaranana ny fametrahana ianao.",
-       "config-copyright": "== Zom-pamorona ary fepetra ==\n\n$1\n\n\nIo fandaharana dia rindrambaiko maimaim-poana; dia afaka zarazarain ary ovaina araka ny fepetra ao amin'ny GNU General Public License navoakan'ny Free Software Foundation; na versiona 2 ao amin'ny lisansa, na (araka ny safidinao) versiona tatỳ aoriana.\n\nIo fandaharaa io dia zaraina amin'ny fanantenana fa ho ilaina, anefa kosa dia <strong>tsy misy fiantohana</strong>; tsy misy fiantohana mikasika ny <strong>fivarotana azy</strong> na <strong>famendrehana ho azo ampiasaina amin'ny tranga iray manokana</strong>.\nJereo ny GNU General Public License hahazoana zavatra amin'ny antsipiriany.\n\nIanao dia tokony nandray <doclink href=Copying> kôpian'nyGNU General Public License </doclink> miaraka amin'ny fandaharana ity; raha tsy izany, manorata any amin'ny Free Software Foundation, Inc., 51 Franklin Street, Fahadimy Floor, Boston, MA 02110-1301, USA, na [https://www.gnu.org/copyleft/gpl.html vakio ao amin'ny Internet izany].",
+       "config-welcome-section-copyright": "== Zom-pamorona ary fepetra ==\n\n$1\n\n\nIo fandaharana dia rindrambaiko maimaim-poana; dia afaka zarazarain ary ovaina araka ny fepetra ao amin'ny GNU General Public License navoakan'ny Free Software Foundation; na versiona 2 ao amin'ny lisansa, na (araka ny safidinao) versiona tatỳ aoriana.\n\nIo fandaharaa io dia zaraina amin'ny fanantenana fa ho ilaina, anefa kosa dia <strong>tsy misy fiantohana</strong>; tsy misy fiantohana mikasika ny <strong>fivarotana azy</strong> na <strong>famendrehana ho azo ampiasaina amin'ny tranga iray manokana</strong>.\nJereo ny GNU General Public License hahazoana zavatra amin'ny antsipiriany.\n\nIanao dia tokony nandray [$2  kôpian'nyGNU General Public License ] miaraka amin'ny fandaharana ity; raha tsy izany, manorata any amin'ny Free Software Foundation, Inc., 51 Franklin Street, Fahadimy Floor, Boston, MA 02110-1301, USA, na [https://www.gnu.org/copyleft/gpl.html vakio ao amin'ny Internet izany].",
        "config-sidebar": "* [https://www.mediawiki.org MediaWiki fandraisana]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Torolalan'ny mampiasa]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents Torolalan'ny mpandrindra]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Fanontaniana mipetraka matetika]\n----\n* <doclink href=Readme>Vakio aho</doclink>\n* <doclink href=ReleaseNotes>Naoty famoahana</doclink>\n* <doclink href=Copying>Fandikàna</doclink>\n* <doclink href=UpgradeDoc>Fampihatsaràna</doclink>",
        "config-env-good": "Voamarina ny tontolo.\nAfaka apetrakao i MediaWiki.",
        "config-env-bad": "Voamarina ny tontolo.\nTsy afaka mametraka an'i MediaWiki ianao.",
@@ -60,7 +60,6 @@
        "config-header-mssql": "Parametatry ny lohamilina Microsoft SQL Server",
        "config-invalid-db-type": "Karazana banky angona tsy ekena.",
        "config-mysql-innodb": "innoDB",
-       "config-mysql-myisam": "MyISAM",
        "config-ns-generic": "Tetikasa",
        "config-ns-other": "Hafa (lazao)",
        "config-admin-name": "Ny anaranao :",
index 64cce74..e652683 100644 (file)
@@ -45,7 +45,7 @@
        "config-help-restart": "Дали сакате да ги исчистите сите зачувани податоци што ги внесовте и да ја започнете воспоставката одново?",
        "config-restart": "Да, почни одново",
        "config-welcome": "=== Проверки на околината ===\nСега ќе се извршиме основни проверки за да се востанови дали околината е погодна за воспоставкa на МедијаВики. Не заборавајте да ги приложите овие информации ако барате помош со довршување на воспоставката.",
-       "config-copyright": "=== Авторски права и услови ===\n\n$1\n\nОва е слободна програмска опрема (free software); можете да го редистрибуирате и/или менувате согласно условите на ГНУ-овата општа јавна лиценца (GNU General Public License) на Фондацијата за слободна програмска опрема (Free Software Foundation); верзија 2 или било која понова верзија на лиценцата (по ваш избор).\n\nОвој програм се нуди со надеж дека ќе биде корисен, но '''без никаква гаранција'''; дури ни подразбраната гаранција за '''продажна способност''' или '''погодност за определена цел'''.\nПовеќе информации ќе најдете во текстот на ГНУ-овата општа јавна лиценца.\n\nБи требало да имате добиено <doclink href=Copying>примерок од ГНУ-овата општа јавна лиценца</doclink> заедно со програмов; ако немате добиено, тогаш пишете ни на Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. или [https://www.gnu.org/copyleft/gpl.html прочитајте ја тука].",
+       "config-welcome-section-copyright": "=== Авторски права и услови ===\n\n$1\n\nОва е слободна програмска опрема (free software); можете да го редистрибуирате и/или менувате согласно условите на ГНУ-овата општа јавна лиценца (GNU General Public License) на Фондацијата за слободна програмска опрема (Free Software Foundation); верзија 2 или било која понова верзија на лиценцата (по ваш избор).\n\nОвој програм се нуди со надеж дека ќе биде корисен, но '''без никаква гаранција'''; дури ни подразбраната гаранција за '''продажна способност''' или '''погодност за определена цел'''.\nПовеќе информации ќе најдете во текстот на ГНУ-овата општа јавна лиценца.\n\nБи требало да имате добиено [$2 примерок од ГНУ-овата општа јавна лиценца] заедно со програмов; ако немате добиено, тогаш пишете ни на Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. или [https://www.gnu.org/copyleft/gpl.html прочитајте ја тука].",
        "config-sidebar": "* [https://www.mediawiki.org Домашна страница на МедијаВики]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Водич за корисници]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents Водич за администратори]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ ЧПП]",
        "config-sidebar-readme": "Прочитај ме",
        "config-sidebar-relnotes": "Белешки за изданието",
        "config-db-web-no-create-privs": "Сметката што ја назначивте за воспоставка нема доволно привилегии за да може да создаде сметка.\nТука мора да назначите постоечка сметка.",
        "config-mysql-engine": "Складишен погон:",
        "config-mysql-innodb": "InnoDB (препорачано)",
-       "config-mysql-myisam": "MyISAM",
-       "config-mysql-myisam-dep": "'''Предупредување:''' Го одбравте MyISAM како складишен погон за MySQL. Но тој не се препорачува за МедијаВики бидејќи:\n* одвај поддржува едновременост поради заклучување на табелите\n* поподложен на расипување од другите погони\n* кодната база на МедијаВики не секогаш може да работи со MyISAM како што треба\n\nАко вашата воспоставка на MySQL поддржува InnoDB, тогаш сериозно препорачуваме да го користите него наместо MyISAM.\nАко вашата воспоставка на MySQL не поддржува InnoDB, веројатно дошло време за надградба.",
-       "config-mysql-only-myisam-dep": "'''Предупредување:''' MyISAM е единствениот достапен складишен погон за MySQL на оваа машина, а ова не се препорачува за употреба со МедијаВики, бидејќи:\n* речиси не поддржува истовремено извршување на задачите поради заклучувањето на табелите\n* поподложен е на расипувања од другите погони\n* кодната база на МедијаВИки не секогаш работи исправно со MyISAM\nВашата воспоставка на MySQL не поддржува InnoDB. Можеби е време да ја надградите.",
        "config-mysql-engine-help": "'''InnoDB''' речиси секогаш е најдобар избор, бидејќи има добра поддршка за едновременост.\n\n'''MyISAM''' може да е побрз кај воспоставките наменети за само еден корисник или незаписни воспоставки (само читање).\nБазите на податоци од MyISAM почесто се расипуваат од базите на InnoDB.",
        "config-mssql-auth": "Тип на заверка:",
        "config-mssql-install-auth": "Изберете го типот на заверка што ќе се користи за поврзување со базата на податоци во текот на воспоставката.\nАко изберете „{{int:config-mssql-windowsauth}}“, ќе се користат најавните податоци или корисникот како кој работи мрежниот опслужувач.",
index 67d9f54..9f31fda 100644 (file)
@@ -42,7 +42,7 @@
        "config-help-restart": "आपण टाकून जतन केलेला सर्व डाटा आपणास साफ करावयाचा व उभारणीची प्रक्रिया पुन्हा सुरू करावयाची आहे काय?",
        "config-restart": "होय, परत चालू करा",
        "config-welcome": "=== पारिसरीक तपासण्या ===\nमिडियाविकिच्या उभारणीस हा परिसर योग्य आहे काय याच्या मूळ तपासण्या आता केल्या जातील.\nजर आपणास पुढे याची उभारणी करण्याबद्दल साहाय्य लागल्यास, याचा अंतर्भाव करणे लक्षात ठेवा.",
-       "config-copyright": "=== प्रताधिकार व अटी ===\n\n$1\nहा कार्यसंच,हे एक मुक्त संचेतन आहे;आपण त्यास पुनर्वितरीत व/किंवा त्यास फ्री सॉफ्टवेअर फाऊंडेशन द्वारे प्रकाशित, GNU जनरल पब्लिक लायसन्स अंतर्गत बदलु शकता;या परवान्याची आवृत्ती २ किंवा (आपल्या इच्छेनुसार)त्यानंतरची आवृत्ती.\n\nहा कार्यसंचाचे वितरण,पण, <strong>कोणत्याही हमीशिवाय</strong>; याशिवाय <strong>व्यापारीकरणाच्या</strong> कोणत्याही अभिप्रेत आश्वासनाशिवाय किंवा <strong>एखाद्या विशिष्ट कार्यासाठीच्या अर्हतेशिवाय</strong>ही आशा ठेऊन केले आहे कि, तो उपयोगी असेल.\nअधिक माहितीसाठी GNU जनरल पब्लिक लायसन्स बघा.\nआपणास या कार्यसंचासमवेत <doclink href=Copying>GNU जनरल पब्लिक लायसन्सची प्रत मिळाली असेल,</doclink>नसल्यास,फ्री सॉफ्टवेअर फाऊंडेशनला या पत्त्यावर लिहा.Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. किंवा त्यास [https://www.gnu.org/copyleft/gpl.html ऑनलाईन वाचा].",
+       "config-welcome-section-copyright": "=== प्रताधिकार व अटी ===\n\n$1\nहा कार्यसंच,हे एक मुक्त संचेतन आहे;आपण त्यास पुनर्वितरीत व/किंवा त्यास फ्री सॉफ्टवेअर फाऊंडेशन द्वारे प्रकाशित, GNU जनरल पब्लिक लायसन्स अंतर्गत बदलु शकता;या परवान्याची आवृत्ती २ किंवा (आपल्या इच्छेनुसार)त्यानंतरची आवृत्ती.\n\nहा कार्यसंचाचे वितरण,पण, <strong>कोणत्याही हमीशिवाय</strong>; याशिवाय <strong>व्यापारीकरणाच्या</strong> कोणत्याही अभिप्रेत आश्वासनाशिवाय किंवा <strong>एखाद्या विशिष्ट कार्यासाठीच्या अर्हतेशिवाय</strong>ही आशा ठेऊन केले आहे कि, तो उपयोगी असेल.\nअधिक माहितीसाठी GNU जनरल पब्लिक लायसन्स बघा.\nआपणास या कार्यसंचासमवेत [$2 GNU जनरल पब्लिक लायसन्सची प्रत मिळाली असेल,]नसल्यास,फ्री सॉफ्टवेअर फाऊंडेशनला या पत्त्यावर लिहा.Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. किंवा त्यास [https://www.gnu.org/copyleft/gpl.html ऑनलाईन वाचा].",
        "config-sidebar": "* [https://www.mediawiki.org मिडियाविकि गृह]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents सदस्य मार्गदर्शिका]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents प्रशासकाची मार्गदर्शिका]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ एफएक्यू]\n----\n* <doclink href=Readme>रीड मी</doclink>\n* <doclink href=ReleaseNotes>विमोचन टिप्पण्या</doclink>\n* <doclink href=Copying>नकलविणे</doclink>\n* <doclink href=UpgradeDoc>दर्जोन्नती करणे</doclink>",
        "config-env-good": "पारिसरीक तपासणी झाली आहे.\nआपण मिडियाविकि उभारू शकता.",
        "config-env-bad": "पारिसरीक तपासणी झाली आहे.\nआपण मिडियाविकि उभारू शकत नाही.",
index 0318f64..1163486 100644 (file)
@@ -47,7 +47,7 @@
        "config-help-restart": "Adakah anda ingin untuk membersihkan semua data yang disimpan yang anda telah masukkan dan memulakan semula proses pemasangan?",
        "config-restart": "Ya, mula semula",
        "config-welcome": "=== Pemeriksaan persekitaran ===\nPemeriksaan asas kini boleh dilakukan untuk melihat jika persekitaran ini adalah sesuai untuk pemasangan MediaWiki.\nIngat untuk memasukkan maklumat ini jika anda mahukan sokongan tentang bagaimana untuk menyelesaikan pemasangan.",
-       "config-copyright": "=== Hakcipta dan Syarat-Syarat ===\n\n$1\n\nProgram ini merupakan perisian bebas; anda boleh mengedarkannya semula dan/atau mengubahsuainya di bawah syarat-syarat Lesen Awam GNU seperti yang diterbitkan oleh Yayasan Perisian Bebas; sama ada versi 2 Lesen ini atau (mengikut pilihan anda) mana-mana versi selepas ini.\n\nProgram ini diedarkan dengan harapan bahawa ia akan menjadi berguna, tetapi '''tanpa sebarang waranti'''; tanpa jaminan yang tersirat '''kebolehdagangan''' atau '''kesesuaian untuk tujuan tertentu'''.\nLihat Lesen Awam GNU untuk maklumat lanjut.\n\nAnda sepatutnya telah menerima <doclink href=Copying> satu salinan Lesen Awam GNU </doclink> bersama-sama dengan program ini, jika tidak, menulis surat kepada Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA, atau [https://www.gnu.org/copyleft/gpl.html membacanya dalam talian].",
+       "config-welcome-section-copyright": "=== Hakcipta dan Syarat-Syarat ===\n\n$1\n\nProgram ini merupakan perisian bebas; anda boleh mengedarkannya semula dan/atau mengubahsuainya di bawah syarat-syarat Lesen Awam GNU seperti yang diterbitkan oleh Yayasan Perisian Bebas; sama ada versi 2 Lesen ini atau (mengikut pilihan anda) mana-mana versi selepas ini.\n\nProgram ini diedarkan dengan harapan bahawa ia akan menjadi berguna, tetapi '''tanpa sebarang waranti'''; tanpa jaminan yang tersirat '''kebolehdagangan''' atau '''kesesuaian untuk tujuan tertentu'''.\nLihat Lesen Awam GNU untuk maklumat lanjut.\n\nAnda sepatutnya telah menerima [$2  satu salinan Lesen Awam GNU ] bersama-sama dengan program ini, jika tidak, menulis surat kepada Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA, atau [https://www.gnu.org/copyleft/gpl.html membacanya dalam talian].",
        "config-sidebar": "* [https://www.mediawiki.org Laman utama MediaWiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Panduan Pengguna]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents Panduan Penyelia]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Soalan lazim]\n----\n* <doclink href=Readme>Baca saya</doclink>\n* <doclink href=ReleaseNotes>Nota keluaran</doclink>\n* <doclink href=Copying>Menyalin</doclink>\n* <doclink href=UpgradeDoc>Menaik taraf</doclink>",
        "config-env-good": "Persekitaran telah diperiksa.\nAnda boleh memasang MediaWiki.",
        "config-env-bad": "Persekitaran telah diperiksa. \nAnda tidak boleh memasang MediaWiki.",
@@ -96,8 +96,6 @@
        "config-db-web-create": "Ciptakan akaun jika belum wujud",
        "config-mysql-engine": "Enjin storan:",
        "config-mysql-innodb": "InnoDB",
-       "config-mysql-myisam": "MyISAM",
-       "config-mysql-only-myisam-dep": "<strong>Amaran:</strong> MyISAM ialah satu-satunya enjin storan yang terdapat untuk MySQL di mesin ini, dan penggunaannya dengan MediaWiki tidak digalakkan kerana:\n* ia tidak menyokong keserempakan (''concurrency'') disebabkan penguncian jadual\n* ia lebih terdedah kepada korupsi daripada enjin-enjin lain\n* pangkalan kod MediaWiki tidak sentiasa mengendalikan MyISAM seperti yang diharapkan\n\nPemasangan MySQL anda tidak menyokong InnoDB. Mungkin tiba masanya untuk naik taraf.",
        "config-mssql-auth": "Jenis pengesahan:",
        "config-site-name": "Nama wiki:",
        "config-site-name-help": "Ini akan dipaparkan pada bar tajuk perisian pelayar dan tempat-tempat lain yang berkenaan.",
index c4cd28b..dae1280 100644 (file)
@@ -41,7 +41,6 @@
        "config-db-schema": "Skema għal MediaWiki:",
        "config-db-web-create": "Oħloq il-kont jekk għadu ma jeżistix",
        "config-mysql-innodb": "InnoDB",
-       "config-mysql-myisam": "MyISAM",
        "config-site-name": "Isem tal-wiki:",
        "config-site-name-help": "Dan se jidher fil-barra tat-titlu tal-browżer u f'diversi postijiet oħra.",
        "config-site-name-blank": "Daħħal isem tas-sit.",
index 67c20e0..c90f816 100644 (file)
@@ -43,7 +43,7 @@
        "config-help-restart": "你敢欲共你拍的佮保存的資料攏清掉,並且重開始安裝的動作?",
        "config-restart": "是,重來",
        "config-welcome": "=== 環境檢測 ===\n這馬欲做基本的檢測,看環境是毋是適合裝 MediaWiki。\n若你愛有支援,才裝會起來,請共遮的資訊記起來。",
-       "config-copyright": "=== Pán-koân seng-bêng kap siū-koân tiâu-khoán ===\n\n$1\n\nPún têng-sek sī chū-iû nńg-thé; lí thang chiàu Chū-iû Nńg-thé Ki-kim-hoē só͘ hoat-piáu--ê GNU Thong-iōng Kong-kiōng Siū-koân Tiâu-khoán kui-tēng, kā pún têng-sek têng hoat-pò͘ iah-sī siu-kái; bô-lūn lí sī chiàu pún siū-koân tiâu-khoán--ê tē 2 pán iah koh khah sin--ê pán-pún (lí thang ka-kī kéng).\n\nPún têng-sek hoat-pò͘--ê bo̍k-tek sī ǹg-bāng ē-tàng pang-chān, m̄-koh <strong>bô hù jīm-hô tam-pó͘ chek-jīm</strong>; iah bô piáu-sī kóng tùi <strong>hoàn-bē-sèng</strong> iah <strong>te̍k-tēng iōng-tô͘--ê sek-iōng-sèng</strong>--ê chêng-hêng tam-pó͘. Siông-sè chhiáⁿ chham-khó GNU Thong-iōng Kong-kiōng Siū-koân.\n\nLí èng-kai tùi pún têng-sek siu-tio̍h <doclink href=\"Copying\">GNU Thong-iōng Kong-kiōng Siū-koân--ê Hù-pún</doclink>; nā-bô, chhiáⁿ siá-phoe thong-tī Chū-iû Nńg-thé KI-kim-hoē, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA, iah-sī [https://www.gnu.org/copyleft/gpl.html soàⁿ-téng khoàⁿ].",
+       "config-welcome-section-copyright": "=== Pán-koân seng-bêng kap siū-koân tiâu-khoán ===\n\n$1\n\nPún têng-sek sī chū-iû nńg-thé; lí thang chiàu Chū-iû Nńg-thé Ki-kim-hoē só͘ hoat-piáu--ê GNU Thong-iōng Kong-kiōng Siū-koân Tiâu-khoán kui-tēng, kā pún têng-sek têng hoat-pò͘ iah-sī siu-kái; bô-lūn lí sī chiàu pún siū-koân tiâu-khoán--ê tē 2 pán iah koh khah sin--ê pán-pún (lí thang ka-kī kéng).\n\nPún têng-sek hoat-pò͘--ê bo̍k-tek sī ǹg-bāng ē-tàng pang-chān, m̄-koh <strong>bô hù jīm-hô tam-pó͘ chek-jīm</strong>; iah bô piáu-sī kóng tùi <strong>hoàn-bē-sèng</strong> iah <strong>te̍k-tēng iōng-tô͘--ê sek-iōng-sèng</strong>--ê chêng-hêng tam-pó͘. Siông-sè chhiáⁿ chham-khó GNU Thong-iōng Kong-kiōng Siū-koân.\n\nLí èng-kai tùi pún têng-sek siu-tio̍h [$2 GNU Thong-iōng Kong-kiōng Siū-koân--ê Hù-pún]; nā-bô, chhiáⁿ siá-phoe thong-tī Chū-iû Nńg-thé KI-kim-hoē, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA, iah-sī [https://www.gnu.org/copyleft/gpl.html soàⁿ-téng khoàⁿ].",
        "config-sidebar": "* [www.mediawiki.org/wiki/MediaWiki/zh-hant MediaWiki 頭頁]\n* [www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents/zh 使用者指南]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents/zh 管理者指南]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ/zh-hant 四常問題集]\n----\n* <doclink href=Readme>讀我說明</doclink>\n* <doclink href=ReleaseNotes>發行說明</doclink>\n* <doclink href=Copying>版權聲明</doclink>\n* <doclink href=UpgradeDoc>升級</doclink>",
        "config-env-good": "環境檢查已完成。\n你會當安裝 MediaWiki。",
        "config-env-bad": "Khoân-kèng kiám-cha oân-sêng--ah.\nLí bô-hoat-tō͘ an-chng MediaWiki.",
index d4dc4b6..5379e8d 100644 (file)
@@ -44,7 +44,7 @@
        "config-help-restart": "Vulite scancellà tutt' 'e date astipate c'avite nzertato e riabbià 'o prucesso d'installazione?",
        "config-restart": "Sì, riabbìa",
        "config-welcome": "=== Cuntrollo 'e ll'ambiente ===\nSarranno eseguite 'e cuntrolle bbase pe' putè vedè si st'ambiente è adatto pe' ne ffà l'installazione 'e MediaWiki.\nArricurdateve d'includere sti nfurmaziune si spiate assistenza ncopp' 'a maniera 'e cumpletà l'installazione.",
-       "config-copyright": "=== Copyright e termine ===\n\n$1\n\nChistu programma è nu software libbero; vuje 'o putite redestribbuì e/o cagnà sott' 'e termine d' 'a licienza GNU GPL ('a Licienza Pubbreca Generale) comme pubbrecata d' 'a Free Software Foundation; o pure 'a verziona 2 d' 'a Licienza, o pure (comme vulite vuje) 'a n'ata verziona cchiù nnova.\n\nChistu programma è destribbuito c' 'a speranza d'essere utile, ma SENZA NISCIUNA GARANZIA; senza manco 'a garanzia p' 'a CUMMERCIABBELETÀ O IDONIETÀ PE' NU SCOPO PARTICULARE.\nIate a vedé 'a GNU GPL pe' n'avé cchiù nfurmaziune.\n\nCu stu programma avísseve 'a ricevere <doclink href=Copying>na copia d' 'a Licienza GNU GPL</doclink> cu stu prugramma; si nò, scrivete â Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA o [https://www.gnu.org/copyleft/gpl.html liggite sta paggena ncopp' 'a l'Internet].",
+       "config-welcome-section-copyright": "=== Copyright e termine ===\n\n$1\n\nChistu programma è nu software libbero; vuje 'o putite redestribbuì e/o cagnà sott' 'e termine d' 'a licienza GNU GPL ('a Licienza Pubbreca Generale) comme pubbrecata d' 'a Free Software Foundation; o pure 'a verziona 2 d' 'a Licienza, o pure (comme vulite vuje) 'a n'ata verziona cchiù nnova.\n\nChistu programma è destribbuito c' 'a speranza d'essere utile, ma SENZA NISCIUNA GARANZIA; senza manco 'a garanzia p' 'a CUMMERCIABBELETÀ O IDONIETÀ PE' NU SCOPO PARTICULARE.\nIate a vedé 'a GNU GPL pe' n'avé cchiù nfurmaziune.\n\nCu stu programma avísseve 'a ricevere [$2 na copia d' 'a Licienza GNU GPL] cu stu prugramma; si nò, scrivete â Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA o [https://www.gnu.org/copyleft/gpl.html liggite sta paggena ncopp' 'a l'Internet].",
        "config-sidebar": "* [https://www.mediawiki.org Paggina prencepale MediaWiki]\n* [https://www.mediawiki.org/wiki/Aiuto:Guida a 'e cuntenute pe' l'utente]\n* [https://www.mediawiki.org/wiki/Manuale:Guida a 'e cuntenute pe l'ammenistrature]\n* [https://www.mediawiki.org/wiki/Manuale:FAQ FAQ]\n----\n* <doclink href=Readme>Lieggeme</doclink>\n* <doclink href=ReleaseNotes>Note 'e verziona</doclink>\n* <doclink href=Copying>Copie</doclink>\n* <doclink href=UpgradeDoc>Agghiurnamento</doclink>",
        "config-env-good": "L'ambiente è stato cuntrullato.\nÈ pussibbele installare MediaWiki.",
        "config-env-bad": "L'ambiente è stato cuntrullato.\nNun se può installà MediaWiki.",
        "config-db-web-no-create-privs": "'O cunto ausato pe' ne fà l'installazione nun tene diritte necessarie pe' ne putè crià n'atu cunto.\n'O cunto zegnàto ccà adda esistere già.",
        "config-mysql-engine": "Mutore d'astipo:",
        "config-mysql-innodb": "InnoDB (fosse 'o cunzigliato)",
-       "config-mysql-myisam": "MyISAM",
-       "config-mysql-myisam-dep": "<strong>Attenziò:</strong> avite scigliuto MyISAM comm' 'o mutore 'archiviaziona MySQL, ca nun è raccummannato pe' l'ausà cu MediaWiki, pecché:\n* supporta debolmente 'a concorrenza p' 'o blocco d' 'a tabbella\n* è cchiù inchine 'a corruzione 'e l'ati mutore\n* 'o codece 'e base 'e MediaWiki nun gestisce sempe MyISAM comme l'avess'a gistiunà\n\nSi ll'installazione vosta MySQL suppuorta InnoDB, è autamente raccummandato ca si scigliesse a 'o posto suo.\nSi 'a installazione MySQL nun suppurtasse InnoDB, forse è 'o mumento 'e ll'agghiurnà.",
-       "config-mysql-only-myisam-dep": "<strong>Attenziò:</strong> MyISAM è l'uneco mutore p'astipà date ca se trova mo' a disposizione p' 'o MySQL dint'a sta macchina, e nun fosse raccumandato 'e s'ausà cu MediaWiki, pecché:\n* suppurtasse minimamente concorrenza pe' bbìa 'e bluccà tabbelle\n* è cchiù facile ca jesse a se scassà cchiù 'e l'ati mutore\n* 'o codece MediaWiki nun maniasse sempe MyISAM comme l'avesse 'e manià\n\nL'installazione MySQL nun suppurtasse InnoDB, può darse ca chist'è 'o mumento pe' ve ll'agghiurnà.",
        "config-mysql-engine-help": "<strong>InnoDB</strong> è quase sempe 'a meglia opzione, pecché ave nu buono suppuorto concorrente.\n\n<strong>MyISAM</strong> putesse ghì cchiù ampressa int'a na installazione mono-utente e liegge-surtanto.\n'E database MyISAM se scassano cchiù spisso d' 'e database InnoDB.",
        "config-mssql-auth": "Tipo d'autenticazione:",
        "config-mssql-install-auth": "Sceglie 'o tipo d'autenticazziona ca s'ausarrà pe cunnettà â database, durante ll'operazziona d'istallazziona. Si piglie \"{{int:config-mssql-windowsauth}}\", 'e credenziale 'e qualunque fosse ll'utenza ca 'o webserver sta pruciessanno sarranno ausate.",
index fc299fb..522294f 100644 (file)
@@ -49,7 +49,7 @@
        "config-help-restart": "Ønsker du å fjerne alle lagrede data som du har skrevet inn og starte installasjonsprosessen på nytt?",
        "config-restart": "Ja, start på nytt",
        "config-welcome": "=== Miljøsjekker ===\nGrunnleggende sjekker utføres for å se om dette miljøet er egnet for en MediaWiki-installasjon.\nDu bør oppgi resultatene fra disse sjekkene om du trenger hjelp under installasjonen.",
-       "config-copyright": "=== Opphavsrett og vilkår ===\n\n$1\n\nMediaWiki er fri programvare; du kan redistribuere det og/eller modifisere det under betingelsene i GNU General Public License som publisert av Free Software Foundation; enten versjon 2 av lisensen, eller (etter eget valg) enhver senere versjon.\n\nDette programmet er distribuert i håp om at det vil være nyttig, men '''uten noen garanti'''; ikke engang implisitt garanti av '''salgbarhet''' eller '''egnethet for et bestemt formål'''.\nSe GNU General Public License for flere detaljer.\n\nDu skal ha mottatt <doclink href=Copying>en kopi av GNU General Public License</doclink> sammen med dette programmet; hvis ikke, skriv til Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA eller [https://www.gnu.org/copyleft/gpl.html les det på nettet].",
+       "config-welcome-section-copyright": "=== Opphavsrett og vilkår ===\n\n$1\n\nMediaWiki er fri programvare; du kan redistribuere det og/eller modifisere det under betingelsene i GNU General Public License som publisert av Free Software Foundation; enten versjon 2 av lisensen, eller (etter eget valg) enhver senere versjon.\n\nDette programmet er distribuert i håp om at det vil være nyttig, men '''uten noen garanti'''; ikke engang implisitt garanti av '''salgbarhet''' eller '''egnethet for et bestemt formål'''.\nSe GNU General Public License for flere detaljer.\n\nDu skal ha mottatt [$2 en kopi av GNU General Public License] sammen med dette programmet; hvis ikke, skriv til Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA eller [https://www.gnu.org/copyleft/gpl.html les det på nettet].",
        "config-sidebar": "* [https://www.mediawiki.org MediaWiki hjem]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Brukerguide]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents Administratorguide]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ OSS]\n----\n* <doclink href=Readme>Les meg</doclink>\n* <doclink href=ReleaseNotes>Utgivelsesnotater</doclink>\n* <doclink href=Copying>Kopiering</doclink>\n* <doclink href=UpgradeDoc>Oppgradering</doclink>",
        "config-env-good": "Miljøet har blitt sjekket.\nDu kan installere MediaWiki.",
        "config-env-bad": "Miljøet har blitt sjekket.\nDu kan ikke installere MediaWiki.",
        "config-db-web-no-create-privs": "Kontoen du oppga for installasjonen har ikke nok privilegier til å opprette en konto.\nKontoen du oppgir her må finnes allerede.",
        "config-mysql-engine": "Lagringsmotor:",
        "config-mysql-innodb": "InnoDB (anbefalt)",
-       "config-mysql-myisam": "MyISAM",
-       "config-mysql-myisam-dep": "'''Advarsel:''' Du har valgt MyISAM som lagringsmotor for MySQL, noe som ikke er anbefalt for bruk med MediaWiki, fordi:\n* den knapt støtter samtidighet pga. tabell-låsing\n* den har større tilbøyelighet for å bli korrupt enn andre motorer\n* MediaWiki-koden håndterer ikke alltid MyISAM som den burde\n\nHvis din MySQL-installasjon støtter InnoDB, er det sterkt å anbefale at du i stedet velger den.\nHvis din MySQL-installasjon ikke støtter InnoDB, kan det være på tide med en oppgradering.",
-       "config-mysql-only-myisam-dep": "'''Advarsel:''' MyISAM er den eneste tilgjengelig lagringsmotoren for MySQL på denne maskinen, og det er ikke anbefalt brukt for MediaWiki, fordi:\n* den knapt støtter samtidighet pga. tabell-låsing\n* den har større tilbøyelighet for å bli korrupt enn andre motorer\n* MediaWiki-koden håndterer ikke alltid MyISAM som den burde\n\nHvis din MySQL-installasjon ikke støtter InnoDB, kan det være på tide med en oppgradering.",
        "config-mysql-engine-help": "'''InnoDB''' er nesten alltid det beste alternativet siden den har god støtte for samtidighet («concurrency»).\n\n'''MyISAM''' kan være raskere i enbruker- eller les-bare-installasjoner.\nMyISAM-databaser har en tendens til å bli ødelagt oftere enn InnoDB-databaser.",
        "config-mssql-auth": "Autentiseringstype:",
        "config-mssql-install-auth": "Valg autentiseringstypen som skal brukes for å koble til databasen under installeringsprosessen. Hvis du velger «{{int:config-mssql-windowsauth}}», vil påloggingsinformasjonen for brukeren som kjører webtjeneren blir brukt.",
index 49e0e58..3450712 100644 (file)
@@ -14,7 +14,7 @@
        "config-your-language": "Jouw taal:",
        "config-help-restart": "Wil je alle opgeslagen gegevens die je hebt ingevoerd wissen en het installatieproces opnieuw starten?",
        "config-welcome": "=== Controle omgeving ===\nEr worden een aantal basiscontroles uitgevoerd met als doel vast te stellen of deze omgeving geschikt is voor een installatie van MediaWiki.\nAls je hulp nodig hebt bij de installatie, lever deze gegevens dan ook aan.",
-       "config-copyright": "=== Auteursrechten en voorwaarden ===\n\n$1\n\nDit programma is vrije software. Je mag het verder verspreiden en/of aanpassen in overeenstemming met de voorwaarden van de GNU General Public License zoals uitgegeven door de Free Software Foundation; ofwel versie 2 van de Licentie of - naar eigen keuze - enige latere versie.\n\nDit programma wordt verspreid in de hoop dat het nuttig is, maar '''zonder enige garantie''', zelfs zonder de impliciete garantie van '''verkoopbaarheid''' of '''geschiktheid voor een bepaald doel'''.\nZie de GNU General Public License voor meer informatie.\n\nSamen met dit programma hoor je een <doclink href=Copying>exemplaar van de GNU General Public License</doclink> ontvangen te hebben; zo niet, schrijf dan aan de Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, Verenigde Staten. Of [https://www.gnu.org/copyleft/gpl.html lees de licentie online].",
+       "config-welcome-section-copyright": "=== Auteursrechten en voorwaarden ===\n\n$1\n\nDit programma is vrije software. Je mag het verder verspreiden en/of aanpassen in overeenstemming met de voorwaarden van de GNU General Public License zoals uitgegeven door de Free Software Foundation; ofwel versie 2 van de Licentie of - naar eigen keuze - enige latere versie.\n\nDit programma wordt verspreid in de hoop dat het nuttig is, maar '''zonder enige garantie''', zelfs zonder de impliciete garantie van '''verkoopbaarheid''' of '''geschiktheid voor een bepaald doel'''.\nZie de GNU General Public License voor meer informatie.\n\nSamen met dit programma hoor je een [$2 exemplaar van de GNU General Public License] ontvangen te hebben; zo niet, schrijf dan aan de Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, Verenigde Staten. Of [https://www.gnu.org/copyleft/gpl.html lees de licentie online].",
        "config-env-good": "De omgeving is gecontroleerd.\nJe kunt MediaWiki installeren.",
        "config-env-bad": "De omgeving is gecontroleerd.\nJe kunt MediaWiki niet installeren.",
        "config-unicode-pure-php-warning": "'''Waarschuwing''': de [https://pecl.php.net/intl PECL-extensie intl] is niet beschikbaar om de Unicodenormalisatie af te handelen en daarom wordt de langzame PHP-implementatie gebruikt.\nAls je MediaWiki voor een website met veel verkeer installeert, lees je dan in over [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations Unicodenormalisatie].",
@@ -44,7 +44,6 @@
        "config-upgrade-done": "Het bijwerken is afgerond.\n\nJe kunt [$1 je wiki nu gebruiken].\n\nAls je je <code>LocalSettings.php</code> opnieuw wilt aanmaken, klik dan op de knop hieronder.\nDit is '''niet aan te raden''' tenzij je problemen hebt met je wiki.",
        "config-upgrade-done-no-regenerate": "Het bijwerken is afgerond.\n\nJe kunt nu [$1 je wiki gebruiken].",
        "config-db-web-no-create-privs": "Het account dat je voor installatie hebt opgegeven, heeft niet voldoende rechten om een account aan te maken.\nHet account dat je hier opgeeft, moet al bestaan.",
-       "config-mysql-myisam-dep": "'''Waarschuwing''': je hebt MyISAM geselecteerd als opslagengine voor MySQL. Dit is niet aan te raden voor MediaWiki omdat:\n* het nauwelijks ondersteuning biedt voor gebruik door meerdere gebruikers tegelijkertijd door het locken van tabellen;\n* het meer vatbaar is voor corruptie dan andere engines;\n* de code van MediaWiki niet alstijd omgaat met MyISAM zoals dat zou moeten.\n\nAls je installatie van MySQL InnoDB ondersteunt, gebruik dat dan vooral.\nAls je installatie van MySQL geen ondersteuning heeft voor InnoDB, denk dan na over upgraden.",
        "config-project-namespace-help": "In het kielzog van Wikipedia beheren veel wiki's hun beleidspagina's apart van hun inhoudelijke pagina's in een \"'''projectnaamruimte'''\".\nAlle paginanamen in deze naamruimte beginnen met een bepaald voorvoegsel dat je hier kunt opgeven.\nDit voorvoegsel wordt meestal afgeleid van de naam van de wiki, maar het kan geen bijzondere tekens bevatten als \"#\" of \":\".",
        "config-admin-name": "Je naam:",
        "config-admin-password-mismatch": "De twee door jou ingevoerde wachtwoorden komen niet overeen.",
index 6a62fb6..23835cd 100644 (file)
        "config-help-restart": "Wilt u alle opgeslagen gegevens die u hebt ingevoerd wissen en het installatieproces opnieuw starten?",
        "config-restart": "Ja, opnieuw starten",
        "config-welcome": "=== Controle omgeving ===\nEr worden een aantal basiscontroles uitgevoerd met als doel vast te stellen of deze omgeving geschikt is voor een installatie van MediaWiki.\nLever deze gegevens aan als u ondersteuning vraagt bij de installatie.",
-       "config-copyright": "=== Auteursrechten en voorwaarden ===\n\n$1\n\nDit programma is vrije software. U mag het verder verspreiden en/of aanpassen in overeenstemming met de voorwaarden van de GNU General Public License zoals uitgegeven door de Free Software Foundation; ofwel versie 2 van de Licentie of - naar uw keuze - enige latere versie.\n\nDit programma wordt verspreid in de hoop dat het nuttig is, maar '''zonder enige garantie''', zelfs zonder de impliciete garantie van '''verkoopbaarheid''' of '''geschiktheid voor een bepaald doel'''.\nZie de GNU General Public License voor meer informatie.\n\nSamen met dit programma hoort u een <doclink href=Copying>exemplaar van de GNU General Public License</doclink> ontvangen te hebben; zo niet, schrijf dan aan de Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, Verenigde Staten. Of [https://www.gnu.org/copyleft/gpl.html lees de licentie online].",
-       "config-sidebar": "* [https://www.mediawiki.org MediaWiki-thuispagina]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Gebruikershandleiding] (Engelstalig)\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents Beheerdershandleiding] (Engelstalig)\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Veelgestelde vragen] (Engelstalig)\n----\n* <doclink href=Readme>Leesmij</doclink> (Engelstalig)\n* <doclink href=ReleaseNotes>Release notes</doclink> (Engelstalig)\n* <doclink href=Copying>Kopiëren</doclink> (Engelstalig)\n* <doclink href=UpgradeDoc>Versie bijwerken</doclink> (Engelstalig)",
+       "config-welcome-section-copyright": "=== Auteursrechten en voorwaarden ===\n\n$1\n\nDit programma is vrije software. U mag het verder verspreiden en/of aanpassen in overeenstemming met de voorwaarden van de GNU General Public License zoals uitgegeven door de Free Software Foundation; ofwel versie 2 van de Licentie of - naar uw keuze - enige latere versie.\n\nDit programma wordt verspreid in de hoop dat het nuttig is, maar '''zonder enige garantie''', zelfs zonder de impliciete garantie van '''verkoopbaarheid''' of '''geschiktheid voor een bepaald doel'''.\nZie de GNU General Public License voor meer informatie.\n\nSamen met dit programma hoort u een [$2 exemplaar van de GNU General Public License] ontvangen te hebben; zo niet, schrijf dan aan de Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, Verenigde Staten. Of [https://www.gnu.org/copyleft/gpl.html lees de licentie online].",
+       "config-sidebar": "* [https://www.mediawiki.org MediaWiki-thuispagina]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Gebruikershandleiding]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents Beheerdershandleiding]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Veelgestelde vragen]",
+       "config-sidebar-readme": "Leesmij",
+       "config-sidebar-relnotes": "Release notes",
+       "config-sidebar-license": "Licentie",
+       "config-sidebar-upgrade": "Informatie over het bijwerken",
        "config-env-good": "De omgeving is gecontroleerd.\nU kunt MediaWiki installeren.",
        "config-env-bad": "De omgeving is gecontroleerd.\nU kunt MediaWiki niet installeren.",
        "config-env-php": "PHP $1 is geïnstalleerd.",
        "config-db-web-no-create-privs": "Het account dat u voor de installatie hebt opgegeven, heeft niet voldoende rechten om een account aan te maken.\nHet account dat u hier opgeeft, moet al bestaan.",
        "config-mysql-engine": "Opslagmethode:",
        "config-mysql-innodb": "InnoDB (aanbevolen)",
-       "config-mysql-myisam": "MyISAM",
-       "config-mysql-myisam-dep": "'''Waarschuwing''': u hebt MyISAM geselecteerd als opslagengine voor MySQL. Dit is niet aan te raden voor MediaWiki omdat:\n* het nauwelijks ondersteuning biedt voor gebruik door meerdere gebruikers tegelijkertijd door het locken van tabellen;\n* het meer vatbaar is voor corruptie dan andere engines;\n* de code van MediaWiki niet alstijd omgaat met MyISAM zoals dat zou moeten.\n\nAls uw installatie van MySQL InnoDB ondersteunt, gebruik dat dan vooral.\nAls uw installatie van MySQL geen ondersteuning heeft voor InnoDB, denk dan na over upgraden.",
-       "config-mysql-only-myisam-dep": "'''Waarschuwing:''' MyISAM is enige beschikbare opslagmethode voor MySQL in deze omgeving, en deze wordt niet aangeraden voor gebruik met MediaWiki, omdat:\n* er nauwelijks ondersteuning is voor meerdere gelijktijdige transacties omdat tabellen op slot gezet worden;\n* tabellen makkelijker stuk kunnen gaan;\n* de code van MediaWiki niet altijd op de juiste wijze omgaat met MyISAM.\n\nUw installatie van MySQL heeft geen ondersteuning voor InnoDB. We raden u aan om een meer recente versie te gebruiken.",
        "config-mysql-engine-help": "'''InnoDB''' is vrijwel altijd de beste instelling, omdat deze goed omgaat met meerdere verzoeken tegelijkertijd.\n\n'''MyISAM''' is bij een zeer beperkt aantal gebruikers mogelijk sneller, of als de wiki alleen-lezen is.\nMyISAM-databases raken vaker beschadigd dan InnoDB-databases.",
        "config-mssql-auth": "Authenticatietype:",
        "config-mssql-install-auth": "Selecteer de authenticatiemethode die wordt gebruikt om met de database te verbinden tijdens het installatieproces.\nAls u \"{{int:config-mssql-windowsauth}}\" selecteert, dan worden de aanmeldgegevens van de gebruiker waaronder de webserver draait voor authenticatie gebruikt.",
index 7a99bb8..3aaecb5 100644 (file)
@@ -91,7 +91,6 @@
        "config-db-web-create": "Creatz lo compte se existís pas ja",
        "config-mysql-engine": "Motor d'emmagazinatge :",
        "config-mysql-innodb": "InnoDB",
-       "config-mysql-myisam": "MyISAM",
        "config-mssql-auth": "Tipe d’autentificacion :",
        "config-mssql-sqlauth": "Autentificacion de SQL Server",
        "config-mssql-windowsauth": "Autentificacion Windows",
index 6a518c7..6fdcd82 100644 (file)
@@ -35,7 +35,6 @@
        "config-header-oracle": "Oracle-azetukset",
        "config-header-mssql": "Microsoft SQL Server azetukset",
        "config-mysql-innodb": "InnoDB",
-       "config-mysql-myisam": "MyISAM",
        "config-site-name": "Wikin nimi:",
        "config-site-name-blank": "Kirjuta sivun nimi.",
        "config-project-namespace": "Projektan nimitila:",
index 18dc924..feda6b2 100644 (file)
        "config-help-restart": "Czy chcesz usunąć wszystkie zapisane dane i uruchomić ponownie proces instalacji?",
        "config-restart": "Tak, zacznij od nowa",
        "config-welcome": "=== Sprawdzenie środowiska instalacji ===\nTeraz zostaną wykonane podstawowe testy sprawdzające czy to środowisko jest odpowiednie dla instalacji MediaWiki.\nJeśli potrzebujesz pomocy podczas instalacji, załącz wyniki tych testów.",
-       "config-copyright": "=== Prawa autorskie i warunki użytkowania ===\n\n$1\n\nTo oprogramowanie jest wolne; możesz je rozprowadzać dalej i modyfikować zgodnie z warunkami licencji GNU General Public License opublikowanej przez Free Software Foundation w wersji 2 tej licencji lub (według Twojego wyboru) którejś z późniejszych jej wersji.\n\nNiniejsze oprogramowanie jest rozpowszechniane w nadziei, że będzie użyteczne, ale '''bez żadnej gwarancji'''; nawet bez domniemanej gwarancji '''handlowej''' lub '''przydatności do określonego celu'''.\nZobacz treść licencji GNU General Public License, aby uzyskać więcej szczegółów.\n\nRazem z oprogramowaniem powinieneś otrzymać <doclink href=Copying>kopię licencji GNU General Public License</doclink>. Jeśli jej nie otrzymałeś, napisz do Free Software Foundation, Inc, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. lub [https://www.gnu.org/copyleft/gpl.html przeczytaj ją online].",
-       "config-sidebar": "* [https://www.mediawiki.org Strona domowa MediaWiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Podręcznik użytkownika]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents Podręcznik administratora]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Odpowiedzi na często zadawane pytania]\n----\n* <doclink href=Readme>Przeczytaj to</doclink>\n* <doclink href=ReleaseNotes>Informacje o tej wersji</doclink>\n* <doclink href=Copying>Kopiowanie</doclink>\n* <doclink href=UpgradeDoc>Aktualizacja</doclink>",
+       "config-welcome-section-copyright": "=== Prawa autorskie i warunki użytkowania ===\n\n$1\n\nTo oprogramowanie jest wolne; możesz je rozprowadzać dalej i modyfikować zgodnie z warunkami licencji GNU General Public License opublikowanej przez Free Software Foundation w wersji 2 tej licencji lub (według Twojego wyboru) którejś z późniejszych jej wersji.\n\nNiniejsze oprogramowanie jest rozpowszechniane w nadziei, że będzie użyteczne, ale '''bez żadnej gwarancji'''; nawet bez domniemanej gwarancji '''handlowej''' lub '''przydatności do określonego celu'''.\nZobacz treść licencji GNU General Public License, aby uzyskać więcej szczegółów.\n\nRazem z oprogramowaniem powinieneś otrzymać [$2 kopię licencji GNU General Public License]. Jeśli jej nie otrzymałeś, napisz do Free Software Foundation, Inc, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. lub [https://www.gnu.org/copyleft/gpl.html przeczytaj ją online].",
+       "config-sidebar": "* [https://www.mediawiki.org Strona domowa MediaWiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Podręcznik użytkownika]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents Podręcznik administratora]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Odpowiedzi na często zadawane pytania]",
+       "config-sidebar-readme": "Podstawowe informacje",
+       "config-sidebar-relnotes": "Informacje o wersji",
+       "config-sidebar-license": "Kopiowanie",
+       "config-sidebar-upgrade": "Uaktualnienie",
        "config-env-good": "Środowisko oprogramowania zostało sprawdzone.\nMożesz teraz zainstalować MediaWiki.",
        "config-env-bad": "Środowisko oprogramowania zostało sprawdzone.\nNie możesz zainstalować MediaWiki.",
        "config-env-php": "Zainstalowane jest PHP w wersji $1.",
        "config-db-web-no-create-privs": "Konto podane do wykonania instalacji nie ma wystarczających uprawnień, aby utworzyć nowe konto.\nKonto, które wskazałeś tutaj musi już istnieć.",
        "config-mysql-engine": "Silnik przechowywania",
        "config-mysql-innodb": "InnoDB (zalecane)",
-       "config-mysql-myisam": "MyISAM",
-       "config-mysql-myisam-dep": "'''Ostrzeżenie''': wybrano MyISIAM jako silnik  składowania danych MySQL, co nie jest zalecane do użytku w MediaWiki, ponieważ:\n * ledwo obsługuje współbieżnośći ze względu na blokowanie tabel\n * jest bardziej podatna na uszkodzenie niż inne silniki\n * kod źródłowy MediaWiki nie zawsze obsługuje MyISAM tak, jak powinien\n\nJeśli instalacja MySQL obsługuje InnoDB, jest wysoce zalecane, by to je wybrać.\nJeśli instalacja MySQL nie obsługuje InnoDB, być może nadszedł czas na jej uaktualnienie.",
-       "config-mysql-only-myisam-dep": "'''Ostrzeżenie:''' MyISAM jest jedynym dostępnym na tym komputerze mechanizmem składowania dla MySQL, który jednak nie jest zalecany do używania z MediaWiki, ponieważ:\n* słabo obsługuje współbieżność z powodu blokowania tabel\n* jest bardziej skłonny do uszkodzeń niż inne silniki\n* kod MediaWiki nie zawsze traktuje MyISAM jak powinien\n\nTwoja instalacja MySQL nie obsługuje InnoDB, być może jest to czas na aktualizację.",
        "config-mysql-engine-help": "'''InnoDB''' jest prawie zawsze najlepszą opcją, ponieważ posiada dobrą obsługę współbieżności.\n\n'''MyISAM''' może być szybsze w instalacjach pojedynczego użytkownika lub tylko do odczytu.\nBazy danych MyISAM mają tendencję do ulegania uszkodzeniom częściej niż bazy InnoDB.",
        "config-mssql-auth": "Typ uwierzytelniania:",
        "config-mssql-install-auth": "Wybierz typ uwierzytelniania, który będzie używany do łączenia się z bazą danych w trakcie procesu instalacji.\nJeśli wybierzesz „{{int:config-mssql-windowsauth}}”, będą wykorzystywane dane konta użytkownika, pod którym działa serwer www.",
index 130d507..b6ab572 100644 (file)
@@ -48,7 +48,7 @@
        "config-help-restart": "Veul-lo scancelé tùit ij dat salvà ch'a l'ha anserì e anandié torna ël process d'instalassion?",
        "config-restart": "É!, felo torna parte",
        "config-welcome": "=== Contròj d'ambient ===\nDle verìfiche ëd base a saran adess fàite për vëdde se st'ambient a va bin për l'instalassion ëd MediaWiki.\nCh'as visa d'anserì coste anformassion s'a sërca d'agiut su com completé l'instalassion.",
-       "config-copyright": "=== Drit d'Autor e Condission ===\n\n$1\n\nCost-sì a l'é un programa lìber e a gràtis: a peul ridistribuilo e/o modifichelo sota le condission dla licensa pùblica general GNU com publicà da la Free Software Foundation; la version 2 dla Licensa, o (a toa sèrnìa) qualsëssìa version pi recenta.\n\nCost programa a l'é distribuì ant la speransa ch'a sia ùtil, ma '''sensa gnun-e garansìe'''; sensa gnanca la garansia implìssita ëd '''comersiabilità''' o '''d'esse adat a un but particolar'''.\n\nA dovrìa avèj arseivù <doclink href=Copying>na còpia ëd la licensa pùblica general GNU</doclink> ansema a sto programa; dësnò, ch'a scriva a la Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA opura [https://www.gnu.org/copyleft/gpl.html ch'a la lesa an linia].",
+       "config-welcome-section-copyright": "=== Drit d'Autor e Condission ===\n\n$1\n\nCost-sì a l'é un programa lìber e a gràtis: a peul ridistribuilo e/o modifichelo sota le condission dla licensa pùblica general GNU com publicà da la Free Software Foundation; la version 2 dla Licensa, o (a toa sèrnìa) qualsëssìa version pi recenta.\n\nCost programa a l'é distribuì ant la speransa ch'a sia ùtil, ma '''sensa gnun-e garansìe'''; sensa gnanca la garansia implìssita ëd '''comersiabilità''' o '''d'esse adat a un but particolar'''.\n\nA dovrìa avèj arseivù [$2 na còpia ëd la licensa pùblica general GNU] ansema a sto programa; dësnò, ch'a scriva a la Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA opura [https://www.gnu.org/copyleft/gpl.html ch'a la lesa an linia].",
        "config-sidebar": "* [https://www.mediawiki.org Intrada MediaWiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Guida dl'Utent]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents Guida dl'Aministrator]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Soens an ciamo]\n----\n* <doclink href=Readme>Ch'am lesa</doclink>\n* <doclink href=ReleaseNotes>Nòte ëd publicassion</doclink>\n* <doclink href=Copying>Còpia</doclink>\n* <doclink href=UpgradeDoc>Agiornament</doclink>",
        "config-env-good": "L'ambient a l'é stàit controlà.\nIt peule instalé MediaWiki.",
        "config-env-bad": "L'ambient a l'é stàit controlà.\nIt peule pa instalé MediaWiki.",
        "config-db-web-no-create-privs": "Ël cont ch'a l'ha specificà për l'instalassion a l'ha pa basta 'd privilegi për creé un cont.\nËl cont ch'a spessìfica ambelessì a dev già esiste.",
        "config-mysql-engine": "Motor ëd memorisassion:",
        "config-mysql-innodb": "InnoDB",
-       "config-mysql-myisam": "MyISAM",
-       "config-mysql-myisam-dep": "'''Avis''': A l'ha selessionà MyISAM com motor ëd memorisassion për MySQL, che a l'é pa arcomandà da dovré con MediaWiki, përchè:\n* a sopòrta a pen-a la contemporanità për via ëd saradure ëd tàula\n* a l'é pi soget a la corussion che j'àutri motor\n* ël còdes bas ëd MediaWiki pa sempe a gestiss MyISAM com a dovrìa\n\nSe soa istalassion MySQL a manten InnoDB, a l'é fortement arcomandà ch'a serna pitòst col-lì.\nSe soa istalassion MySQL a manten nen InnoDB, a peul esse ch'a sia ël moment ëd n'agiornament.",
        "config-mysql-engine-help": "'''InnoDB''' a l'é scasi sempe la mej opsion, da già ch'a l'ha un bon manteniment dla concorensa.\n\n'''MyISAM''' a peul esse pi lest an instalassion për n'utent sol o mach an letura.\nLa base ëd dàit MyISAM a tira a corompse pi 'd soens che la base ëd dàit InnoDB.",
        "config-site-name": "Nòm ëd la wiki:",
        "config-site-name-help": "Sòn a comparirà ant la bara dël tìtol dël navigador e an vàire d'àutri pòst.",
index 1b0b054..5d1cc8f 100644 (file)
@@ -63,7 +63,7 @@
        "config-help-restart": "Deseja limpar todos os dados salvos que você introduziu e reiniciar o processo de instalação?",
        "config-restart": "Sim, reiniciar",
        "config-welcome": "=== Verificações de ambiente ===\nSerão realizadas verificações básicas para determinar se este ambiente é apropriado para a instalação do MediaWiki.\nLembre-se de incluir estas informações se for procurar por suporte para como concluir a instalação.",
-       "config-copyright": "=== Direitos autorais e Termos de uso ===\n\n$1\n\nEste programa é software livre; você pode redistribuí-lo e/ou modificá-lo nos termos da licença GNU General Public License tal como publicada pela Free Software Foundation; tanto a versão 2 da Licença, como (por opção sua) qualquer versão posterior.\n\nEste programa é distribuído na esperança de que seja útil, mas <strong>sem qualquer garantia</strong>; inclusive, sem a garantia implícita da <strong>possibilidade de ser comercializado</strong> ou de <strong>adequação para qualquer finalidade específica</strong>.\nConsulte a licença GNU General Public License para mais detalhes.\n\nEm conjunto com este programa você deve ter recebido <doclink href=Copying>uma cópia da licença GNU General Public License</doclink>; se não a recebeu, peça-a por escrito para Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA ou [https://www.gnu.org/copyleft/gpl.html leia-a na internet].",
+       "config-welcome-section-copyright": "=== Direitos autorais e Termos de uso ===\n\n$1\n\nEste programa é software livre; você pode redistribuí-lo e/ou modificá-lo nos termos da licença GNU General Public License tal como publicada pela Free Software Foundation; tanto a versão 2 da Licença, como (por opção sua) qualquer versão posterior.\n\nEste programa é distribuído na esperança de que seja útil, mas <strong>sem qualquer garantia</strong>; inclusive, sem a garantia implícita da <strong>possibilidade de ser comercializado</strong> ou de <strong>adequação para qualquer finalidade específica</strong>.\nConsulte a licença GNU General Public License para mais detalhes.\n\nEm conjunto com este programa você deve ter recebido [$2 uma cópia da licença GNU General Public License]; se não a recebeu, peça-a por escrito para Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA ou [https://www.gnu.org/copyleft/gpl.html leia-a na internet].",
        "config-sidebar": "* [https://www.mediawiki.org/wiki/MediaWiki/pt-br Página principal do MediaWiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents/pt-br Ajuda]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents/pt-br Manual técnico]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ/pt-br FAQ]",
        "config-sidebar-readme": "Leia-me",
        "config-sidebar-relnotes": "Notas de lançamento",
        "config-db-web-no-create-privs": "A conta que você especificou para a instalação não possui privilégios suficientes para criar uma conta.\nA conta que for especificada aqui já deve existir.",
        "config-mysql-engine": "Mecanismo de armazenamento:",
        "config-mysql-innodb": "InnoDB (recomendado)",
-       "config-mysql-myisam": "MyISAM",
-       "config-mysql-myisam-dep": "<strong>Aviso:</strong> Você selecionou MyISAM como mecanismo de armazenamento para o MySQL, o que não é recomendado para uso com o MediaWiki, porque:\n* dificilmente suporta concorrência devido ao bloqueio da tabela\n* é mais propenso à corrupção do que outros motores\n*a base de código MediaWiki nem sempre lida com o MyISAM como deveria\n\nSe sua instalação MySQL suportar o InnoDB, é altamente recomendável que você escolha ele.\nSe sua instalação MySQL não suportar o InnoDB, talvez seja hora de uma atualização.",
-       "config-mysql-only-myisam-dep": "<strong>Aviso:</strong> O MyISAM é o único mecanismo de armazenamento disponível para o MySQL nesta máquina e isso não é recomendado para uso com o MediaWiki, porque:\n* dificilmente suporta concorrência devido ao bloqueio da tabela\n* é mais propenso à corrupção do que outros motores\n*a base de código MediaWiki nem sempre lida com o MyISAM como deveria\n\nA sua instalação no MySQL não suporta InnoDB, talvez seja hora de uma atualização.",
        "config-mysql-engine-help": "<strong>InnoDB</strong> é quase sempre a melhor opção, uma vez que possui um bom suporte de concorrência.\n\n<strong>MyISAM</strong> pode ser mais rápido em instalações de usuário único ou somente leitura.\\O banco de dados MyISAM tendem a ficar corrompidos mais frequentemente do que os bancos de dados InnoDB.",
        "config-mssql-auth": "Tipo de autenticação:",
        "config-mssql-install-auth": "Selecione o tipo de autenticação que será usado para se conectar ao banco de dados durante o processo de instalação.\nSe você selecionar \"{{int:config-mssql-windowsauth}}\", as credenciais de qualquer usuário que o servidor web esteja executando serão usadas.",
index 93e6f08..223e26e 100644 (file)
@@ -62,7 +62,7 @@
        "config-help-restart": "Deseja limpar todos os dados gravados que introduziu e reiniciar o processo de instalação?",
        "config-restart": "Sim, reiniciar",
        "config-welcome": "=== Verificações do ambiente ===\nSerão agora realizadas verificações básicas para determinar se este ambiente é apropriado para instalação do MediaWiki.\nLembre-se de fornecer esta informação se necessitar de pedir ajuda para concluir a instalação.",
-       "config-copyright": "=== Direitos de autor e Condições de utilização ===\n\n$1\n\nEste programa é software livre; pode redistribuí-lo e/ou modificá-lo nos termos da licença GNU General Public License, tal como publicada pela Free Software Foundation; tanto a versão 2 da Licença, como (por opção sua) qualquer versão posterior.\n\nEste programa é distribuído na esperança de que seja útil, mas '''sem qualquer garantia'''; inclusive, sem a garantia implícita da '''possibilidade de ser comercializado''' ou de '''adequação para qualquer finalidade específica'''.\nConsulte a licença GNU General Public License para mais detalhes.\n\nEm conjunto com este programa deve ter recebido <doclink href=Copying>uma cópia da licença GNU General Public License</doclink>; se não a recebeu, peça-a por escrito a Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA ou [https://www.gnu.org/copyleft/gpl.html leia-a na Internet].",
+       "config-welcome-section-copyright": "=== Direitos de autor e Condições de utilização ===\n\n$1\n\nEste programa é software livre; pode redistribuí-lo e/ou modificá-lo nos termos da licença GNU General Public License, tal como publicada pela Free Software Foundation; tanto a versão 2 da Licença, como (por opção sua) qualquer versão posterior.\n\nEste programa é distribuído na esperança de que seja útil, mas '''sem qualquer garantia'''; inclusive, sem a garantia implícita da '''possibilidade de ser comercializado''' ou de '''adequação para qualquer finalidade específica'''.\nConsulte a licença GNU General Public License para mais detalhes.\n\nEm conjunto com este programa deve ter recebido [$2 uma cópia da licença GNU General Public License]; se não a recebeu, peça-a por escrito a Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA ou [https://www.gnu.org/copyleft/gpl.html leia-a na Internet].",
        "config-sidebar": "* [https://www.mediawiki.org/wiki/MediaWiki/pt Página principal do MediaWiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents/pt Ajuda]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents/pt Manual técnico]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ/pt FAQ]",
        "config-sidebar-readme": "Leia-me",
        "config-sidebar-relnotes": "Notas de lançamento",
        "config-db-web-no-create-privs": "A conta que especificou para a instalação não tem privilégios suficientes para criar uma conta.\nA conta que especificar aqui já tem de existir.",
        "config-mysql-engine": "Motor de armazenamento:",
        "config-mysql-innodb": "InnoDB (recomendado)",
-       "config-mysql-myisam": "MyISAM",
-       "config-mysql-myisam-dep": "<strong>Aviso:</strong>  Selecionou o MyISAM para motor de armazenamento do MySQL, uma combinação desaconselhada para usar com o MediaWiki porque:\n* praticamente não permite acessos simultâneos, porque bloqueia tabelas\n* o MyISAM é mais suscetível a perdas da integridade dos dados do que outros motores\n* o código do MediaWiki não trabalha devidamente com o MyISAM\n\nSe a sua instalação do MySQL suporta InnoDB, é altamente recomendado que o escolha em vez do MyISAM.\nSe não suporta o InnoDB, talvez seja uma boa altura para atualizá-la para a versão mais recente.",
-       "config-mysql-only-myisam-dep": "<strong>Aviso:</strong> O único motor de armazenamento para MySQL nesta máquina é o MyISAM e o seu uso com o MediaWiki não é recomendado porque:\n* praticamente não suporta acessos simultâneos, porque bloqueia tabelas\n* o MyISAM é mais suscetível a perdas da integridade dos dados do que outros motores\n* o código do MediaWiki não trabalha devidamente com o MyISAM\n\nA sua instalação MySQL não suporta InnoDB, talvez seja uma boa altura para atualizá-la para a versão mais recente.",
        "config-mysql-engine-help": "<strong>InnoDB</strong> é quase sempre a melhor opção, porque suporta bem acessos simultâneos <i>(concurrency)</i>.\n\n<strong>MyISAM</strong> pode ser mais rápido no modo de utilizador único ou em instalações somente para leitura.\nAs bases de dados MyISAM tendem a perder integridade de dados com mais frequência do que as bases de dados InnoDB.",
        "config-mssql-auth": "Tipo de autenticação:",
        "config-mssql-install-auth": "Selecione o tipo de autenticação a usar para ligar à base de dados durante o processo de instalação.\nSe selecionar \"{{int:config-mssql-windowsauth}}\", serão usadas as credenciais do utilizador com que o servidor de Internet está a ser executado.",
index a1e6dd6..039cd26 100644 (file)
@@ -63,7 +63,7 @@
        "config-help-restart": "Message in warning box in MediaWiki installer.",
        "config-restart": "Button text to confirm the installation procedure has to be restarted.",
        "config-welcome": "Notice that the installer is about to check as to whether MediaWiki can be installed.",
-       "config-welcome-section-copyright": "This message follows {{msg-mw|config-env-good}}.\n\nParameters:\n* $1 - copyright and author list\n* $2 - Link to the installer page that contains the license text\n",
+       "config-welcome-section-copyright": "This message follows {{msg-mw|config-env-good}}.\n\nParameters:\n* $1 - copyright and author list\n* $2 - Link to the installer page that contains the license text",
        "config-sidebar": "Maximum width for words is 24 characters. Only visible part of the translation counts to this limit.",
        "config-sidebar-readme": "Link in sidebar to read the README documentation",
        "config-sidebar-relnotes": "Link in sidebar to read the RELEASE-NOTES documentation",
        "config-db-web-no-create-privs": "Error message in the MediaWiki installer.",
        "config-mysql-engine": "Field label for MySQL storage engine in the MediaWiki installer.",
        "config-mysql-innodb": "Option for the MySQL storage engine in the MediaWiki installer.",
-       "config-mysql-myisam": "Option for the MySQL storage engine in the MediaWiki installer.",
-       "config-mysql-myisam-dep": "Warning message in the MediaWiki installer when MyISAM is chosen as MySQL storage engine.",
-       "config-mysql-only-myisam-dep": "Used as warning message when mysql does not support the minimum suggested feature set.",
        "config-mysql-engine-help": "Help text in MediaWiki installer with advice for picking a MySQL storage engine.",
        "config-mssql-auth": "Radio button group label.\n\nFollowed by the following radio button labels:\n* {{msg-mw|Config-mssql-sqlauth}}\n* {{msg-mw|Config-mssql-windowsauth}}",
        "config-mssql-install-auth": "Used as the help text for the \"Authentication type\" radio button when typing in database settings for installation.\n\nRefers to {{msg-mw|Config-mssql-windowsauth}}.\n\nSee also:\n* {{msg-mw|Config-mssql-web-auth}}",
index 66eca85..fb68b30 100644 (file)
@@ -50,7 +50,7 @@
        "config-help-restart": "Doriți să ștergeți toate datele salvate introduse și să reporniți procesul de instalare?",
        "config-restart": "Da, repornește.",
        "config-welcome": "=== Verificări ale mediului ===\nVerificări de bază vor fi efectuate pentru a vedea dacă este potrivit pentru instalarea MediaWiki.\nNu uitați să includeți aceste informații dacă doriți asistență pentru completarea instalării.",
-       "config-copyright": "=== Drepturi de autor și termeni ===\n\n$1\n\nAcest program este un software liber; îl puteți redistribui și / sau modifica în conformitate cu termenii Licenței Publice Generale GNU, publicată de Fundația pentru Software Liber; fie versiunea 2 a Licenței, fie (la alegere) orice versiune ulterioară.\nAcest program este distribuit în speranța că va fi util, dar <strong>fără nicio garanție</strong>; fără nici măcar garanția implicită de <strong>vandabilitate</strong> sau <strong>fitness pentru un anumit scop</strong>.\nPentru mai multe detalii, consultați Licența publică generală GNU.\nAr fi trebuit să fi primit <doclink href = Copying> o copie a GNU General Public License </ doclink> împreună cu acest program; dacă nu, scrieți la Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, SUA, sau [https://www.gnu.org/copyleft/gpl.html citiți-o online] .",
+       "config-welcome-section-copyright": "=== Drepturi de autor și termeni ===\n\n$1\n\nAcest program este un software liber; îl puteți redistribui și / sau modifica în conformitate cu termenii Licenței Publice Generale GNU, publicată de Fundația pentru Software Liber; fie versiunea 2 a Licenței, fie (la alegere) orice versiune ulterioară.\nAcest program este distribuit în speranța că va fi util, dar <strong>fără nicio garanție</strong>; fără nici măcar garanția implicită de <strong>vandabilitate</strong> sau <strong>fitness pentru un anumit scop</strong>.\nPentru mai multe detalii, consultați Licența publică generală GNU.\nAr fi trebuit să fi primit [$2 o copie a GNU General Public License] împreună cu acest program; dacă nu, scrieți la Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, SUA, sau [https://www.gnu.org/copyleft/gpl.html citiți-o online] .",
        "config-sidebar": "* [https://www.mediawiki.org Acasă MediaWiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents User's Guide]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents Administrator's Guide]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ FAQ]\n----\n* <doclink href=Readme>Read me</doclink>\n* <doclink href=ReleaseNotes>Release notes</doclink>\n* <doclink href=Copying>Copying</doclink>\n* <doclink href=UpgradeDoc>Upgrading</doclink>",
        "config-env-good": "Verificarea mediului a fost efectuată cu succes.\nPuteți instala MediaWiki.",
        "config-env-bad": "Verificarea mediului a fost efectuată.\nNu puteți instala MediaWiki.",
        "config-db-web-create": "Creați contul dacă nu există deja",
        "config-mysql-engine": "Motor de stocare:",
        "config-mysql-innodb": "InnoDB (recomandat)",
-       "config-mysql-myisam": "MyISAM",
        "config-mssql-auth": "Tip de autentificare:",
        "config-site-name": "Numele wikiului:",
        "config-site-name-blank": "Introduceți un nume pentru sit.",
index 1c0ec86..df1ca1a 100644 (file)
@@ -58,7 +58,6 @@
        "config-header-mssql": "'Mbostaziune de Microsoft SQL Server",
        "config-invalid-db-type": "Tipe de database invalide.",
        "config-mysql-innodb": "InnoDB (conzigliate)",
-       "config-mysql-myisam": "MyISAM",
        "config-ns-generic": "Proggette",
        "config-admin-email": "Indirizze e-mail:",
        "config-install-step-done": "fatte",
index a34db5f..03ef206 100644 (file)
@@ -69,7 +69,7 @@
        "config-help-restart": "Вы хотите удалить все сохранённые данные, которые вы ввели, и запустить процесс установки заново?",
        "config-restart": "Да, начать заново",
        "config-welcome": "=== Проверка окружения ===\nБудут проведены базовые проверки с целью определить, подходит ли данная система для установки MediaWiki.\nНе забудьте включить эту информацию, если вам потребуется помощь для завершения установки.",
-       "config-copyright": "=== Авторские права и условия ===\n\n$1\n\nMediaWiki — свободное программное обеспечение, которое вы можете распространять и/или изменять в соответствии с условиями лицензии GNU General Public License, опубликованной фондом свободного программного обеспечения; второй версии, либо любой более поздней версии.\n\nMediaWiki распространяется в надежде, что она будет полезной, но <strong>без каких-либо гарантий</strong>, даже без подразумеваемых гарантий <strong>коммерческой ценности</strong> или <strong>пригодности для определённой цели</strong>. См. лицензию GNU General Public License для более подробной информации.\n\nВы должны были получить <doclink href=Copying>копию GNU General Public License</doclink> вместе с этой программой, если нет, то напишите Free Software Foundation, Inc., по адресу: 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA или [https://www.gnu.org/copyleft/gpl.html прочтите её онлайн].",
+       "config-welcome-section-copyright": "=== Авторские права и условия ===\n\n$1\n\nMediaWiki — свободное программное обеспечение, которое вы можете распространять и/или изменять в соответствии с условиями лицензии GNU General Public License, опубликованной фондом свободного программного обеспечения; второй версии, либо любой более поздней версии.\n\nMediaWiki распространяется в надежде, что она будет полезной, но <strong>без каких-либо гарантий</strong>, даже без подразумеваемых гарантий <strong>коммерческой ценности</strong> или <strong>пригодности для определённой цели</strong>. См. лицензию GNU General Public License для более подробной информации.\n\nВы должны были получить [$2 копию GNU General Public License] вместе с этой программой, если нет, то напишите Free Software Foundation, Inc., по адресу: 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA или [https://www.gnu.org/copyleft/gpl.html прочтите её онлайн].",
        "config-sidebar": "* [https://www.mediawiki.org Сайт MediaWiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Справка для пользователей]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents Справка для администраторов]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ FAQ]",
        "config-sidebar-readme": "Прочти меня",
        "config-sidebar-relnotes": "Информация о версии",
        "config-db-web-no-create-privs": "Учётная запись, указанная вами для установки, не обладает достаточными правами для создания учётной записи.\nУказанная здесь учётная запись уже должна существовать.",
        "config-mysql-engine": "Движок базы данных:",
        "config-mysql-innodb": "InnoDB (рекомендуется)",
-       "config-mysql-myisam": "MyISAM",
-       "config-mysql-myisam-dep": "''' Внимание.''' Вы выбрали механизм MyISAM для хранения данных MySQL. Он не рекомендуется к использованию по следующим причинам:\n* он слабо поддерживает параллелизм из-за табличных блокировок;\n* более склонен к потере данных, по сравнению с другими механизмами;\n* код MediaWiki не всегда учитывает особенности MyISAM должным образом.\n\nЕсли ваша MySQL поддерживает InnoDB, настоятельно рекомендуется выбрать этот механизм.\nЕсли ваша MySQL не поддерживает InnoDB, возможно, настало время обновиться.",
-       "config-mysql-only-myisam-dep": "<strong>Предупреждение:</strong> MyISAM — единственная доступная система хранения данных для MySQL на этом компьютере, и она не рекомендуется для использования совместно с MediaWiki, потому что:\n* слабо поддерживает параллелизм из-за блокировки таблиц\n* больше других систем подвержена повреждению\n* кодовая база MediaWiki не всегда обрабатывает MyISAM так, как следует\n\nВаша MySQL не поддерживает InnoDB, так что, возможно, настало время для обновления.",
        "config-mysql-engine-help": "'''InnoDB''' почти всегда предпочтительнее, так как он лучше справляется с параллельным доступом.\n\n'''MyISAM''' может оказаться быстрее для вики с одним пользователем или с минимальным количеством поступающих правок, однако базы данных на нём портятся чаще, чем на InnoDB.",
        "config-mssql-auth": "Тип аутентификации:",
        "config-mssql-install-auth": "Выберите тип проверки подлинности, который будет использоваться для подключения к базе данных во время процесса установки.\nЕсли вы выберите «{{int:config-mssql-windowsauth}}», будут использоваться учётные данные пользователя, под которым работает веб-сервер.",
index a8bada1..3fc52ab 100644 (file)
@@ -45,7 +45,7 @@
        "config-help-restart": "Div ye wish tae clear aw hained data that ye'v entered n restairt the instawlation process?",
        "config-restart": "Ai, restart it",
        "config-welcome": "=== Environmêntal checks ===\nBasic checks will nou be performed tae see gif this environment is suitable fer MediaWiki installâtion.\nMynd tae inclæde this information gif ye seek heelp oan hou tae complete the installâtion.",
-       "config-copyright": "=== Copiericht n Terms ===\n\n$1\n\nThis program is free saffware; ye can redistreebute it n/or modifie it unner the terms o the GNU General Public License aes published bi the Free Software Foundation; either version 2 o the License, or (yer optie) onie later version.\n\nThis program is distributed in the hope that it will be uiseful, but <strong>wioot onie warrantie</strong>; wioot even the implied warrantie o <strong>merchantabeelity</strong> or <strong>fitness fer ae parteecular purpose</strong>.\nSee the GNU General Public License fer mair details.\n\nYe shid hae receeved <doclink href=Copying> ae copie o the GNU General Publeec License</doclink> alang wi this program; gif naw, write til the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA, or [https://www.gnu.org/copyleft/gpl.html read it online].",
+       "config-welcome-section-copyright": "=== Copiericht n Terms ===\n\n$1\n\nThis program is free saffware; ye can redistreebute it n/or modifie it unner the terms o the GNU General Public License aes published bi the Free Software Foundation; either version 2 o the License, or (yer optie) onie later version.\n\nThis program is distributed in the hope that it will be uiseful, but <strong>wioot onie warrantie</strong>; wioot even the implied warrantie o <strong>merchantabeelity</strong> or <strong>fitness fer ae parteecular purpose</strong>.\nSee the GNU General Public License fer mair details.\n\nYe shid hae receeved [$2  ae copie o the GNU General Publeec License] alang wi this program; gif naw, write til the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA, or [https://www.gnu.org/copyleft/gpl.html read it online].",
        "config-sidebar": "* [https://www.mediawiki.org MediaWiki home]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents User's Guide]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents Administrator's Guide]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ FAQ]\n----\n* <doclink href=Readme>Read me</doclink>\n* <doclink href=ReleaseNotes>Release notes</doclink>\n* <doclink href=Copying>Copiein</doclink>\n* <doclink href=UpgradeDoc>Upgradin</doclink>",
        "config-env-good": "The environment haes been checked.\nYe can install MediaWiki.",
        "config-env-bad": "The environment haes been checked.\nYe canna install MediaWiki.",
        "config-db-web-no-create-privs": "The accoont that ye speceefied fer instawation disna hae enooch preevileges tae cræft aen accoont.\nThe accoont that ye speceefie here maun awreadie exeest.",
        "config-mysql-engine": "Storage engine:",
        "config-mysql-innodb": "InnoDB",
-       "config-mysql-myisam": "MyISAM",
-       "config-mysql-myisam-dep": "<strong>Warnishment:</strong> Ye'v selected MyISAM aes storage engine fer MySQL, this isna recommended fer uiss wi MediaWiki, cause:\n* it barelie supports concurrencie cause o buird lockin\n* it's mair prone til rot than ither engines\n* the MediaWiki codebase disna aye haunnle MyISAM aes it shid\n\nGif yer MySQL installâtion supports InnoDB, it is heilie recommended that ye chuise that instead.\nGif yer MySQL installâtion disna support InnoDB, than perhaps it's time fer aen upgrade.",
-       "config-mysql-only-myisam-dep": "<strong>Warnishment:</strong> MyISAM is the yinly available storage engine fer MySQL oan this machine, n this isna recommended fer uiss wi MediaWiki, cause:\n* it barelie supports concurrencie cause o buird lockin\n* it is mair prone til rot than ither engines\n* the MediaWiki codebase disna aye haunnle MyISAM aes it shid\n\nYer MySQL installâtion dina support InnoDB, perhaps it's time fer aen upgrade.",
        "config-mysql-engine-help": "<strong>InnoDB</strong> is awmaist aye the best optie, aes it haes guid concurrencie support.\n\n<strong>MyISAM</strong> micht be faster in single-uiser or read-yinly installâtions.\nMyISAM databases tend tae rot mair aften than InnoDB databases.",
        "config-mssql-auth": "Authentication type:",
        "config-mssql-install-auth": "Select the authentication type that's tae be uised tae connect wi the database durin the installation process.\nGif ye select \"{{int:config-mssql-windowsauth}}\", the credeentials o whitever uiser the wabserver is rinnin aes will be uised.",
index e884770..c718b75 100644 (file)
        "config-help-restart": "Želite li obrisati sve sačuvane podatke koje ste unijeli i ponovo pokrenuti uspostavu?",
        "config-restart": "Da, pokreni ponovo",
        "config-welcome": "=== Provjere okoline ===\nSada ćemo obaviti osnovne provjere kako bismo utvrdili je li okruženje prikladno za uspostavu MediaWikija. Ne zaboravite navesti ove informacije ako tražite pomoć s dovršavanjem uspostave.",
-       "config-copyright": "=== Autorska prava i uvjeti ===\n\n$1\n\nTo je slobodni softver (free software); možete ga redistribuirati i/ili mijenjati pod uvjetima GNU-ove opće javne licence (GNU General Public License) Zaklade za slobodni softver (Free Software Foundation); verzija 2 ili bilo koja kasnija verzija licence (po vašem izboru).\n\nOvaj se program nudi u nadi da će biti koristan, ali '''bez ikakvog jamstva'''; čak i implicirano jamstvo '''sposobnosti prodaje''' ili '''prikladnosti za određenu svrhu'''.\nViše informacija ćete naći u tekstu GNU-ove opće javne licence.\n\nTrebali ste primiti <doclink href=Copying>primjerak GNU-ove opće javne licence</doclink> zajedno s programima; ako ga ne primite, pišite nam na Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. ili [https://www.gnu.org/copyleft/gpl.html pročitajte je ovdje].",
-       "config-sidebar": "* [https://www.mediawiki.org Početna strana MediaWikija]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Vodič za korisnike]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents Vodič za administratore]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ ČPP]\n----\n* <doclink href=Readme>Pročitaj me</doclink>\n* <doclink href=ReleaseNotes>Bilješke o izdanju</doclink>\n* <doclink href=Copying>Kopiranje</doclink>\n* <doclink href=UpgradeDoc>Nadograđivanje</doclink>",
+       "config-welcome-section-copyright": "=== Autorska prava i uvjeti ===\n\n$1\n\nTo je slobodni softver (free software); možete ga redistribuirati i/ili mijenjati pod uvjetima GNU-ove opće javne licence (GNU General Public License) Zaklade za slobodni softver (Free Software Foundation); verzija 2 ili bilo koja kasnija verzija licence (po vašem izboru).\n\nOvaj se program nudi u nadi da će biti koristan, ali '''bez ikakvog jamstva'''; čak i implicirano jamstvo '''sposobnosti prodaje''' ili '''prikladnosti za određenu svrhu'''.\nViše informacija ćete naći u tekstu GNU-ove opće javne licence.\n\nTrebali ste primiti [$2 primjerak GNU-ove opće javne licence] zajedno s programima; ako ga ne primite, pišite nam na Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. ili [https://www.gnu.org/copyleft/gpl.html pročitajte je ovdje].",
+       "config-sidebar": "* [https://www.mediawiki.org Početna strana MediaWikija]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Vodič za korisnike]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents Vodič za administratore]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ ČPP]",
+       "config-sidebar-readme": "Pročitaj me",
+       "config-sidebar-relnotes": "Bilješke o izdanju",
+       "config-sidebar-license": "Kopiranje",
+       "config-sidebar-upgrade": "Nadogradnja",
        "config-env-good": "Okruženje je provjereno.\nMožete uspostaviti MediaWiki.",
        "config-env-bad": "Okruženje je provjereno.\nNe možete uspostaviti MediaWiki.",
        "config-env-php": "PHP $1 je uspostavljen.",
        "config-db-web-no-create-privs": "Račun koji ste naveli za uspostavu nema dovoljne privilegije za da stvori račun.\nOvdje morate navesti postojeći račun.",
        "config-mysql-engine": "Skladišni pogon:",
        "config-mysql-innodb": "InnoDB (preporučeno)",
-       "config-mysql-myisam": "MyISAM",
-       "config-mysql-myisam-dep": "<strong>Upozorenje:</strong> Odabrali ste MyISAM kao skladišni pogon za MySQL. Ali ne preporučuje se za MediaWiki jer:\n* jedva podržava istovremenost iz zaključavanja tabela\n* vjerojatnije je da će ih druge biljke pokvariti\n* kodna baza MediaWikija ne može uvijek ispravno raditi s MyISAM-om\n\nAko vaša uspostava MySQL-a podržava InnoDB, tada seriozno preporučujemo da je koristite umjesto MyISAM.\nAko vaša uspostava MySQL-a ne podržava InnoDB, vjerojatno je vrijeme za nadogradnju.",
-       "config-mysql-only-myisam-dep": "<strong>Upozorenje:</strong> MyISAM je jedini dostupan skladišni pogon za MySQL na ovom stroju, a ovo se ne preporučuje za uporabu s MediaWiki, jer:\n* skoro ne podržava istovremeno izvršavanje zadataka zbog zaključavanja tablica\n* više osjetljiv na kvarenje od drugih pogona \n* kodna baza MediaWIkija ne radi uvijek ispravno s MyISAM-om\nVaša MySQL uspostava ne podržava InnoDB. Možda je vrijeme da ga nadogradimo.",
+       "config-mssql-auth": "Tip potvrde identiteta:",
+       "config-mssql-sqlauth": "Potvrda identiteta za SQL Server",
+       "config-mssql-windowsauth": "Potvrda identiteta za Windows",
+       "config-site-name": "Ime wikija:",
+       "config-site-name-help": "Ovo će se pojaviti u naslovnoj traci pregledača i na raznim drugim mestima.",
        "config-admin-password": "Lozinka:",
        "mainpagetext": "<strong>MediaWiki je uspješno instaliran.</strong>",
        "mainpagedocfooter": "Za informacije o korištenju wiki softvera konzultirajte [https://meta.wikimedia.org/wiki/Help:Contents Vodič za korisnike].\n\n== Uvod u rad ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Lista konfiguracije postavki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista primatelja izdanja MediaWikija]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Lokalizirajte MediaWiki za svoj jezik]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Saznajte kako se boriti protiv spama na svojem wikiju]"
index 363014c..fefe7a2 100644 (file)
@@ -62,7 +62,6 @@
        "config-db-web-account": "ජාල ප්‍රවේශනය සඳහා දත්ත සංචිත ගිණුම",
        "config-mysql-engine": "ආචයන එන්ජිම:",
        "config-mysql-innodb": "InnoDB",
-       "config-mysql-myisam": "MyISAM",
        "config-mssql-windowsauth": "windows සහතික කිරීම.",
        "config-site-name": "විකියෙහි නම:",
        "config-site-name-blank": "අඩවි නාමයක් යොදන්න.",
index 7543691..3dd7038 100644 (file)
@@ -45,7 +45,7 @@
        "config-help-restart": "Želite počistiti vse shranjene podatke, ki ste jih vnesti, in ponovno začeti s postopkom namestitve?",
        "config-restart": "Da, ponovno zaženi",
        "config-welcome": "=== Pregledi okolja ===\nIzvedli bomo osnovne preglede, da vidimo, če je okolje primerno za namestitev MediaWiki.\nPosredujte rezultate teh pregledov, če med namestitvijo potrebujete pomoč.",
-       "config-sidebar": "* [https://www.mediawiki.org Domača stran MediaWiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Vodnik za uporabnike]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents Vodnik za administratorje]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Pogosto zastavljena vprašanja]\n----\n* <doclink href=Readme>Beri me</doclink>\n* <doclink href=ReleaseNotes>Opombe ob izidu</doclink>\n* <doclink href=Copying>Kopiranje</doclink>\n* <doclink href=UpgradeDoc>Nadgrajevanje</doclink>",
+       "config-sidebar": "* [https://www.mediawiki.org Domača stran MediaWiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Vodnik za uporabnike]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents Vodnik za administratorje]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Pogosto zastavljena vprašanja]",
        "config-env-good": "Okolje je pregledano.\nLahko namestite MediaWiki.",
        "config-env-bad": "Okolje je pregledano.\nNe morete namestiti MediaWiki.",
        "config-env-php": "Nameščen je PHP $1.",
        "config-db-web-create": "Ustvari račun, če že ne obstaja",
        "config-mysql-engine": "Pogon skladiščenja:",
        "config-mysql-innodb": "InnoDB (priporočeno)",
-       "config-mysql-myisam": "MyISAM",
        "config-mssql-auth": "Tip avtentikacije:",
        "config-site-name": "Ime wikija:",
        "config-site-name-help": "To bo prikazano v naslovni vrstici brskalnika in na drugih različnih mestih.",
index 344bd23..e740511 100644 (file)
        "config-db-web-no-create-privs": "Налог који сте навели за инсталацију нема довољне привилегије да отвори налог.\nНалог који овде наведете већ мора да постоји.",
        "config-mysql-engine": "Механизам складишта:",
        "config-mysql-innodb": "InnoDB (препоручено)",
-       "config-mysql-myisam": "MyISAM",
        "config-mssql-auth": "Тип потврде идентитета:",
        "config-mssql-sqlauth": "SQL Server потврда идентитета",
        "config-mssql-windowsauth": "Windows потврда идентитета",
index 0b31bca..26d60f5 100644 (file)
        "config-db-web-no-create-privs": "Nalog koji ste naveli za instalaciju nema dovoljne privilegije da otvori nalog.\nNalog koji ovde navedete već mora da postoji.",
        "config-mysql-engine": "Mehanizam skladišta:",
        "config-mysql-innodb": "InnoDB (preporučeno)",
-       "config-mysql-myisam": "MyISAM",
        "config-mssql-auth": "Tip potvrde identiteta:",
        "config-mssql-sqlauth": "SQL Server potvrda identiteta",
        "config-mssql-windowsauth": "Windows potvrda identiteta",
index 1db3fca..45b8545 100644 (file)
@@ -49,7 +49,7 @@
        "config-help-restart": "Vill du rensa all sparad data som du har angivit och starta om installationen?",
        "config-restart": "Ja, starta om",
        "config-welcome": "=== Miljökontroller ===\nGrundläggande kontroller kommer nu att utföras för att se om denna miljö är lämplig för installation av MediaWiki.\nKom ihåg att ta med denna information om du söker stöd för hur du skall slutföra installationen.",
-       "config-copyright": "=== Upphovsrätt och Villkor ===\n\n$1\n\nDetta program är fri programvara; du kan vidaredistribuera den och/eller modifiera det enligt villkoren i GNU General Public License som publicerats av Free Software Foundation; antingen genom version 2 av licensen, eller (på ditt initiativ) någon senare version.\n\nDetta program är distribuerat i hopp om att det kommer att vara användbart, men '''utan någon garanti'''; utan att ens ha en underförstådd garanti om '''säljbarhet''' eller '''lämplighet för ett särskilt ändamål'''.\nSe GNU General Public License för mer detaljer.\n\nDu bör ha fått <doclink href=Copying>en kopia av GNU General Public License</doclink> tillsammans med detta program; om inte, skriv till Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA, eller [https://www.gnu.org/copyleft/gpl.html läs den online].",
+       "config-welcome-section-copyright": "=== Upphovsrätt och Villkor ===\n\n$1\n\nDetta program är fri programvara; du kan vidaredistribuera den och/eller modifiera det enligt villkoren i GNU General Public License som publicerats av Free Software Foundation; antingen genom version 2 av licensen, eller (på ditt initiativ) någon senare version.\n\nDetta program är distribuerat i hopp om att det kommer att vara användbart, men '''utan någon garanti'''; utan att ens ha en underförstådd garanti om '''säljbarhet''' eller '''lämplighet för ett särskilt ändamål'''.\nSe GNU General Public License för mer detaljer.\n\nDu bör ha fått [$2 en kopia av GNU General Public License] tillsammans med detta program; om inte, skriv till Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA, eller [https://www.gnu.org/copyleft/gpl.html läs den online].",
        "config-sidebar": "* [https://www.mediawiki.org MediaWikis webbplats]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Användarguide]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents Administratörsguide]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Frågor och svar]",
        "config-sidebar-readme": "Läs mig",
        "config-sidebar-relnotes": "Utgivningsanteckningar",
        "config-env-bad": "Miljön har kontrollerats.\nDu kan inte installera MediaWiki.",
        "config-env-php": "PHP $1 är installerat.",
        "config-env-hhvm": "HHVM $1 är installerat.",
-       "config-unicode-using-intl": "Använder [https://pecl.php.net/intl intl PECL-tillägget] för Unicode-normalisering.",
-       "config-unicode-pure-php-warning": "'''Varning:''' [https://pecl.php.net/intl intl PECL-tillägget] är inte tillgängligt för att hantera Unicode-normalisering, faller tillbaka till en långsamt implementering i ren PHP.\nOm du driver en högtrafikerad webbplats bör du läsa lite om [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations Unicode-normalisering].",
+       "config-unicode-using-intl": "Använder tillägget [https://pecl.php.net/intl PHP intl] för Unicode-normalisering.",
+       "config-unicode-pure-php-warning": "'''Varning:''' Tillägget [https://php.net/manual/en/book.intl.php PHP intl] är inte tillgängligt för att hantera Unicode-normalisering, faller tillbaka till en långsamt implementering i ren PHP.\nOm du driver en högtrafikerad webbplats bör du läsa lite om [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations Unicode-normalisering].",
        "config-unicode-update-warning": "<strong>Varning:</strong> Den installerade versionen av Unicode-normaliserings \"wrappern\" använder en äldre version av [http://site.icu-project.org/ ICU projektets] bibliotek.\nDu bör [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations uppgradera] om är intresserad av att använda Unicode.",
        "config-no-db": "Kunde inte hitta en lämplig databasdrivrutin! Du måste installera en databasdrivrutin för PHP.\nFöljande databas{{PLURAL:$2|typ |typer}} stöds: $1.\n\nI du själv kompilerat din PHP, konfigurera den med en databasklient aktiverad genom att t.ex. använda <code>./configure --with-mysqli</code>.\nOm du installerade PHP från ett Debian- eller Ubuntupaket måste du även installera, t.ex. <code>php-mysql</code>-paketet.",
-       "config-outdated-sqlite": "'''Varning:''' du har SQLite $1, vilket är lägre än minimikravet version $2. SQLite kommer inte att vara tillgänglig.",
+       "config-outdated-sqlite": "<strong>Varning:</strong> Du har SQLite $2, vilket är lägre än minimikravet version $1. SQLite kommer inte att vara tillgänglig.",
        "config-no-fts3": "'''Varning:''' SQLite kompileras utan [//sqlite.org/fts3.html FTS3-modulen], sökfunktioner kommer att vara otillgängliga på denna backend.",
        "config-pcre-old": "'''Kritiskt:''' PCRE $1 eller senare krävs.\nDin PHP-binär är länkad till PCRE $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Mer information].",
        "config-pcre-no-utf8": "'''Kritiskt:''' PHP:s PCRE-modul verkar vara kompilerat utan PCRE_UTF8-stöd.\nMediaWiki kräver stöd för UTF-8 för att fungera korrekt.",
        "config-db-web-no-create-privs": "Det konto som du har angett för installation har inte tillräcklig behörighet för att skapa ett konto.\nDet konto du anger här måste redan finnas.",
        "config-mysql-engine": "Lagringsmotor:",
        "config-mysql-innodb": "InnoDB (rekommenderas)",
-       "config-mysql-myisam": "MyISAM",
-       "config-mysql-myisam-dep": "'''Varning:''' Du har valt MyISAM som lagringsmotor för MySQL, vilket inte rekommenderas för användning med MediaWiki eftersom:\n* den knappt stöder samtidigt exekvering på grund av låsning av tabeller\n* den är mer benägen att korrumpera data än andra motorer\n* MediaWiki-kodbasen hanterar inte alltid MyISAM som den ska\n\nOm din MySQL-installation stöder InnoDB, är det starkt rekommenderat att du väljer det istället.\nOm din MySQL-installation inte stöder InnoDB, kanske det är dags för en uppgradering.",
-       "config-mysql-only-myisam-dep": "'''Varning:''' MyISAM är den enda tillgängliga lagringsmotorn för MySQL på denna maskin, och den är inte rekommenderad att använda med MediaWiki eftersom:\n* den knappt stöder samtidigt exekvering på grund av låsning av tabeller\n* den är mer benägen att korrumpera data än andra motorer\n* MediaWiki-kodbasen hanterar inte alltid MyISAM som den ska\n\nDin MySQL-installation stöder inte InnoDB, det kanske är dags för en uppgradering.",
        "config-mysql-engine-help": "'''InnoDB''' är nästan alltid det bästa valet eftersom den har ett bra system för samtidiga arbeten.\n\n'''MyISAM''' kan vara snabbare i enanvändarläge eller skrivskyddade installationer.\nMyISAM-databaser tenderar att bli korrupta oftare än InnoDB-databaser.",
        "config-mssql-auth": "Autentiseringstyp:",
        "config-mssql-install-auth": "Välj autentiseringstypen som kommer att användas för att ansluta till databasen under installationsprocessen.\nOm du väljer \"{{int:config-mssql-windowsauth}}\", kommer autentiseringsuppgifterna för den användare webbservern körs som att användas.",
        "config-license-help": "Många publika wikis släpper alla bidrag under en  [https://freedomdefined.org/Definition fri licens].\nDetta bidrar till en känsla av gemensamt ägandeskap och uppmuntrar till långsiktiga bidrag.\nDet är i allmänhet inte nödvändigt för en privat eller företagswiki.\n\nOm du vill kunna använda text från Wikipedia, och du vill att Wikipedia ska kunna acceptera text kopierad ifrån din wiki bör du välja <strong>{{int:config-license-cc-by-sa}}</strong>.\n\nWikipedia använde tidigare  GNU Free Documentation License.\nGFDL är en giltig licens, men svår att förstå.\nDet är även svårt att återanvända innehåll som licensierats under GFDL.",
        "config-email-settings": "E-postinställningar",
        "config-enable-email": "Aktivera utgående e-post",
-       "config-enable-email-help": "Om du vill att e-post ska fungera behöver,[Config-dbsupport-oracle/manual/en/mail.configuration.php PHPs e-postinställningar] vara konfigurerad på rätt sätt.\nOm du inte vill ha några e-postfunktioner, kan du inaktivera dem här.",
+       "config-enable-email-help": "Om du vill att e-post ska fungera behöver [https://www.php.net/manual/en/mail.configuration.php PHPs e-postinställningar] vara konfigurerad på rätt sätt.\nOm du inte vill ha några e-postfunktioner kan du inaktivera dem här.",
        "config-email-user": "Aktivera e-post mellan användare",
        "config-email-user-help": "Tillåta alla användare att skicka e-post till varandra om de har aktiverat det i sina inställningar.",
        "config-email-usertalk": "Aktivera meddelanden för användardiskussionssidor",
index 1460fec..e8e9a75 100644 (file)
@@ -44,7 +44,7 @@
        "config-help-restart": "మీరు భద్రపరిచిన డేటా మొత్తాన్ని తీసివేసి స్థాపనను తిరిగి ప్రారంభించాలా?",
        "config-restart": "ఔను, తిరిగి ప్రారంభించు",
        "config-welcome": "=== పర్యావరణ పరీక్షలు ===\nఈ పర్యావరణం MediaWiki స్థాపనకు అనుకూలంగా ఉందో లేదో చూసే ప్రాథమిక పరీక్షలు ఇపుడు చేస్తాం.\nస్థాపనను ఎలా పూర్తి చెయ్యాలనే విషయమై మీకు సహాయం అడిగేటపుడు, ఈ సమాచారాన్ని ఇవ్వాలని గుర్తుంచుకోండి.",
-       "config-copyright": "=== కాపీహక్కు, నిబంధనలు===\n\n$1\n\nఇది ఉచిత సాఫ్ట్‌వేరు; ఫ్రీ సాఫ్ట్‌వేర్ ఫౌండేషన్ వారు ప్రచురించిన GNU జనరల్ పబ్లిక్ లైసెన్సును (2వ లేదా తరువాతి వర్షన్) అనుసరించి దీన్ని పంపిణీ చెయ్యవచ్చు లేదా మార్చుకోనూవచ్చు.\n\nదీని వలన ఉపయోగం ఉంటుందనే నమ్మకంతో ప్రచురింపబడింది. కానీ <strong>ఎటువంటి వారంటీ లేదు</strong>; <strong> వర్తకం చేయదగ్గ </strong>  లేదా <strong> ఒక అవసరానికి సరిపడే సామర్థ్యం</strong> ఉన్నదనే అంతరార్థ వారంటీ కూడా లేదు.\nమరిన్ని వివరాలకు GNU జనరల్ పబ్లిక్ లైసెన్స్ చూడండి.\n\nమీరు ఈ ప్రోగ్రాముతో పాటు <doclink href=Copying> GNU జనరల్ పబ్లిక్ లైసెన్స్ ప్రతిని </doclink> అందుకుని ఉండాలి; లేకపోతే, Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA కు జాబు రాయండి లేదా [https://www.gnu.org/copyleft/gpl.html ఆన్‌లైన్‌లో చదివండి].",
+       "config-welcome-section-copyright": "=== కాపీహక్కు, నిబంధనలు===\n\n$1\n\nఇది ఉచిత సాఫ్ట్‌వేరు; ఫ్రీ సాఫ్ట్‌వేర్ ఫౌండేషన్ వారు ప్రచురించిన GNU జనరల్ పబ్లిక్ లైసెన్సును (2వ లేదా తరువాతి వర్షన్) అనుసరించి దీన్ని పంపిణీ చెయ్యవచ్చు లేదా మార్చుకోనూవచ్చు.\n\nదీని వలన ఉపయోగం ఉంటుందనే నమ్మకంతో ప్రచురింపబడింది. కానీ <strong>ఎటువంటి వారంటీ లేదు</strong>; <strong> వర్తకం చేయదగ్గ </strong>  లేదా <strong> ఒక అవసరానికి సరిపడే సామర్థ్యం</strong> ఉన్నదనే అంతరార్థ వారంటీ కూడా లేదు.\nమరిన్ని వివరాలకు GNU జనరల్ పబ్లిక్ లైసెన్స్ చూడండి.\n\nమీరు ఈ ప్రోగ్రాముతో పాటు [$2  GNU జనరల్ పబ్లిక్ లైసెన్స్ ప్రతిని ] అందుకుని ఉండాలి; లేకపోతే, Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA కు జాబు రాయండి లేదా [https://www.gnu.org/copyleft/gpl.html ఆన్‌లైన్‌లో చదివండి].",
        "config-sidebar": "* [https://www.mediawiki.org MediaWiki మొదటిపేజీ]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents వాడుకరుల మార్గదర్శి]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents అధికారుల మార్గదర్శి]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ FAQ]\n----\n* <doclink href=Readme>చదవాల్సినవి</doclink>\n* <doclink href=ReleaseNotes>విడుదల గమనికలు</doclink>\n* <doclink href=Copying>కాపీ చెయ్యడం</doclink>\n* <doclink href=UpgradeDoc>ఉన్నతీకరించడం</doclink>",
        "config-env-good": "పర్యావరణాన్ని పరీక్షించాం.\nఇక మీరు MediaWiki ని స్థాపించుకోవచ్చు.",
        "config-env-bad": "పర్యావరణాన్ని పరీక్షించాం.\nమీరు MediaWiki ని స్థాపించలేరు.",
        "config-db-web-no-create-privs": "స్థాపన కోసం మీరిచ్చిన ఖాతాకు ఓ కొత్త ఖాతాను సృష్టించే అనుమతులు లేవు.\nఇక్కడ మీరిచ్చే ఖాతా తప్పనిసరిగా ఈసరికే ఉనికిలో ఉండాలి.",
        "config-mysql-engine": "స్టోరేజీ ఇంజను:",
        "config-mysql-innodb": "InnoDB",
-       "config-mysql-myisam": "MyISAM",
        "config-mssql-auth": "ఆథెంటికేషన్ రకం:",
        "config-mssql-sqlauth": "SQL Server ఆథెంటికేషన్",
        "config-mssql-windowsauth": "విండోస్ ఆథెంటికేషన్",
index a4e2ac0..38aafbe 100644 (file)
@@ -47,7 +47,7 @@
        "config-help-restart": "คุณต้องการล้างข้อมูลทั้งหมดที่คุณกรอกและเริ่มกระบวนการติดตั้งใหม่อีกครั้งหรือไม่?",
        "config-restart": "ใช่ เริ่มใหม่อีกครั้ง",
        "config-welcome": "=== การตรวจสอบสภาพแวดล้อม ===\nการตรวจสอบเบื้องต้นจะกระทำขึ้น เพื่อยืนยันว่าสภาพแวดล้อมปัจจุบันเหมาะสมสำหรับการติดตั้ง MediaWiki หรือไม่\nโปรดจำไว้ว่าให้รวบรวมผลลัพธ์การตรวจสอบนี้ ถ้าคุณต้องการแสวงหาการสนับสนุนเพื่อที่จะติดตั้งให้สมบูรณ์",
-       "config-copyright": "=== ลิขสิทธิ์และเงื่อนไข ===\n\n$1\n\nโปรแกรมนี้เป็นซอฟต์แวร์เสรี คุณสามารถนำโปรแกรมนี้มาเผยแพร่ซ้ำและ/หรือดัดแปลงได้ภายใต้เงื่อนไขของสัญญาอนุญาตสาธารณะทั่วไปของ GNU (GNU General Public License) ซึ่งเผยแพร่โดย Free Software Foundation (สัญญาอนุญาตรุ่น 2 ขึ้นไป)\n\nโปรแกรมนี้ถูกเผยแพร่โดยหวังว่าจะเป็นประโยชน์แก่ผู้ใช้ แต่<strong>จะไม่มีการรับประกันใด ๆ</strong> แม้แต่การรับประกันเกี่ยวกับ<strong>การนำไปใช้ในการซื้อขาย</strong> หรือ<strong>ความเหมาะสมสำหรับวัตถุประสงค์เฉพาะ</strong>\nสำหรับรายละเอียดเพิ่มเติม โปรดดูที่สัญญาอนุญาตสาธารณะทั่วไปของ GNU\n\nคุณควรได้รับ<doclink href=Copying>สำเนาของสัญญาอนุญาตสาธารณะทั่วไปของ GNU</doclink> มาพร้อมกับโปรแกรมนี้ ถ้าไม่ได้รับ ให้ขอได้ที่ Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA, \nหรือ[https://www.gnu.org/copyleft/gpl.html อ่านออนไลน์ที่นี่]",
+       "config-welcome-section-copyright": "=== ลิขสิทธิ์และเงื่อนไข ===\n\n$1\n\nโปรแกรมนี้เป็นซอฟต์แวร์เสรี คุณสามารถนำโปรแกรมนี้มาเผยแพร่ซ้ำและ/หรือดัดแปลงได้ภายใต้เงื่อนไขของสัญญาอนุญาตสาธารณะทั่วไปของ GNU (GNU General Public License) ซึ่งเผยแพร่โดย Free Software Foundation (สัญญาอนุญาตรุ่น 2 ขึ้นไป)\n\nโปรแกรมนี้ถูกเผยแพร่โดยหวังว่าจะเป็นประโยชน์แก่ผู้ใช้ แต่<strong>จะไม่มีการรับประกันใด ๆ</strong> แม้แต่การรับประกันเกี่ยวกับ<strong>การนำไปใช้ในการซื้อขาย</strong> หรือ<strong>ความเหมาะสมสำหรับวัตถุประสงค์เฉพาะ</strong>\nสำหรับรายละเอียดเพิ่มเติม โปรดดูที่สัญญาอนุญาตสาธารณะทั่วไปของ GNU\n\nคุณควรได้รับ[$2 สำเนาของสัญญาอนุญาตสาธารณะทั่วไปของ GNU] มาพร้อมกับโปรแกรมนี้ ถ้าไม่ได้รับ ให้ขอได้ที่ Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA, \nหรือ[https://www.gnu.org/copyleft/gpl.html อ่านออนไลน์ที่นี่]",
        "config-sidebar": "* [https://www.mediawiki.org โฮมเพจของ MediaWiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents แนวปฏิบัติของผู้ใช้]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents แนวปฏิบัติของผู้ดูแลระบบ]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ คำถามที่ถามบ่อย]\n----\n* <doclink href=Readme>อ่านเอกสารกำกับ</doclink>\n* <doclink href=ReleaseNotes>บันทึกการเผยแพร่</doclink>\n* <doclink href=Copying>การคัดลอก</doclink>\n* <doclink href=UpgradeDoc>การอัปเกรด</doclink>",
        "config-env-good": "ตรวจสอบสภาพแวดล้อมแล้ว\nคุณสามารถติดตั้ง MediaWiki",
        "config-env-bad": "ตรวจสอบสภาพแวดล้อมแล้ว\nคุณไม่สามารถติดตั้ง MediaWiki",
        "config-db-web-no-create-privs": "บัญชีที่คุณระบุไว้สำหรับการติดตั้งมีสิทธิ์ไม่เพียงพอที่จะสร้างบัญชี\nบัญชีที่คุณระบุไว้ที่นี่จะต้องมีอยู่แล้ว",
        "config-mysql-engine": "กลไกที่จัดเก็บข้อมูล:",
        "config-mysql-innodb": "InnoDB",
-       "config-mysql-myisam": "MyISAM",
-       "config-mysql-myisam-dep": "<strong>คำเตือน:</strong> คุณได้เลือก MyISAM เป็นกลไกที่จัดเก็บข้อมูลสำหรับ MySQL ซึ่่งไม่แนะนำให้ใช้กับ MediaWiki เนื่องจาก:\n* ไม่ค่อยสนับสนุนกระบวนการทำงานพร้อมกันเนื่องจากการล็อกตารางข้อมูล\n* มีแนวโน้มที่จะเสียหายมากกว่ากลไกอื่น\n* Codebase ของ MediaWiki ไม่สามารถจัดการ MyISAM ได้ดีเท่าที่ควร\n\nถ้าการติดตั้ง MySQL ของคุณสนับสนุน InnoDB แนะนำอย่างยิ่งว่าให้คุณเลือก InnoDB แทน\nถ้าการติดตั้ง MySQL ของคุณไม่สนับสนุน InnoDB อาจถึงเวลาที่คุณต้องอัปเกรดแล้ว",
-       "config-mysql-only-myisam-dep": "<strong>คำเตือน:</strong> กลไกที่จัดเก็บข้อมูลสำหรับ MySQL ที่พร้อมใช้งานบนเครื่องนี้มีเพียง MyISAM ซึ่่งไม่แนะนำให้ใช้กับ MediaWiki เนื่องจาก:\n* ไม่ค่อยสนับสนุนกระบวนการทำงานพร้อมกันเนื่องจากการล็อกตารางข้อมูล\n* มีแนวโน้มที่จะเสียหายมากกว่ากลไกอื่น\n* Codebase ของ MediaWiki ไม่สามารถจัดการ MyISAM ได้ดีเท่าที่ควร\n\nการติดตั้ง MySQL ของคุณไม่สนับสนุน InnoDB อาจถึงเวลาที่คุณต้องอัปเกรดแล้ว",
        "config-mysql-engine-help": "<strong>InnoDB</strong> เป็นตัวเลือกที่เกือบดีที่สุดเสมอ เนื่องจากมีการสนับสนุนกระบวนการทำงานพร้อมกัน\n\n<strong>MyISAM</strong> อาจทำงานได้เร็วกว่าในการติดตั้งแบบผู้ใช้คนเดียวหรือแบบอ่านอย่างเดียว\nฐานข้อมูล MyISAM มักจะได้รับความเสียหายบ่อยมากกว่าฐานข้อมูล InnoDB",
        "config-mssql-auth": "ชนิดการยืนยันตัวตน:",
        "config-mssql-install-auth": "เลือกชนิดการยืนยันตัวตนที่จะใช้เชื่อมต่อไปยังฐานข้อมูลในระหว่างกระบวนการติดตั้ง\nถ้าคุณเลือก \"{{int:config-mssql-windowsauth}}\" ข้อมูลประจำตัวที่ระบุว่าเว็บเซิร์ฟเวอร์กำลังทำงานในฐานะผู้ใช้ใดจะถูกใช้",
index fe53fa1..6d63409 100644 (file)
@@ -48,7 +48,7 @@
        "config-help-restart": "Nais mo bang hawiin ang lahat ng nasagip na datong ipinasok mo at muling simulan ang proseso ng pagluluklok?",
        "config-restart": "Oo, muling simulan ito",
        "config-welcome": "=== Pagsusuring pangkapaligiran ===\nIsasagawa ang payak na mga pagsusuri upang makita kung ang kapaligirang ito ay angkop para sa pagluluklok ng MediaWiki.\nTandaan na dapat isama mo itong impormasyon kung kailangan mo ng tulong kung paano tapusin ang instalasyon.",
-       "config-copyright": "=== Karapatang-ari at Tadhana ===\n\n$1\n\nAng programang ito ay malayang software; maaari mo itong ipamahagi at/o baguhin sa ilalim ng mga tadhana ng Pangkalahatang Pampublikong Lisensiyang GNU ayon sa pagkakalathala ng Free Software Foundation; na maaaring bersyong 2 ng Lisensiya, o (kung nais mo) anumang susunod na bersyon.\n\nIpinamamahagi ang programang ito na umaasang magiging gamitin, subaliut '''walang anumang katiyakan'''; na walang pahiwatig ng '''pagiging mabenta''' o '''kaangkupan para sa isang tiyak na layunin'''.\nTingnan ang Pangkalahatang Pampublikong Lisensiyang GNU para sa mas maraming detalye.\n\nDapat nakatanggap ka ng <doclink href=Copying>isang sipi ng Pangkalahatang Pampublikong Lisensiyang GNU</doclink> kasama ng programang ito; kung hindi, sumulat sa Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA, o [https://www.gnu.org/licenses//gpl.html basahin ito sa Internet].",
+       "config-welcome-section-copyright": "=== Karapatang-ari at Tadhana ===\n\n$1\n\nAng programang ito ay malayang software; maaari mo itong ipamahagi at/o baguhin sa ilalim ng mga tadhana ng Pangkalahatang Pampublikong Lisensiyang GNU ayon sa pagkakalathala ng Free Software Foundation; na maaaring bersyong 2 ng Lisensiya, o (kung nais mo) anumang susunod na bersyon.\n\nIpinamamahagi ang programang ito na umaasang magiging gamitin, subaliut '''walang anumang katiyakan'''; na walang pahiwatig ng '''pagiging mabenta''' o '''kaangkupan para sa isang tiyak na layunin'''.\nTingnan ang Pangkalahatang Pampublikong Lisensiyang GNU para sa mas maraming detalye.\n\nDapat nakatanggap ka ng [$2 isang sipi ng Pangkalahatang Pampublikong Lisensiyang GNU] kasama ng programang ito; kung hindi, sumulat sa Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA, o [https://www.gnu.org/licenses//gpl.html basahin ito sa Internet].",
        "config-sidebar": "* [https://www.mediawiki.org Tahanan ng MediaWiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Gabay ng Tagagamit]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents Gabay ng Tagapangasiwa]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Mga Malimit Itanong]\n----\n* <doclink href=Readme>Basahin ako</doclink>\n* <doclink href=ReleaseNotes>Mga tala ng paglalabas</doclink>\n* <doclink href=Copying>Pagkopya</doclink>\n* <doclink href=UpgradeDoc>Pagsasapanahon</doclink>",
        "config-env-good": "Nasuri na ang kapaligiran.\nMailuluklok mo ang MediaWiki.",
        "config-env-bad": "Nasuri na ang kapaligiran.\nHindi mo mailuklok ang MediaWiki.",
        "config-db-web-no-create-privs": "Ang tinukoy mong account na iluluklok ay walang sapat na mga pribilehiyo upang makalikha ng isang account.\nAng account na tutukuyin mo rito ay umiiral na dapat.",
        "config-mysql-engine": "Makinang imbakan:",
        "config-mysql-innodb": "InnoDB",
-       "config-mysql-myisam": "MyISAM",
-       "config-mysql-myisam-dep": "'''Babala''': Pinili mo ang MyISAM bilang makinang imbakan para sa MySQL, na hindi iminumungkahi para gamitin sa MediaWiki, sapagkat:\n* bahagya lamang itong sumusuporta ng pagkakasundu-sundo dahil sa pagkakandado ng talahanayan\n* mas malaki ang pagkakataon na kapitan ng sira kaysa sa ibang mga makina\n* ang himpilang kodigo ng MediaWiki ay hindi palaging humahawak ng MyISAM ayon sa nararapat\n\nKung ang iyong nakaluklok na MySQL ay sumusuporta ng InnoDB, higit na iminumungkahi na piliin mo iyon sa halip.\nKung ang iyong nakaluklok na MySQL ay hindi sumusuporta ng InnoDB, marahil ay panahon na para sa isang pagtataas ng uri.",
        "config-mysql-engine-help": "Ang '''InnoDB''' ay ang halos palaging pinaka mainam na mapipili, dahil mayroon itong mabuting suporta ng pagkakasundu-sundo.\n\nMaaaring mas mabilis ang '''MyISAM''' sa mga pagluluklok na pang-isahang tagagamit o mababasa lamang.\nMay gawi ang mga kalipunan ng dato ng MyISAM na masira nang mas madalas kaysa sa mga kalipunan ng dato ng InnoDB.",
        "config-site-name": "Pangalan ng wiki:",
        "config-site-name-help": "Lilitaw ito sa bareta ng pamagat ng pantingin-tingin at sa samu't saring ibang mga lugar.",
index feb682a..e2a4683 100644 (file)
@@ -60,7 +60,7 @@
        "config-help-restart": "Girişini yaptığınız tüm kayıtlı verileri silerek, yükleme işlemini yeniden başlatmak ister misiniz?",
        "config-restart": "Evet, yeniden başlat",
        "config-welcome": "===Ortam Kontrolleri===\nOrtamın Mediawiki kurulumuna uygun olup olmadığını anlamak için basit kontroller yapılacak.\nKurulumu nasıl tamamlayacağınız konusunda destek isterken bu bilgileri eklemeyi unutmayın.",
-       "config-copyright": "=== Telif Hakları ve Koşulları ===\n\n$1\n\nBu program ücretsiz bir yazılımdır; yeniden dağıtabilir veya Özgür Yazılım Kuruluşu tarafından yayınlanan (GNU) Genel Kamu Lisansı koşulları altında değiştirebilirsiniz; isterseniz ikinci lisans sürümünü veya (sizin seçeneğiniz) herhangi bir sonraki lisans sürümünü kullanabilirsiniz.\n\nBu program, faydalı olacağı umuduyla dağıtılmaktadır, ancak ''' herhangi bir garantisi yoktur '''; ''' uygunluk ''' veya ''' belirli bir amaca uygunluk ''' gibi dolaylı garantileri bile yoktur.\nDaha fazla ayrıntı için (GNU) Genel Kamu Lisansına bakınız.\n\nBu program ile birlikte <doclink href=\"Copying\">bir (GNU) Genel Kamu Lisansının bir kopyasını </doclink> almış olmanız gerekir; bu program (GNU) Genel Kamu Lisansı ile dağıtılmadıysa, Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, ABD adresine yazın veya [https://www.gnu.org/copyleft/gpl.html online olarak okuyun].",
+       "config-welcome-section-copyright": "=== Telif Hakları ve Koşulları ===\n\n$1\n\nBu program ücretsiz bir yazılımdır; yeniden dağıtabilir veya Özgür Yazılım Kuruluşu tarafından yayınlanan (GNU) Genel Kamu Lisansı koşulları altında değiştirebilirsiniz; isterseniz ikinci lisans sürümünü veya (sizin seçeneğiniz) herhangi bir sonraki lisans sürümünü kullanabilirsiniz.\n\nBu program, faydalı olacağı umuduyla dağıtılmaktadır, ancak ''' herhangi bir garantisi yoktur '''; ''' uygunluk ''' veya ''' belirli bir amaca uygunluk ''' gibi dolaylı garantileri bile yoktur.\nDaha fazla ayrıntı için (GNU) Genel Kamu Lisansına bakınız.\n\nBu program ile birlikte [$2 bir (GNU) Genel Kamu Lisansının bir kopyasını ] almış olmanız gerekir; bu program (GNU) Genel Kamu Lisansı ile dağıtılmadıysa, Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, ABD adresine yazın veya [https://www.gnu.org/copyleft/gpl.html online olarak okuyun].",
        "config-sidebar": "* [https://www.mediawiki.org MediaWiki anasayfa]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Kullanıcı Kılavuzu]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents Hizmetli Rehberi]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ SSS]\n----\n* <doclink href=Readme>Beni oku</doclink>\n* <doclink href=ReleaseNotes>Sürüm notları</doclink>\n* <doclink href=Copying>Kopyalama</doclink>\n* <doclink href=UpgradeDoc>Yükseltme</doclink>",
        "config-env-good": "Ortam kontrol edildi.\nMediaWiki'yi kurabilirsiniz.",
        "config-env-bad": "Ortam kontrol edildi.\nMediaWiki'yi kuramazsınız.",
        "config-db-web-no-create-privs": "Kurulum için belirlediğiniz hesap, hesap yaratımı için gerekli izinlere sahip değil.\nBurada belirttiğiniz hesap halihazırda var olmalı.",
        "config-mysql-engine": "Depolama motoru:",
        "config-mysql-innodb": "InnoDB (önerilen)",
-       "config-mysql-myisam": "MyISAM",
        "config-mssql-auth": "Kimlik doğrulama türü:",
        "config-mssql-install-auth": "Kurulum işlemi sırasında veritabanına bağlanmak için kullanılacak doğrulama türünü seçin.\n\"{{int:config-mssql-windowsauth}}\"'ı seçerseniz,ağ sunucusu olarak çalışan kullanıcının kimlik bilgileri kullanılacaktır.",
        "config-mssql-sqlauth": "SQL Server kimlik doğrulaması",
index bc222a5..85aa98f 100644 (file)
@@ -3,7 +3,8 @@
                "authors": [
                        "KhayR",
                        "Seb35",
-                       "Ильнар"
+                       "Ильнар",
+                       "Ерней"
                ]
        },
        "config-desc": "MediaWiki йөкләүче",
        "config-db-host": "Мәгълүмат базасы хосты:",
        "config-db-host-oracle": "TNS мәгълүмат базасы:",
        "config-db-wiki-settings": "Бу вики идентификациясе",
-       "config-db-name": "Мәгълүмат базасы исеме:",
+       "config-db-name": "Мәгълүматлар базасы исеме (сызыкчасыз):",
        "config-db-name-oracle": "Мәгълүмат базасы төзелеше:",
        "config-db-username": "Мәгълүмат базасын кулланучы исеме:",
        "config-db-password": "Мәгълүмат базасының серсүзе:",
        "config-db-port": "Мәгълүмат базасы порты:",
-       "config-db-schema": "MediaWiki өчен төзелеш:",
+       "config-db-schema": "MediaWiki өчен (сызыкчасыз) төзелеш:",
        "config-type-mysql": "MariaDB, MySQL яисә ярашлы",
        "config-type-mssql": "Microsoft SQL Server",
        "config-header-mysql": "MariaDB/MySQL көйләнмәләре",
@@ -58,7 +59,6 @@
        "config-show-table-status": "«<code>SHOW TABLE STATUS</code>» таләбе эшләнмәде!",
        "config-mysql-engine": "Саклау системасы:",
        "config-mysql-innodb": "InnoDB (тәкъдим ителә)",
-       "config-mysql-myisam": "MyISAM",
        "config-mssql-auth": "Аутентификация төре:",
        "config-mssql-sqlauth": "SQL Server чынлыгын раслау",
        "config-mssql-windowsauth": "Windows чынлыгын раслау",
index bfb0e64..3ae74e7 100644 (file)
@@ -55,7 +55,7 @@
        "config-help-restart": "Ви бажаєте видалити всі введені та збережені вами дані і запустити процес установки спочатку?",
        "config-restart": "Так, перезапустити установку",
        "config-welcome": "=== Перевірка оточення ===\nБудуть проведені базові перевірки, щоб виявити, чи можлива установка MediaWiki у даній системі.\nНе забудьте включити цю інформацію, якщо ви звернетеся по підтримку, як завершити установку.",
-       "config-copyright": "=== Авторське право і умови ===\n\n$1\n\nЦя програма є вільним програмним забезпеченням; Ви можете розповсюджувати та/або змінювати її під ліцензією GNU General Public License, опублікованою Фондом вільного програмного забезпечення; версією 2 цієї ліцензії або будь-якою пізнішою на Ваш вибір.\n\nЦя програма поширюється з надією на те, що вона буде корисною, однак '''без жодних гарантій'''; навіть без неявної гарантії '''комерційної цінності''' або '''придатності для певних цілей'''.\nДив. GNU General Public License для детальної інформації.\n\nВи повинні були отримати <doclink href=Copying>копію GNU General Public License</doclink> разом із цією програмою; якщо ж ні, зверніться до Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. або [https://www.gnu.org/copyleft/gpl.html ознайомтесь з нею онлайн].",
+       "config-welcome-section-copyright": "=== Авторське право і умови ===\n\n$1\n\nЦя програма є вільним програмним забезпеченням; Ви можете розповсюджувати та/або змінювати її під ліцензією GNU General Public License, опублікованою Фондом вільного програмного забезпечення; версією 2 цієї ліцензії або будь-якою пізнішою на Ваш вибір.\n\nЦя програма поширюється з надією на те, що вона буде корисною, однак '''без жодних гарантій'''; навіть без неявної гарантії '''комерційної цінності''' або '''придатності для певних цілей'''.\nДив. GNU General Public License для детальної інформації.\n\nВи повинні були отримати [$2 копію GNU General Public License] разом із цією програмою; якщо ж ні, зверніться до Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. або [https://www.gnu.org/copyleft/gpl.html ознайомтесь з нею онлайн].",
        "config-sidebar": "* [https://www.mediawiki.org Сайт MediaWiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Посібник користувача]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents Посібник адміністратора]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ FAQ]",
        "config-sidebar-readme": "Прочитай мене",
        "config-sidebar-relnotes": "Інформація про версію",
        "config-db-web-no-create-privs": "Обліковий запис, вказаний Вами для встановлення, не має достатніх повноважень для створення облікового запису.\nОбліковий запис, який Ви вказуєте тут, уже повинен існувати.",
        "config-mysql-engine": "Двигун бази даних:",
        "config-mysql-innodb": "InnoDB (рекомендовано)",
-       "config-mysql-myisam": "MyISAM",
-       "config-mysql-myisam-dep": "'''Увага''': Ви обрали MyISAM для зберігання даних MySQL, що не рекомендовано для роботи з MediaWiki, оскільки:\n* він слабко підтримує паралелізм через блокування таблиць\n* він більш схильний до ушкоджень, ніж інші двигуни\n* база коду MediaWiki не завжди працює з MyISAM так, як мала б.\n\nЯкщо Ваша інсталяція MySQL підтримує InnoDB, дуже рекомендується вибрати цей двигун.\nЯкщо Ваша інсталяція MySQL не підтримує InnoDB, можливо настав час її оновити.",
-       "config-mysql-only-myisam-dep": "\"'Зауваження:\"' MyISAM є єдиним механізмом для зберігання MySQL на цій машині, який не рекомендується для використання з MediaWiki, оскільки:\n* слабо підтримує паралелізм через блокування таблиць\n* більш схильний до пошкоджень, ніж інші двигуни\n* код MediaWiki не завжди розглядає MyISAM, як повинен\n\nТвоє встановлення MySQL не підтримує InnoDB, можливо, потрібно оновити.",
        "config-mysql-engine-help": "'''InnoDB''' є завжди кращим вибором, оскільки краще підтримує паралельний доступ.\n\n'''MyISAM''' може бути швидшим для одного користувача або в інсталяціях read-only.\nБази даних MyISAM схильні псуватись частіше, ніж бази InnoDB.",
        "config-mssql-auth": "Тип автентифікації:",
        "config-mssql-install-auth": "Виберіть тип перевірки автентичності, який буде використовуватися для підключення до бази даних під час процесу установки. \nЯкщо ви оберете \"{{int:config-mssql-windowsauth}}\", будуть використовуватися облікові дані користувача, під яким працює веб-сервер.",
index 03fb785..0929c1b 100644 (file)
@@ -49,7 +49,7 @@
        "config-help-restart": "Bạn có muốn xóa tất cả dữ liệu được lưu mà bạn vừa nhập và khởi động lại quá trình cài đặt?",
        "config-restart": "Có, khởi động lại nó",
        "config-welcome": "=== Kiểm tra môi trường ===\nBây giờ sẽ kiểm tra sơ qua môi trường này có phù hợp cho việc cài đặt MediaWiki.\nHãy nhớ bao gồm thông tin này khi nào xin hỗ trợ hoàn thành việc cài đặt.",
-       "config-copyright": "=== Bản quyền và Điều khoản ===\n\n$1\n\nChương trình này là phần mềm tự do; bạn được phép tái phân phối và/hoặc sửa đổi nó theo những điều khoản của Giấy phép Công cộng GNU do Quỹ Phần mềm Tự do xuất bản; phiên bản 2 hay bất kỳ phiên bản nào mới hơn nào của Giấy phép (tùy bạn lựa chọn).\n\nChương trình này được phân phối với hy vọng rằng nó sẽ hữu ích, nhưng <strong>không có bất kỳ một đảm bảo nào</strong>, ngay cả những bảo đảm ngụ ý cho <strong>tính thương mại</strong> hoặc <strong>phù hợp với mục đích đặc biệt nào đó</strong>. \nXem Giấy phép Công cộng GNU để biết thêm chi tiết.\n\nCó lẽ bạn đã nhận được <doclink href=Copying>bản sao Giấy phép Công cộng GNU</doclink> đi kèm với chương trình này; nếu không, hãy viết thư đến:\n Free Software Foundation, Inc.\n 51 Franklin St., Fifth Floor\n Boston, MA 02110-1301\n USA\nhoặc [https://www.gnu.org/copyleft/gpl.html đọc nó trực tuyến].",
+       "config-welcome-section-copyright": "=== Bản quyền và Điều khoản ===\n\n$1\n\nChương trình này là phần mềm tự do; bạn được phép tái phân phối và/hoặc sửa đổi nó theo những điều khoản của Giấy phép Công cộng GNU do Quỹ Phần mềm Tự do xuất bản; phiên bản 2 hay bất kỳ phiên bản nào mới hơn nào của Giấy phép (tùy bạn lựa chọn).\n\nChương trình này được phân phối với hy vọng rằng nó sẽ hữu ích, nhưng <strong>không có bất kỳ một đảm bảo nào</strong>, ngay cả những bảo đảm ngụ ý cho <strong>tính thương mại</strong> hoặc <strong>phù hợp với mục đích đặc biệt nào đó</strong>. \nXem Giấy phép Công cộng GNU để biết thêm chi tiết.\n\nCó lẽ bạn đã nhận được [$2 bản sao Giấy phép Công cộng GNU] đi kèm với chương trình này; nếu không, hãy viết thư đến:\n Free Software Foundation, Inc.\n 51 Franklin St., Fifth Floor\n Boston, MA 02110-1301\n USA\nhoặc [https://www.gnu.org/copyleft/gpl.html đọc nó trực tuyến].",
        "config-sidebar": "* [https://www.mediawiki.org/wiki/Special:MyLanguage/MediaWiki Trang chủ MediaWiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Hướng dẫn sử dụng]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents Hướng dẫn quản lý]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Câu thường hỏi]",
        "config-sidebar-readme": "Đọc thêm",
        "config-sidebar-relnotes": "Thông báo phát hành",
        "config-db-web-no-create-privs": "Tài khoản mà bạn xác định để cài đặt không có đủ quyền để tạo một tài khoản. Tài khoản mà bạn chỉ ra ở đây phải thực sự tồn tại trước đó.",
        "config-mysql-engine": "Máy lưu trữ:",
        "config-mysql-innodb": "InnoDB (khuyến khích)",
-       "config-mysql-myisam": "MyISAM",
-       "config-mysql-myisam-dep": "<strong>Cảnh báo:</strong> Bạn đã chọn MyISAM làm động cơ lưu trữ cho MySQL, điều này không được khuyến khích sử dụng với MediaWiki, bởi vì:\n* Nó ít hỗ trợ đồng thời do việc khóa bảng\n* Nó dễ bị lỗi hơn so với các động cơ khác\n* Kho mã nguồn của MediaWiki không phải khi nào cũng xử lý MyISAM như mong muốn\n\nNếu cài đặt MySQL của bạn hỗ trợ InnoDB, đặc biệt khuyến cáo bạn nên chọn để thay thế.\nNếu cài đặt MySQL của bạn không hỗ trợ InnoDB, có lẽ đã đến lúc để nâng cấp.",
-       "config-mysql-only-myisam-dep": "<strong>Cảnh báo:</strong> MyISAM chỉ là công cụ lưu trữ có sẵn cho MySQL trên máy tính này, và điều này không được khuyến khích sử dụng với MediaWiki, bởi vì:\n* Nó ít hỗ trợ đồng thời do việc khóa khóa\n* Nó là dễ bị hư hỏng hơn các engine khác\n* Codebase MediaWiki không phải khi nào cũng xử lý MyISAM như mong muốn\n\nCài đặt MySQL của bạn không hỗ trợ InnoDB, có lẽ đã đến lúc để nâng cấp.",
        "config-mysql-engine-help": "<strong>InnoDB</strong> hầu như luôn là tùy chọn tốt nhất, vì nó có hỗ trợ đồng thời rất tốt.\n\n<strong>MyISAM</strong> có thể nhanh hơn trong chế độ một người dùng hoặc các cài đặt chỉ-đọc (read-only).\nCơ sở dữ liệu MyISAM có xu hướng thường xuyên bị hỏng hóc hơn so với cơ sở dữ liệu InnoDB.",
        "config-mssql-auth": "Kiểu xác thực:",
        "config-mssql-install-auth": "Chọn loại xác thực sẽ được sử dụng để kết nối với cơ sở dữ liệu trong quá trình cài đặt.\nNếu bạn chọn “{{int:config-mssql-windowsauth}}”, thông tin của bất cứ người sử dụng nào mà máy chủ web đang chạy sẽ được sử dụng.",
index dca707f..f53d856 100644 (file)
@@ -60,7 +60,6 @@
        "config-sqlite-cant-create-db": "Diri nakakahimo hin database file nga <code>$1</code>.",
        "config-db-web-account": "Database account para han web access",
        "config-mysql-innodb": "InnoDB",
-       "config-mysql-myisam": "MyISAM",
        "config-site-name": "Ngaran han wiki:",
        "config-ns-generic": "Proyekto",
        "config-ns-site-name": "Kapareho han wiki nga ngaran: $1",
index 6035c61..ecbfe02 100644 (file)
@@ -65,7 +65,7 @@
        "config-help-restart": "是否要清除所有已输入且保存的数据,并重新启动安装过程吗?",
        "config-restart": "是的,重启吧",
        "config-welcome": "=== 环境检查 ===\n将简单检查当前环境是否适合安装MediaWiki。如果您要寻求安装过程的支持,请记得附上此信息。",
-       "config-copyright": "=== 版权和条款 ===\n\n$1\n\n本程序为自由软件;您可依据自由软件基金会所发表的GNU通用公共授权条款规定,就本程序再为发布与/或修改;无论您依据的是本授权的第二版或(您自行选择的)任一日后发行的版本。\n\n本程序是基于使用目的而加以发布,然而'''不负任何担保责任''';亦无对'''适售性'''或'''特定目的适用性'''所为的默示性担保。详情请参照GNU通用公共授权。\n\n您应已收到附随于本程序的<doclink href=\"Copying\">GNU通用公共授权的副本</doclink>;如果没有,请写信至自由软件基金会:59 Temple Place - Suite 330, Boston, Ma 02111-1307, USA,或[https://www.gnu.org/copyleft/gpl.html 在线阅读]。",
+       "config-welcome-section-copyright": "=== 版权和条款 ===\n\n$1\n\n本程序为自由软件;您可依据自由软件基金会所发表的GNU通用公共授权条款规定,就本程序再为发布与/或修改;无论您依据的是本授权的第二版或(您自行选择的)任一日后发行的版本。\n\n本程序是基于使用目的而加以发布,然而'''不负任何担保责任''';亦无对'''适售性'''或'''特定目的适用性'''所为的默示性担保。详情请参照GNU通用公共授权。\n\n您应已收到附随于本程序的[$2 GNU通用公共授权的副本];如果没有,请写信至自由软件基金会:59 Temple Place - Suite 330, Boston, Ma 02111-1307, USA,或[https://www.gnu.org/copyleft/gpl.html 在线阅读]。",
        "config-sidebar": "* [https://www.mediawiki.org/wiki/MediaWiki/zh-hans MediaWiki首页]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents/zh-hans 用户指南]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents 管理员指南]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ/zh-hans 常见问题解答]\n----\n* <doclink href=Readme>自述文件</doclink>\n* <doclink href=ReleaseNotes>发行说明</doclink>\n* <doclink href=Copying>协议副本</doclink>\n* <doclink href=UpgradeDoc>升级</doclink>",
        "config-env-good": "环境检查已经完成。您可以安装MediaWiki。",
        "config-env-bad": "环境检查已经完成。您不能安装MediaWiki。",
        "config-db-web-no-create-privs": "您指定给安装程序的帐号缺少创建帐号的权限,因此您指定的帐号必须已经存在。",
        "config-mysql-engine": "存储引擎:",
        "config-mysql-innodb": "InnoDB(推荐)",
-       "config-mysql-myisam": "MyISAM",
-       "config-mysql-myisam-dep": "<strong>警告:</strong>您选择了MyISAM作为MySQL的存储引擎,MediaWiki并不推荐您这么做,因为:\n* 它仅能通过表锁定来勉强支持并发\n* 与其他引擎相比,它更容易被损坏\n* MediaWiki代码库并不总会去处理MyISAM\n\n如果您的MySQL程序支持InnoDB,我们高度推荐您使用该引擎替代MyISAM。\n如果您的MySQL程序不支持InnoDB,请考虑升级。",
-       "config-mysql-only-myisam-dep": "<strong>警告:</strong>MyISAM是MySQL在此机器上唯一可用的存储引擎,但它不适合用于MediaWiki,因为:\n*因为表级锁定,它几乎不支持并发。\n*它相比其他引擎更容易损坏。\n*MediaWiki代码不能总是按照预期操作MyISAM。\n\n你的MySQL不支持InnoDB,是时候升级了。",
        "config-mysql-engine-help": "<strong>InnoDB</strong>通常是最佳选项,因为它对并发操作有着良好的支持。\n\n<strong>MyISAM</strong>在单用户或只读环境下可能会有更快的性能表现。但MyISAM数据库出错的概率一般要大于InnoDB数据库。",
        "config-mssql-auth": "身份验证类型:",
        "config-mssql-install-auth": "选择安装过程中链接数据库时将采用的身份验证方式。如果您选择“{{int:config-mssql-windowsauth}}”,将使用运行服务器的用户的身份凭据。",
index 13a9241..0443cc4 100644 (file)
        "config-page-restart": "重新安裝",
        "config-page-readme": "讀我說明",
        "config-page-releasenotes": "發佈說明",
-       "config-page-copying": "複製",
+       "config-page-copying": "副本",
        "config-page-upgradedoc": "升級",
        "config-page-existingwiki": "現有的 wiki",
        "config-help-restart": "是否要清除所有已輸入且儲存的資料,並重新開始安裝程序嗎?",
        "config-restart": "是的,重新開始",
        "config-welcome": "=== 環境檢查 ===\n現在會做基本的檢查,檢查環境是否符合 MediaWiki 安裝所需。\n若您要尋求如何完成安裝的協助,請記得提供以下訊息。",
-       "config-copyright": "=== 版權聲明與授權條款 ===\n\n$1\n\n本程式為自由軟體;您可依據自由軟體基金會所發表的 GNU 通用公共授權條款規定,將本程式重新發佈與/或修改;無論您依據的是本授權條款的第二版或 (您可自行選擇) 之後的任何版本。\n\n本程式發佈的目的是希望可以提供幫助,但 <strong>不負任何擔保責任</strong>;亦無隱含對 <strong>適售性</strong> 或 <strong>特定用途的適用性</strong> 的情形擔保。詳情請參照 GNU 通用公共授權。\n\n您應已隨本程式收到 <doclink href=\"Copying\">GNU 通用公共授權條款的副本</doclink>;如果沒有,請信件通知自由軟體基金會,51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA,或 [https://www.gnu.org/copyleft/gpl.html 線上閱讀]。",
-       "config-sidebar": "* [https://www.mediawiki.org/wiki/MediaWiki/zh-hant MediaWiki 首頁]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents/zh 使用者指南]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents/zh 管理員指南]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ/zh 常見問題集]\n----\n* <doclink href=Readme>讀我說明</doclink>\n* <doclink href=ReleaseNotes>發行說明</doclink>\n* <doclink href=Copying>版權聲明</doclink>\n* <doclink href=UpgradeDoc>升級</doclink>",
+       "config-welcome-section-copyright": "=== 版權聲明與授權條款 ===\n\n$1\n\n本程式為自由軟體;您可依據自由軟體基金會所發表的 GNU 通用公共授權條款規定,將本程式重新發佈與/或修改;無論您依據的是本授權條款的第二版或 (您可自行選擇) 之後的任何版本。\n\n本程式發佈的目的是希望可以提供幫助,但 <strong>不負任何擔保責任</strong>;亦無隱含對 <strong>適售性</strong> 或 <strong>特定用途的適用性</strong> 的情形擔保。詳情請參照 GNU 通用公共授權。\n\n您應已隨本程式收到 [$2 GNU 通用公共授權條款的副本];如果沒有,請信件通知自由軟體基金會,51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA,或 [https://www.gnu.org/copyleft/gpl.html 線上閱讀]。",
+       "config-sidebar": "* [https://www.mediawiki.org/wiki/MediaWiki/zh-hant MediaWiki 首頁]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents/zh 使用者指南]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents/zh 管理員指南]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ/zh 常見問題集]",
+       "config-sidebar-readme": "讀我檔案",
+       "config-sidebar-relnotes": "發佈說明",
+       "config-sidebar-license": "副本",
+       "config-sidebar-upgrade": "升級",
        "config-env-good": "環境檢查已完成。\n您可以安裝 MediaWiki。",
        "config-env-bad": "環境檢查已完成。\n您無法安裝 MediaWiki。",
        "config-env-php": "PHP $1 已安裝。",
        "config-env-hhvm": "HHVM $1 已安裝。",
-       "config-unicode-using-intl": "使用 [https://pecl.php.net/intl intl PECL 擴充套件] 做 Unicode 正規化。",
-       "config-unicode-pure-php-warning": "<strong>警告:</strong> 無法使用 [https://pecl.php.net/intl intl PECL 擴充套件] 處理 Unicode 正規化,故回退使用純 PHP 實作的正規化程式,此方式處理速度較緩慢。\n\n如果您的網站瀏覽人次很高,您應先閱讀 [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations/zh Unicode 正規化]。",
+       "config-unicode-using-intl": "使用 [https://php.net/manual/en/book.intl.php PHP intl 擴充套件]做 Unicode 正規化。",
+       "config-unicode-pure-php-warning": "<strong>警告:</strong> 無法使用 [https://php.net/manual/en/book.intl.php PHP intl 擴充套件]處理 Unicode 正規化,故回退使用純 PHP 實作的正規化程式,此方式處理速度較緩慢。\n\n如果您的網站瀏覽人次很高,您應先閱讀 [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations/zh Unicode 正規化]。",
        "config-unicode-update-warning": "<strong>警告</strong>:目前安裝的 Unicode 正規化包裝程式使用了舊版 [http://site.icu-project.org/ ICU 計劃] 的程式庫。\n若您需要使用 Unicode,您應先進行 [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations 升級]。",
        "config-no-db": "找不到合適的資料庫驅動程式!您需要安裝 PHP 資料庫驅動程式。\n目前支援以下{{PLURAL:$2|類型|類型}}的資料庫: $1 。\n\n如果您是自行編譯 PHP,您必須重新設定並開啟資料庫客戶端,例:使用 <code>./configure --with-mysqli</code> 指令參數。\n如果您是使用 Debian 或 Ubuntu 的套件安裝 PHP ,您則需要額外安裝,例:<code>php-mysql</code> 套件。",
        "config-outdated-sqlite": "<strong>警告:</strong>您已安裝 SQLite $2,但是它的版本低於最低需求版本 $1。 因此您無法使用 SQLite。",
        "config-db-web-no-create-privs": "您指定給安裝程序使用的帳號沒有足夠的權限建立新帳號。\n在此處必須指定已經存在的帳號。",
        "config-mysql-engine": "儲存引擎:",
        "config-mysql-innodb": "InnoDB(推薦)",
-       "config-mysql-myisam": "MyISAM",
-       "config-mysql-myisam-dep": "<strong>警告:</strong>您選擇用來做為 MySQL 的儲存引撆 MyISAM 並不建議使用在 MediaWiki,主要原因為:\n* MyISAM 使用的資料表鎖定較無法承受多人同時連線\n* 比起其他儲存引擎相,它較容易損壞\n* MediaWiki 程式碼並沒有針對 MyISAM 做特別的處理\n\n若您安裝的 MySQL 支援 InnoDB,我們強烈建議您改用 InnoDB。\n若您安裝的 MySQL 不支援 InnoDB,則應考慮升級 MySQL。",
-       "config-mysql-only-myisam-dep": "<strong>警告:</strong>您的伺服器上的 MySQL 唯一可用的儲存引擎是 MyISAM,但並不建議使用,主要原因為:\n* MyISAM 使用的資料表鎖定較無法承受多人同時連線\n* 比起其他儲存引擎相,它較容易損壞\n* MediaWiki 程式碼並沒有針對 MyISAM 做特別的處理\n\n若您安裝的 MySQL 不支援 InnoDB,則應考慮升級 MySQL。",
        "config-mysql-engine-help": "由於對同時連線有較好的處理能力,<strong>InnoDB</strong> 通常是最佳的選項。\n\n<strong>MyISAM</strong> 只在單人使用或者唯讀作業的情況之下才可能有較快的處理能力。\n相較於 InnoDB,MyISAM 也較容易出現資料損毀的情況。",
        "config-mssql-auth": "身份驗證類型:",
        "config-mssql-install-auth": "請選擇安裝程序中要用來連線資料庫使用的身份驗證類型。\n若您選擇 \"{{int:config-mssql-windowsauth}}\",不論網頁伺服器是使用何種身份執行都會使用這組驗證資料。",
index 465fe82..0954ac8 100644 (file)
@@ -33,7 +33,7 @@
  *
  * @ingroup Cache
  */
-class APCBagOStuff extends BagOStuff {
+class APCBagOStuff extends MediumSpecificBagOStuff {
        /** @var bool Whether to trust the APC implementation to serialization */
        private $nativeSerialize;
 
index b14ac7c..021cdf7 100644 (file)
@@ -33,7 +33,7 @@
  *
  * @ingroup Cache
  */
-class APCUBagOStuff extends BagOStuff {
+class APCUBagOStuff extends MediumSpecificBagOStuff {
        /** @var bool Whether to trust the APC implementation to serialization */
        private $nativeSerialize;
 
index dce49c4..8c99532 100644 (file)
@@ -30,7 +30,6 @@ use Psr\Log\LoggerAwareInterface;
 use Psr\Log\LoggerInterface;
 use Psr\Log\NullLogger;
 use Wikimedia\ScopedCallback;
-use Wikimedia\WaitConditionLoop;
 
 /**
  * Class representing a cache/ephemeral data store
@@ -62,86 +61,40 @@ use Wikimedia\WaitConditionLoop;
  * @ingroup Cache
  */
 abstract class BagOStuff implements IExpiringStore, IStoreKeyEncoder, LoggerAwareInterface {
-       /** @var array[] Lock tracking */
-       protected $locks = [];
-       /** @var int ERR_* class constant */
-       protected $lastError = self::ERR_NONE;
-       /** @var string */
-       protected $keyspace = 'local';
        /** @var LoggerInterface */
        protected $logger;
+
        /** @var callable|null */
        protected $asyncHandler;
-       /** @var int Seconds */
-       protected $syncTimeout;
-       /** @var int Bytes; chunk size of segmented cache values */
-       protected $segmentationSize;
-       /** @var int Bytes; maximum total size of a segmented cache value */
-       protected $segmentedValueMaxSize;
+       /** @var int[] Map of (ATTR_* class constant => QOS_* class constant) */
+       protected $attrMap = [];
 
        /** @var bool */
-       private $debugMode = false;
-       /** @var array */
-       private $duplicateKeyLookups = [];
-       /** @var bool */
-       private $reportDupes = false;
-       /** @var bool */
-       private $dupeTrackScheduled = false;
-
-       /** @var callable[] */
-       protected $busyCallbacks = [];
+       protected $debugMode = false;
 
        /** @var float|null */
        private $wallClockOverride;
 
-       /** @var int[] Map of (ATTR_* class constant => QOS_* class constant) */
-       protected $attrMap = [];
-
-       /** Bitfield constants for get()/getMulti() */
-       const READ_LATEST = 1; // use latest data for replicated stores
-       const READ_VERIFIED = 2; // promise that caller can tell when keys are stale
-       /** Bitfield constants for set()/merge() */
-       const WRITE_SYNC = 4; // synchronously write to all locations for replicated stores
-       const WRITE_CACHE_ONLY = 8; // Only change state of the in-memory cache
-       const WRITE_ALLOW_SEGMENTS = 16; // Allow partitioning of the value if it is large
-       const WRITE_PRUNE_SEGMENTS = 32; // Delete all partition segments of the value
-
-       /** @var string Component to use for key construction of blob segment keys */
-       const SEGMENT_COMPONENT = 'segment';
+       /** Bitfield constants for get()/getMulti(); these are only advisory */
+       const READ_LATEST = 1; // if supported, avoid reading stale data due to replication
+       const READ_VERIFIED = 2; // promise that the caller handles detection of staleness
+       /** Bitfield constants for set()/merge(); these are only advisory */
+       const WRITE_SYNC = 4; // if supported, block until the write is fully replicated
+       const WRITE_CACHE_ONLY = 8; // only change state of the in-memory cache
+       const WRITE_ALLOW_SEGMENTS = 16; // allow partitioning of the value if it is large
+       const WRITE_PRUNE_SEGMENTS = 32; // delete all the segments if the value is partitioned
+       const WRITE_BACKGROUND = 64; // if supported, do not block on completion until the next read
 
        /**
-        * $params include:
+        * Parameters include:
         *   - logger: Psr\Log\LoggerInterface instance
-        *   - keyspace: Default keyspace for $this->makeKey()
         *   - asyncHandler: Callable to use for scheduling tasks after the web request ends.
         *      In CLI mode, it should run the task immediately.
-        *   - reportDupes: Whether to emit warning log messages for all keys that were
-        *      requested more than once (requires an asyncHandler).
-        *   - syncTimeout: How long to wait with WRITE_SYNC in seconds.
-        *   - segmentationSize: The chunk size, in bytes, of segmented values. The value should
-        *      not exceed the maximum size of values in the storage backend, as configured by
-        *      the site administrator.
-        *   - segmentedValueMaxSize: The maximum total size, in bytes, of segmented values.
-        *      This should be configured to a reasonable size give the site traffic and the
-        *      amount of I/O between application and cache servers that the network can handle.
         * @param array $params
         */
        public function __construct( array $params = [] ) {
                $this->setLogger( $params['logger'] ?? new NullLogger() );
-
-               if ( isset( $params['keyspace'] ) ) {
-                       $this->keyspace = $params['keyspace'];
-               }
-
                $this->asyncHandler = $params['asyncHandler'] ?? null;
-
-               if ( !empty( $params['reportDupes'] ) && is_callable( $this->asyncHandler ) ) {
-                       $this->reportDupes = true;
-               }
-
-               $this->syncTimeout = $params['syncTimeout'] ?? 3;
-               $this->segmentationSize = $params['segmentationSize'] ?? 8388608; // 8MiB
-               $this->segmentedValueMaxSize = $params['segmentedValueMaxSize'] ?? 67108864; // 64MiB
        }
 
        /**
@@ -153,10 +106,10 @@ abstract class BagOStuff implements IExpiringStore, IStoreKeyEncoder, LoggerAwar
        }
 
        /**
-        * @param bool $bool
+        * @param bool $enabled
         */
-       public function setDebug( $bool ) {
-               $this->debugMode = $bool;
+       public function setDebug( $enabled ) {
+               $this->debugMode = $enabled;
        }
 
        /**
@@ -200,52 +153,7 @@ abstract class BagOStuff implements IExpiringStore, IStoreKeyEncoder, LoggerAwar
         * @param int $flags Bitfield of BagOStuff::READ_* constants [optional]
         * @return mixed Returns false on failure or if the item does not exist
         */
-       public function get( $key, $flags = 0 ) {
-               $this->trackDuplicateKeys( $key );
-
-               return $this->resolveSegments( $key, $this->doGet( $key, $flags ) );
-       }
-
-       /**
-        * Track the number of times that a given key has been used.
-        * @param string $key
-        */
-       private function trackDuplicateKeys( $key ) {
-               if ( !$this->reportDupes ) {
-                       return;
-               }
-
-               if ( !isset( $this->duplicateKeyLookups[$key] ) ) {
-                       // Track that we have seen this key. This N-1 counting style allows
-                       // easy filtering with array_filter() later.
-                       $this->duplicateKeyLookups[$key] = 0;
-               } else {
-                       $this->duplicateKeyLookups[$key] += 1;
-
-                       if ( $this->dupeTrackScheduled === false ) {
-                               $this->dupeTrackScheduled = true;
-                               // Schedule a callback that logs keys processed more than once by get().
-                               call_user_func( $this->asyncHandler, function () {
-                                       $dups = array_filter( $this->duplicateKeyLookups );
-                                       foreach ( $dups as $key => $count ) {
-                                               $this->logger->warning(
-                                                       'Duplicate get(): "{key}" fetched {count} times',
-                                                       // Count is N-1 of the actual lookup count
-                                                       [ 'key' => $key, 'count' => $count + 1, ]
-                                               );
-                                       }
-                               } );
-                       }
-               }
-       }
-
-       /**
-        * @param string $key
-        * @param int $flags Bitfield of BagOStuff::READ_* constants [optional]
-        * @param mixed|null &$casToken Token to use for check-and-set comparisons
-        * @return mixed Returns false on failure or if the item does not exist
-        */
-       abstract protected function doGet( $key, $flags = 0, &$casToken = null );
+       abstract public function get( $key, $flags = 0 );
 
        /**
         * Set an item
@@ -256,70 +164,7 @@ abstract class BagOStuff implements IExpiringStore, IStoreKeyEncoder, LoggerAwar
         * @param int $flags Bitfield of BagOStuff::WRITE_* constants
         * @return bool Success
         */
-       public function set( $key, $value, $exptime = 0, $flags = 0 ) {
-               if (
-                       is_int( $value ) || // avoid breaking incr()/decr()
-                       ( $flags & self::WRITE_ALLOW_SEGMENTS ) != self::WRITE_ALLOW_SEGMENTS ||
-                       is_infinite( $this->segmentationSize )
-               ) {
-                       return $this->doSet( $key, $value, $exptime, $flags );
-               }
-
-               $serialized = $this->serialize( $value );
-               $segmentSize = $this->getSegmentationSize();
-               $maxTotalSize = $this->getSegmentedValueMaxSize();
-
-               $size = strlen( $serialized );
-               if ( $size <= $segmentSize ) {
-                       // Since the work of serializing it was already done, just use it inline
-                       return $this->doSet(
-                               $key,
-                               SerializedValueContainer::newUnified( $serialized ),
-                               $exptime,
-                               $flags
-                       );
-               } elseif ( $size > $maxTotalSize ) {
-                       $this->setLastError( "Key $key exceeded $maxTotalSize bytes." );
-
-                       return false;
-               }
-
-               $chunksByKey = [];
-               $segmentHashes = [];
-               $count = intdiv( $size, $segmentSize ) + ( ( $size % $segmentSize ) ? 1 : 0 );
-               for ( $i = 0; $i < $count; ++$i ) {
-                       $segment = substr( $serialized, $i * $segmentSize, $segmentSize );
-                       $hash = sha1( $segment );
-                       $chunkKey = $this->makeGlobalKey( self::SEGMENT_COMPONENT, $key, $hash );
-                       $chunksByKey[$chunkKey] = $segment;
-                       $segmentHashes[] = $hash;
-               }
-
-               $flags &= ~self::WRITE_ALLOW_SEGMENTS; // sanity
-               $ok = $this->setMulti( $chunksByKey, $exptime, $flags );
-               if ( $ok ) {
-                       // Only when all segments are stored should the main key be changed
-                       $ok = $this->doSet(
-                               $key,
-                               SerializedValueContainer::newSegmented( $segmentHashes ),
-                               $exptime,
-                               $flags
-                       );
-               }
-
-               return $ok;
-       }
-
-       /**
-        * Set an item
-        *
-        * @param string $key
-        * @param mixed $value
-        * @param int $exptime Either an interval in seconds or a unix timestamp for expiry
-        * @param int $flags Bitfield of BagOStuff::WRITE_* constants
-        * @return bool Success
-        */
-       abstract protected function doSet( $key, $value, $exptime = 0, $flags = 0 );
+       abstract public function set( $key, $value, $exptime = 0, $flags = 0 );
 
        /**
         * Delete an item
@@ -332,38 +177,7 @@ abstract class BagOStuff implements IExpiringStore, IStoreKeyEncoder, LoggerAwar
         * @return bool True if the item was deleted or not found, false on failure
         * @param int $flags Bitfield of BagOStuff::WRITE_* constants
         */
-       public function delete( $key, $flags = 0 ) {
-               if ( ( $flags & self::WRITE_PRUNE_SEGMENTS ) != self::WRITE_PRUNE_SEGMENTS ) {
-                       return $this->doDelete( $key, $flags );
-               }
-
-               $mainValue = $this->doGet( $key, self::READ_LATEST );
-               if ( !$this->doDelete( $key, $flags ) ) {
-                       return false;
-               }
-
-               if ( !SerializedValueContainer::isSegmented( $mainValue ) ) {
-                       return true; // no segments to delete
-               }
-
-               $orderedKeys = array_map(
-                       function ( $segmentHash ) use ( $key ) {
-                               return $this->makeGlobalKey( self::SEGMENT_COMPONENT, $key, $segmentHash );
-                       },
-                       $mainValue->{SerializedValueContainer::SEGMENTED_HASHES}
-               );
-
-               return $this->deleteMulti( $orderedKeys, $flags );
-       }
-
-       /**
-        * Delete an item
-        *
-        * @param string $key
-        * @return bool True if the item was deleted or not found, false on failure
-        * @param int $flags Bitfield of BagOStuff::WRITE_* constants
-        */
-       abstract protected function doDelete( $key, $flags = 0 );
+       abstract public function delete( $key, $flags = 0 );
 
        /**
         * Insert an item if it does not already exist
@@ -393,99 +207,13 @@ abstract class BagOStuff implements IExpiringStore, IStoreKeyEncoder, LoggerAwar
         * @return bool Success
         * @throws InvalidArgumentException
         */
-       public function merge( $key, callable $callback, $exptime = 0, $attempts = 10, $flags = 0 ) {
-               return $this->mergeViaCas( $key, $callback, $exptime, $attempts, $flags );
-       }
-
-       /**
-        * @see BagOStuff::merge()
-        *
-        * @param string $key
-        * @param callable $callback Callback method to be executed
-        * @param int $exptime Either an interval in seconds or a unix timestamp for expiry
-        * @param int $attempts The amount of times to attempt a merge in case of failure
-        * @param int $flags Bitfield of BagOStuff::WRITE_* constants
-        * @return bool Success
-        */
-       final protected function mergeViaCas( $key, callable $callback, $exptime, $attempts, $flags ) {
-               do {
-                       $casToken = null; // passed by reference
-                       // Get the old value and CAS token from cache
-                       $this->clearLastError();
-                       $currentValue = $this->resolveSegments(
-                               $key,
-                               $this->doGet( $key, self::READ_LATEST, $casToken )
-                       );
-                       if ( $this->getLastError() ) {
-                               $this->logger->warning(
-                                       __METHOD__ . ' failed due to I/O error on get() for {key}.',
-                                       [ 'key' => $key ]
-                               );
-
-                               return false; // don't spam retries (retry only on races)
-                       }
-
-                       // Derive the new value from the old value
-                       $value = call_user_func( $callback, $this, $key, $currentValue, $exptime );
-                       $hadNoCurrentValue = ( $currentValue === false );
-                       unset( $currentValue ); // free RAM in case the value is large
-
-                       $this->clearLastError();
-                       if ( $value === false ) {
-                               $success = true; // do nothing
-                       } elseif ( $hadNoCurrentValue ) {
-                               // Try to create the key, failing if it gets created in the meantime
-                               $success = $this->add( $key, $value, $exptime, $flags );
-                       } else {
-                               // Try to update the key, failing if it gets changed in the meantime
-                               $success = $this->cas( $casToken, $key, $value, $exptime, $flags );
-                       }
-                       if ( $this->getLastError() ) {
-                               $this->logger->warning(
-                                       __METHOD__ . ' failed due to I/O error for {key}.',
-                                       [ 'key' => $key ]
-                               );
-
-                               return false; // IO error; don't spam retries
-                       }
-
-               } while ( !$success && --$attempts );
-
-               return $success;
-       }
-
-       /**
-        * Check and set an item
-        *
-        * @param mixed $casToken
-        * @param string $key
-        * @param mixed $value
-        * @param int $exptime Either an interval in seconds or a unix timestamp for expiry
-        * @param int $flags Bitfield of BagOStuff::WRITE_* constants
-        * @return bool Success
-        */
-       protected function cas( $casToken, $key, $value, $exptime = 0, $flags = 0 ) {
-               if ( !$this->lock( $key, 0 ) ) {
-                       return false; // non-blocking
-               }
-
-               $curCasToken = null; // passed by reference
-               $this->doGet( $key, self::READ_LATEST, $curCasToken );
-               if ( $casToken === $curCasToken ) {
-                       $success = $this->set( $key, $value, $exptime, $flags );
-               } else {
-                       $this->logger->info(
-                               __METHOD__ . ' failed due to race condition for {key}.',
-                               [ 'key' => $key ]
-                       );
-
-                       $success = false; // mismatched or failed
-               }
-
-               $this->unlock( $key );
-
-               return $success;
-       }
+       abstract public function merge(
+               $key,
+               callable $callback,
+               $exptime = 0,
+               $attempts = 10,
+               $flags = 0
+       );
 
        /**
         * Change the expiration on a key if it exists
@@ -504,39 +232,7 @@ abstract class BagOStuff implements IExpiringStore, IStoreKeyEncoder, LoggerAwar
         * @return bool Success Returns false on failure or if the item does not exist
         * @since 1.28
         */
-       public function changeTTL( $key, $exptime = 0, $flags = 0 ) {
-               return $this->doChangeTTL( $key, $exptime, $flags );
-       }
-
-       /**
-        * @param string $key
-        * @param int $exptime
-        * @param int $flags
-        * @return bool
-        */
-       protected function doChangeTTL( $key, $exptime, $flags ) {
-               $expiry = $this->convertToExpiry( $exptime );
-               $delete = ( $expiry != 0 && $expiry < $this->getCurrentTime() );
-
-               if ( !$this->lock( $key, 0 ) ) {
-                       return false;
-               }
-               // Use doGet() to avoid having to trigger resolveSegments()
-               $blob = $this->doGet( $key, self::READ_LATEST );
-               if ( $blob ) {
-                       if ( $delete ) {
-                               $ok = $this->doDelete( $key, $flags );
-                       } else {
-                               $ok = $this->doSet( $key, $blob, $exptime, $flags );
-                       }
-               } else {
-                       $ok = false;
-               }
-
-               $this->unlock( $key );
-
-               return $ok;
-       }
+       abstract public function changeTTL( $key, $exptime = 0, $flags = 0 );
 
        /**
         * Acquire an advisory lock on a key string
@@ -549,51 +245,7 @@ abstract class BagOStuff implements IExpiringStore, IStoreKeyEncoder, LoggerAwar
         * @param string $rclass Allow reentry if set and the current lock used this value
         * @return bool Success
         */
-       public function lock( $key, $timeout = 6, $expiry = 6, $rclass = '' ) {
-               // Avoid deadlocks and allow lock reentry if specified
-               if ( isset( $this->locks[$key] ) ) {
-                       if ( $rclass != '' && $this->locks[$key]['class'] === $rclass ) {
-                               ++$this->locks[$key]['depth'];
-                               return true;
-                       } else {
-                               return false;
-                       }
-               }
-
-               $fname = __METHOD__;
-               $expiry = min( $expiry ?: INF, self::TTL_DAY );
-               $loop = new WaitConditionLoop(
-                       function () use ( $key, $expiry, $fname ) {
-                               $this->clearLastError();
-                               if ( $this->add( "{$key}:lock", 1, $expiry ) ) {
-                                       return WaitConditionLoop::CONDITION_REACHED; // locked!
-                               } elseif ( $this->getLastError() ) {
-                                       $this->logger->warning(
-                                               $fname . ' failed due to I/O error for {key}.',
-                                               [ 'key' => $key ]
-                                       );
-
-                                       return WaitConditionLoop::CONDITION_ABORTED; // network partition?
-                               }
-
-                               return WaitConditionLoop::CONDITION_CONTINUE;
-                       },
-                       $timeout
-               );
-
-               $code = $loop->invoke();
-               $locked = ( $code === $loop::CONDITION_REACHED );
-               if ( $locked ) {
-                       $this->locks[$key] = [ 'class' => $rclass, 'depth' => 1 ];
-               } elseif ( $code === $loop::CONDITION_TIMED_OUT ) {
-                       $this->logger->warning(
-                               "$fname failed due to timeout for {key}.",
-                               [ 'key' => $key, 'timeout' => $timeout ]
-                       );
-               }
-
-               return $locked;
-       }
+       abstract public function lock( $key, $timeout = 6, $expiry = 6, $rclass = '' );
 
        /**
         * Release an advisory lock on a key string
@@ -601,27 +253,7 @@ abstract class BagOStuff implements IExpiringStore, IStoreKeyEncoder, LoggerAwar
         * @param string $key
         * @return bool Success
         */
-       public function unlock( $key ) {
-               if ( !isset( $this->locks[$key] ) ) {
-                       return false;
-               }
-
-               if ( --$this->locks[$key]['depth'] <= 0 ) {
-                       unset( $this->locks[$key] );
-
-                       $ok = $this->doDelete( "{$key}:lock" );
-                       if ( !$ok ) {
-                               $this->logger->warning(
-                                       __METHOD__ . ' failed to release lock for {key}.',
-                                       [ 'key' => $key ]
-                               );
-                       }
-
-                       return $ok;
-               }
-
-               return true;
-       }
+       abstract public function unlock( $key );
 
        /**
         * Get a lightweight exclusive self-unlocking lock
@@ -672,37 +304,11 @@ abstract class BagOStuff implements IExpiringStore, IStoreKeyEncoder, LoggerAwar
         *
         * @return bool Success; false if unimplemented
         */
-       public function deleteObjectsExpiringBefore(
+       abstract public function deleteObjectsExpiringBefore(
                $timestamp,
                callable $progress = null,
                $limit = INF
-       ) {
-               return false;
-       }
-
-       /**
-        * Get an associative array containing the item for each of the keys that have items.
-        * @param string[] $keys List of keys; can be a map of (unused => key) for convenience
-        * @param int $flags Bitfield; supports READ_LATEST [optional]
-        * @return mixed[] Map of (key => value) for existing keys; preserves the order of $keys
-        */
-       public function getMulti( array $keys, $flags = 0 ) {
-               $foundByKey = $this->doGetMulti( $keys, $flags );
-
-               $res = [];
-               foreach ( $keys as $key ) {
-                       // Resolve one blob at a time (avoids too much I/O at once)
-                       if ( array_key_exists( $key, $foundByKey ) ) {
-                               // A value should not appear in the key if a segment is missing
-                               $value = $this->resolveSegments( $key, $foundByKey[$key] );
-                               if ( $value !== false ) {
-                                       $res[$key] = $value;
-                               }
-                       }
-               }
-
-               return $res;
-       }
+       );
 
        /**
         * Get an associative array containing the item for each of the keys that have items.
@@ -710,79 +316,36 @@ abstract class BagOStuff implements IExpiringStore, IStoreKeyEncoder, LoggerAwar
         * @param int $flags Bitfield; supports READ_LATEST [optional]
         * @return mixed[] Map of (key => value) for existing keys
         */
-       protected function doGetMulti( array $keys, $flags = 0 ) {
-               $res = [];
-               foreach ( $keys as $key ) {
-                       $val = $this->doGet( $key, $flags );
-                       if ( $val !== false ) {
-                               $res[$key] = $val;
-                       }
-               }
-
-               return $res;
-       }
+       abstract public function getMulti( array $keys, $flags = 0 );
 
        /**
         * Batch insertion/replace
         *
         * This does not support WRITE_ALLOW_SEGMENTS to avoid excessive read I/O
         *
+        * WRITE_BACKGROUND can be used for bulk insertion where the response is not vital
+        *
         * @param mixed[] $data Map of (key => value)
         * @param int $exptime Either an interval in seconds or a unix timestamp for expiry
         * @param int $flags Bitfield of BagOStuff::WRITE_* constants (since 1.33)
         * @return bool Success
         * @since 1.24
         */
-       public function setMulti( array $data, $exptime = 0, $flags = 0 ) {
-               if ( ( $flags & self::WRITE_ALLOW_SEGMENTS ) === self::WRITE_ALLOW_SEGMENTS ) {
-                       throw new InvalidArgumentException( __METHOD__ . ' got WRITE_ALLOW_SEGMENTS' );
-               }
-               return $this->doSetMulti( $data, $exptime, $flags );
-       }
-
-       /**
-        * @param mixed[] $data Map of (key => value)
-        * @param int $exptime Either an interval in seconds or a unix timestamp for expiry
-        * @param int $flags Bitfield of BagOStuff::WRITE_* constants
-        * @return bool Success
-        */
-       protected function doSetMulti( array $data, $exptime = 0, $flags = 0 ) {
-               $res = true;
-               foreach ( $data as $key => $value ) {
-                       $res = $this->doSet( $key, $value, $exptime, $flags ) && $res;
-               }
-               return $res;
-       }
+       abstract public function setMulti( array $data, $exptime = 0, $flags = 0 );
 
        /**
         * Batch deletion
         *
         * This does not support WRITE_ALLOW_SEGMENTS to avoid excessive read I/O
         *
+        * WRITE_BACKGROUND can be used for bulk deletion where the response is not vital
+        *
         * @param string[] $keys List of keys
         * @param int $flags Bitfield of BagOStuff::WRITE_* constants
         * @return bool Success
         * @since 1.33
         */
-       public function deleteMulti( array $keys, $flags = 0 ) {
-               if ( ( $flags & self::WRITE_ALLOW_SEGMENTS ) === self::WRITE_ALLOW_SEGMENTS ) {
-                       throw new InvalidArgumentException( __METHOD__ . ' got WRITE_ALLOW_SEGMENTS' );
-               }
-               return $this->doDeleteMulti( $keys, $flags );
-       }
-
-       /**
-        * @param string[] $keys List of keys
-        * @param int $flags Bitfield of BagOStuff::WRITE_* constants
-        * @return bool Success
-        */
-       protected function doDeleteMulti( array $keys, $flags = 0 ) {
-               $res = true;
-               foreach ( $keys as $key ) {
-                       $res = $this->doDelete( $key, $flags ) && $res;
-               }
-               return $res;
-       }
+       abstract public function deleteMulti( array $keys, $flags = 0 );
 
        /**
         * Change the expiration of multiple keys that exist
@@ -795,14 +358,7 @@ abstract class BagOStuff implements IExpiringStore, IStoreKeyEncoder, LoggerAwar
         * @return bool Success
         * @since 1.34
         */
-       public function changeTTLMulti( array $keys, $exptime, $flags = 0 ) {
-               $res = true;
-               foreach ( $keys as $key ) {
-                       $res = $this->doChangeTTL( $key, $exptime, $flags ) && $res;
-               }
-
-               return $res;
-       }
+       abstract public function changeTTLMulti( array $keys, $exptime, $flags = 0 );
 
        /**
         * Increase stored value of $key by $value while preserving its TTL
@@ -818,9 +374,7 @@ abstract class BagOStuff implements IExpiringStore, IStoreKeyEncoder, LoggerAwar
         * @param int $value Value to subtract from $key (default: 1) [optional]
         * @return int|bool New value or false on failure
         */
-       public function decr( $key, $value = 1 ) {
-               return $this->incr( $key, - $value );
-       }
+       abstract public function decr( $key, $value = 1 );
 
        /**
         * Increase stored value of $key by $value while preserving its TTL
@@ -834,83 +388,20 @@ abstract class BagOStuff implements IExpiringStore, IStoreKeyEncoder, LoggerAwar
         * @return int|bool New value or false on failure
         * @since 1.24
         */
-       public function incrWithInit( $key, $ttl, $value = 1, $init = 1 ) {
-               $this->clearLastError();
-               $newValue = $this->incr( $key, $value );
-               if ( $newValue === false && !$this->getLastError() ) {
-                       // No key set; initialize
-                       $newValue = $this->add( $key, (int)$init, $ttl ) ? $init : false;
-                       if ( $newValue === false && !$this->getLastError() ) {
-                               // Raced out initializing; increment
-                               $newValue = $this->incr( $key, $value );
-                       }
-               }
-
-               return $newValue;
-       }
-
-       /**
-        * Get and reassemble the chunks of blob at the given key
-        *
-        * @param string $key
-        * @param mixed $mainValue
-        * @return string|null|bool The combined string, false if missing, null on error
-        */
-       final protected function resolveSegments( $key, $mainValue ) {
-               if ( SerializedValueContainer::isUnified( $mainValue ) ) {
-                       return $this->unserialize( $mainValue->{SerializedValueContainer::UNIFIED_DATA} );
-               }
-
-               if ( SerializedValueContainer::isSegmented( $mainValue ) ) {
-                       $orderedKeys = array_map(
-                               function ( $segmentHash ) use ( $key ) {
-                                       return $this->makeGlobalKey( self::SEGMENT_COMPONENT, $key, $segmentHash );
-                               },
-                               $mainValue->{SerializedValueContainer::SEGMENTED_HASHES}
-                       );
-
-                       $segmentsByKey = $this->doGetMulti( $orderedKeys );
-
-                       $parts = [];
-                       foreach ( $orderedKeys as $segmentKey ) {
-                               if ( isset( $segmentsByKey[$segmentKey] ) ) {
-                                       $parts[] = $segmentsByKey[$segmentKey];
-                               } else {
-                                       return false; // missing segment
-                               }
-                       }
-
-                       return $this->unserialize( implode( '', $parts ) );
-               }
-
-               return $mainValue;
-       }
+       abstract public function incrWithInit( $key, $ttl, $value = 1, $init = 1 );
 
        /**
         * Get the "last error" registered; clearLastError() should be called manually
         * @return int ERR_* constant for the "last error" registry
         * @since 1.23
         */
-       public function getLastError() {
-               return $this->lastError;
-       }
+       abstract public function getLastError();
 
        /**
         * Clear the "last error" registry
         * @since 1.23
         */
-       public function clearLastError() {
-               $this->lastError = self::ERR_NONE;
-       }
-
-       /**
-        * Set the "last error" registry
-        * @param int $err ERR_* constant
-        * @since 1.23
-        */
-       protected function setLastError( $err ) {
-               $this->lastError = $err;
-       }
+       abstract public function clearLastError();
 
        /**
         * Let a callback be run to avoid wasting time on special blocking calls
@@ -932,75 +423,7 @@ abstract class BagOStuff implements IExpiringStore, IStoreKeyEncoder, LoggerAwar
         * @param callable $workCallback
         * @since 1.28
         */
-       final public function addBusyCallback( callable $workCallback ) {
-               $this->busyCallbacks[] = $workCallback;
-       }
-
-       /**
-        * @param string $text
-        */
-       protected function debug( $text ) {
-               if ( $this->debugMode ) {
-                       $this->logger->debug( "{class} debug: $text", [ 'class' => static::class ] );
-               }
-       }
-
-       /**
-        * @param int $exptime
-        * @return bool
-        */
-       final protected function expiryIsRelative( $exptime ) {
-               return ( $exptime != 0 && $exptime < ( 10 * self::TTL_YEAR ) );
-       }
-
-       /**
-        * Convert an optionally relative timestamp to an absolute time
-        *
-        * The input value will be cast to an integer and interpreted as follows:
-        *   - zero: no expiry; return zero (e.g. TTL_INDEFINITE)
-        *   - negative: relative TTL; return UNIX timestamp offset by this value
-        *   - positive (< 10 years): relative TTL; return UNIX timestamp offset by this value
-        *   - positive (>= 10 years): absolute UNIX timestamp; return this value
-        *
-        * @param int $exptime Absolute TTL or 0 for indefinite
-        * @return int
-        */
-       final protected function convertToExpiry( $exptime ) {
-               return $this->expiryIsRelative( $exptime )
-                       ? (int)$this->getCurrentTime() + $exptime
-                       : $exptime;
-       }
-
-       /**
-        * Convert an optionally absolute expiry time to a relative time. If an
-        * absolute time is specified which is in the past, use a short expiry time.
-        *
-        * @param int $exptime
-        * @return int
-        */
-       final protected function convertToRelative( $exptime ) {
-               return $this->expiryIsRelative( $exptime )
-                       ? (int)$exptime
-                       : max( $exptime - (int)$this->getCurrentTime(), 1 );
-       }
-
-       /**
-        * Check if a value is an integer
-        *
-        * @param mixed $value
-        * @return bool
-        */
-       final protected function isInteger( $value ) {
-               if ( is_int( $value ) ) {
-                       return true;
-               } elseif ( !is_string( $value ) ) {
-                       return false;
-               }
-
-               $integer = (int)$value;
-
-               return ( $value === (string)$integer );
-       }
+       abstract public function addBusyCallback( callable $workCallback );
 
        /**
         * Construct a cache key.
@@ -1010,37 +433,27 @@ abstract class BagOStuff implements IExpiringStore, IStoreKeyEncoder, LoggerAwar
         * @param array $args
         * @return string Colon-delimited list of $keyspace followed by escaped components of $args
         */
-       public function makeKeyInternal( $keyspace, $args ) {
-               $key = $keyspace;
-               foreach ( $args as $arg ) {
-                       $key .= ':' . str_replace( ':', '%3A', $arg );
-               }
-               return strtr( $key, ' ', '_' );
-       }
+       abstract public function makeKeyInternal( $keyspace, $args );
 
        /**
         * Make a global cache key.
         *
         * @since 1.27
         * @param string $class Key class
-        * @param string|null $component [optional] Key component (starting with a key collection name)
-        * @return string Colon-delimited list of $keyspace followed by escaped components of $args
+        * @param string ...$components Key components (starting with a key collection name)
+        * @return string Colon-delimited list of $keyspace followed by escaped components
         */
-       public function makeGlobalKey( $class, $component = null ) {
-               return $this->makeKeyInternal( 'global', func_get_args() );
-       }
+       abstract public function makeGlobalKey( $class, ...$components );
 
        /**
         * Make a cache key, scoped to this instance's keyspace.
         *
         * @since 1.27
         * @param string $class Key class
-        * @param string|null $component [optional] Key component (starting with a key collection name)
-        * @return string Colon-delimited list of $keyspace followed by escaped components of $args
+        * @param string ...$components Key components (starting with a key collection name)
+        * @return string Colon-delimited list of $keyspace followed by escaped components
         */
-       public function makeKey( $class, $component = null ) {
-               return $this->makeKeyInternal( $this->keyspace, func_get_args() );
-       }
+       abstract public function makeKey( $class, ...$components );
 
        /**
         * @param int $flag ATTR_* class constant
@@ -1056,7 +469,7 @@ abstract class BagOStuff implements IExpiringStore, IStoreKeyEncoder, LoggerAwar
         * @since 1.34
         */
        public function getSegmentationSize() {
-               return $this->segmentationSize;
+               return INF;
        }
 
        /**
@@ -1064,7 +477,7 @@ abstract class BagOStuff implements IExpiringStore, IStoreKeyEncoder, LoggerAwar
         * @since 1.34
         */
        public function getSegmentedValueMaxSize() {
-               return $this->segmentedValueMaxSize;
+               return INF;
        }
 
        /**
@@ -1105,22 +518,4 @@ abstract class BagOStuff implements IExpiringStore, IStoreKeyEncoder, LoggerAwar
        public function setMockTime( &$time ) {
                $this->wallClockOverride =& $time;
        }
-
-       /**
-        * @param mixed $value
-        * @return string|int String/integer representation
-        * @note Special handling is usually needed for integers so incr()/decr() work
-        */
-       protected function serialize( $value ) {
-               return is_int( $value ) ? $value : serialize( $value );
-       }
-
-       /**
-        * @param string|int $value
-        * @return mixed Original value or false on error
-        * @note Special handling is usually needed for integers so incr()/decr() work
-        */
-       protected function unserialize( $value ) {
-               return $this->isInteger( $value ) ? (int)$value : unserialize( $value );
-       }
 }
index ea434e0..0ab26c9 100644 (file)
@@ -44,8 +44,6 @@ class CachedBagOStuff extends BagOStuff {
         * @param array $params Parameters for HashBagOStuff
         */
        public function __construct( BagOStuff $backend, $params = [] ) {
-               unset( $params['reportDupes'] ); // useless here
-
                parent::__construct( $params );
 
                $this->backend = $backend;
@@ -53,17 +51,41 @@ class CachedBagOStuff extends BagOStuff {
                $this->attrMap = $backend->attrMap;
        }
 
-       protected function doGet( $key, $flags = 0, &$casToken = null ) {
-               $ret = $this->procCache->get( $key, $flags );
-               if ( $ret === false && !$this->procCache->hasKey( $key ) ) {
-                       $ret = $this->backend->get( $key, $flags );
-                       $this->set( $key, $ret, self::TTL_INDEFINITE, self::WRITE_CACHE_ONLY );
+       public function setDebug( $enabled ) {
+               parent::setDebug( $enabled );
+               $this->backend->setDebug( $enabled );
+       }
+
+       public function get( $key, $flags = 0 ) {
+               $value = $this->procCache->get( $key, $flags );
+               if ( $value === false && !$this->procCache->hasKey( $key ) ) {
+                       $value = $this->backend->get( $key, $flags );
+                       $this->set( $key, $value, self::TTL_INDEFINITE, self::WRITE_CACHE_ONLY );
+               }
+
+               return $value;
+       }
+
+       public function getMulti( array $keys, $flags = 0 ) {
+               $valuesByKeyCached = [];
+
+               $keysMissing = [];
+               foreach ( $keys as $key ) {
+                       $value = $this->procCache->get( $key, $flags );
+                       if ( $value === false && !$this->procCache->hasKey( $key ) ) {
+                               $keysMissing[] = $key;
+                       } else {
+                               $valuesByKeyCached[$key] = $value;
+                       }
                }
 
-               return $ret;
+               $valuesByKeyFetched = $this->backend->getMulti( $keys, $flags );
+               $this->setMulti( $valuesByKeyFetched, self::TTL_INDEFINITE, self::WRITE_CACHE_ONLY );
+
+               return $valuesByKeyCached + $valuesByKeyFetched;
        }
 
-       protected function doSet( $key, $value, $exptime = 0, $flags = 0 ) {
+       public function set( $key, $value, $exptime = 0, $flags = 0 ) {
                $this->procCache->set( $key, $value, $exptime, $flags );
                if ( ( $flags & self::WRITE_CACHE_ONLY ) != self::WRITE_CACHE_ONLY ) {
                        $this->backend->set( $key, $value, $exptime, $flags );
@@ -72,7 +94,7 @@ class CachedBagOStuff extends BagOStuff {
                return true;
        }
 
-       protected function doDelete( $key, $flags = 0 ) {
+       public function delete( $key, $flags = 0 ) {
                $this->procCache->delete( $key, $flags );
                if ( ( $flags & self::WRITE_CACHE_ONLY ) != self::WRITE_CACHE_ONLY ) {
                        $this->backend->delete( $key, $flags );
@@ -81,19 +103,6 @@ class CachedBagOStuff extends BagOStuff {
                return true;
        }
 
-       public function deleteObjectsExpiringBefore(
-               $timestamp,
-               callable $progress = null,
-               $limit = INF
-       ) {
-               $this->procCache->deleteObjectsExpiringBefore( $timestamp, $progress, $limit );
-
-               return $this->backend->deleteObjectsExpiringBefore( $timestamp, $progress, $limit );
-       }
-
-       // These just call the backend (tested elsewhere)
-       // @codeCoverageIgnoreStart
-
        public function add( $key, $value, $exptime = 0, $flags = 0 ) {
                if ( $this->get( $key ) === false ) {
                        return $this->set( $key, $value, $exptime, $flags );
@@ -102,12 +111,19 @@ class CachedBagOStuff extends BagOStuff {
                return false; // key already set
        }
 
-       public function incr( $key, $value = 1 ) {
-               $n = $this->backend->incr( $key, $value );
+       // These just call the backend (tested elsewhere)
+       // @codeCoverageIgnoreStart
+
+       public function merge( $key, callable $callback, $exptime = 0, $attempts = 10, $flags = 0 ) {
+               $this->procCache->delete( $key );
+
+               return $this->backend->merge( $key, $callback, $exptime, $attempts, $flags );
+       }
 
+       public function changeTTL( $key, $exptime = 0, $flags = 0 ) {
                $this->procCache->delete( $key );
 
-               return $n;
+               return $this->backend->changeTTL( $key, $exptime, $flags );
        }
 
        public function lock( $key, $timeout = 6, $expiry = 6, $rclass = '' ) {
@@ -118,21 +134,26 @@ class CachedBagOStuff extends BagOStuff {
                return $this->backend->unlock( $key );
        }
 
-       public function makeKeyInternal( $keyspace, $args ) {
-               return $this->backend->makeKeyInternal( ...func_get_args() );
+       public function deleteObjectsExpiringBefore(
+               $timestamp,
+               callable $progress = null,
+               $limit = INF
+       ) {
+               $this->procCache->deleteObjectsExpiringBefore( $timestamp, $progress, $limit );
+
+               return $this->backend->deleteObjectsExpiringBefore( $timestamp, $progress, $limit );
        }
 
-       public function makeKey( $class, $component = null ) {
-               return $this->backend->makeKey( ...func_get_args() );
+       public function makeKeyInternal( $keyspace, $args ) {
+               return $this->backend->makeKeyInternal( $keyspace, $args );
        }
 
-       public function makeGlobalKey( $class, $component = null ) {
-               return $this->backend->makeGlobalKey( ...func_get_args() );
+       public function makeKey( $class, ...$components ) {
+               return $this->backend->makeKey( $class, ...$components );
        }
 
-       public function setDebug( $bool ) {
-               parent::setDebug( $bool );
-               $this->backend->setDebug( $bool );
+       public function makeGlobalKey( $class, ...$components ) {
+               return $this->backend->makeGlobalKey( $class, ...$components );
        }
 
        public function getLastError() {
@@ -143,5 +164,60 @@ class CachedBagOStuff extends BagOStuff {
                return $this->backend->clearLastError();
        }
 
+       public function setMulti( array $data, $exptime = 0, $flags = 0 ) {
+               $this->procCache->setMulti( $data, $exptime, $flags );
+               if ( ( $flags & self::WRITE_CACHE_ONLY ) != self::WRITE_CACHE_ONLY ) {
+                       return $this->backend->setMulti( $data, $exptime, $flags );
+               }
+
+               return true;
+       }
+
+       public function deleteMulti( array $keys, $flags = 0 ) {
+               $this->procCache->deleteMulti( $keys, $flags );
+               if ( ( $flags & self::WRITE_CACHE_ONLY ) != self::WRITE_CACHE_ONLY ) {
+                       return $this->backend->deleteMulti( $keys, $flags );
+               }
+
+               return true;
+       }
+
+       public function changeTTLMulti( array $keys, $exptime, $flags = 0 ) {
+               $this->procCache->changeTTLMulti( $keys, $exptime, $flags );
+               if ( ( $flags & self::WRITE_CACHE_ONLY ) != self::WRITE_CACHE_ONLY ) {
+                       return $this->backend->changeTTLMulti( $keys, $exptime, $flags );
+               }
+
+               return true;
+       }
+
+       public function incr( $key, $value = 1 ) {
+               $this->procCache->delete( $key );
+
+               return $this->backend->incr( $key, $value );
+       }
+
+       public function decr( $key, $value = 1 ) {
+               $this->procCache->delete( $key );
+
+               return $this->backend->decr( $key, $value );
+       }
+
+       public function incrWithInit( $key, $ttl, $value = 1, $init = 1 ) {
+               $this->procCache->delete( $key );
+
+               return $this->backend->incrWithInit( $key, $ttl, $value, $init );
+       }
+
+       public function addBusyCallback( callable $workCallback ) {
+               $this->backend->addBusyCallback( $workCallback );
+       }
+
+       public function setMockTime( &$time ) {
+               parent::setMockTime( $time );
+               $this->procCache->setMockTime( $time );
+               $this->backend->setMockTime( $time );
+       }
+
        // @codeCoverageIgnoreEnd
 }
index 6dc1363..dab8ba1 100644 (file)
@@ -26,7 +26,7 @@
  *
  * @ingroup Cache
  */
-class EmptyBagOStuff extends BagOStuff {
+class EmptyBagOStuff extends MediumSpecificBagOStuff {
        protected function doGet( $key, $flags = 0, &$casToken = null ) {
                $casToken = null;
 
index c74bb6e..83c8004 100644 (file)
@@ -28,7 +28,7 @@
  *
  * @ingroup Cache
  */
-class HashBagOStuff extends BagOStuff {
+class HashBagOStuff extends MediumSpecificBagOStuff {
        /** @var mixed[] */
        protected $bag = [];
        /** @var int Max entries allowed */
index da0686e..59e1c05 100644 (file)
@@ -11,17 +11,17 @@ interface IStoreKeyEncoder {
         * Make a global cache key.
         *
         * @param string $class Key class
-        * @param string|null $component [optional] Key component (starting with a key collection name)
-        * @return string Colon-delimited list of $keyspace followed by escaped components of $args
+        * @param string ...$components Key components (starting with a key collection name)
+        * @return string Colon-delimited list of $keyspace followed by escaped components
         */
-       public function makeGlobalKey( $class, $component = null );
+       public function makeGlobalKey( $class, ...$components );
 
        /**
         * Make a cache key, scoped to this instance's keyspace.
         *
         * @param string $class Key class
-        * @param string|null $component [optional] Key component (starting with a key collection name)
-        * @return string Colon-delimited list of $keyspace followed by escaped components of $args
+        * @param string ...$components Key components (starting with a key collection name)
+        * @return string Colon-delimited list of $keyspace followed by escaped components
         */
-       public function makeKey( $class, $component = null );
+       public function makeKey( $class, ...$components );
 }
diff --git a/includes/libs/objectcache/MediumSpecificBagOStuff.php b/includes/libs/objectcache/MediumSpecificBagOStuff.php
new file mode 100644 (file)
index 0000000..e742432
--- /dev/null
@@ -0,0 +1,932 @@
+<?php
+/**
+ * Storage medium specific cache for storing items.
+ *
+ * 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 Cache
+ */
+
+use Wikimedia\WaitConditionLoop;
+
+/**
+ * Storage medium specific cache for storing items (e.g. redis, memcached, ...)
+ *
+ * This should not be used for proxy classes that simply wrap other cache instances
+ *
+ * @ingroup Cache
+ * @since 1.34
+ */
+abstract class MediumSpecificBagOStuff extends BagOStuff {
+       /** @var array[] Lock tracking */
+       protected $locks = [];
+       /** @var int ERR_* class constant */
+       protected $lastError = self::ERR_NONE;
+       /** @var string */
+       protected $keyspace = 'local';
+       /** @var int Seconds */
+       protected $syncTimeout;
+       /** @var int Bytes; chunk size of segmented cache values */
+       protected $segmentationSize;
+       /** @var int Bytes; maximum total size of a segmented cache value */
+       protected $segmentedValueMaxSize;
+
+       /** @var array */
+       private $duplicateKeyLookups = [];
+       /** @var bool */
+       private $reportDupes = false;
+       /** @var bool */
+       private $dupeTrackScheduled = false;
+
+       /** @var callable[] */
+       protected $busyCallbacks = [];
+
+       /** @var string Component to use for key construction of blob segment keys */
+       const SEGMENT_COMPONENT = 'segment';
+
+       /**
+        * @see BagOStuff::__construct()
+        * Additional $params options include:
+        *   - logger: Psr\Log\LoggerInterface instance
+        *   - keyspace: Default keyspace for $this->makeKey()
+        *   - reportDupes: Whether to emit warning log messages for all keys that were
+        *      requested more than once (requires an asyncHandler).
+        *   - syncTimeout: How long to wait with WRITE_SYNC in seconds.
+        *   - segmentationSize: The chunk size, in bytes, of segmented values. The value should
+        *      not exceed the maximum size of values in the storage backend, as configured by
+        *      the site administrator.
+        *   - segmentedValueMaxSize: The maximum total size, in bytes, of segmented values.
+        *      This should be configured to a reasonable size give the site traffic and the
+        *      amount of I/O between application and cache servers that the network can handle.
+        * @param array $params
+        */
+       public function __construct( array $params = [] ) {
+               parent::__construct( $params );
+
+               if ( isset( $params['keyspace'] ) ) {
+                       $this->keyspace = $params['keyspace'];
+               }
+
+               if ( !empty( $params['reportDupes'] ) && is_callable( $this->asyncHandler ) ) {
+                       $this->reportDupes = true;
+               }
+
+               $this->syncTimeout = $params['syncTimeout'] ?? 3;
+               $this->segmentationSize = $params['segmentationSize'] ?? 8388608; // 8MiB
+               $this->segmentedValueMaxSize = $params['segmentedValueMaxSize'] ?? 67108864; // 64MiB
+       }
+
+       /**
+        * Get an item with the given key
+        *
+        * If the key includes a deterministic input hash (e.g. the key can only have
+        * the correct value) or complete staleness checks are handled by the caller
+        * (e.g. nothing relies on the TTL), then the READ_VERIFIED flag should be set.
+        * This lets tiered backends know they can safely upgrade a cached value to
+        * higher tiers using standard TTLs.
+        *
+        * @param string $key
+        * @param int $flags Bitfield of BagOStuff::READ_* constants [optional]
+        * @return mixed Returns false on failure or if the item does not exist
+        */
+       public function get( $key, $flags = 0 ) {
+               $this->trackDuplicateKeys( $key );
+
+               return $this->resolveSegments( $key, $this->doGet( $key, $flags ) );
+       }
+
+       /**
+        * Track the number of times that a given key has been used.
+        * @param string $key
+        */
+       private function trackDuplicateKeys( $key ) {
+               if ( !$this->reportDupes ) {
+                       return;
+               }
+
+               if ( !isset( $this->duplicateKeyLookups[$key] ) ) {
+                       // Track that we have seen this key. This N-1 counting style allows
+                       // easy filtering with array_filter() later.
+                       $this->duplicateKeyLookups[$key] = 0;
+               } else {
+                       $this->duplicateKeyLookups[$key] += 1;
+
+                       if ( $this->dupeTrackScheduled === false ) {
+                               $this->dupeTrackScheduled = true;
+                               // Schedule a callback that logs keys processed more than once by get().
+                               call_user_func( $this->asyncHandler, function () {
+                                       $dups = array_filter( $this->duplicateKeyLookups );
+                                       foreach ( $dups as $key => $count ) {
+                                               $this->logger->warning(
+                                                       'Duplicate get(): "{key}" fetched {count} times',
+                                                       // Count is N-1 of the actual lookup count
+                                                       [ 'key' => $key, 'count' => $count + 1, ]
+                                               );
+                                       }
+                               } );
+                       }
+               }
+       }
+
+       /**
+        * @param string $key
+        * @param int $flags Bitfield of BagOStuff::READ_* constants [optional]
+        * @param mixed|null &$casToken Token to use for check-and-set comparisons
+        * @return mixed Returns false on failure or if the item does not exist
+        */
+       abstract protected function doGet( $key, $flags = 0, &$casToken = null );
+
+       /**
+        * Set an item
+        *
+        * @param string $key
+        * @param mixed $value
+        * @param int $exptime Either an interval in seconds or a unix timestamp for expiry
+        * @param int $flags Bitfield of BagOStuff::WRITE_* constants
+        * @return bool Success
+        */
+       public function set( $key, $value, $exptime = 0, $flags = 0 ) {
+               if (
+                       is_int( $value ) || // avoid breaking incr()/decr()
+                       ( $flags & self::WRITE_ALLOW_SEGMENTS ) != self::WRITE_ALLOW_SEGMENTS ||
+                       is_infinite( $this->segmentationSize )
+               ) {
+                       return $this->doSet( $key, $value, $exptime, $flags );
+               }
+
+               $serialized = $this->serialize( $value );
+               $segmentSize = $this->getSegmentationSize();
+               $maxTotalSize = $this->getSegmentedValueMaxSize();
+
+               $size = strlen( $serialized );
+               if ( $size <= $segmentSize ) {
+                       // Since the work of serializing it was already done, just use it inline
+                       return $this->doSet(
+                               $key,
+                               SerializedValueContainer::newUnified( $serialized ),
+                               $exptime,
+                               $flags
+                       );
+               } elseif ( $size > $maxTotalSize ) {
+                       $this->setLastError( "Key $key exceeded $maxTotalSize bytes." );
+
+                       return false;
+               }
+
+               $chunksByKey = [];
+               $segmentHashes = [];
+               $count = intdiv( $size, $segmentSize ) + ( ( $size % $segmentSize ) ? 1 : 0 );
+               for ( $i = 0; $i < $count; ++$i ) {
+                       $segment = substr( $serialized, $i * $segmentSize, $segmentSize );
+                       $hash = sha1( $segment );
+                       $chunkKey = $this->makeGlobalKey( self::SEGMENT_COMPONENT, $key, $hash );
+                       $chunksByKey[$chunkKey] = $segment;
+                       $segmentHashes[] = $hash;
+               }
+
+               $flags &= ~self::WRITE_ALLOW_SEGMENTS; // sanity
+               $ok = $this->setMulti( $chunksByKey, $exptime, $flags );
+               if ( $ok ) {
+                       // Only when all segments are stored should the main key be changed
+                       $ok = $this->doSet(
+                               $key,
+                               SerializedValueContainer::newSegmented( $segmentHashes ),
+                               $exptime,
+                               $flags
+                       );
+               }
+
+               return $ok;
+       }
+
+       /**
+        * Set an item
+        *
+        * @param string $key
+        * @param mixed $value
+        * @param int $exptime Either an interval in seconds or a unix timestamp for expiry
+        * @param int $flags Bitfield of BagOStuff::WRITE_* constants
+        * @return bool Success
+        */
+       abstract protected function doSet( $key, $value, $exptime = 0, $flags = 0 );
+
+       /**
+        * Delete an item
+        *
+        * For large values written using WRITE_ALLOW_SEGMENTS, this only deletes the main
+        * segment list key unless WRITE_PRUNE_SEGMENTS is in the flags. While deleting the segment
+        * list key has the effect of functionally deleting the key, it leaves unused blobs in cache.
+        *
+        * @param string $key
+        * @param int $flags Bitfield of BagOStuff::WRITE_* constants
+        * @return bool True if the item was deleted or not found, false on failure
+        */
+       public function delete( $key, $flags = 0 ) {
+               if ( ( $flags & self::WRITE_PRUNE_SEGMENTS ) != self::WRITE_PRUNE_SEGMENTS ) {
+                       return $this->doDelete( $key, $flags );
+               }
+
+               $mainValue = $this->doGet( $key, self::READ_LATEST );
+               if ( !$this->doDelete( $key, $flags ) ) {
+                       return false;
+               }
+
+               if ( !SerializedValueContainer::isSegmented( $mainValue ) ) {
+                       return true; // no segments to delete
+               }
+
+               $orderedKeys = array_map(
+                       function ( $segmentHash ) use ( $key ) {
+                               return $this->makeGlobalKey( self::SEGMENT_COMPONENT, $key, $segmentHash );
+                       },
+                       $mainValue->{SerializedValueContainer::SEGMENTED_HASHES}
+               );
+
+               return $this->deleteMulti( $orderedKeys, $flags );
+       }
+
+       /**
+        * Delete an item
+        *
+        * @param string $key
+        * @param int $flags Bitfield of BagOStuff::WRITE_* constants
+        * @return bool True if the item was deleted or not found, false on failure
+        */
+       abstract protected function doDelete( $key, $flags = 0 );
+
+       /**
+        * Merge changes into the existing cache value (possibly creating a new one)
+        *
+        * The callback function returns the new value given the current value
+        * (which will be false if not present), and takes the arguments:
+        * (this BagOStuff, cache key, current value, TTL).
+        * The TTL parameter is reference set to $exptime. It can be overriden in the callback.
+        * Nothing is stored nor deleted if the callback returns false.
+        *
+        * @param string $key
+        * @param callable $callback Callback method to be executed
+        * @param int $exptime Either an interval in seconds or a unix timestamp for expiry
+        * @param int $attempts The amount of times to attempt a merge in case of failure
+        * @param int $flags Bitfield of BagOStuff::WRITE_* constants
+        * @return bool Success
+        * @throws InvalidArgumentException
+        */
+       public function merge( $key, callable $callback, $exptime = 0, $attempts = 10, $flags = 0 ) {
+               return $this->mergeViaCas( $key, $callback, $exptime, $attempts, $flags );
+       }
+
+       /**
+        * @param string $key
+        * @param callable $callback Callback method to be executed
+        * @param int $exptime Either an interval in seconds or a unix timestamp for expiry
+        * @param int $attempts The amount of times to attempt a merge in case of failure
+        * @param int $flags Bitfield of BagOStuff::WRITE_* constants
+        * @return bool Success
+        * @see BagOStuff::merge()
+        *
+        */
+       final protected function mergeViaCas( $key, callable $callback, $exptime, $attempts, $flags ) {
+               do {
+                       $casToken = null; // passed by reference
+                       // Get the old value and CAS token from cache
+                       $this->clearLastError();
+                       $currentValue = $this->resolveSegments(
+                               $key,
+                               $this->doGet( $key, self::READ_LATEST, $casToken )
+                       );
+                       if ( $this->getLastError() ) {
+                               $this->logger->warning(
+                                       __METHOD__ . ' failed due to I/O error on get() for {key}.',
+                                       [ 'key' => $key ]
+                               );
+
+                               return false; // don't spam retries (retry only on races)
+                       }
+
+                       // Derive the new value from the old value
+                       $value = call_user_func( $callback, $this, $key, $currentValue, $exptime );
+                       $hadNoCurrentValue = ( $currentValue === false );
+                       unset( $currentValue ); // free RAM in case the value is large
+
+                       $this->clearLastError();
+                       if ( $value === false ) {
+                               $success = true; // do nothing
+                       } elseif ( $hadNoCurrentValue ) {
+                               // Try to create the key, failing if it gets created in the meantime
+                               $success = $this->add( $key, $value, $exptime, $flags );
+                       } else {
+                               // Try to update the key, failing if it gets changed in the meantime
+                               $success = $this->cas( $casToken, $key, $value, $exptime, $flags );
+                       }
+                       if ( $this->getLastError() ) {
+                               $this->logger->warning(
+                                       __METHOD__ . ' failed due to I/O error for {key}.',
+                                       [ 'key' => $key ]
+                               );
+
+                               return false; // IO error; don't spam retries
+                       }
+
+               } while ( !$success && --$attempts );
+
+               return $success;
+       }
+
+       /**
+        * Check and set an item
+        *
+        * @param mixed $casToken
+        * @param string $key
+        * @param mixed $value
+        * @param int $exptime Either an interval in seconds or a unix timestamp for expiry
+        * @param int $flags Bitfield of BagOStuff::WRITE_* constants
+        * @return bool Success
+        */
+       protected function cas( $casToken, $key, $value, $exptime = 0, $flags = 0 ) {
+               if ( !$this->lock( $key, 0 ) ) {
+                       return false; // non-blocking
+               }
+
+               $curCasToken = null; // passed by reference
+               $this->doGet( $key, self::READ_LATEST, $curCasToken );
+               if ( $casToken === $curCasToken ) {
+                       $success = $this->set( $key, $value, $exptime, $flags );
+               } else {
+                       $this->logger->info(
+                               __METHOD__ . ' failed due to race condition for {key}.',
+                               [ 'key' => $key ]
+                       );
+
+                       $success = false; // mismatched or failed
+               }
+
+               $this->unlock( $key );
+
+               return $success;
+       }
+
+       /**
+        * Change the expiration on a key if it exists
+        *
+        * If an expiry in the past is given then the key will immediately be expired
+        *
+        * For large values written using WRITE_ALLOW_SEGMENTS, this only changes the TTL of the
+        * main segment list key. While lowering the TTL of the segment list key has the effect of
+        * functionally lowering the TTL of the key, it might leave unused blobs in cache for longer.
+        * Raising the TTL of such keys is not effective, since the expiration of a single segment
+        * key effectively expires the entire value.
+        *
+        * @param string $key
+        * @param int $exptime TTL or UNIX timestamp
+        * @param int $flags Bitfield of BagOStuff::WRITE_* constants (since 1.33)
+        * @return bool Success Returns false on failure or if the item does not exist
+        * @since 1.28
+        */
+       public function changeTTL( $key, $exptime = 0, $flags = 0 ) {
+               return $this->doChangeTTL( $key, $exptime, $flags );
+       }
+
+       /**
+        * @param string $key
+        * @param int $exptime
+        * @param int $flags
+        * @return bool
+        */
+       protected function doChangeTTL( $key, $exptime, $flags ) {
+               $expiry = $this->convertToExpiry( $exptime );
+               $delete = ( $expiry != 0 && $expiry < $this->getCurrentTime() );
+
+               if ( !$this->lock( $key, 0 ) ) {
+                       return false;
+               }
+               // Use doGet() to avoid having to trigger resolveSegments()
+               $blob = $this->doGet( $key, self::READ_LATEST );
+               if ( $blob ) {
+                       if ( $delete ) {
+                               $ok = $this->doDelete( $key, $flags );
+                       } else {
+                               $ok = $this->doSet( $key, $blob, $exptime, $flags );
+                       }
+               } else {
+                       $ok = false;
+               }
+
+               $this->unlock( $key );
+
+               return $ok;
+       }
+
+       /**
+        * Acquire an advisory lock on a key string
+        *
+        * Note that if reentry is enabled, duplicate calls ignore $expiry
+        *
+        * @param string $key
+        * @param int $timeout Lock wait timeout; 0 for non-blocking [optional]
+        * @param int $expiry Lock expiry [optional]; 1 day maximum
+        * @param string $rclass Allow reentry if set and the current lock used this value
+        * @return bool Success
+        */
+       public function lock( $key, $timeout = 6, $expiry = 6, $rclass = '' ) {
+               // Avoid deadlocks and allow lock reentry if specified
+               if ( isset( $this->locks[$key] ) ) {
+                       if ( $rclass != '' && $this->locks[$key]['class'] === $rclass ) {
+                               ++$this->locks[$key]['depth'];
+                               return true;
+                       } else {
+                               return false;
+                       }
+               }
+
+               $fname = __METHOD__;
+               $expiry = min( $expiry ?: INF, self::TTL_DAY );
+               $loop = new WaitConditionLoop(
+                       function () use ( $key, $expiry, $fname ) {
+                               $this->clearLastError();
+                               if ( $this->add( "{$key}:lock", 1, $expiry ) ) {
+                                       return WaitConditionLoop::CONDITION_REACHED; // locked!
+                               } elseif ( $this->getLastError() ) {
+                                       $this->logger->warning(
+                                               $fname . ' failed due to I/O error for {key}.',
+                                               [ 'key' => $key ]
+                                       );
+
+                                       return WaitConditionLoop::CONDITION_ABORTED; // network partition?
+                               }
+
+                               return WaitConditionLoop::CONDITION_CONTINUE;
+                       },
+                       $timeout
+               );
+
+               $code = $loop->invoke();
+               $locked = ( $code === $loop::CONDITION_REACHED );
+               if ( $locked ) {
+                       $this->locks[$key] = [ 'class' => $rclass, 'depth' => 1 ];
+               } elseif ( $code === $loop::CONDITION_TIMED_OUT ) {
+                       $this->logger->warning(
+                               "$fname failed due to timeout for {key}.",
+                               [ 'key' => $key, 'timeout' => $timeout ]
+                       );
+               }
+
+               return $locked;
+       }
+
+       /**
+        * Release an advisory lock on a key string
+        *
+        * @param string $key
+        * @return bool Success
+        */
+       public function unlock( $key ) {
+               if ( !isset( $this->locks[$key] ) ) {
+                       return false;
+               }
+
+               if ( --$this->locks[$key]['depth'] <= 0 ) {
+                       unset( $this->locks[$key] );
+
+                       $ok = $this->doDelete( "{$key}:lock" );
+                       if ( !$ok ) {
+                               $this->logger->warning(
+                                       __METHOD__ . ' failed to release lock for {key}.',
+                                       [ 'key' => $key ]
+                               );
+                       }
+
+                       return $ok;
+               }
+
+               return true;
+       }
+
+       /**
+        * Delete all objects expiring before a certain date.
+        * @param string|int $timestamp The reference date in MW or TS_UNIX format
+        * @param callable|null $progress Optional, a function which will be called
+        *     regularly during long-running operations with the percentage progress
+        *     as the first parameter. [optional]
+        * @param int $limit Maximum number of keys to delete [default: INF]
+        *
+        * @return bool Success; false if unimplemented
+        */
+       public function deleteObjectsExpiringBefore(
+               $timestamp,
+               callable $progress = null,
+               $limit = INF
+       ) {
+               return false;
+       }
+
+       /**
+        * Get an associative array containing the item for each of the keys that have items.
+        * @param string[] $keys List of keys; can be a map of (unused => key) for convenience
+        * @param int $flags Bitfield; supports READ_LATEST [optional]
+        * @return mixed[] Map of (key => value) for existing keys; preserves the order of $keys
+        */
+       public function getMulti( array $keys, $flags = 0 ) {
+               $foundByKey = $this->doGetMulti( $keys, $flags );
+
+               $res = [];
+               foreach ( $keys as $key ) {
+                       // Resolve one blob at a time (avoids too much I/O at once)
+                       if ( array_key_exists( $key, $foundByKey ) ) {
+                               // A value should not appear in the key if a segment is missing
+                               $value = $this->resolveSegments( $key, $foundByKey[$key] );
+                               if ( $value !== false ) {
+                                       $res[$key] = $value;
+                               }
+                       }
+               }
+
+               return $res;
+       }
+
+       /**
+        * Get an associative array containing the item for each of the keys that have items.
+        * @param string[] $keys List of keys
+        * @param int $flags Bitfield; supports READ_LATEST [optional]
+        * @return array Map of (key => value) for existing keys
+        */
+       protected function doGetMulti( array $keys, $flags = 0 ) {
+               $res = [];
+               foreach ( $keys as $key ) {
+                       $val = $this->doGet( $key, $flags );
+                       if ( $val !== false ) {
+                               $res[$key] = $val;
+                       }
+               }
+
+               return $res;
+       }
+
+       /**
+        * Batch insertion/replace
+        *
+        * This does not support WRITE_ALLOW_SEGMENTS to avoid excessive read I/O
+        *
+        * @param mixed[] $data Map of (key => value)
+        * @param int $exptime Either an interval in seconds or a unix timestamp for expiry
+        * @param int $flags Bitfield of BagOStuff::WRITE_* constants (since 1.33)
+        * @return bool Success
+        * @since 1.24
+        */
+       public function setMulti( array $data, $exptime = 0, $flags = 0 ) {
+               if ( ( $flags & self::WRITE_ALLOW_SEGMENTS ) === self::WRITE_ALLOW_SEGMENTS ) {
+                       throw new InvalidArgumentException( __METHOD__ . ' got WRITE_ALLOW_SEGMENTS' );
+               }
+               return $this->doSetMulti( $data, $exptime, $flags );
+       }
+
+       /**
+        * @param mixed[] $data Map of (key => value)
+        * @param int $exptime Either an interval in seconds or a unix timestamp for expiry
+        * @param int $flags Bitfield of BagOStuff::WRITE_* constants
+        * @return bool Success
+        */
+       protected function doSetMulti( array $data, $exptime = 0, $flags = 0 ) {
+               $res = true;
+               foreach ( $data as $key => $value ) {
+                       $res = $this->doSet( $key, $value, $exptime, $flags ) && $res;
+               }
+               return $res;
+       }
+
+       /**
+        * Batch deletion
+        *
+        * This does not support WRITE_ALLOW_SEGMENTS to avoid excessive read I/O
+        *
+        * @param string[] $keys List of keys
+        * @param int $flags Bitfield of BagOStuff::WRITE_* constants
+        * @return bool Success
+        * @since 1.33
+        */
+       public function deleteMulti( array $keys, $flags = 0 ) {
+               if ( ( $flags & self::WRITE_ALLOW_SEGMENTS ) === self::WRITE_ALLOW_SEGMENTS ) {
+                       throw new InvalidArgumentException( __METHOD__ . ' got WRITE_ALLOW_SEGMENTS' );
+               }
+               return $this->doDeleteMulti( $keys, $flags );
+       }
+
+       /**
+        * @param string[] $keys List of keys
+        * @param int $flags Bitfield of BagOStuff::WRITE_* constants
+        * @return bool Success
+        */
+       protected function doDeleteMulti( array $keys, $flags = 0 ) {
+               $res = true;
+               foreach ( $keys as $key ) {
+                       $res = $this->doDelete( $key, $flags ) && $res;
+               }
+               return $res;
+       }
+
+       /**
+        * Change the expiration of multiple keys that exist
+        *
+        * @param string[] $keys List of keys
+        * @param int $exptime TTL or UNIX timestamp
+        * @param int $flags Bitfield of BagOStuff::WRITE_* constants (since 1.33)
+        * @return bool Success
+        * @see BagOStuff::changeTTL()
+        *
+        * @since 1.34
+        */
+       public function changeTTLMulti( array $keys, $exptime, $flags = 0 ) {
+               $res = true;
+               foreach ( $keys as $key ) {
+                       $res = $this->doChangeTTL( $key, $exptime, $flags ) && $res;
+               }
+
+               return $res;
+       }
+
+       /**
+        * Decrease stored value of $key by $value while preserving its TTL
+        * @param string $key
+        * @param int $value Value to subtract from $key (default: 1) [optional]
+        * @return int|bool New value or false on failure
+        */
+       public function decr( $key, $value = 1 ) {
+               return $this->incr( $key, -$value );
+       }
+
+       /**
+        * Increase stored value of $key by $value while preserving its TTL
+        *
+        * This will create the key with value $init and TTL $ttl instead if not present
+        *
+        * @param string $key
+        * @param int $ttl
+        * @param int $value
+        * @param int $init
+        * @return int|bool New value or false on failure
+        * @since 1.24
+        */
+       public function incrWithInit( $key, $ttl, $value = 1, $init = 1 ) {
+               $this->clearLastError();
+               $newValue = $this->incr( $key, $value );
+               if ( $newValue === false && !$this->getLastError() ) {
+                       // No key set; initialize
+                       $newValue = $this->add( $key, (int)$init, $ttl ) ? $init : false;
+                       if ( $newValue === false && !$this->getLastError() ) {
+                               // Raced out initializing; increment
+                               $newValue = $this->incr( $key, $value );
+                       }
+               }
+
+               return $newValue;
+       }
+
+       /**
+        * Get and reassemble the chunks of blob at the given key
+        *
+        * @param string $key
+        * @param mixed $mainValue
+        * @return string|null|bool The combined string, false if missing, null on error
+        */
+       final protected function resolveSegments( $key, $mainValue ) {
+               if ( SerializedValueContainer::isUnified( $mainValue ) ) {
+                       return $this->unserialize( $mainValue->{SerializedValueContainer::UNIFIED_DATA} );
+               }
+
+               if ( SerializedValueContainer::isSegmented( $mainValue ) ) {
+                       $orderedKeys = array_map(
+                               function ( $segmentHash ) use ( $key ) {
+                                       return $this->makeGlobalKey( self::SEGMENT_COMPONENT, $key, $segmentHash );
+                               },
+                               $mainValue->{SerializedValueContainer::SEGMENTED_HASHES}
+                       );
+
+                       $segmentsByKey = $this->doGetMulti( $orderedKeys );
+
+                       $parts = [];
+                       foreach ( $orderedKeys as $segmentKey ) {
+                               if ( isset( $segmentsByKey[$segmentKey] ) ) {
+                                       $parts[] = $segmentsByKey[$segmentKey];
+                               } else {
+                                       return false; // missing segment
+                               }
+                       }
+
+                       return $this->unserialize( implode( '', $parts ) );
+               }
+
+               return $mainValue;
+       }
+
+       /**
+        * Get the "last error" registered; clearLastError() should be called manually
+        * @return int ERR_* constant for the "last error" registry
+        * @since 1.23
+        */
+       public function getLastError() {
+               return $this->lastError;
+       }
+
+       /**
+        * Clear the "last error" registry
+        * @since 1.23
+        */
+       public function clearLastError() {
+               $this->lastError = self::ERR_NONE;
+       }
+
+       /**
+        * Set the "last error" registry
+        * @param int $err ERR_* constant
+        * @since 1.23
+        */
+       protected function setLastError( $err ) {
+               $this->lastError = $err;
+       }
+
+       /**
+        * Let a callback be run to avoid wasting time on special blocking calls
+        *
+        * The callbacks may or may not be called ever, in any particular order.
+        * They are likely to be invoked when something WRITE_SYNC is used used.
+        * They should follow a caching pattern as shown below, so that any code
+        * using the work will get it's result no matter what happens.
+        * @code
+        *     $result = null;
+        *     $workCallback = function () use ( &$result ) {
+        *         if ( !$result ) {
+        *             $result = ....
+        *         }
+        *         return $result;
+        *     }
+        * @endcode
+        *
+        * @param callable $workCallback
+        * @since 1.28
+        */
+       final public function addBusyCallback( callable $workCallback ) {
+               $this->busyCallbacks[] = $workCallback;
+       }
+
+       /**
+        * @param int $exptime
+        * @return bool
+        */
+       final protected function expiryIsRelative( $exptime ) {
+               return ( $exptime != 0 && $exptime < ( 10 * self::TTL_YEAR ) );
+       }
+
+       /**
+        * Convert an optionally relative timestamp to an absolute time
+        *
+        * The input value will be cast to an integer and interpreted as follows:
+        *   - zero: no expiry; return zero (e.g. TTL_INDEFINITE)
+        *   - negative: relative TTL; return UNIX timestamp offset by this value
+        *   - positive (< 10 years): relative TTL; return UNIX timestamp offset by this value
+        *   - positive (>= 10 years): absolute UNIX timestamp; return this value
+        *
+        * @param int $exptime Absolute TTL or 0 for indefinite
+        * @return int
+        */
+       final protected function convertToExpiry( $exptime ) {
+               return $this->expiryIsRelative( $exptime )
+                       ? (int)$this->getCurrentTime() + $exptime
+                       : $exptime;
+       }
+
+       /**
+        * Convert an optionally absolute expiry time to a relative time. If an
+        * absolute time is specified which is in the past, use a short expiry time.
+        *
+        * @param int $exptime
+        * @return int
+        */
+       final protected function convertToRelative( $exptime ) {
+               return $this->expiryIsRelative( $exptime )
+                       ? (int)$exptime
+                       : max( $exptime - (int)$this->getCurrentTime(), 1 );
+       }
+
+       /**
+        * Check if a value is an integer
+        *
+        * @param mixed $value
+        * @return bool
+        */
+       final protected function isInteger( $value ) {
+               if ( is_int( $value ) ) {
+                       return true;
+               } elseif ( !is_string( $value ) ) {
+                       return false;
+               }
+
+               $integer = (int)$value;
+
+               return ( $value === (string)$integer );
+       }
+
+       /**
+        * Construct a cache key.
+        *
+        * @param string $keyspace
+        * @param array $args
+        * @return string Colon-delimited list of $keyspace followed by escaped components of $args
+        * @since 1.27
+        */
+       public function makeKeyInternal( $keyspace, $args ) {
+               $key = $keyspace;
+               foreach ( $args as $arg ) {
+                       $key .= ':' . str_replace( ':', '%3A', $arg );
+               }
+               return strtr( $key, ' ', '_' );
+       }
+
+       /**
+        * Make a global cache key.
+        *
+        * @param string $class Key class
+        * @param string ...$components Key components (starting with a key collection name)
+        * @return string Colon-delimited list of $keyspace followed by escaped components
+        * @since 1.27
+        */
+       public function makeGlobalKey( $class, ...$components ) {
+               return $this->makeKeyInternal( 'global', func_get_args() );
+       }
+
+       /**
+        * Make a cache key, scoped to this instance's keyspace.
+        *
+        * @param string $class Key class
+        * @param string ...$components Key components (starting with a key collection name)
+        * @return string Colon-delimited list of $keyspace followed by escaped components
+        * @since 1.27
+        */
+       public function makeKey( $class, ...$components ) {
+               return $this->makeKeyInternal( $this->keyspace, func_get_args() );
+       }
+
+       /**
+        * @param int $flag ATTR_* class constant
+        * @return int QOS_* class constant
+        * @since 1.28
+        */
+       public function getQoS( $flag ) {
+               return $this->attrMap[$flag] ?? self::QOS_UNKNOWN;
+       }
+
+       /**
+        * @return int|float The chunk size, in bytes, of segmented objects (INF for no limit)
+        * @since 1.34
+        */
+       public function getSegmentationSize() {
+               return $this->segmentationSize;
+       }
+
+       /**
+        * @return int|float Maximum total segmented object size in bytes (INF for no limit)
+        * @since 1.34
+        */
+       public function getSegmentedValueMaxSize() {
+               return $this->segmentedValueMaxSize;
+       }
+
+       /**
+        * @param mixed $value
+        * @return string|int String/integer representation
+        * @note Special handling is usually needed for integers so incr()/decr() work
+        */
+       protected function serialize( $value ) {
+               return is_int( $value ) ? $value : serialize( $value );
+       }
+
+       /**
+        * @param string|int $value
+        * @return mixed Original value or false on error
+        * @note Special handling is usually needed for integers so incr()/decr() work
+        */
+       protected function unserialize( $value ) {
+               return $this->isInteger( $value ) ? (int)$value : unserialize( $value );
+       }
+
+       /**
+        * @param string $text
+        */
+       protected function debug( $text ) {
+               if ( $this->debugMode ) {
+                       $this->logger->debug( "{class} debug: $text", [ 'class' => static::class ] );
+               }
+       }
+}
index f75e780..9f1c98a 100644 (file)
@@ -26,7 +26,7 @@
  *
  * @ingroup Cache
  */
-abstract class MemcachedBagOStuff extends BagOStuff {
+abstract class MemcachedBagOStuff extends MediumSpecificBagOStuff {
        function __construct( array $params ) {
                parent::__construct( $params );
 
index 221bc82..cc7ee2a 100644 (file)
  */
 class MemcachedPeclBagOStuff extends MemcachedBagOStuff {
        /** @var Memcached */
-       protected $client;
+       protected $syncClient;
+       /** @var Memcached|null */
+       protected $asyncClient;
+
+       /** @var bool Whether the non-buffering client is locked from use */
+       protected $syncClientIsBuffering = false;
+       /** @var bool Whether the non-buffering client should be flushed before use */
+       protected $hasUnflushedChanges = false;
+
+       /** @var array Memcached options */
+       private static $OPTS_SYNC_WRITES = [
+               Memcached::OPT_NO_BLOCK => false, // async I/O (using TCP buffers)
+               Memcached::OPT_BUFFER_WRITES => false // libmemcached buffers
+       ];
+       /** @var array Memcached options */
+       private static $OPTS_ASYNC_WRITES = [
+               Memcached::OPT_NO_BLOCK => true, // async I/O (using TCP buffers)
+               Memcached::OPT_BUFFER_WRITES => true // libmemcached buffers
+       ];
 
        /**
         * Available parameters are:
@@ -63,15 +81,22 @@ class MemcachedPeclBagOStuff extends MemcachedBagOStuff {
                        // The Memcached object is essentially shared for each pool ID.
                        // We can only reuse a pool ID if we keep the config consistent.
                        $connectionPoolId = md5( serialize( $params ) );
-                       $client = new Memcached( $connectionPoolId );
-                       $this->initializeClient( $client, $params );
+                       $syncClient = new Memcached( "$connectionPoolId-sync" );
+                       // Avoid clobbering the main thread-shared Memcached instance
+                       $asyncClient = new Memcached( "$connectionPoolId-async" );
                } else {
-                       $client = new Memcached;
-                       $this->initializeClient( $client, $params );
+                       $syncClient = new Memcached();
+                       $asyncClient = null;
                }
 
-               $this->client = $client;
+               $this->initializeClient( $syncClient, $params, self::$OPTS_SYNC_WRITES );
+               if ( $asyncClient ) {
+                       $this->initializeClient( $asyncClient, $params, self::$OPTS_ASYNC_WRITES );
+               }
 
+               // Set the main client and any dedicated one for buffered writes
+               $this->syncClient = $syncClient;
+               $this->asyncClient = $asyncClient;
                // The compression threshold is an undocumented php.ini option for some
                // reason. There's probably not much harm in setting it globally, for
                // compatibility with the settings for the PHP client.
@@ -84,9 +109,10 @@ class MemcachedPeclBagOStuff extends MemcachedBagOStuff {
         *
         * @param Memcached $client
         * @param array $params
+        * @param array $options Base options for Memcached::setOptions()
         * @throws RuntimeException
         */
-       private function initializeClient( Memcached $client, array $params ) {
+       private function initializeClient( Memcached $client, array $params, array $options ) {
                if ( $client->getServerList() ) {
                        $this->logger->debug( __METHOD__ . ": pre-initialized client instance." );
 
@@ -95,7 +121,9 @@ class MemcachedPeclBagOStuff extends MemcachedBagOStuff {
 
                $this->logger->debug( __METHOD__ . ": initializing new client instance." );
 
-               $options = [
+               $options += [
+                       Memcached::OPT_NO_BLOCK => false,
+                       Memcached::OPT_BUFFER_WRITES => false,
                        // Network protocol (ASCII or binary)
                        Memcached::OPT_BINARY_PROTOCOL => $params['use_binary_protocol'],
                        // Set various network timeouts
@@ -150,10 +178,12 @@ class MemcachedPeclBagOStuff extends MemcachedBagOStuff {
 
        protected function doGet( $key, $flags = 0, &$casToken = null ) {
                $this->debug( "get($key)" );
+
+               $client = $this->acquireSyncClient();
                if ( defined( Memcached::class . '::GET_EXTENDED' ) ) { // v3.0.0
                        /** @noinspection PhpUndefinedClassConstantInspection */
                        $flags = Memcached::GET_EXTENDED;
-                       $res = $this->client->get( $this->validateKeyEncoding( $key ), null, $flags );
+                       $res = $client->get( $this->validateKeyEncoding( $key ), null, $flags );
                        if ( is_array( $res ) ) {
                                $result = $res['value'];
                                $casToken = $res['cas'];
@@ -162,62 +192,77 @@ class MemcachedPeclBagOStuff extends MemcachedBagOStuff {
                                $casToken = null;
                        }
                } else {
-                       $result = $this->client->get( $this->validateKeyEncoding( $key ), null, $casToken );
+                       $result = $client->get( $this->validateKeyEncoding( $key ), null, $casToken );
                }
-               $result = $this->checkResult( $key, $result );
-               return $result;
+
+               return $this->checkResult( $key, $result );
        }
 
        protected function doSet( $key, $value, $exptime = 0, $flags = 0 ) {
                $this->debug( "set($key)" );
-               $result = $this->client->set(
+
+               $client = $this->acquireSyncClient();
+               $result = $client->set(
                        $this->validateKeyEncoding( $key ),
                        $value,
                        $this->fixExpiry( $exptime )
                );
-               if ( $result === false && $this->client->getResultCode() === Memcached::RES_NOTSTORED ) {
+
+               return ( $result === false && $client->getResultCode() === Memcached::RES_NOTSTORED )
                        // "Not stored" is always used as the mcrouter response with AllAsyncRoute
-                       return true;
-               }
-               return $this->checkResult( $key, $result );
+                       ? true
+                       : $this->checkResult( $key, $result );
        }
 
        protected function cas( $casToken, $key, $value, $exptime = 0, $flags = 0 ) {
                $this->debug( "cas($key)" );
-               $result = $this->client->cas( $casToken, $this->validateKeyEncoding( $key ),
-                       $value, $this->fixExpiry( $exptime ) );
+
+               $result = $this->acquireSyncClient()->cas(
+                       $casToken,
+                       $this->validateKeyEncoding( $key ),
+                       $value, $this->fixExpiry( $exptime )
+               );
+
                return $this->checkResult( $key, $result );
        }
 
        protected function doDelete( $key, $flags = 0 ) {
                $this->debug( "delete($key)" );
-               $result = $this->client->delete( $this->validateKeyEncoding( $key ) );
-               if ( $result === false && $this->client->getResultCode() === Memcached::RES_NOTFOUND ) {
+
+               $client = $this->acquireSyncClient();
+               $result = $client->delete( $this->validateKeyEncoding( $key ) );
+
+               return ( $result === false && $client->getResultCode() === Memcached::RES_NOTFOUND )
                        // "Not found" is counted as success in our interface
-                       return true;
-               }
-               return $this->checkResult( $key, $result );
+                       ? true
+                       : $this->checkResult( $key, $result );
        }
 
        public function add( $key, $value, $exptime = 0, $flags = 0 ) {
                $this->debug( "add($key)" );
-               $result = $this->client->add(
+
+               $result = $this->acquireSyncClient()->add(
                        $this->validateKeyEncoding( $key ),
                        $value,
                        $this->fixExpiry( $exptime )
                );
+
                return $this->checkResult( $key, $result );
        }
 
        public function incr( $key, $value = 1 ) {
                $this->debug( "incr($key)" );
-               $result = $this->client->increment( $key, $value );
+
+               $result = $this->acquireSyncClient()->increment( $key, $value );
+
                return $this->checkResult( $key, $result );
        }
 
        public function decr( $key, $value = 1 ) {
                $this->debug( "decr($key)" );
-               $result = $this->client->decrement( $key, $value );
+
+               $result = $this->acquireSyncClient()->decrement( $key, $value );
+
                return $this->checkResult( $key, $result );
        }
 
@@ -236,22 +281,25 @@ class MemcachedPeclBagOStuff extends MemcachedBagOStuff {
                if ( $result !== false ) {
                        return $result;
                }
-               switch ( $this->client->getResultCode() ) {
+
+               $client = $this->syncClient;
+               switch ( $client->getResultCode() ) {
                        case Memcached::RES_SUCCESS:
                                break;
                        case Memcached::RES_DATA_EXISTS:
                        case Memcached::RES_NOTSTORED:
                        case Memcached::RES_NOTFOUND:
-                               $this->debug( "result: " . $this->client->getResultMessage() );
+                               $this->debug( "result: " . $client->getResultMessage() );
                                break;
                        default:
-                               $msg = $this->client->getResultMessage();
+                               $msg = $client->getResultMessage();
                                $logCtx = [];
                                if ( $key !== false ) {
-                                       $server = $this->client->getServerByKey( $key );
+                                       $server = $client->getServerByKey( $key );
                                        $logCtx['memcached-server'] = "{$server['host']}:{$server['port']}";
                                        $logCtx['memcached-key'] = $key;
-                                       $msg = "Memcached error for key \"{memcached-key}\" on server \"{memcached-server}\": $msg";
+                                       $msg = "Memcached error for key \"{memcached-key}\" " .
+                                               "on server \"{memcached-server}\": $msg";
                                } else {
                                        $msg = "Memcached error: $msg";
                                }
@@ -263,41 +311,71 @@ class MemcachedPeclBagOStuff extends MemcachedBagOStuff {
 
        protected function doGetMulti( array $keys, $flags = 0 ) {
                $this->debug( 'getMulti(' . implode( ', ', $keys ) . ')' );
+
                foreach ( $keys as $key ) {
                        $this->validateKeyEncoding( $key );
                }
-               $result = $this->client->getMulti( $keys ) ?: [];
+
+               // The PECL implementation uses "gets" which works as well as a pipeline
+               $result = $this->acquireSyncClient()->getMulti( $keys ) ?: [];
+
                return $this->checkResult( false, $result );
        }
 
        protected function doSetMulti( array $data, $exptime = 0, $flags = 0 ) {
                $this->debug( 'setMulti(' . implode( ', ', array_keys( $data ) ) . ')' );
+
+               $exptime = $this->fixExpiry( $exptime );
                foreach ( array_keys( $data ) as $key ) {
                        $this->validateKeyEncoding( $key );
                }
-               $result = $this->client->setMulti( $data, $this->fixExpiry( $exptime ) );
+
+               // The PECL implementation is a naïve for-loop so use async I/O to pipeline;
+               // https://github.com/php-memcached-dev/php-memcached/blob/master/php_memcached.c#L1852
+               if ( ( $flags & self::WRITE_BACKGROUND ) == self::WRITE_BACKGROUND ) {
+                       $client = $this->acquireAsyncClient();
+                       $result = $client->setMulti( $data, $exptime );
+                       $this->releaseAsyncClient( $client );
+               } else {
+                       $result = $this->acquireSyncClient()->setMulti( $data, $exptime );
+               }
+
                return $this->checkResult( false, $result );
        }
 
        protected function doDeleteMulti( array $keys, $flags = 0 ) {
                $this->debug( 'deleteMulti(' . implode( ', ', $keys ) . ')' );
+
                foreach ( $keys as $key ) {
                        $this->validateKeyEncoding( $key );
                }
-               $result = $this->client->deleteMulti( $keys ) ?: [];
-               $ok = true;
-               foreach ( $result as $code ) {
+
+               // The PECL implementation is a naïve for-loop so use async I/O to pipeline;
+               // https://github.com/php-memcached-dev/php-memcached/blob/7443d16d02fb73cdba2e90ae282446f80969229c/php_memcached.c#L1852
+               if ( ( $flags & self::WRITE_BACKGROUND ) == self::WRITE_BACKGROUND ) {
+                       $client = $this->acquireAsyncClient();
+                       $resultArray = $client->deleteMulti( $keys ) ?: [];
+                       $this->releaseAsyncClient( $client );
+               } else {
+                       $resultArray = $this->acquireSyncClient()->deleteMulti( $keys ) ?: [];
+               }
+
+               $result = true;
+               foreach ( $resultArray as $code ) {
                        if ( !in_array( $code, [ true, Memcached::RES_NOTFOUND ], true ) ) {
                                // "Not found" is counted as success in our interface
-                               $ok = false;
+                               $result = false;
                        }
                }
-               return $this->checkResult( false, $ok );
+
+               return $this->checkResult( false, $result );
        }
 
        protected function doChangeTTL( $key, $exptime, $flags ) {
                $this->debug( "touch($key)" );
-               $result = $this->client->touch( $key, $exptime );
+
+               $result = $this->acquireSyncClient()->touch( $key, $this->fixExpiry( $exptime ) );
+
                return $this->checkResult( $key, $result );
        }
 
@@ -306,7 +384,7 @@ class MemcachedPeclBagOStuff extends MemcachedBagOStuff {
                        return $value;
                }
 
-               $serializer = $this->client->getOption( Memcached::OPT_SERIALIZER );
+               $serializer = $this->syncClient->getOption( Memcached::OPT_SERIALIZER );
                if ( $serializer === Memcached::SERIALIZER_PHP ) {
                        return serialize( $value );
                } elseif ( $serializer === Memcached::SERIALIZER_IGBINARY ) {
@@ -321,7 +399,7 @@ class MemcachedPeclBagOStuff extends MemcachedBagOStuff {
                        return (int)$value;
                }
 
-               $serializer = $this->client->getOption( Memcached::OPT_SERIALIZER );
+               $serializer = $this->syncClient->getOption( Memcached::OPT_SERIALIZER );
                if ( $serializer === Memcached::SERIALIZER_PHP ) {
                        return unserialize( $value );
                } elseif ( $serializer === Memcached::SERIALIZER_IGBINARY ) {
@@ -330,4 +408,52 @@ class MemcachedPeclBagOStuff extends MemcachedBagOStuff {
 
                throw new UnexpectedValueException( __METHOD__ . ": got serializer '$serializer'." );
        }
+
+       /**
+        * @return Memcached
+        */
+       private function acquireSyncClient() {
+               if ( $this->syncClientIsBuffering ) {
+                       throw new RuntimeException( "The main (unbuffered I/O) client is locked" );
+               }
+
+               if ( $this->hasUnflushedChanges ) {
+                       // Force a synchronous flush of async writes so that their changes are visible
+                       $this->syncClient->fetch();
+                       if ( $this->asyncClient ) {
+                               $this->asyncClient->fetch();
+                       }
+                       $this->hasUnflushedChanges = false;
+               }
+
+               return $this->syncClient;
+       }
+
+       /**
+        * @return Memcached
+        */
+       private function acquireAsyncClient() {
+               if ( $this->asyncClient ) {
+                       return $this->asyncClient; // dedicated buffering instance
+               }
+
+               // Modify the main instance to temporarily buffer writes
+               $this->syncClientIsBuffering = true;
+               $this->syncClient->setOptions( self::$OPTS_ASYNC_WRITES );
+
+               return $this->syncClient;
+       }
+
+       /**
+        * @param Memcached $client
+        */
+       private function releaseAsyncClient( $client ) {
+               $this->hasUnflushedChanges = true;
+
+               if ( !$this->asyncClient ) {
+                       // This is the main instance; make it stop buffering writes again
+                       $client->setOptions( self::$OPTS_SYNC_WRITES );
+                       $this->syncClientIsBuffering = false;
+               }
+       }
 }
index f8b91bc..b1d5d29 100644 (file)
@@ -53,8 +53,9 @@ class MemcachedPhpBagOStuff extends MemcachedBagOStuff {
                $this->client->set_servers( $params['servers'] );
        }
 
-       public function setDebug( $debug ) {
-               $this->client->set_debug( $debug );
+       public function setDebug( $enabled ) {
+               parent::debug( $enabled );
+               $this->client->set_debug( $enabled );
        }
 
        protected function doGet( $key, $flags = 0, &$casToken = null ) {
index 8e791ba..d150880 100644 (file)
@@ -40,7 +40,8 @@ class MultiWriteBagOStuff extends BagOStuff {
        /** @var int[] List of all backing cache indexes */
        protected $cacheIndexes = [];
 
-       const UPGRADE_TTL = 3600; // TTL when a key is copied to a higher cache tier
+       /** @var int TTL when a key is copied to a higher cache tier */
+       private static $UPGRADE_TTL = 3600;
 
        /**
         * $params include:
@@ -97,9 +98,10 @@ class MultiWriteBagOStuff extends BagOStuff {
                $this->cacheIndexes = array_keys( $this->caches );
        }
 
-       public function setDebug( $debug ) {
+       public function setDebug( $enabled ) {
+               parent::setDebug( $enabled );
                foreach ( $this->caches as $cache ) {
-                       $cache->setDebug( $debug );
+                       $cache->setDebug( $enabled );
                }
        }
 
@@ -131,7 +133,7 @@ class MultiWriteBagOStuff extends BagOStuff {
                                $this->asyncWrites,
                                'set',
                                // @TODO: consider using self::WRITE_ALLOW_SEGMENTS here?
-                               [ $key, $value, self::UPGRADE_TTL ]
+                               [ $key, $value, self::$UPGRADE_TTL ]
                        );
                }
 
@@ -348,50 +350,26 @@ class MultiWriteBagOStuff extends BagOStuff {
        }
 
        public function makeKeyInternal( $keyspace, $args ) {
-               return $this->caches[0]->makeKeyInternal( ...func_get_args() );
+               return $this->caches[0]->makeKeyInternal( $keyspace, $args );
        }
 
-       public function makeKey( $class, $component = null ) {
+       public function makeKey( $class, ...$components ) {
                return $this->caches[0]->makeKey( ...func_get_args() );
        }
 
-       public function makeGlobalKey( $class, $component = null ) {
+       public function makeGlobalKey( $class, ...$components ) {
                return $this->caches[0]->makeGlobalKey( ...func_get_args() );
        }
 
-       protected function doGet( $key, $flags = 0, &$casToken = null ) {
-               throw new LogicException( __METHOD__ . ': proxy class does not need this method.' );
+       public function addBusyCallback( callable $workCallback ) {
+               $this->caches[0]->addBusyCallback( $workCallback );
        }
 
-       protected function doSet( $key, $value, $exptime = 0, $flags = 0 ) {
-               throw new LogicException( __METHOD__ . ': proxy class does not need this method.' );
-       }
-
-       protected function doDelete( $key, $flags = 0 ) {
-               throw new LogicException( __METHOD__ . ': proxy class does not need this method.' );
-       }
-
-       protected function doChangeTTL( $key, $exptime, $flags ) {
-               throw new LogicException( __METHOD__ . ': proxy class does not need this method.' );
-       }
-
-       protected function doGetMulti( array $keys, $flags = 0 ) {
-               throw new LogicException( __METHOD__ . ': proxy class does not need this method.' );
-       }
-
-       protected function doSetMulti( array $keys, $exptime = 0, $flags = 0 ) {
-               throw new LogicException( __METHOD__ . ': proxy class does not need this method.' );
-       }
-
-       protected function doDeleteMulti( array $keys, $flags = 0 ) {
-               throw new LogicException( __METHOD__ . ': proxy class does not need this method.' );
-       }
-
-       protected function serialize( $value ) {
-               throw new LogicException( __METHOD__ . ': proxy class does not need this method.' );
-       }
-
-       protected function unserialize( $blob ) {
-               throw new LogicException( __METHOD__ . ': proxy class does not need this method.' );
+       public function setMockTime( &$time ) {
+               parent::setMockTime( $time );
+               foreach ( $this->caches as $cache ) {
+                       $cache->setMockTime( $time );
+                       $cache->setMockTime( $time );
+               }
        }
 }
index 2a12689..aa4a9b3 100644 (file)
@@ -44,7 +44,7 @@ use Psr\Log\LoggerInterface;
  * $wgSessionCacheType = 'sessions';
  * @endcode
  */
-class RESTBagOStuff extends BagOStuff {
+class RESTBagOStuff extends MediumSpecificBagOStuff {
        /**
         * Default connection timeout in seconds. The kernel retransmits the SYN
         * packet after 1 second, so 1.2 seconds allows for 1 retransmit without
index 2d1ed05..87d26ef 100644 (file)
@@ -28,7 +28,7 @@
  * @ingroup Cache
  * @ingroup Redis
  */
-class RedisBagOStuff extends BagOStuff {
+class RedisBagOStuff extends MediumSpecificBagOStuff {
        /** @var RedisConnectionPool */
        protected $redisPool;
        /** @var array List of server names */
@@ -368,54 +368,11 @@ class RedisBagOStuff extends BagOStuff {
                }
 
                try {
-                       $conn->watch( $key );
-                       if ( $conn->exists( $key ) ) {
-                               $conn->multi( Redis::MULTI );
-                               $conn->incrBy( $key, $value );
-                               $batchResult = $conn->exec();
-                               if ( $batchResult === false ) {
-                                       $result = false;
-                               } else {
-                                       $result = end( $batchResult );
-                               }
-                       } else {
-                               $result = false;
-                               $conn->unwatch();
-                       }
-               } catch ( RedisException $e ) {
-                       try {
-                               $conn->unwatch(); // sanity
-                       } catch ( RedisException $ex ) {
-                               // already errored
-                       }
-                       $result = false;
-                       $this->handleException( $conn, $e );
-               }
-
-               $this->logRequest( 'incr', $key, $conn->getServer(), $result );
-
-               return $result;
-       }
-
-       public function incrWithInit( $key, $exptime, $value = 1, $init = 1 ) {
-               $conn = $this->getConnection( $key );
-               if ( !$conn ) {
-                       return false;
-               }
-
-               $ttl = $this->convertToRelative( $exptime );
-               $preIncrInit = $init - $value;
-               try {
-                       $conn->multi( Redis::MULTI );
-                       $conn->set( $key, $preIncrInit, $ttl ? [ 'nx', 'ex' => $ttl ] : [ 'nx' ] );
-                       $conn->incrBy( $key, $value );
-                       $batchResult = $conn->exec();
-                       if ( $batchResult === false ) {
-                               $result = false;
-                               $this->debug( "incrWithInit request to {$conn->getServer()} failed" );
-                       } else {
-                               $result = end( $batchResult );
+                       if ( !$conn->exists( $key ) ) {
+                               return false;
                        }
+                       // @FIXME: on races, the key may have a 0 TTL
+                       $result = $conn->incrBy( $key, $value );
                } catch ( RedisException $e ) {
                        $result = false;
                        $this->handleException( $conn, $e );
index 295ec30..504d515 100644 (file)
@@ -69,9 +69,10 @@ class ReplicatedBagOStuff extends BagOStuff {
                $this->attrMap = $this->mergeFlagMaps( [ $this->readStore, $this->writeStore ] );
        }
 
-       public function setDebug( $debug ) {
-               $this->writeStore->setDebug( $debug );
-               $this->readStore->setDebug( $debug );
+       public function setDebug( $enabled ) {
+               parent::setDebug( $enabled );
+               $this->writeStore->setDebug( $enabled );
+               $this->readStore->setDebug( $enabled );
        }
 
        public function get( $key, $flags = 0 ) {
@@ -161,47 +162,21 @@ class ReplicatedBagOStuff extends BagOStuff {
                return $this->writeStore->makeKeyInternal( ...func_get_args() );
        }
 
-       public function makeKey( $class, $component = null ) {
+       public function makeKey( $class, ...$components ) {
                return $this->writeStore->makeKey( ...func_get_args() );
        }
 
-       public function makeGlobalKey( $class, $component = null ) {
+       public function makeGlobalKey( $class, ...$components ) {
                return $this->writeStore->makeGlobalKey( ...func_get_args() );
        }
 
-       protected function doGet( $key, $flags = 0, &$casToken = null ) {
-               throw new LogicException( __METHOD__ . ': proxy class does not need this method.' );
+       public function addBusyCallback( callable $workCallback ) {
+               $this->writeStore->addBusyCallback( $workCallback );
        }
 
-       protected function doSet( $key, $value, $exptime = 0, $flags = 0 ) {
-               throw new LogicException( __METHOD__ . ': proxy class does not need this method.' );
-       }
-
-       protected function doDelete( $key, $flags = 0 ) {
-               throw new LogicException( __METHOD__ . ': proxy class does not need this method.' );
-       }
-
-       protected function doChangeTTL( $key, $exptime, $flags ) {
-               throw new LogicException( __METHOD__ . ': proxy class does not need this method.' );
-       }
-
-       protected function doGetMulti( array $keys, $flags = 0 ) {
-               throw new LogicException( __METHOD__ . ': proxy class does not need this method.' );
-       }
-
-       protected function doSetMulti( array $keys, $exptime = 0, $flags = 0 ) {
-               throw new LogicException( __METHOD__ . ': proxy class does not need this method.' );
-       }
-
-       protected function doDeleteMulti( array $keys, $flags = 0 ) {
-               throw new LogicException( __METHOD__ . ': proxy class does not need this method.' );
-       }
-
-       protected function serialize( $value ) {
-               throw new LogicException( __METHOD__ . ': proxy class does not need this method.' );
-       }
-
-       protected function unserialize( $blob ) {
-               throw new LogicException( __METHOD__ . ': proxy class does not need this method.' );
+       public function setMockTime( &$time ) {
+               parent::setMockTime( $time );
+               $this->writeStore->setMockTime( $time );
+               $this->readStore->setMockTime( $time );
        }
 }
index 65059c8..69edb11 100644 (file)
@@ -118,20 +118,21 @@ class WANObjectCache implements IExpiringStore, IStoreKeyEncoder, LoggerAwareInt
        protected $cache;
        /** @var MapCacheLRU[] Map of group PHP instance caches */
        protected $processCaches = [];
+       /** @var LoggerInterface */
+       protected $logger;
+       /** @var StatsdDataFactoryInterface */
+       protected $stats;
+       /** @var callable|null Function that takes a WAN cache callback and runs it later */
+       protected $asyncHandler;
+
        /** @bar bool Whether to use mcrouter key prefixing for routing */
        protected $mcrouterAware;
        /** @var string Physical region for mcrouter use */
        protected $region;
        /** @var string Cache cluster name for mcrouter use */
        protected $cluster;
-       /** @var LoggerInterface */
-       protected $logger;
-       /** @var StatsdDataFactoryInterface */
-       protected $stats;
        /** @var bool Whether to use "interim" caching while keys are tombstoned */
        protected $useInterimHoldOffCaching = true;
-       /** @var callable|null Function that takes a WAN cache callback and runs it later */
-       protected $asyncHandler;
        /** @var float Unix timestamp of the oldest possible valid values */
        protected $epoch;
        /** @var string Stable secret used for hasing long strings into key components */
@@ -147,93 +148,104 @@ class WANObjectCache implements IExpiringStore, IStoreKeyEncoder, LoggerAwareInt
        /** @var float|null */
        private $wallClockOverride;
 
-       /** Max time expected to pass between delete() and DB commit finishing */
+       /** @var int Max expected seconds to pass between delete() and DB commit finishing */
        const MAX_COMMIT_DELAY = 3;
-       /** Max replication+snapshot lag before applying TTL_LAGGED or disallowing set() */
+       /** @var int Max expected seconds of combined lag from replication and view snapshots */
        const MAX_READ_LAG = 7;
-       /** Seconds to tombstone keys on delete() */
-       const HOLDOFF_TTL = 11; // MAX_COMMIT_DELAY + MAX_READ_LAG + 1
-
-       /** Seconds to keep dependency purge keys around */
-       const CHECK_KEY_TTL = self::TTL_YEAR;
-       /** Seconds to keep interim value keys for tombstoned keys around */
-       const INTERIM_KEY_TTL = 1;
-
-       /** Seconds to keep lock keys around */
-       const LOCK_TTL = 10;
-       /** Seconds to no-op key set() calls to avoid large blob I/O stampedes */
-       const COOLOFF_TTL = 1;
-       /** Default remaining TTL at which to consider pre-emptive regeneration */
+       /** @var int Seconds to tombstone keys on delete() and treat as volatile after invalidation */
+       const HOLDOFF_TTL = self::MAX_COMMIT_DELAY + self::MAX_READ_LAG + 1;
+
+       /** @var int Idiom for getWithSetCallback() meaning "do not store the callback result" */
+       const TTL_UNCACHEABLE = -1;
+
+       /** @var int Consider regeneration if the key will expire within this many seconds */
        const LOW_TTL = 30;
-       /** Max TTL to store keys when a data sourced is lagged */
+       /** @var int Max TTL, in seconds, to store keys when a data sourced is lagged */
        const TTL_LAGGED = 30;
 
-       /** Never consider performing "popularity" refreshes until a key reaches this age */
-       const AGE_NEW = 60;
-       /** The time length of the "popularity" refresh window for hot keys */
+       /** @var int Expected time-till-refresh, in seconds, if the key is accessed once per second */
        const HOT_TTR = 900;
-       /** Hits/second for a refresh to be expected within the "popularity" window */
-       const HIT_RATE_HIGH = 1;
-       /** Seconds to ramp up to the "popularity" refresh chance after a key is no longer new */
-       const RAMPUP_TTL = 30;
+       /** @var int Minimum key age, in seconds, for expected time-till-refresh to be considered */
+       const AGE_NEW = 60;
 
-       /** Idiom for getWithSetCallback() meaning "do not store the callback result" */
-       const TTL_UNCACHEABLE = -1;
-       /** Idiom for getWithSetCallback() meaning "no regeneration mutex based on key hotness" */
+       /** @var int Idiom for getWithSetCallback() meaning "no cache stampede mutex required" */
        const TSE_NONE = -1;
-       /** Idiom for set()/getWithSetCallback() meaning "no post-expiration persistence" */
+
+       /** @var int Idiom for set()/getWithSetCallback() meaning "no post-expiration persistence" */
        const STALE_TTL_NONE = 0;
-       /** Idiom for set()/getWithSetCallback() meaning "no post-expiration grace period" */
+       /** @var int Idiom for set()/getWithSetCallback() meaning "no post-expiration grace period" */
        const GRACE_TTL_NONE = 0;
-       /** Idiom for delete()/touchCheckKey() meaning "no hold-off period for cache writes" */
-       const HOLDOFF_NONE = 0;
+       /** @var int Idiom for delete()/touchCheckKey() meaning "no hold-off period" */
+       const HOLDOFF_TTL_NONE = 0;
+       /** @var int Alias for HOLDOFF_TTL_NONE (b/c) (deprecated since 1.34) */
+       const HOLDOFF_NONE = self::HOLDOFF_TTL_NONE;
 
-       /** Idiom for getWithSetCallback() meaning "no minimum required as-of timestamp" */
+       /** @var float Idiom for getWithSetCallback() meaning "no minimum required as-of timestamp" */
        const MIN_TIMESTAMP_NONE = 0.0;
-       /** @var int One second into the UNIX timestamp epoch */
-       const EPOCH_UNIX_ONE_SECOND = 1.0;
-
-       /** Tiny negative float to use when CTL comes up >= 0 due to clock skew */
-       const TINY_NEGATIVE = -0.000001;
-       /** Tiny positive float to use when using "minTime" to assert an inequality */
-       const TINY_POSTIVE = 0.000001;
 
-       /** Milliseconds of delay after get() where set() storms are a consideration with "lockTSE" */
-       const SET_DELAY_HIGH_MS = 50;
-       /** Min millisecond set() backoff for keys in hold-off (far less than INTERIM_KEY_TTL) */
-       const RECENT_SET_LOW_MS = 50;
-       /** Max millisecond set() backoff for keys in hold-off (far less than INTERIM_KEY_TTL) */
-       const RECENT_SET_HIGH_MS = 100;
+       /** @var string Default process cache name and max key count */
+       const PC_PRIMARY = 'primary:1000';
 
-       /** @var int Seconds needed for value generation considered slow */
-       const GENERATION_SLOW_SEC = 3;
-
-       /** Parameter to get()/getMulti() to return extra information by reference */
+       /** @var int Idion for get()/getMulti() to return extra information by reference */
        const PASS_BY_REF = -1;
 
-       /** Cache format version number */
-       const VERSION = 1;
-
-       const FLD_FORMAT_VERSION = 0; // key to WAN cache version number
-       const FLD_VALUE = 1; // key to the cached value
-       const FLD_TTL = 2; // key to the original TTL
-       const FLD_TIME = 3; // key to the cache timestamp
-       const FLD_FLAGS = 4; // key to the flags bitfield (reserved number)
-       const FLD_VALUE_VERSION = 5; // key to collection cache version number
-       const FLD_GENERATION_TIME = 6; // key to how long it took to generate the value
-
-       const PURGE_TIME = 0; // key to the tombstone entry timestamp
-       const PURGE_HOLDOFF = 1; // key to the tombstone entry hold-off TTL
-
-       const VALUE_KEY_PREFIX = 'WANCache:v:';
-       const INTERIM_KEY_PREFIX = 'WANCache:i:';
-       const TIME_KEY_PREFIX = 'WANCache:t:';
-       const MUTEX_KEY_PREFIX = 'WANCache:m:';
-       const COOLOFF_KEY_PREFIX = 'WANCache:c:';
-
-       const PURGE_VAL_PREFIX = 'PURGED:';
-
-       const PC_PRIMARY = 'primary:1000'; // process cache name and max key count
+       /** @var int Seconds to keep dependency purge keys around */
+       private static $CHECK_KEY_TTL = self::TTL_YEAR;
+       /** @var int Seconds to keep interim value keys for tombstoned keys around */
+       private static $INTERIM_KEY_TTL = 1;
+
+       /** @var int Seconds to keep lock keys around */
+       private static $LOCK_TTL = 10;
+       /** @var int Seconds to no-op key set() calls to avoid large blob I/O stampedes */
+       private static $COOLOFF_TTL = 1;
+       /** @var int Seconds to ramp up the chance of regeneration due to expected time-till-refresh */
+       private static $RAMPUP_TTL = 30;
+
+       /** @var float Tiny negative float to use when CTL comes up >= 0 due to clock skew */
+       private static $TINY_NEGATIVE = -0.000001;
+       /** @var float Tiny positive float to use when using "minTime" to assert an inequality */
+       private static $TINY_POSTIVE = 0.000001;
+
+       /** @var int Milliseconds of key fetch/validate/regenerate delay prone to set() stampedes */
+       private static $SET_DELAY_HIGH_MS = 50;
+       /** @var int Min millisecond set() backoff during hold-off (far less than INTERIM_KEY_TTL) */
+       private static $RECENT_SET_LOW_MS = 50;
+       /** @var int Max millisecond set() backoff during hold-off (far less than INTERIM_KEY_TTL) */
+       private static $RECENT_SET_HIGH_MS = 100;
+
+       /** @var int Consider value generation slow if it takes more than this many seconds */
+       private static $GENERATION_SLOW_SEC = 3;
+
+       /** @var int Key to the tombstone entry timestamp */
+       private static $PURGE_TIME = 0;
+       /** @var int Key to the tombstone entry hold-off TTL */
+       private static $PURGE_HOLDOFF = 1;
+
+       /** @var int Cache format version number */
+       private static $VERSION = 1;
+
+       /** @var int Key to WAN cache version number */
+       private static $FLD_FORMAT_VERSION = 0;
+       /** @var int Key to the cached value */
+       private static $FLD_VALUE = 1;
+       /** @var int Key to the original TTL */
+       private static $FLD_TTL = 2;
+       /** @var int Key to the cache timestamp */
+       private static $FLD_TIME = 3;
+       /** @var int Key to the flags bit field (reserved number) */
+       private static /** @noinspection PhpUnusedPrivateFieldInspection */ $FLD_FLAGS = 4;
+       /** @var int Key to collection cache version number */
+       private static $FLD_VALUE_VERSION = 5;
+       /** @var int Key to how long it took to generate the value */
+       private static $FLD_GENERATION_TIME = 6;
+
+       private static $VALUE_KEY_PREFIX = 'WANCache:v:';
+       private static $INTERIM_KEY_PREFIX = 'WANCache:i:';
+       private static $TIME_KEY_PREFIX = 'WANCache:t:';
+       private static $MUTEX_KEY_PREFIX = 'WANCache:m:';
+       private static $COOLOFF_KEY_PREFIX = 'WANCache:c:';
+
+       private static $PURGE_VAL_PREFIX = 'PURGED:';
 
        /**
         * @param array $params
@@ -265,7 +277,7 @@ class WANObjectCache implements IExpiringStore, IStoreKeyEncoder, LoggerAwareInt
                $this->region = $params['region'] ?? 'main';
                $this->cluster = $params['cluster'] ?? 'wan-main';
                $this->mcrouterAware = !empty( $params['mcrouterAware'] );
-               $this->epoch = $params['epoch'] ?? self::EPOCH_UNIX_ONE_SECOND;
+               $this->epoch = $params['epoch'] ?? 0;
                $this->secret = $params['secret'] ?? (string)$this->epoch;
 
                $this->setLogger( $params['logger'] ?? new NullLogger() );
@@ -392,14 +404,14 @@ class WANObjectCache implements IExpiringStore, IStoreKeyEncoder, LoggerAwareInt
                $curTTLs = [];
                $infoByKey = [];
 
-               $vPrefixLen = strlen( self::VALUE_KEY_PREFIX );
-               $valueKeys = self::prefixCacheKeys( $keys, self::VALUE_KEY_PREFIX );
+               $vPrefixLen = strlen( self::$VALUE_KEY_PREFIX );
+               $valueKeys = self::prefixCacheKeys( $keys, self::$VALUE_KEY_PREFIX );
 
                $checkKeysForAll = [];
                $checkKeysByKey = [];
                $checkKeysFlat = [];
                foreach ( $checkKeys as $i => $checkKeyGroup ) {
-                       $prefixed = self::prefixCacheKeys( (array)$checkKeyGroup, self::TIME_KEY_PREFIX );
+                       $prefixed = self::prefixCacheKeys( (array)$checkKeyGroup, self::$TIME_KEY_PREFIX );
                        $checkKeysFlat = array_merge( $checkKeysFlat, $prefixed );
                        // Are these check keys for a specific cache key, or for all keys being fetched?
                        if ( is_int( $i ) ) {
@@ -445,11 +457,11 @@ class WANObjectCache implements IExpiringStore, IStoreKeyEncoder, LoggerAwareInt
 
                        $lastCKPurge = null; // timestamp of the highest check key
                        foreach ( $purgeValues as $purge ) {
-                               $lastCKPurge = max( $purge[self::PURGE_TIME], $lastCKPurge );
-                               $safeTimestamp = $purge[self::PURGE_TIME] + $purge[self::PURGE_HOLDOFF];
+                               $lastCKPurge = max( $purge[self::$PURGE_TIME], $lastCKPurge );
+                               $safeTimestamp = $purge[self::$PURGE_TIME] + $purge[self::$PURGE_HOLDOFF];
                                if ( $value !== false && $safeTimestamp >= $keyInfo['asOf'] ) {
                                        // How long ago this value was invalidated by *this* check key
-                                       $ago = min( $purge[self::PURGE_TIME] - $now, self::TINY_NEGATIVE );
+                                       $ago = min( $purge[self::$PURGE_TIME] - $now, self::$TINY_NEGATIVE );
                                        // How long ago this value was invalidated by *any* known check key
                                        $keyInfo['curTTL'] = min( $keyInfo['curTTL'], $ago );
                                }
@@ -489,7 +501,7 @@ class WANObjectCache implements IExpiringStore, IStoreKeyEncoder, LoggerAwareInt
                        if ( $purge === false ) {
                                // Key is not set or malformed; regenerate
                                $newVal = $this->makePurgeValue( $now, self::HOLDOFF_TTL );
-                               $this->cache->add( $timeKey, $newVal, self::CHECK_KEY_TTL );
+                               $this->cache->add( $timeKey, $newVal, self::$CHECK_KEY_TTL );
                                $purge = $this->parsePurgeValue( $newVal );
                        }
                        $purgeValues[] = $purge;
@@ -649,10 +661,10 @@ class WANObjectCache implements IExpiringStore, IStoreKeyEncoder, LoggerAwareInt
                $storeTTL = $ttl + $staleTTL;
 
                if ( $creating ) {
-                       $ok = $this->cache->add( self::VALUE_KEY_PREFIX . $key, $wrapped, $storeTTL );
+                       $ok = $this->cache->add( self::$VALUE_KEY_PREFIX . $key, $wrapped, $storeTTL );
                } else {
                        $ok = $this->cache->merge(
-                               self::VALUE_KEY_PREFIX . $key,
+                               self::$VALUE_KEY_PREFIX . $key,
                                function ( $cache, $key, $cWrapped ) use ( $wrapped ) {
                                        // A string value means that it is a tombstone; do nothing in that case
                                        return ( is_string( $cWrapped ) ) ? false : $wrapped;
@@ -716,7 +728,7 @@ class WANObjectCache implements IExpiringStore, IStoreKeyEncoder, LoggerAwareInt
         *
         * The $ttl parameter can be used when purging values that have not actually changed
         * recently. For example, a cleanup script to purge cache entries does not really need
-        * a hold-off period, so it can use HOLDOFF_NONE. Likewise for user-requested purge.
+        * a hold-off period, so it can use HOLDOFF_TTL_NONE. Likewise for user-requested purge.
         * Note that $ttl limits the effective range of 'lockTSE' for getWithSetCallback().
         *
         * If called twice on the same key, then the last hold-off TTL takes precedence. For
@@ -729,10 +741,10 @@ class WANObjectCache implements IExpiringStore, IStoreKeyEncoder, LoggerAwareInt
        final public function delete( $key, $ttl = self::HOLDOFF_TTL ) {
                if ( $ttl <= 0 ) {
                        // Publish the purge to all datacenters
-                       $ok = $this->relayDelete( self::VALUE_KEY_PREFIX . $key );
+                       $ok = $this->relayDelete( self::$VALUE_KEY_PREFIX . $key );
                } else {
                        // Publish the purge to all datacenters
-                       $ok = $this->relayPurge( self::VALUE_KEY_PREFIX . $key, $ttl, self::HOLDOFF_NONE );
+                       $ok = $this->relayPurge( self::$VALUE_KEY_PREFIX . $key, $ttl, self::HOLDOFF_TTL_NONE );
                }
 
                $kClass = $this->determineKeyClassForStats( $key );
@@ -828,7 +840,7 @@ class WANObjectCache implements IExpiringStore, IStoreKeyEncoder, LoggerAwareInt
        final public function getMultiCheckKeyTime( array $keys ) {
                $rawKeys = [];
                foreach ( $keys as $key ) {
-                       $rawKeys[$key] = self::TIME_KEY_PREFIX . $key;
+                       $rawKeys[$key] = self::$TIME_KEY_PREFIX . $key;
                }
 
                $rawValues = $this->cache->getMulti( $rawKeys );
@@ -838,14 +850,14 @@ class WANObjectCache implements IExpiringStore, IStoreKeyEncoder, LoggerAwareInt
                foreach ( $rawKeys as $key => $rawKey ) {
                        $purge = $this->parsePurgeValue( $rawValues[$rawKey] );
                        if ( $purge !== false ) {
-                               $time = $purge[self::PURGE_TIME];
+                               $time = $purge[self::$PURGE_TIME];
                        } else {
                                // Casting assures identical floats for the next getCheckKeyTime() calls
                                $now = (string)$this->getCurrentTime();
                                $this->cache->add(
                                        $rawKey,
                                        $this->makePurgeValue( $now, self::HOLDOFF_TTL ),
-                                       self::CHECK_KEY_TTL
+                                       self::$CHECK_KEY_TTL
                                );
                                $time = (float)$now;
                        }
@@ -887,12 +899,12 @@ class WANObjectCache implements IExpiringStore, IStoreKeyEncoder, LoggerAwareInt
         * @see WANObjectCache::resetCheckKey()
         *
         * @param string $key Cache key
-        * @param int $holdoff HOLDOFF_TTL or HOLDOFF_NONE constant
+        * @param int $holdoff HOLDOFF_TTL or HOLDOFF_TTL_NONE constant
         * @return bool True if the item was purged or not found, false on failure
         */
        final public function touchCheckKey( $key, $holdoff = self::HOLDOFF_TTL ) {
                // Publish the purge to all datacenters
-               $ok = $this->relayPurge( self::TIME_KEY_PREFIX . $key, self::CHECK_KEY_TTL, $holdoff );
+               $ok = $this->relayPurge( self::$TIME_KEY_PREFIX . $key, self::$CHECK_KEY_TTL, $holdoff );
 
                $kClass = $this->determineKeyClassForStats( $key );
                $this->stats->increment( "wanobjectcache.$kClass.ck_touch." . ( $ok ? 'ok' : 'error' ) );
@@ -929,7 +941,7 @@ class WANObjectCache implements IExpiringStore, IStoreKeyEncoder, LoggerAwareInt
         */
        final public function resetCheckKey( $key ) {
                // Publish the purge to all datacenters
-               $ok = $this->relayDelete( self::TIME_KEY_PREFIX . $key );
+               $ok = $this->relayDelete( self::$TIME_KEY_PREFIX . $key );
 
                $kClass = $this->determineKeyClassForStats( $key );
                $this->stats->increment( "wanobjectcache.$kClass.ck_reset." . ( $ok ? 'ok' : 'error' ) );
@@ -1374,30 +1386,25 @@ class WANObjectCache implements IExpiringStore, IStoreKeyEncoder, LoggerAwareInt
                        // This avoids stampedes on eviction or preemptive regeneration taking too long.
                        ( $busyValue !== null && $possValue === false );
 
-               // If a regeneration lock is required, threads that do not get the lock will use any
-               // available stale or volatile value. If there is none, then the cheap/placeholder
-               // value from $busyValue will be used if provided; failing that, all threads will try
-               // to regenerate the value and ignore the lock.
-               if ( $useRegenerationLock ) {
-                       $hasLock = $this->cache->add( self::MUTEX_KEY_PREFIX . $key, 1, self::LOCK_TTL );
-                       if ( !$hasLock ) {
-                               if ( $this->isValid( $possValue, $possInfo['asOf'], $minAsOf ) ) {
-                                       $this->stats->increment( "wanobjectcache.$kClass.hit.stale" );
-
-                                       return [ $possValue, $possInfo['version'], $curInfo['asOf'] ];
-                               } elseif ( $busyValue !== null ) {
-                                       $miss = is_infinite( $minAsOf ) ? 'renew' : 'miss';
-                                       $this->stats->increment( "wanobjectcache.$kClass.$miss.busy" );
-
-                                       return [
-                                               is_callable( $busyValue ) ? $busyValue() : $busyValue,
-                                               $version,
-                                               $curInfo['asOf']
-                                       ];
-                               }
+               // If a regeneration lock is required, threads that do not get the lock will try to use
+               // the stale value, the interim value, or the $busyValue placeholder, in that order. If
+               // none of those are set then all threads will bypass the lock and regenerate the value.
+               $hasLock = $useRegenerationLock && $this->claimStampedeLock( $key );
+               if ( $useRegenerationLock && !$hasLock ) {
+                       if ( $this->isValid( $possValue, $possInfo['asOf'], $minAsOf ) ) {
+                               $this->stats->increment( "wanobjectcache.$kClass.hit.stale" );
+
+                               return [ $possValue, $possInfo['version'], $curInfo['asOf'] ];
+                       } elseif ( $busyValue !== null ) {
+                               $miss = is_infinite( $minAsOf ) ? 'renew' : 'miss';
+                               $this->stats->increment( "wanobjectcache.$kClass.$miss.busy" );
+
+                               return [
+                                       is_callable( $busyValue ) ? $busyValue() : $busyValue,
+                                       $version,
+                                       $curInfo['asOf']
+                               ];
                        }
-               } else {
-                       $hasLock = false;
                }
 
                // Generate the new value given any prior value with a matching version
@@ -1447,9 +1454,7 @@ class WANObjectCache implements IExpiringStore, IStoreKeyEncoder, LoggerAwareInt
                        }
                }
 
-               if ( $hasLock ) {
-                       $this->cache->changeTTL( self::MUTEX_KEY_PREFIX . $key, (int)$initialTime - 60 );
-               }
+               $this->yieldStampedeLock( $key, $hasLock );
 
                $miss = is_infinite( $minAsOf ) ? 'renew' : 'miss';
                $this->stats->increment( "wanobjectcache.$kClass.$miss.compute" );
@@ -1457,12 +1462,34 @@ class WANObjectCache implements IExpiringStore, IStoreKeyEncoder, LoggerAwareInt
                return [ $value, $version, $curInfo['asOf'] ];
        }
 
+       /**
+        * @param string $key
+        * @return bool Success
+        */
+       private function claimStampedeLock( $key ) {
+               // Note that locking is not bypassed due to I/O errors; this avoids stampedes
+               return $this->cache->add( self::$MUTEX_KEY_PREFIX . $key, 1, self::$LOCK_TTL );
+       }
+
+       /**
+        * @param string $key
+        * @param bool $hasLock
+        */
+       private function yieldStampedeLock( $key, $hasLock ) {
+               if ( $hasLock ) {
+                       // The backend might be a mcrouter proxy set to broadcast DELETE to *all* the local
+                       // datacenter cache servers via OperationSelectorRoute (for increased consistency).
+                       // Since that would be excessive for these locks, use TOUCH to expire the key.
+                       $this->cache->changeTTL( self::$MUTEX_KEY_PREFIX . $key, $this->getCurrentTime() - 60 );
+               }
+       }
+
        /**
         * @param float $age Age of volatile/interim key in seconds
         * @return bool Whether the age of a volatile value is negligible
         */
        private function isVolatileValueAgeNegligible( $age ) {
-               return ( $age < mt_rand( self::RECENT_SET_LOW_MS, self::RECENT_SET_HIGH_MS ) / 1e3 );
+               return ( $age < mt_rand( self::$RECENT_SET_LOW_MS, self::$RECENT_SET_HIGH_MS ) / 1e3 );
        }
 
        /**
@@ -1484,13 +1511,13 @@ class WANObjectCache implements IExpiringStore, IStoreKeyEncoder, LoggerAwareInt
                // consistent hashing).
                if ( $lockTSE < 0 || $hasLock ) {
                        return true; // either not a priori hot or thread has the lock
-               } elseif ( $elapsed <= self::SET_DELAY_HIGH_MS * 1e3 ) {
+               } elseif ( $elapsed <= self::$SET_DELAY_HIGH_MS * 1e3 ) {
                        return true; // not enough time for threads to pile up
                }
 
                $this->cache->clearLastError();
                if (
-                       !$this->cache->add( self::COOLOFF_KEY_PREFIX . $key, 1, self::COOLOFF_TTL ) &&
+                       !$this->cache->add( self::$COOLOFF_KEY_PREFIX . $key, 1, self::$COOLOFF_TTL ) &&
                        // Don't treat failures due to I/O errors as the key being in cooloff
                        $this->cache->getLastError() === BagOStuff::ERR_NONE
                ) {
@@ -1517,7 +1544,7 @@ class WANObjectCache implements IExpiringStore, IStoreKeyEncoder, LoggerAwareInt
 
                $touched = $touchedCallback( $value );
                if ( $touched !== null && $touched >= $curInfo['asOf'] ) {
-                       $curTTL = min( $curTTL, self::TINY_NEGATIVE, $curInfo['asOf'] - $touched );
+                       $curTTL = min( $curTTL, self::$TINY_NEGATIVE, $curInfo['asOf'] - $touched );
                }
 
                return [ $curTTL, max( $curInfo['tombAsOf'], $curInfo['lastCKPurge'], $touched ) ];
@@ -1545,7 +1572,7 @@ class WANObjectCache implements IExpiringStore, IStoreKeyEncoder, LoggerAwareInt
                $now = $this->getCurrentTime();
 
                if ( $this->useInterimHoldOffCaching ) {
-                       $wrapped = $this->cache->get( self::INTERIM_KEY_PREFIX . $key );
+                       $wrapped = $this->cache->get( self::$INTERIM_KEY_PREFIX . $key );
 
                        list( $value, $keyInfo ) = $this->unwrap( $wrapped, $now );
                        if ( $this->isValid( $value, $keyInfo['asOf'], $minAsOf ) ) {
@@ -1564,11 +1591,11 @@ class WANObjectCache implements IExpiringStore, IStoreKeyEncoder, LoggerAwareInt
         * @param float $walltime How long it took to generate the value in seconds
         */
        private function setInterimValue( $key, $value, $ttl, $version, $walltime ) {
-               $ttl = max( self::INTERIM_KEY_TTL, (int)$ttl );
+               $ttl = max( self::$INTERIM_KEY_TTL, (int)$ttl );
 
                $wrapped = $this->wrap( $value, $ttl, $version, $this->getCurrentTime(), $walltime );
                $this->cache->merge(
-                       self::INTERIM_KEY_PREFIX . $key,
+                       self::$INTERIM_KEY_PREFIX . $key,
                        function () use ( $wrapped ) {
                                return $wrapped;
                        },
@@ -1810,12 +1837,12 @@ class WANObjectCache implements IExpiringStore, IStoreKeyEncoder, LoggerAwareInt
         */
        final public function reap( $key, $purgeTimestamp, &$isStale = false ) {
                $minAsOf = $purgeTimestamp + self::HOLDOFF_TTL;
-               $wrapped = $this->cache->get( self::VALUE_KEY_PREFIX . $key );
-               if ( is_array( $wrapped ) && $wrapped[self::FLD_TIME] < $minAsOf ) {
+               $wrapped = $this->cache->get( self::$VALUE_KEY_PREFIX . $key );
+               if ( is_array( $wrapped ) && $wrapped[self::$FLD_TIME] < $minAsOf ) {
                        $isStale = true;
                        $this->logger->warning( "Reaping stale value key '$key'." );
                        $ttlReap = self::HOLDOFF_TTL; // avoids races with tombstone creation
-                       $ok = $this->cache->changeTTL( self::VALUE_KEY_PREFIX . $key, $ttlReap );
+                       $ok = $this->cache->changeTTL( self::$VALUE_KEY_PREFIX . $key, $ttlReap );
                        if ( !$ok ) {
                                $this->logger->error( "Could not complete reap of key '$key'." );
                        }
@@ -1838,11 +1865,11 @@ class WANObjectCache implements IExpiringStore, IStoreKeyEncoder, LoggerAwareInt
         * @since 1.28
         */
        final public function reapCheckKey( $key, $purgeTimestamp, &$isStale = false ) {
-               $purge = $this->parsePurgeValue( $this->cache->get( self::TIME_KEY_PREFIX . $key ) );
-               if ( $purge && $purge[self::PURGE_TIME] < $purgeTimestamp ) {
+               $purge = $this->parsePurgeValue( $this->cache->get( self::$TIME_KEY_PREFIX . $key ) );
+               if ( $purge && $purge[self::$PURGE_TIME] < $purgeTimestamp ) {
                        $isStale = true;
                        $this->logger->warning( "Reaping stale check key '$key'." );
-                       $ok = $this->cache->changeTTL( self::TIME_KEY_PREFIX . $key, self::TTL_SECOND );
+                       $ok = $this->cache->changeTTL( self::$TIME_KEY_PREFIX . $key, self::TTL_SECOND );
                        if ( !$ok ) {
                                $this->logger->error( "Could not complete reap of check key '$key'." );
                        }
@@ -1858,22 +1885,22 @@ class WANObjectCache implements IExpiringStore, IStoreKeyEncoder, LoggerAwareInt
        /**
         * @see BagOStuff::makeKey()
         * @param string $class Key class
-        * @param string|null $component [optional] Key component (starting with a key collection name)
-        * @return string Colon-delimited list of $keyspace followed by escaped components of $args
+        * @param string ...$components Key components (starting with a key collection name)
+        * @return string Colon-delimited list of $keyspace followed by escaped components
         * @since 1.27
         */
-       public function makeKey( $class, $component = null ) {
+       public function makeKey( $class, ...$components ) {
                return $this->cache->makeKey( ...func_get_args() );
        }
 
        /**
         * @see BagOStuff::makeGlobalKey()
         * @param string $class Key class
-        * @param string|null $component [optional] Key component (starting with a key collection name)
-        * @return string Colon-delimited list of $keyspace followed by escaped components of $args
+        * @param string ...$components Key components (starting with a key collection name)
+        * @return string Colon-delimited list of $keyspace followed by escaped components
         * @since 1.27
         */
-       public function makeGlobalKey( $class, $component = null ) {
+       public function makeGlobalKey( $class, ...$components ) {
                return $this->cache->makeGlobalKey( ...func_get_args() );
        }
 
@@ -2175,14 +2202,14 @@ class WANObjectCache implements IExpiringStore, IStoreKeyEncoder, LoggerAwareInt
                        // Wildcards select all matching routes, e.g. the WAN cluster on all DCs
                        $ok = $this->cache->set(
                                "/*/{$this->cluster}/{$key}",
-                               $this->makePurgeValue( $this->getCurrentTime(), self::HOLDOFF_NONE ),
+                               $this->makePurgeValue( $this->getCurrentTime(), self::HOLDOFF_TTL_NONE ),
                                $ttl
                        );
                } else {
                        // This handles the mcrouter and the single-DC case
                        $ok = $this->cache->set(
                                $key,
-                               $this->makePurgeValue( $this->getCurrentTime(), self::HOLDOFF_NONE ),
+                               $this->makePurgeValue( $this->getCurrentTime(), self::HOLDOFF_TTL_NONE ),
                                $ttl
                        );
                }
@@ -2314,17 +2341,18 @@ class WANObjectCache implements IExpiringStore, IStoreKeyEncoder, LoggerAwareInt
                        return false;
                }
 
+               $popularHitsPerSec = 1;
                // Lifecycle is: new, ramp-up refresh chance, full refresh chance.
-               // Note that the "expected # of refreshes" for the ramp-up time range is half of what it
-               // would be if P(refresh) was at its full value during that time range.
-               $refreshWindowSec = max( $timeTillRefresh - $ageNew - self::RAMPUP_TTL / 2, 1 );
+               // Note that the "expected # of refreshes" for the ramp-up time range is half
+               // of what it would be if P(refresh) was at its full value during that time range.
+               $refreshWindowSec = max( $timeTillRefresh - $ageNew - self::$RAMPUP_TTL / 2, 1 );
                // P(refresh) * (# hits in $refreshWindowSec) = (expected # of refreshes)
-               // P(refresh) * ($refreshWindowSec * $popularHitsPerSec) = 1
+               // P(refresh) * ($refreshWindowSec * $popularHitsPerSec) = 1 (by definition)
                // P(refresh) = 1/($refreshWindowSec * $popularHitsPerSec)
-               $chance = 1 / ( self::HIT_RATE_HIGH * $refreshWindowSec );
+               $chance = 1 / ( $popularHitsPerSec * $refreshWindowSec );
 
                // Ramp up $chance from 0 to its nominal value over RAMPUP_TTL seconds to avoid stampedes
-               $chance *= ( $timeOld <= self::RAMPUP_TTL ) ? $timeOld / self::RAMPUP_TTL : 1;
+               $chance *= ( $timeOld <= self::$RAMPUP_TTL ) ? $timeOld / self::$RAMPUP_TTL : 1;
 
                return mt_rand( 1, 1e9 ) <= 1e9 * $chance;
        }
@@ -2340,7 +2368,7 @@ class WANObjectCache implements IExpiringStore, IStoreKeyEncoder, LoggerAwareInt
         */
        protected function isValid( $value, $asOf, $minAsOf, $purgeTime = null ) {
                // Avoid reading any key not generated after the latest delete() or touch
-               $safeMinAsOf = max( $minAsOf, $purgeTime + self::TINY_POSTIVE );
+               $safeMinAsOf = max( $minAsOf, $purgeTime + self::$TINY_POSTIVE );
 
                if ( $value === false ) {
                        return false;
@@ -2363,16 +2391,16 @@ class WANObjectCache implements IExpiringStore, IStoreKeyEncoder, LoggerAwareInt
                // Returns keys in ascending integer order for PHP7 array packing:
                // https://nikic.github.io/2014/12/22/PHPs-new-hashtable-implementation.html
                $wrapped = [
-                       self::FLD_FORMAT_VERSION => self::VERSION,
-                       self::FLD_VALUE => $value,
-                       self::FLD_TTL => $ttl,
-                       self::FLD_TIME => $now
+                       self::$FLD_FORMAT_VERSION => self::$VERSION,
+                       self::$FLD_VALUE => $value,
+                       self::$FLD_TTL => $ttl,
+                       self::$FLD_TIME => $now
                ];
                if ( $version !== null ) {
-                       $wrapped[self::FLD_VALUE_VERSION] = $version;
+                       $wrapped[self::$FLD_VALUE_VERSION] = $version;
                }
-               if ( $walltime >= self::GENERATION_SLOW_SEC ) {
-                       $wrapped[self::FLD_GENERATION_TIME] = $walltime;
+               if ( $walltime >= self::$GENERATION_SLOW_SEC ) {
+                       $wrapped[self::$FLD_GENERATION_TIME] = $walltime;
                }
 
                return $wrapped;
@@ -2395,20 +2423,20 @@ class WANObjectCache implements IExpiringStore, IStoreKeyEncoder, LoggerAwareInt
                if ( is_array( $wrapped ) ) {
                        // Entry expected to be a cached value; validate it
                        if (
-                               ( $wrapped[self::FLD_FORMAT_VERSION] ?? null ) === self::VERSION &&
-                               $wrapped[self::FLD_TIME] >= $this->epoch
+                               ( $wrapped[self::$FLD_FORMAT_VERSION] ?? null ) === self::$VERSION &&
+                               $wrapped[self::$FLD_TIME] >= $this->epoch
                        ) {
-                               if ( $wrapped[self::FLD_TTL] > 0 ) {
+                               if ( $wrapped[self::$FLD_TTL] > 0 ) {
                                        // Get the approximate time left on the key
-                                       $age = $now - $wrapped[self::FLD_TIME];
-                                       $curTTL = max( $wrapped[self::FLD_TTL] - $age, 0.0 );
+                                       $age = $now - $wrapped[self::$FLD_TIME];
+                                       $curTTL = max( $wrapped[self::$FLD_TTL] - $age, 0.0 );
                                } else {
                                        // Key had no TTL, so the time left is unbounded
                                        $curTTL = INF;
                                }
-                               $value = $wrapped[self::FLD_VALUE];
-                               $info['version'] = $wrapped[self::FLD_VALUE_VERSION] ?? null;
-                               $info['asOf'] = $wrapped[self::FLD_TIME];
+                               $value = $wrapped[self::$FLD_VALUE];
+                               $info['version'] = $wrapped[self::$FLD_VALUE_VERSION] ?? null;
+                               $info['asOf'] = $wrapped[self::$FLD_TIME];
                                $info['curTTL'] = $curTTL;
                        }
                } else {
@@ -2416,8 +2444,8 @@ class WANObjectCache implements IExpiringStore, IStoreKeyEncoder, LoggerAwareInt
                        $purge = $this->parsePurgeValue( $wrapped );
                        if ( $purge !== false ) {
                                // Tombstoned keys should always have a negative current $ttl
-                               $info['curTTL'] = min( $purge[self::PURGE_TIME] - $now, self::TINY_NEGATIVE );
-                               $info['tombAsOf'] = $purge[self::PURGE_TIME];
+                               $info['curTTL'] = min( $purge[self::$PURGE_TIME] - $now, self::$TINY_NEGATIVE );
+                               $info['tombAsOf'] = $purge[self::$PURGE_TIME];
                        }
                }
 
@@ -2459,8 +2487,10 @@ class WANObjectCache implements IExpiringStore, IStoreKeyEncoder, LoggerAwareInt
                }
 
                $segments = explode( ':', $value, 3 );
-               if ( !isset( $segments[0] ) || !isset( $segments[1] )
-                       || "{$segments[0]}:" !== self::PURGE_VAL_PREFIX
+               if (
+                       !isset( $segments[0] ) ||
+                       !isset( $segments[1] ) ||
+                       "{$segments[0]}:" !== self::$PURGE_VAL_PREFIX
                ) {
                        return false;
                }
@@ -2476,8 +2506,8 @@ class WANObjectCache implements IExpiringStore, IStoreKeyEncoder, LoggerAwareInt
                }
 
                return [
-                       self::PURGE_TIME => (float)$segments[1],
-                       self::PURGE_HOLDOFF => (int)$segments[2],
+                       self::$PURGE_TIME => (float)$segments[1],
+                       self::$PURGE_HOLDOFF => (int)$segments[2],
                ];
        }
 
@@ -2487,7 +2517,7 @@ class WANObjectCache implements IExpiringStore, IStoreKeyEncoder, LoggerAwareInt
         * @return string Wrapped purge value
         */
        private function makePurgeValue( $timestamp, $holdoff ) {
-               return self::PURGE_VAL_PREFIX . (float)$timestamp . ':' . (int)$holdoff;
+               return self::$PURGE_VAL_PREFIX . (float)$timestamp . ':' . (int)$holdoff;
        }
 
        /**
@@ -2547,18 +2577,18 @@ class WANObjectCache implements IExpiringStore, IStoreKeyEncoder, LoggerAwareInt
                $keysWarmUp = [];
                // Get all the value keys to fetch...
                foreach ( $keys as $key ) {
-                       $keysWarmUp[] = self::VALUE_KEY_PREFIX . $key;
+                       $keysWarmUp[] = self::$VALUE_KEY_PREFIX . $key;
                }
                // Get all the check keys to fetch...
                foreach ( $checkKeys as $i => $checkKeyOrKeys ) {
                        if ( is_int( $i ) ) {
                                // Single check key that applies to all value keys
-                               $keysWarmUp[] = self::TIME_KEY_PREFIX . $checkKeyOrKeys;
+                               $keysWarmUp[] = self::$TIME_KEY_PREFIX . $checkKeyOrKeys;
                        } else {
                                // List of check keys that apply to value key $i
                                $keysWarmUp = array_merge(
                                        $keysWarmUp,
-                                       self::prefixCacheKeys( $checkKeyOrKeys, self::TIME_KEY_PREFIX )
+                                       self::prefixCacheKeys( $checkKeyOrKeys, self::$TIME_KEY_PREFIX )
                                );
                        }
                }
index d75b344..0e4e3fb 100644 (file)
  *
  * @ingroup Cache
  */
-class WinCacheBagOStuff extends BagOStuff {
+class WinCacheBagOStuff extends MediumSpecificBagOStuff {
        protected function doGet( $key, $flags = 0, &$casToken = null ) {
                $casToken = null;
 
                $blob = wincache_ucache_get( $key );
-               if ( !is_string( $blob ) ) {
+               if ( !is_string( $blob ) && !is_int( $blob ) ) {
                        return false;
                }
 
index 048b567..3bc19ff 100644 (file)
@@ -23,6 +23,8 @@
  * @since 1.22
  */
 
+use MediaWiki\Storage\RevisionRecord;
+
 /**
  * This class formats delete log entries.
  *
@@ -280,10 +282,10 @@ class DeleteLogFormatter extends LogFormatter {
                        ];
 
                        static $fields = [
-                               Revision::DELETED_TEXT => 'content',
-                               Revision::DELETED_COMMENT => 'comment',
-                               Revision::DELETED_USER => 'user',
-                               Revision::DELETED_RESTRICTED => 'restricted',
+                               RevisionRecord::DELETED_TEXT => 'content',
+                               RevisionRecord::DELETED_COMMENT => 'comment',
+                               RevisionRecord::DELETED_USER => 'user',
+                               RevisionRecord::DELETED_RESTRICTED => 'restricted',
                        ];
 
                        if ( isset( $rawParams['6::ofield'] ) ) {
index 7e5a8a4..9226875 100644 (file)
@@ -36,7 +36,7 @@ use Wikimedia\WaitConditionLoop;
  *
  * @ingroup Cache
  */
-class SqlBagOStuff extends BagOStuff {
+class SqlBagOStuff extends MediumSpecificBagOStuff {
        /** @var array[] (server index => server config) */
        protected $serverInfos;
        /** @var string[] (server index => tag/host name) */
@@ -55,8 +55,6 @@ class SqlBagOStuff extends BagOStuff {
        protected $tableName = 'objectcache';
        /** @var bool */
        protected $replicaOnly = false;
-       /** @var int */
-       protected $syncTimeout = 3;
 
        /** @var LoadBalancer|null */
        protected $separateMainLB;
@@ -159,9 +157,6 @@ class SqlBagOStuff extends BagOStuff {
                if ( isset( $params['shards'] ) ) {
                        $this->shards = intval( $params['shards'] );
                }
-               if ( isset( $params['syncTimeout'] ) ) {
-                       $this->syncTimeout = $params['syncTimeout'];
-               }
                // Backwards-compatibility for < 1.34
                $this->replicaOnly = $params['replicaOnly'] ?? ( $params['slaveOnly'] ?? false );
        }
index 4e28085..f158e4d 100644 (file)
@@ -454,7 +454,9 @@ class Article implements Page {
                $this->mRevIdFetched = $this->mRevision->getId();
                $this->fetchResult = Status::newGood( $this->mRevision );
 
-               if ( !$this->mRevision->userCan( Revision::DELETED_TEXT, $this->getContext()->getUser() ) ) {
+               if (
+                       !$this->mRevision->userCan( RevisionRecord::DELETED_TEXT, $this->getContext()->getUser() )
+               ) {
                        wfDebug( __METHOD__ . " failed to retrieve content of revision " .
                                $this->mRevision->getId() . "\n" );
 
@@ -466,7 +468,7 @@ class Article implements Page {
 
                if ( Hooks::isRegistered( 'ArticleAfterFetchContentObject' ) ) {
                        $contentObject = $this->mRevision->getContent(
-                               Revision::FOR_THIS_USER,
+                               RevisionRecord::FOR_THIS_USER,
                                $this->getContext()->getUser()
                        );
 
@@ -489,7 +491,7 @@ class Article implements Page {
 
                // For B/C only
                $this->mContentObject = $this->mRevision->getContent(
-                       Revision::FOR_THIS_USER,
+                       RevisionRecord::FOR_THIS_USER,
                        $this->getContext()->getUser()
                );
 
@@ -1481,7 +1483,7 @@ class Article implements Page {
         * @return bool True if the view is allowed, false if not.
         */
        public function showDeletedRevisionHeader() {
-               if ( !$this->mRevision->isDeleted( Revision::DELETED_TEXT ) ) {
+               if ( !$this->mRevision->isDeleted( RevisionRecord::DELETED_TEXT ) ) {
                        // Not deleted
                        return true;
                }
@@ -1489,7 +1491,7 @@ class Article implements Page {
                $outputPage = $this->getContext()->getOutput();
                $user = $this->getContext()->getUser();
                // If the user is not allowed to see it...
-               if ( !$this->mRevision->userCan( Revision::DELETED_TEXT, $user ) ) {
+               if ( !$this->mRevision->userCan( RevisionRecord::DELETED_TEXT, $user ) ) {
                        $outputPage->wrapWikiMsg( "<div class='mw-warning plainlinks'>\n$1\n</div>\n",
                                'rev-deleted-text-permission' );
 
@@ -1499,7 +1501,7 @@ class Article implements Page {
                        # Give explanation and add a link to view the revision...
                        $oldid = intval( $this->getOldID() );
                        $link = $this->getTitle()->getFullURL( "oldid={$oldid}&unhide=1" );
-                       $msg = $this->mRevision->isDeleted( Revision::DELETED_RESTRICTED ) ?
+                       $msg = $this->mRevision->isDeleted( RevisionRecord::DELETED_RESTRICTED ) ?
                                'rev-suppressed-text-unhide' : 'rev-deleted-text-unhide';
                        $outputPage->wrapWikiMsg( "<div class='mw-warning plainlinks'>\n$1\n</div>\n",
                                [ $msg, $link ] );
@@ -1507,7 +1509,7 @@ class Article implements Page {
                        return false;
                // We are allowed to see...
                } else {
-                       $msg = $this->mRevision->isDeleted( Revision::DELETED_RESTRICTED ) ?
+                       $msg = $this->mRevision->isDeleted( RevisionRecord::DELETED_RESTRICTED ) ?
                                'rev-suppressed-text-view' : 'rev-deleted-text-view';
                        $outputPage->wrapWikiMsg( "<div class='mw-warning plainlinks'>\n$1\n</div>\n", $msg );
 
@@ -2412,7 +2414,7 @@ class Article implements Page {
         * Call to WikiPage function for backwards compatibility.
         * @see WikiPage::getComment
         */
-       public function getComment( $audience = Revision::FOR_PUBLIC, User $user = null ) {
+       public function getComment( $audience = RevisionRecord::FOR_PUBLIC, User $user = null ) {
                return $this->mPage->getComment( $audience, $user );
        }
 
@@ -2444,7 +2446,7 @@ class Article implements Page {
         * Call to WikiPage function for backwards compatibility.
         * @see WikiPage::getCreator
         */
-       public function getCreator( $audience = Revision::FOR_PUBLIC, User $user = null ) {
+       public function getCreator( $audience = RevisionRecord::FOR_PUBLIC, User $user = null ) {
                return $this->mPage->getCreator( $audience, $user );
        }
 
@@ -2556,7 +2558,7 @@ class Article implements Page {
         * Call to WikiPage function for backwards compatibility.
         * @see WikiPage::getUser
         */
-       public function getUser( $audience = Revision::FOR_PUBLIC, User $user = null ) {
+       public function getUser( $audience = RevisionRecord::FOR_PUBLIC, User $user = null ) {
                return $this->mPage->getUser( $audience, $user );
        }
 
@@ -2564,7 +2566,7 @@ class Article implements Page {
         * Call to WikiPage function for backwards compatibility.
         * @see WikiPage::getUserText
         */
-       public function getUserText( $audience = Revision::FOR_PUBLIC, User $user = null ) {
+       public function getUserText( $audience = RevisionRecord::FOR_PUBLIC, User $user = null ) {
                return $this->mPage->getUserText( $audience, $user );
        }
 
index fdba6fb..173fdc6 100644 (file)
@@ -813,7 +813,7 @@ class WikiPage implements Page, IDBAccessObject {
         *
         * @since 1.21
         */
-       public function getContent( $audience = Revision::FOR_PUBLIC, User $user = null ) {
+       public function getContent( $audience = RevisionRecord::FOR_PUBLIC, User $user = null ) {
                $this->loadLastEdit();
                if ( $this->mLastRevision ) {
                        return $this->mLastRevision->getContent( $audience, $user );
@@ -851,7 +851,7 @@ class WikiPage implements Page, IDBAccessObject {
         *   to the $audience parameter
         * @return int User ID for the user that made the last article revision
         */
-       public function getUser( $audience = Revision::FOR_PUBLIC, User $user = null ) {
+       public function getUser( $audience = RevisionRecord::FOR_PUBLIC, User $user = null ) {
                $this->loadLastEdit();
                if ( $this->mLastRevision ) {
                        return $this->mLastRevision->getUser( $audience, $user );
@@ -870,7 +870,7 @@ class WikiPage implements Page, IDBAccessObject {
         *   to the $audience parameter
         * @return User|null
         */
-       public function getCreator( $audience = Revision::FOR_PUBLIC, User $user = null ) {
+       public function getCreator( $audience = RevisionRecord::FOR_PUBLIC, User $user = null ) {
                $revision = $this->getOldestRevision();
                if ( $revision ) {
                        $userName = $revision->getUserText( $audience, $user );
@@ -889,7 +889,7 @@ class WikiPage implements Page, IDBAccessObject {
         *   to the $audience parameter
         * @return string Username of the user that made the last article revision
         */
-       public function getUserText( $audience = Revision::FOR_PUBLIC, User $user = null ) {
+       public function getUserText( $audience = RevisionRecord::FOR_PUBLIC, User $user = null ) {
                $this->loadLastEdit();
                if ( $this->mLastRevision ) {
                        return $this->mLastRevision->getUserText( $audience, $user );
@@ -908,7 +908,7 @@ class WikiPage implements Page, IDBAccessObject {
         * @return string|null Comment stored for the last article revision, or null if the specified
         *  audience does not have access to the comment.
         */
-       public function getComment( $audience = Revision::FOR_PUBLIC, User $user = null ) {
+       public function getComment( $audience = RevisionRecord::FOR_PUBLIC, User $user = null ) {
                $this->loadLastEdit();
                if ( $this->mLastRevision ) {
                        return $this->mLastRevision->getComment( $audience, $user );
@@ -1176,7 +1176,7 @@ class WikiPage implements Page, IDBAccessObject {
                $conds[] = 'NOT(' . $actorMigration->getWhere( $dbr, 'rev_user', $user )['conds'] . ')';
 
                // Username hidden?
-               $conds[] = "{$dbr->bitAnd( 'rev_deleted', Revision::DELETED_USER )} = 0";
+               $conds[] = "{$dbr->bitAnd( 'rev_deleted', RevisionRecord::DELETED_USER )} = 0";
 
                $jconds = [
                        'user' => [ 'LEFT JOIN', $actorQuery['fields']['rev_user'] . ' = user_id' ],
@@ -2695,7 +2695,7 @@ class WikiPage implements Page, IDBAccessObject {
                // we need to remember the old content so we can use it to generate all deletion updates.
                $revision = $this->getRevision();
                try {
-                       $content = $this->getContent( Revision::RAW );
+                       $content = $this->getContent( RevisionRecord::RAW );
                } catch ( Exception $ex ) {
                        wfLogWarning( __METHOD__ . ': failed to load content during deletion! '
                                . $ex->getMessage() );
@@ -2844,7 +2844,7 @@ class WikiPage implements Page, IDBAccessObject {
 
                // Bitfields to further suppress the content
                if ( $suppress ) {
-                       $bitfield = Revision::SUPPRESSED_ALL;
+                       $bitfield = RevisionRecord::SUPPRESSED_ALL;
                        $revQuery['fields'] = array_diff( $revQuery['fields'], [ 'rev_deleted' ] );
                }
 
@@ -3768,7 +3768,7 @@ class WikiPage implements Page, IDBAccessObject {
                        $slotContent = [ SlotRecord::MAIN => $rev ];
                } else {
                        $slotContent = array_map( function ( SlotRecord $slot ) {
-                               return $slot->getContent( Revision::RAW );
+                               return $slot->getContent( RevisionRecord::RAW );
                        }, $rev->getSlots()->getSlots() );
                }
 
index 863b5e8..6600f8f 100644 (file)
@@ -903,7 +903,7 @@ class Parser {
        /**
         * Accessor for the Title object
         *
-        * @return Title
+        * @return Title|null
         */
        public function getTitle() {
                return $this->mTitle;
index 457648a..fca06c9 100644 (file)
@@ -177,7 +177,7 @@ class MessageBlobStore implements LoggerAwareInterface {
                // - This global check key invalidates message blobs for all modules for all wikis
                //   in cache contexts (e.g. languages, skins). Setting a hold-off on this key could
                //   cause a cache stampede since no values would be stored for several seconds.
-               $cache->touchCheckKey( $cache->makeGlobalKey( __CLASS__ ), $cache::HOLDOFF_NONE );
+               $cache->touchCheckKey( $cache->makeGlobalKey( __CLASS__ ), $cache::HOLDOFF_TTL_NONE );
        }
 
        /**
index fbc59fe..af30313 100644 (file)
@@ -1159,11 +1159,12 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
                                                throw new MWException( __METHOD__ . ": invalid versionCallback for file" .
                                                        " \"{$fileInfo['name']}\" in module \"{$this->getName()}\"" );
                                        }
-                                       $expanded['definitionSummary'] = ( $fileInfo['versionCallback'] )( $context );
+                                       $expanded['definitionSummary'] =
+                                               ( $fileInfo['versionCallback'] )( $context, $this->getConfig() );
                                        // Don't invoke 'callback' here as it may be expensive (T223260).
                                        $expanded['callback'] = $fileInfo['callback'];
                                } else {
-                                       $expanded['content'] = ( $fileInfo['callback'] )( $context );
+                                       $expanded['content'] = ( $fileInfo['callback'] )( $context, $this->getConfig() );
                                }
                        } elseif ( isset( $fileInfo['config'] ) ) {
                                if ( $type !== 'data' ) {
@@ -1240,7 +1241,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
                                $fileInfo['content'] = $content;
                                unset( $fileInfo['filePath'] );
                        } elseif ( isset( $fileInfo['callback'] ) ) {
-                               $fileInfo['content'] = ( $fileInfo['callback'] )( $context );
+                               $fileInfo['content'] = ( $fileInfo['callback'] )( $context, $this->getConfig() );
                                unset( $fileInfo['callback'] );
                        }
 
index d37c31b..b104073 100644 (file)
@@ -23,6 +23,7 @@
  */
 
 use MediaWiki\Linker\LinkTarget;
+use MediaWiki\Storage\RevisionRecord;
 use Wikimedia\Assert\Assert;
 use Wikimedia\Rdbms\Database;
 use Wikimedia\Rdbms\IDatabase;
@@ -220,7 +221,7 @@ class ResourceLoaderWikiModule extends ResourceLoaderModule {
                        if ( !$revision ) {
                                return null;
                        }
-                       $content = $revision->getContent( Revision::RAW );
+                       $content = $revision->getContent( RevisionRecord::RAW );
 
                        if ( !$content ) {
                                $this->getLogger()->error(
index 00e40a0..ab9830f 100644 (file)
@@ -19,6 +19,8 @@
  * @ingroup RevisionDelete
  */
 
+use MediaWiki\Storage\RevisionRecord;
+
 /**
  * Item class for a filearchive table row
  */
@@ -109,8 +111,8 @@ class RevDelArchivedFileItem extends RevDelFileItem {
                        'width' => $file->getWidth(),
                        'height' => $file->getHeight(),
                        'size' => $file->getSize(),
-                       'userhidden' => (bool)$file->isDeleted( Revision::DELETED_USER ),
-                       'commenthidden' => (bool)$file->isDeleted( Revision::DELETED_COMMENT ),
+                       'userhidden' => (bool)$file->isDeleted( RevisionRecord::DELETED_USER ),
+                       'commenthidden' => (bool)$file->isDeleted( RevisionRecord::DELETED_COMMENT ),
                        'contenthidden' => (bool)$this->isDeleted(),
                ];
                if ( $this->canViewContent() ) {
@@ -124,13 +126,13 @@ class RevDelArchivedFileItem extends RevDelFileItem {
                                ),
                        ];
                }
-               if ( $file->userCan( Revision::DELETED_USER, $user ) ) {
+               if ( $file->userCan( RevisionRecord::DELETED_USER, $user ) ) {
                        $ret += [
                                'userid' => $file->getUser( 'id' ),
                                'user' => $file->getUser( 'text' ),
                        ];
                }
-               if ( $file->userCan( Revision::DELETED_COMMENT, $user ) ) {
+               if ( $file->userCan( RevisionRecord::DELETED_COMMENT, $user ) ) {
                        $ret += [
                                'comment' => $file->getRawDescription(),
                        ];
index c7941b7..8c080ba 100644 (file)
@@ -19,6 +19,8 @@
  * @ingroup RevisionDelete
  */
 
+use MediaWiki\Storage\RevisionRecord;
+
 /**
  * Item class for an oldimage table row
  */
@@ -164,14 +166,14 @@ class RevDelFileItem extends RevDelItem {
         * @return string HTML
         */
        protected function getUserTools() {
-               if ( $this->file->userCan( Revision::DELETED_USER, $this->list->getUser() ) ) {
+               if ( $this->file->userCan( RevisionRecord::DELETED_USER, $this->list->getUser() ) ) {
                        $uid = $this->file->getUser( 'id' );
                        $name = $this->file->getUser( 'text' );
                        $link = Linker::userLink( $uid, $name ) . Linker::userToolLinks( $uid, $name );
                } else {
                        $link = $this->list->msg( 'rev-deleted-user' )->escaped();
                }
-               if ( $this->file->isDeleted( Revision::DELETED_USER ) ) {
+               if ( $this->file->isDeleted( RevisionRecord::DELETED_USER ) ) {
                        return '<span class="history-deleted">' . $link . '</span>';
                }
 
@@ -217,8 +219,8 @@ class RevDelFileItem extends RevDelItem {
                        'width' => $file->getWidth(),
                        'height' => $file->getHeight(),
                        'size' => $file->getSize(),
-                       'userhidden' => (bool)$file->isDeleted( Revision::DELETED_USER ),
-                       'commenthidden' => (bool)$file->isDeleted( Revision::DELETED_COMMENT ),
+                       'userhidden' => (bool)$file->isDeleted( RevisionRecord::DELETED_USER ),
+                       'commenthidden' => (bool)$file->isDeleted( RevisionRecord::DELETED_COMMENT ),
                        'contenthidden' => (bool)$this->isDeleted(),
                ];
                if ( !$this->isDeleted() ) {
@@ -236,13 +238,13 @@ class RevDelFileItem extends RevDelItem {
                                ),
                        ];
                }
-               if ( $file->userCan( Revision::DELETED_USER, $user ) ) {
+               if ( $file->userCan( RevisionRecord::DELETED_USER, $user ) ) {
                        $ret += [
                                'userid' => $file->user,
                                'user' => $file->user_text,
                        ];
                }
-               if ( $file->userCan( Revision::DELETED_COMMENT, $user ) ) {
+               if ( $file->userCan( RevisionRecord::DELETED_COMMENT, $user ) ) {
                        $ret += [
                                'comment' => $file->description,
                        ];
index 221359d..680ae8e 100644 (file)
@@ -20,6 +20,7 @@
  */
 
 use MediaWiki\MediaWikiServices;
+use MediaWiki\Storage\RevisionRecord;
 
 /**
  * Abstract base class for a list of deletable items. The list class
@@ -195,7 +196,7 @@ abstract class RevDelList extends RevisionListBase {
                                $status->failCount++;
                                continue;
                        // Cannot just "hide from Sysops" without hiding any fields
-                       } elseif ( $newBits == Revision::DELETED_RESTRICTED ) {
+                       } elseif ( $newBits == RevisionRecord::DELETED_RESTRICTED ) {
                                $itemStatus->warning(
                                        'revdelete-only-restricted', $item->formatDate(), $item->formatTime() );
                                $status->failCount++;
index 54a715d..edb86da 100644 (file)
@@ -19,6 +19,8 @@
  * @ingroup RevisionDelete
  */
 
+use MediaWiki\Storage\RevisionRecord;
+
 /**
  * Item class for a logging table row
  */
@@ -44,7 +46,9 @@ class RevDelLogItem extends RevDelItem {
        }
 
        public function canView() {
-               return LogEventsList::userCan( $this->row, Revision::DELETED_RESTRICTED, $this->list->getUser() );
+               return LogEventsList::userCan(
+                       $this->row, RevisionRecord::DELETED_RESTRICTED, $this->list->getUser()
+               );
        }
 
        public function canViewContent() {
index b26fffd..fcdcb9a 100644 (file)
@@ -19,6 +19,7 @@
  * @ingroup RevisionDelete
  */
 
+use MediaWiki\Storage\RevisionRecord;
 use Wikimedia\Rdbms\IDatabase;
 
 /**
@@ -91,7 +92,7 @@ class RevDelLogList extends RevDelList {
        }
 
        public function getSuppressBit() {
-               return Revision::DELETED_RESTRICTED;
+               return RevisionRecord::DELETED_RESTRICTED;
        }
 
        public function getLogAction() {
index 6eb0b37..a5859e5 100644 (file)
@@ -19,6 +19,8 @@
  * @ingroup RevisionDelete
  */
 
+use MediaWiki\Storage\RevisionRecord;
+
 /**
  * Item class for a live revision table row
  */
@@ -63,11 +65,15 @@ class RevDelRevisionItem extends RevDelItem {
        }
 
        public function canView() {
-               return $this->revision->userCan( Revision::DELETED_RESTRICTED, $this->list->getUser() );
+               return $this->revision->userCan(
+                       RevisionRecord::DELETED_RESTRICTED, $this->list->getUser()
+               );
        }
 
        public function canViewContent() {
-               return $this->revision->userCan( Revision::DELETED_TEXT, $this->list->getUser() );
+               return $this->revision->userCan(
+                       RevisionRecord::DELETED_TEXT, $this->list->getUser()
+               );
        }
 
        public function getBits() {
@@ -108,11 +114,11 @@ class RevDelRevisionItem extends RevDelItem {
        }
 
        public function isDeleted() {
-               return $this->revision->isDeleted( Revision::DELETED_TEXT );
+               return $this->revision->isDeleted( RevisionRecord::DELETED_TEXT );
        }
 
        public function isHideCurrentOp( $newBits ) {
-               return ( $newBits & Revision::DELETED_TEXT )
+               return ( $newBits & RevisionRecord::DELETED_TEXT )
                        && $this->list->getCurrent() == $this->getId();
        }
 
@@ -203,19 +209,19 @@ class RevDelRevisionItem extends RevDelItem {
                $ret = [
                        'id' => $rev->getId(),
                        'timestamp' => wfTimestamp( TS_ISO_8601, $rev->getTimestamp() ),
-                       'userhidden' => (bool)$rev->isDeleted( Revision::DELETED_USER ),
-                       'commenthidden' => (bool)$rev->isDeleted( Revision::DELETED_COMMENT ),
-                       'texthidden' => (bool)$rev->isDeleted( Revision::DELETED_TEXT ),
+                       'userhidden' => (bool)$rev->isDeleted( RevisionRecord::DELETED_USER ),
+                       'commenthidden' => (bool)$rev->isDeleted( RevisionRecord::DELETED_COMMENT ),
+                       'texthidden' => (bool)$rev->isDeleted( RevisionRecord::DELETED_TEXT ),
                ];
-               if ( $rev->userCan( Revision::DELETED_USER, $user ) ) {
+               if ( $rev->userCan( RevisionRecord::DELETED_USER, $user ) ) {
                        $ret += [
-                               'userid' => $rev->getUser( Revision::FOR_THIS_USER ),
-                               'user' => $rev->getUserText( Revision::FOR_THIS_USER ),
+                               'userid' => $rev->getUser( RevisionRecord::FOR_THIS_USER ),
+                               'user' => $rev->getUserText( RevisionRecord::FOR_THIS_USER ),
                        ];
                }
-               if ( $rev->userCan( Revision::DELETED_COMMENT, $user ) ) {
+               if ( $rev->userCan( RevisionRecord::DELETED_COMMENT, $user ) ) {
                        $ret += [
-                               'comment' => $rev->getComment( Revision::FOR_THIS_USER ),
+                               'comment' => $rev->getComment( RevisionRecord::FOR_THIS_USER ),
                        ];
                }
 
index 07362c4..0705503 100644 (file)
@@ -19,6 +19,7 @@
  * @ingroup RevisionDelete
  */
 
+use MediaWiki\Storage\RevisionRecord;
 use Wikimedia\Rdbms\FakeResultWrapper;
 use Wikimedia\Rdbms\IDatabase;
 
@@ -48,7 +49,7 @@ class RevDelRevisionList extends RevDelList {
        }
 
        public static function getRevdelConstant() {
-               return Revision::DELETED_TEXT;
+               return RevisionRecord::DELETED_TEXT;
        }
 
        public static function suggestTarget( $target, array $ids ) {
@@ -167,7 +168,7 @@ class RevDelRevisionList extends RevDelList {
        }
 
        public function getSuppressBit() {
-               return Revision::DELETED_RESTRICTED;
+               return RevisionRecord::DELETED_RESTRICTED;
        }
 
        public function doPreCommitUpdates() {
index f7f7e89..5644b95 100644 (file)
@@ -21,6 +21,7 @@
  * @ingroup RevisionDelete
  */
 
+use MediaWiki\Storage\RevisionRecord;
 use Wikimedia\Rdbms\IDatabase;
 
 /**
@@ -52,13 +53,13 @@ class RevisionDeleteUser {
                        $dbw = wfGetDB( DB_MASTER );
                }
 
-               # To suppress, we OR the current bitfields with Revision::DELETED_USER
+               # To suppress, we OR the current bitfields with RevisionRecord::DELETED_USER
                # to put a 1 in the username *_deleted bit. To unsuppress we AND the
-               # current bitfields with the inverse of Revision::DELETED_USER. The
+               # current bitfields with the inverse of RevisionRecord::DELETED_USER. The
                # username bit is made to 0 (x & 0 = 0), while others are unchanged (x & 1 = x).
                # The same goes for the sysop-restricted *_deleted bit.
-               $delUser = Revision::DELETED_USER | Revision::DELETED_RESTRICTED;
-               $delAction = LogPage::DELETED_ACTION | Revision::DELETED_RESTRICTED;
+               $delUser = RevisionRecord::DELETED_USER | RevisionRecord::DELETED_RESTRICTED;
+               $delAction = LogPage::DELETED_ACTION | RevisionRecord::DELETED_RESTRICTED;
                if ( $op === '&' ) {
                        $delUser = $dbw->bitNot( $delUser );
                        $delAction = $dbw->bitNot( $delAction );
index 7b2147a..3ab96cb 100644 (file)
@@ -21,6 +21,8 @@
  * @ingroup RevisionDelete
  */
 
+use MediaWiki\Storage\RevisionRecord;
+
 /**
  * General controller for RevDel, used by both SpecialRevisiondelete and
  * ApiRevisionDelete.
@@ -129,14 +131,14 @@ class RevisionDeleter {
                $ret = [ 0 => [], 1 => [], 2 => [] ];
                // Build bitfield changes in language
                self::checkItem( 'revdelete-content',
-                       Revision::DELETED_TEXT, $diff, $n, $ret );
+                       RevisionRecord::DELETED_TEXT, $diff, $n, $ret );
                self::checkItem( 'revdelete-summary',
-                       Revision::DELETED_COMMENT, $diff, $n, $ret );
+                       RevisionRecord::DELETED_COMMENT, $diff, $n, $ret );
                self::checkItem( 'revdelete-uname',
-                       Revision::DELETED_USER, $diff, $n, $ret );
+                       RevisionRecord::DELETED_USER, $diff, $n, $ret );
                // Restriction application to sysops
-               if ( $diff & Revision::DELETED_RESTRICTED ) {
-                       if ( $n & Revision::DELETED_RESTRICTED ) {
+               if ( $diff & RevisionRecord::DELETED_RESTRICTED ) {
+                       if ( $n & RevisionRecord::DELETED_RESTRICTED ) {
                                $ret[2][] = 'revdelete-restricted';
                        } else {
                                $ret[2][] = 'revdelete-unrestricted';
index faf8d82..bf90c06 100644 (file)
@@ -20,6 +20,8 @@
  * @file
  */
 
+use MediaWiki\Storage\RevisionRecord;
+
 /**
  * Item class for a live revision table row
  */
@@ -53,15 +55,19 @@ class RevisionItem extends RevisionItemBase {
        }
 
        public function canView() {
-               return $this->revision->userCan( Revision::DELETED_RESTRICTED, $this->context->getUser() );
+               return $this->revision->userCan(
+                       RevisionRecord::DELETED_RESTRICTED, $this->context->getUser()
+               );
        }
 
        public function canViewContent() {
-               return $this->revision->userCan( Revision::DELETED_TEXT, $this->context->getUser() );
+               return $this->revision->userCan(
+                       RevisionRecord::DELETED_TEXT, $this->context->getUser()
+               );
        }
 
        public function isDeleted() {
-               return $this->revision->isDeleted( Revision::DELETED_TEXT );
+               return $this->revision->isDeleted( RevisionRecord::DELETED_TEXT );
        }
 
        /**
index 29bd463..ce3fc26 100644 (file)
@@ -13,7 +13,7 @@ class AugmentPageProps implements ResultSetAugmentor {
                $this->propnames = $propnames;
        }
 
-       public function augmentAll( SearchResultSet $resultSet ) {
+       public function augmentAll( ISearchResultSet $resultSet ) {
                $titles = $resultSet->extractTitles();
                return PageProps::getInstance()->getProperties( $titles, $this->propnames );
        }
diff --git a/includes/search/ISearchResultSet.php b/includes/search/ISearchResultSet.php
new file mode 100644 (file)
index 0000000..1b30f5a
--- /dev/null
@@ -0,0 +1,142 @@
+<?php
+
+/**
+ * @ingroup Search
+ */
+interface ISearchResultSet extends \Countable, \IteratorAggregate {
+       /**
+        * Identifier for interwiki results that are displayed only together with existing main wiki
+        * results.
+        */
+       const SECONDARY_RESULTS = 0;
+
+       /**
+        * Identifier for interwiki results that can be displayed even if no existing main wiki results
+        * exist.
+        */
+       const INLINE_RESULTS = 1;
+
+       /**
+        * @return int
+        */
+       function numRows();
+
+       /**
+        * Some search modes return a total hit count for the query
+        * in the entire article database. This may include pages
+        * in namespaces that would not be matched on the given
+        * settings.
+        *
+        * Return null if no total hits number is supported.
+        *
+        * @return int|null
+        */
+       function getTotalHits();
+
+       /**
+        * Some search modes will run an alternative query that it thinks gives
+        * a better result than the provided search. Returns true if this has
+        * occurred.
+        *
+        * @return bool
+        */
+       function hasRewrittenQuery();
+
+       /**
+        * @return string|null The search the query was internally rewritten to,
+        *  or null when the result of the original query was returned.
+        */
+       function getQueryAfterRewrite();
+
+       /**
+        * @return string|null Same as self::getQueryAfterRewrite(), but in HTML
+        *  and with changes highlighted. Null when the query was not rewritten.
+        */
+       function getQueryAfterRewriteSnippet();
+
+       /**
+        * Some search modes return a suggested alternate term if there are
+        * no exact hits. Returns true if there is one on this set.
+        *
+        * @return bool
+        */
+       function hasSuggestion();
+
+       /**
+        * @return string|null Suggested query, null if none
+        */
+       function getSuggestionQuery();
+
+       /**
+        * @return string HTML highlighted suggested query, '' if none
+        */
+       function getSuggestionSnippet();
+
+       /**
+        * Return a result set of hits on other (multiple) wikis associated with this one
+        *
+        * @param int $type
+        * @return ISearchResultSet[]
+        */
+       function getInterwikiResults( $type = self::SECONDARY_RESULTS );
+
+       /**
+        * Check if there are results on other wikis
+        *
+        * @param int $type
+        * @return bool
+        */
+       function hasInterwikiResults( $type = self::SECONDARY_RESULTS );
+
+       /**
+        * Did the search contain search syntax?  If so, Special:Search won't offer
+        * the user a link to a create a page named by the search string because the
+        * name would contain the search syntax.
+        * @return bool
+        */
+       public function searchContainedSyntax();
+
+       /**
+        * @return bool True when there are more pages of search results available.
+        */
+       public function hasMoreResults();
+
+       /**
+        * @param int $limit Shrink result set to $limit and flag
+        *  if more results are available.
+        */
+       public function shrink( $limit );
+
+       /**
+        * Extract all the results in the result set as array.
+        * @return SearchResult[]
+        */
+       public function extractResults();
+
+       /**
+        * Extract all the titles in the result set.
+        * @return Title[]
+        */
+       public function extractTitles();
+
+       /**
+        * Sets augmented data for result set.
+        * @param string $name Extra data item name
+        * @param array[] $data Extra data as PAGEID => data
+        */
+       public function setAugmentedData( $name, $data );
+
+       /**
+        * Returns extra data for specific result and store it in SearchResult object.
+        * @param SearchResult $result
+        */
+       public function augmentResult( SearchResult $result );
+
+       /**
+        * @return int|null The offset the current page starts at. Typically
+        *  this should be null to allow the UI to decide on its own, but in
+        *  special cases like interleaved AB tests specifying explicitly is
+        *  necessary.
+        */
+       public function getOffset();
+}
index 97ef2d5..f132e13 100644 (file)
@@ -2,7 +2,7 @@
 
 /**
  * Marker class for search engines that can handle their own pagination, by
- * reporting in their SearchResultSet when a next page is available. This
+ * reporting in their ISearchResultSet when a next page is available. This
  * only applies to search{Title,Text} and not to completion search.
  *
  * SearchEngine implementations not implementing this interface will have
index a3979f7..6430a8a 100644 (file)
@@ -20,10 +20,10 @@ class PerRowAugmentor implements ResultSetAugmentor {
 
        /**
         * Produce data to augment search result set.
-        * @param SearchResultSet $resultSet
+        * @param ISearchResultSet $resultSet
         * @return array Data for all results
         */
-       public function augmentAll( SearchResultSet $resultSet ) {
+       public function augmentAll( ISearchResultSet $resultSet ) {
                $data = [];
                foreach ( $resultSet->extractResults() as $result ) {
                        $id = $result->getTitle()->getArticleID();
index e2d79a9..aabdde6 100644 (file)
@@ -6,8 +6,8 @@
 interface ResultSetAugmentor {
        /**
         * Produce data to augment search result set.
-        * @param SearchResultSet $resultSet
+        * @param ISearchResultSet $resultSet
         * @return array Data for all results
         */
-       public function augmentAll( SearchResultSet $resultSet );
+       public function augmentAll( ISearchResultSet $resultSet );
 }
index 8ea356f..0c5d4da 100644 (file)
@@ -51,7 +51,7 @@ abstract class SearchDatabase extends SearchEngine {
 
        /**
         * @param string $term
-        * @return SearchResultSet|Status|null
+        * @return ISearchResultSet|Status|null
         */
        final public function doSearchText( $term ) {
                return $this->doSearchTextInDB( $this->extractNamespacePrefix( $term ) );
@@ -67,7 +67,7 @@ abstract class SearchDatabase extends SearchEngine {
 
        /**
         * @param string $term
-        * @return SearchResultSet|null
+        * @return ISearchResultSet|null
         */
        final public function doSearchTitle( $term ) {
                return $this->doSearchTitleInDB( $this->extractNamespacePrefix( $term ) );
index 2fb4585..32b0f06 100644 (file)
@@ -79,7 +79,7 @@ abstract class SearchEngine {
         * be converted to final in 1.34. Override self::doSearchText().
         *
         * @param string $term Raw search term
-        * @return SearchResultSet|Status|null
+        * @return ISearchResultSet|Status|null
         */
        public function searchText( $term ) {
                return $this->maybePaginate( function () use ( $term ) {
@@ -91,7 +91,7 @@ abstract class SearchEngine {
         * Perform a full text search query and return a result set.
         *
         * @param string $term Raw search term
-        * @return SearchResultSet|Status|null
+        * @return ISearchResultSet|Status|null
         * @since 1.32
         */
        protected function doSearchText( $term ) {
@@ -136,7 +136,7 @@ abstract class SearchEngine {
         * be converted to final in 1.34. Override self::doSearchTitle().
         *
         * @param string $term Raw search term
-        * @return SearchResultSet|null
+        * @return ISearchResultSet|null
         */
        public function searchTitle( $term ) {
                return $this->maybePaginate( function () use ( $term ) {
@@ -148,7 +148,7 @@ abstract class SearchEngine {
         * Perform a title-only search query and return a result set.
         *
         * @param string $term Raw search term
-        * @return SearchResultSet|null
+        * @return ISearchResultSet|null
         * @since 1.32
         */
        protected function doSearchTitle( $term ) {
@@ -161,7 +161,7 @@ abstract class SearchEngine {
         * explicitly implement their own pagination.
         *
         * @param Closure $fn Takes no arguments
-        * @return SearchResultSet|Status<SearchResultSet>|null Result of calling $fn
+        * @return ISearchResultSet|Status<ISearchResultSet>|null Result of calling $fn
         */
        private function maybePaginate( Closure $fn ) {
                if ( $this instanceof PaginatingSearchEngine ) {
@@ -175,10 +175,10 @@ abstract class SearchEngine {
                }
 
                $resultSet = null;
-               if ( $resultSetOrStatus instanceof SearchResultSet ) {
+               if ( $resultSetOrStatus instanceof ISearchResultSet ) {
                        $resultSet = $resultSetOrStatus;
                } elseif ( $resultSetOrStatus instanceof Status &&
-                       $resultSetOrStatus->getValue() instanceof SearchResultSet
+                       $resultSetOrStatus->getValue() instanceof ISearchResultSet
                ) {
                        $resultSet = $resultSetOrStatus->getValue();
                }
@@ -784,9 +784,9 @@ abstract class SearchEngine {
        /**
         * Augment search results with extra data.
         *
-        * @param SearchResultSet $resultSet
+        * @param ISearchResultSet $resultSet
         */
-       public function augmentSearchResults( SearchResultSet $resultSet ) {
+       public function augmentSearchResults( ISearchResultSet $resultSet ) {
                $setAugmentors = [];
                $rowAugmentors = [];
                Hooks::run( "SearchResultsAugment", [ &$setAugmentors, &$rowAugmentors ] );
index 42bc62d..6d25aa4 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * A SearchResultSet wrapper for SearchNearMatcher
+ * A ISearchResultSet wrapper for SearchNearMatcher
  */
 class SearchNearMatchResultSet extends SearchResultSet {
        /**
index d400267..4715c75 100644 (file)
@@ -39,10 +39,10 @@ class SearchNearMatcher {
 
        /**
         * Do a near match (see SearchEngine::getNearMatch) and wrap it into a
-        * SearchResultSet.
+        * ISearchResultSet.
         *
         * @param string $searchterm
-        * @return SearchResultSet
+        * @return ISearchResultSet
         */
        public function getNearMatchResultSet( $searchterm ) {
                return new SearchNearMatchResultSet( $this->getNearMatch( $searchterm ) );
index 7703e38..a862e17 100644 (file)
@@ -66,10 +66,10 @@ class SearchResult {
         * Return a new SearchResult and initializes it with a title.
         *
         * @param Title $title
-        * @param SearchResultSet|null $parentSet
+        * @param ISearchResultSet|null $parentSet
         * @return SearchResult
         */
-       public static function newFromTitle( $title, SearchResultSet $parentSet = null ) {
+       public static function newFromTitle( $title, ISearchResultSet $parentSet = null ) {
                $result = new static();
                $result->initFromTitle( $title );
                if ( $parentSet ) {
index 5ee96cb..84f8bcf 100644 (file)
 /**
  * @ingroup Search
  */
-class SearchResultSet implements Countable, IteratorAggregate {
-
-       /**
-        * Identifier for interwiki results that are displayed only together with existing main wiki
-        * results.
-        */
-       const SECONDARY_RESULTS = 0;
-
-       /**
-        * Identifier for interwiki results that can be displayed even if no existing main wiki results
-        * exist.
-        */
-       const INLINE_RESULTS = 1;
+class SearchResultSet implements ISearchResultSet {
 
        protected $containedSyntax = false;
 
@@ -179,7 +167,7 @@ class SearchResultSet implements Countable, IteratorAggregate {
         * Return a result set of hits on other (multiple) wikis associated with this one
         *
         * @param int $type
-        * @return SearchResultSet[]
+        * @return ISearchResultSet[]
         */
        function getInterwikiResults( $type = self::SECONDARY_RESULTS ) {
                return null;
@@ -234,9 +222,9 @@ class SearchResultSet implements Countable, IteratorAggregate {
 
        /**
         * Frees the result set, if applicable.
+        * @deprecated noop since 1.34
         */
        function free() {
-               // ...
        }
 
        /**
index 87068ca..f5d795f 100644 (file)
@@ -66,14 +66,6 @@ class SqlSearchResultSet extends SearchResultSet {
                return $this->results;
        }
 
-       function free() {
-               if ( $this->resultSet === false ) {
-                       return;
-               }
-
-               $this->resultSet->free();
-       }
-
        function getTotalHits() {
                if ( !is_null( $this->totalHits ) ) {
                        return $this->totalHits;
index 7742075..4ba7868 100644 (file)
@@ -446,8 +446,9 @@ class Command {
                        // stream_select parameter names are from the POV of us being able to do the operation;
                        // proc_open desriptor types are from the POV of the process doing it.
                        // So $writePipes is passed as the $read parameter and $readPipes as $write.
-                       // phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged
-                       $numReadyPipes = @stream_select( $writePipes, $readPipes, $emptyArray, $timeout );
+                       AtEase::suppressWarnings();
+                       $numReadyPipes = stream_select( $writePipes, $readPipes, $emptyArray, $timeout );
+                       AtEase::restoreWarnings();
                        if ( $numReadyPipes === false ) {
                                $error = error_get_last();
                                if ( strncmp( $error['message'], $eintrMessage, strlen( $eintrMessage ) ) == 0 ) {
index 101570f..65cd2d2 100644 (file)
@@ -429,7 +429,7 @@ abstract class AuthManagerSpecialPage extends SpecialPage {
                                // accidentally returning it so best check and fix
                                $status = Status::wrap( $status );
                        } elseif ( is_string( $status ) ) {
-                               $status = Status::newFatal( new RawMessage( '$1', $status ) );
+                               $status = Status::newFatal( new RawMessage( '$1', [ $status ] ) );
                        } elseif ( is_array( $status ) ) {
                                if ( is_string( reset( $status ) ) ) {
                                        $status = Status::newFatal( ...$status );
index c47d87b..cf9da49 100644 (file)
@@ -49,14 +49,15 @@ class FewestrevisionsPage extends QueryPage {
                                'namespace' => 'page_namespace',
                                'title' => 'page_title',
                                'value' => 'COUNT(*)',
-                               'redirect' => 'page_is_redirect'
                        ],
                        'conds' => [
                                'page_namespace' => MediaWikiServices::getInstance()->getNamespaceInfo()->
                                        getContentNamespaces(),
-                               'page_id = rev_page' ],
+                               'page_id = rev_page',
+                               'page_is_redirect = 0',
+                       ],
                        'options' => [
-                               'GROUP BY' => [ 'page_namespace', 'page_title', 'page_is_redirect' ]
+                               'GROUP BY' => [ 'page_namespace', 'page_title' ]
                        ]
                ];
        }
index 22a7612..e7f4107 100644 (file)
@@ -39,6 +39,19 @@ class SpecialGoToInterwiki extends UnlistedSpecialPage {
        }
 
        public function execute( $par ) {
+               // Allow forcing an interstitial for local interwikis. This is used
+               // when a redirect page is reached via a special page which resolves
+               // to a user-dependent value (as defined by
+               // RedirectSpecialPage::personallyIdentifiableTarget). See the hack
+               // for avoiding T109724 in MediaWiki::performRequest (which also
+               // explains why we can't use a query parameter instead).
+               //
+               // HHVM dies when substr_compare is used on an empty string so ensure it's not.
+               $force = ( substr_compare( $par ?: 'x', 'force/', 0, 6 ) === 0 );
+               if ( $force ) {
+                       $par = substr( $par, 6 );
+               }
+
                $this->setHeaders();
                $target = Title::newFromText( $par );
                // Disallow special pages as a precaution against
@@ -50,9 +63,9 @@ class SpecialGoToInterwiki extends UnlistedSpecialPage {
                }
 
                $url = $target->getFullURL();
-               if ( !$target->isExternal() || $target->isLocal() ) {
+               if ( !$target->isExternal() || ( $target->isLocal() && !$force ) ) {
                        // Either a normal page, or a local interwiki.
-                       // just redirect.
+                       // Just redirect.
                        $this->getOutput()->redirect( $url, '301' );
                } else {
                        $this->getOutput()->addWikiMsg(
index 89eb410..5b77d5a 100644 (file)
@@ -21,6 +21,8 @@
  * @ingroup SpecialPage
  */
 
+use MediaWiki\Storage\RevisionRecord;
+
 /**
  * Special page allowing users with the appropriate permissions to
  * merge article histories, with some restrictions
@@ -293,12 +295,12 @@ class SpecialMergeHistory extends SpecialPage {
                        [],
                        [ 'oldid' => $rev->getId() ]
                );
-               if ( $rev->isDeleted( Revision::DELETED_TEXT ) ) {
+               if ( $rev->isDeleted( RevisionRecord::DELETED_TEXT ) ) {
                        $pageLink = '<span class="history-deleted">' . $pageLink . '</span>';
                }
 
                # Last link
-               if ( !$rev->userCan( Revision::DELETED_TEXT, $user ) ) {
+               if ( !$rev->userCan( RevisionRecord::DELETED_TEXT, $user ) ) {
                        $last = $this->msg( 'last' )->escaped();
                } elseif ( isset( $this->prevId[$row->rev_id] ) ) {
                        $last = $linkRenderer->makeKnownLink(
index 4f34785..f3ae31a 100644 (file)
@@ -28,6 +28,8 @@ use MediaWiki\Preferences\MultiUsernameFilter;
  */
 class SpecialMute extends FormSpecialPage {
 
+       const PAGE_NAME = 'Mute';
+
        /** @var User */
        private $target;
 
@@ -51,7 +53,7 @@ class SpecialMute extends FormSpecialPage {
 
                $this->centralIdLookup = CentralIdLookup::factory();
 
-               parent::__construct( 'Mute', '', false );
+               parent::__construct( self::PAGE_NAME, '', false );
        }
 
        /**
@@ -66,7 +68,7 @@ class SpecialMute extends FormSpecialPage {
                parent::execute( $par );
 
                $out = $this->getOutput();
-               $out->addModules( 'mediawiki.special.pageLanguage' );
+               $out->addModules( 'mediawiki.misc-authed-ooui' );
        }
 
        /**
@@ -97,10 +99,12 @@ class SpecialMute extends FormSpecialPage {
         * @return bool
         */
        public function onSubmit( array $data, HTMLForm $form = null ) {
-               if ( !empty( $data['MuteEmail'] ) ) {
-                       $this->muteEmailsFromTarget();
-               } else {
-                       $this->unmuteEmailsFromTarget();
+               foreach ( $data as $userOption => $value ) {
+                       if ( $value ) {
+                               $this->muteTarget( $userOption );
+                       } else {
+                               $this->unmuteTarget( $userOption );
+                       }
                }
 
                return true;
@@ -114,10 +118,12 @@ class SpecialMute extends FormSpecialPage {
        }
 
        /**
-        * Un-mute emails from target
+        * Un-mute target
+        *
+        * @param string $userOption up_property key that holds the blacklist
         */
-       private function unmuteEmailsFromTarget() {
-               $blacklist = $this->getBlacklist();
+       private function unmuteTarget( $userOption ) {
+               $blacklist = $this->getBlacklist( $userOption );
 
                $key = array_search( $this->targetCentralId, $blacklist );
                if ( $key !== false ) {
@@ -125,24 +131,25 @@ class SpecialMute extends FormSpecialPage {
                        $blacklist = implode( "\n", $blacklist );
 
                        $user = $this->getUser();
-                       $user->setOption( 'email-blacklist', $blacklist );
+                       $user->setOption( $userOption, $blacklist );
                        $user->saveSettings();
                }
        }
 
        /**
-        * Mute emails from target
+        * Mute target
+        * @param string $userOption up_property key that holds the blacklist
         */
-       private function muteEmailsFromTarget() {
+       private function muteTarget( $userOption ) {
                // avoid duplicates just in case
-               if ( !$this->isTargetBlacklisted() ) {
-                       $blacklist = $this->getBlacklist();
+               if ( !$this->isTargetBlacklisted( $userOption ) ) {
+                       $blacklist = $this->getBlacklist( $userOption );
 
                        $blacklist[] = $this->targetCentralId;
                        $blacklist = implode( "\n", $blacklist );
 
                        $user = $this->getUser();
-                       $user->setOption( 'email-blacklist', $blacklist );
+                       $user->setOption( $userOption, $blacklist );
                        $user->saveSettings();
                }
        }
@@ -150,30 +157,38 @@ class SpecialMute extends FormSpecialPage {
        /**
         * @inheritDoc
         */
-       protected function alterForm( HTMLForm $form ) {
+       protected function getForm() {
+               $form = parent::getForm();
                $form->setId( 'mw-specialmute-form' );
                $form->setHeaderText( $this->msg( 'specialmute-header', $this->target )->parse() );
                $form->setSubmitTextMsg( 'specialmute-submit' );
                $form->setSubmitID( 'save' );
+
+               return $form;
        }
 
        /**
         * @inheritDoc
         */
        protected function getFormFields() {
-               if ( !$this->enableUserEmailBlacklist || !$this->enableUserEmail ) {
-                       throw new ErrorPageError( 'specialmute', 'specialmute-error-email-blacklist-disabled' );
+               $fields = [];
+               if (
+                       $this->enableUserEmailBlacklist &&
+                       $this->enableUserEmail &&
+                       $this->getUser()->getEmailAuthenticationTimestamp()
+               ) {
+                       $fields['email-blacklist'] = [
+                               'type' => 'check',
+                               'label-message' => 'specialmute-label-mute-email',
+                               'default' => $this->isTargetBlacklisted( 'email-blacklist' ),
+                       ];
                }
 
-               if ( !$this->getUser()->getEmailAuthenticationTimestamp() ) {
-                       throw new ErrorPageError( 'specialmute', 'specialmute-error-email-preferences' );
-               }
+               Hooks::run( 'SpecialMuteModifyFormFields', [ $this, &$fields ] );
 
-               $fields['MuteEmail'] = [
-                       'type' => 'check',
-                       'label-message' => 'specialmute-label-mute-email',
-                       'default' => $this->isTargetBlacklisted(),
-               ];
+               if ( count( $fields ) == 0 ) {
+                       throw new ErrorPageError( 'specialmute', 'specialmute-error-no-options' );
+               }
 
                return $fields;
        }
@@ -192,18 +207,20 @@ class SpecialMute extends FormSpecialPage {
        }
 
        /**
+        * @param string $userOption
         * @return bool
         */
-       private function isTargetBlacklisted() {
-               $blacklist = $this->getBlacklist();
-               return in_array( $this->targetCentralId, $blacklist );
+       public function isTargetBlacklisted( $userOption ) {
+               $blacklist = $this->getBlacklist( $userOption );
+               return in_array( $this->targetCentralId, $blacklist, true );
        }
 
        /**
+        * @param string $userOption
         * @return array
         */
-       private function getBlacklist() {
-               $blacklist = $this->getUser()->getOption( 'email-blacklist' );
+       private function getBlacklist( $userOption ) {
+               $blacklist = $this->getUser()->getOption( $userOption );
                if ( !$blacklist ) {
                        return [];
                }
index 682bceb..7444225 100644 (file)
@@ -21,6 +21,8 @@
  * @ingroup SpecialPage
  */
 
+use MediaWiki\Storage\RevisionRecord;
+
 /**
  * Special page allowing users with the appropriate permissions to view
  * and hide revisions. Log items can also be hidden.
@@ -197,12 +199,12 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                        [ $this->typeLabels['check-label'], 'wpHidePrimary',
                                RevisionDeleter::getRevdelConstant( $this->typeName )
                        ],
-                       [ 'revdelete-hide-comment', 'wpHideComment', Revision::DELETED_COMMENT ],
-                       [ 'revdelete-hide-user', 'wpHideUser', Revision::DELETED_USER ]
+                       [ 'revdelete-hide-comment', 'wpHideComment', RevisionRecord::DELETED_COMMENT ],
+                       [ 'revdelete-hide-user', 'wpHideUser', RevisionRecord::DELETED_USER ]
                ];
                if ( $user->isAllowed( 'suppressrevision' ) ) {
                        $this->checks[] = [ 'revdelete-hide-restricted',
-                               'wpHideRestricted', Revision::DELETED_RESTRICTED ];
+                               'wpHideRestricted', RevisionRecord::DELETED_RESTRICTED ];
                }
 
                # Either submit or create our form
@@ -530,7 +532,7 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                                        $bitfield & $field
                                );
 
-                               if ( $field == Revision::DELETED_RESTRICTED ) {
+                               if ( $field == RevisionRecord::DELETED_RESTRICTED ) {
                                        $innerHTML = "<b>$innerHTML</b>";
                                }
 
@@ -561,7 +563,7 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                                $line .= '<td class="mw-revdel-checkbox">' . Xml::radio( $name, 0, $selected == 0 ) . '</td>';
                                $line .= '<td class="mw-revdel-checkbox">' . Xml::radio( $name, 1, $selected == 1 ) . '</td>';
                                $label = $this->msg( $message )->escaped();
-                               if ( $field == Revision::DELETED_RESTRICTED ) {
+                               if ( $field == RevisionRecord::DELETED_RESTRICTED ) {
                                        $label = "<b>$label</b>";
                                }
                                $line .= "<td>$label</td>";
@@ -599,7 +601,7 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                                . $this->otherReason;
                }
                # Can the user set this field?
-               if ( $bitParams[Revision::DELETED_RESTRICTED] == 1
+               if ( $bitParams[RevisionRecord::DELETED_RESTRICTED] == 1
                        && !$this->getUser()->isAllowed( 'suppressrevision' )
                ) {
                        throw new PermissionsError( 'suppressrevision' );
@@ -662,8 +664,8 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                        }
                        $bitfield[$field] = $val;
                }
-               if ( !isset( $bitfield[Revision::DELETED_RESTRICTED] ) ) {
-                       $bitfield[Revision::DELETED_RESTRICTED] = 0;
+               if ( !isset( $bitfield[RevisionRecord::DELETED_RESTRICTED] ) ) {
+                       $bitfield[RevisionRecord::DELETED_RESTRICTED] = 0;
                }
 
                return $bitfield;
index e1fbe6a..ad045e4 100644 (file)
@@ -79,7 +79,7 @@ class SpecialSearch extends SpecialPage {
        /**
         * @var string
         */
-       protected $sort;
+       protected $sort = SearchEngine::DEFAULT_SORT;
 
        /**
         * @var bool
@@ -92,6 +92,12 @@ class SpecialSearch extends SpecialPage {
         */
        protected $searchConfig;
 
+       /**
+        * @var Status Holds any parameter validation errors that should
+        *  be displayed back to the user.
+        */
+       private $loadStatus;
+
        const NAMESPACES_CURRENT = 'sense';
 
        public function __construct() {
@@ -204,6 +210,8 @@ class SpecialSearch extends SpecialPage {
         * @see tests/phpunit/includes/specials/SpecialSearchTest.php
         */
        public function load() {
+               $this->loadStatus = new Status();
+
                $request = $this->getRequest();
                list( $this->limit, $this->offset ) = $request->getLimitOffset( 20, '' );
                $this->mPrefix = $request->getVal( 'prefix', '' );
@@ -211,8 +219,13 @@ class SpecialSearch extends SpecialPage {
                        $this->setExtraParam( 'prefix', $this->mPrefix );
                }
 
-               $this->sort = $request->getVal( 'sort', SearchEngine::DEFAULT_SORT );
-               if ( $this->sort !== SearchEngine::DEFAULT_SORT ) {
+               $sort = $request->getVal( 'sort', SearchEngine::DEFAULT_SORT );
+               $validSorts = $this->getSearchEngine()->getValidSorts();
+               if ( !in_array( $sort, $validSorts ) ) {
+                       $this->loadStatus->warning( 'search-invalid-sort-order', $sort,
+                               implode( ', ', $validSorts ) );
+               } elseif ( $sort !== $this->sort ) {
+                       $this->sort = $sort;
                        $this->setExtraParam( 'sort', $this->sort );
                }
 
@@ -247,6 +260,7 @@ class SpecialSearch extends SpecialPage {
                        $this->namespaces = $profiles[$profile]['namespaces'];
                } else {
                        // Unknown profile requested
+                       $this->loadStatus->warning( 'search-unknown-profile', $profile );
                        $profile = 'default';
                        $this->namespaces = $profiles['default']['namespaces'];
                }
@@ -375,17 +389,22 @@ class SpecialSearch extends SpecialPage {
                        $out->addHTML( $dymWidget->render( $term, $textMatches ) );
                }
 
-               $hasErrors = $textStatus && $textStatus->getErrors() !== [];
+               $hasSearchErrors = $textStatus && $textStatus->getErrors() !== [];
                $hasOtherResults = $textMatches &&
-                       $textMatches->hasInterwikiResults( SearchResultSet::INLINE_RESULTS );
+                       $textMatches->hasInterwikiResults( ISearchResultSet::INLINE_RESULTS );
 
-               if ( $textMatches && $textMatches->hasInterwikiResults( SearchResultSet::SECONDARY_RESULTS ) ) {
+               if ( $textMatches && $textMatches->hasInterwikiResults( ISearchResultSet::SECONDARY_RESULTS ) ) {
                        $out->addHTML( '<div class="searchresults mw-searchresults-has-iw">' );
                } else {
                        $out->addHTML( '<div class="searchresults">' );
                }
 
-               if ( $hasErrors ) {
+               if ( $hasSearchErrors || $this->loadStatus->getErrors() ) {
+                       if ( $textStatus === null ) {
+                               $textStatus = $this->loadStatus;
+                       } else {
+                               $textStatus->merge( $this->loadStatus );
+                       }
                        list( $error, $warning ) = $textStatus->splitByErrorType();
                        if ( $error->getErrors() ) {
                                $out->addHTML( Html::errorBox(
@@ -405,7 +424,7 @@ class SpecialSearch extends SpecialPage {
                Hooks::run( 'SpecialSearchResults', [ $term, &$titleMatches, &$textMatches ] );
 
                // If we have no results and have not already displayed an error message
-               if ( $num === 0 && !$hasErrors ) {
+               if ( $num === 0 && !$hasSearchErrors ) {
                        $out->wrapWikiMsg( "<p class=\"mw-search-nonefound\">\n$1</p>", [
                                $hasOtherResults ? 'search-nonefound-thiswiki' : 'search-nonefound',
                                wfEscapeWikiText( $term )
@@ -443,14 +462,6 @@ class SpecialSearch extends SpecialPage {
                        $term, $this->offset, $titleMatches, $textMatches
                ) );
 
-               if ( $titleMatches ) {
-                       $titleMatches->free();
-               }
-
-               if ( $textMatches ) {
-                       $textMatches->free();
-               }
-
                $out->addHTML( '<div class="mw-search-visualclear"></div>' );
 
                // prev/next links
@@ -481,8 +492,8 @@ class SpecialSearch extends SpecialPage {
        /**
         * @param Title $title
         * @param int $num The number of search results found
-        * @param null|SearchResultSet $titleMatches Results from title search
-        * @param null|SearchResultSet $textMatches Results from text search
+        * @param null|ISearchResultSet $titleMatches Results from title search
+        * @param null|ISearchResultSet $textMatches Results from text search
         */
        protected function showCreateLink( $title, $num, $titleMatches, $textMatches ) {
                // show direct page/create link if applicable
index 31e4836..9a16a72 100644 (file)
@@ -387,11 +387,11 @@ class SpecialUndelete extends SpecialPage {
                        return;
                }
 
-               if ( $rev->isDeleted( Revision::DELETED_TEXT ) ) {
-                       if ( !$rev->userCan( Revision::DELETED_TEXT, $user ) ) {
+               if ( $rev->isDeleted( RevisionRecord::DELETED_TEXT ) ) {
+                       if ( !$rev->userCan( RevisionRecord::DELETED_TEXT, $user ) ) {
                                $out->wrapWikiMsg(
                                        "<div class='mw-warning plainlinks'>\n$1\n</div>\n",
-                               $rev->isDeleted( Revision::DELETED_RESTRICTED ) ?
+                               $rev->isDeleted( RevisionRecord::DELETED_RESTRICTED ) ?
                                        'rev-suppressed-text-permission' : 'rev-deleted-text-permission'
                                );
 
@@ -400,7 +400,7 @@ class SpecialUndelete extends SpecialPage {
 
                        $out->wrapWikiMsg(
                                "<div class='mw-warning plainlinks'>\n$1\n</div>\n",
-                               $rev->isDeleted( Revision::DELETED_RESTRICTED ) ?
+                               $rev->isDeleted( RevisionRecord::DELETED_RESTRICTED ) ?
                                        'rev-suppressed-text-view' : 'rev-deleted-text-view'
                        );
                        $out->addHTML( '<br />' );
@@ -932,7 +932,7 @@ class SpecialUndelete extends SpecialPage {
                if ( $this->mCanView ) {
                        $titleObj = $this->getPageTitle();
                        # Last link
-                       if ( !$rev->userCan( Revision::DELETED_TEXT, $this->getUser() ) ) {
+                       if ( !$rev->userCan( RevisionRecord::DELETED_TEXT, $this->getUser() ) ) {
                                $pageLink = htmlspecialchars( $this->getLanguage()->userTimeAndDate( $ts, $user ) );
                                $last = $this->msg( 'diff' )->escaped();
                        } elseif ( $remaining > 0 || ( $earliestLiveTime && $ts > $earliestLiveTime ) ) {
@@ -1055,7 +1055,7 @@ class SpecialUndelete extends SpecialPage {
                $user = $this->getUser();
                $time = $this->getLanguage()->userTimeAndDate( $ts, $user );
 
-               if ( !$rev->userCan( Revision::DELETED_TEXT, $user ) ) {
+               if ( !$rev->userCan( RevisionRecord::DELETED_TEXT, $user ) ) {
                        return '<span class="history-deleted">' . $time . '</span>';
                }
 
@@ -1069,7 +1069,7 @@ class SpecialUndelete extends SpecialPage {
                        ]
                );
 
-               if ( $rev->isDeleted( Revision::DELETED_TEXT ) ) {
+               if ( $rev->isDeleted( RevisionRecord::DELETED_TEXT ) ) {
                        $link = '<span class="history-deleted">' . $link . '</span>';
                }
 
index a8ff32f..87534eb 100644 (file)
@@ -161,11 +161,9 @@ class UserrightsPage extends SpecialPage {
                         * allow them to change any user rights.
                         */
                        if ( !$user->isAllowed( 'userrights' ) ) {
-                               // @TODO Should the user be blocked from changing user rights if they
-                               //       are partially blocked?
                                $block = $user->getBlock();
-                               if ( $block ) {
-                                       throw new UserBlockedError( $user->getBlock() );
+                               if ( $block && $block->isSitewide() ) {
+                                       throw new UserBlockedError( $block );
                                }
                        }
 
index d82ba53..1cb78b8 100644 (file)
@@ -24,6 +24,7 @@
  * @ingroup Pager
  */
 use MediaWiki\MediaWikiServices;
+use MediaWiki\Storage\RevisionRecord;
 use Wikimedia\Rdbms\IResultWrapper;
 use Wikimedia\Rdbms\FakeResultWrapper;
 use Wikimedia\Rdbms\IDatabase;
@@ -347,10 +348,13 @@ class ContribsPager extends RangeChronologicalPager {
 
                // Paranoia: avoid brute force searches (T19342)
                if ( !$user->isAllowed( 'deletedhistory' ) ) {
-                       $queryInfo['conds'][] = $this->mDb->bitAnd( 'rev_deleted', Revision::DELETED_USER ) . ' = 0';
+                       $queryInfo['conds'][] = $this->mDb->bitAnd(
+                               'rev_deleted', RevisionRecord::DELETED_USER
+                               ) . ' = 0';
                } elseif ( !$user->isAllowedAny( 'suppressrevision', 'viewsuppressed' ) ) {
-                       $queryInfo['conds'][] = $this->mDb->bitAnd( 'rev_deleted', Revision::SUPPRESSED_USER ) .
-                               ' != ' . Revision::SUPPRESSED_USER;
+                       $queryInfo['conds'][] = $this->mDb->bitAnd(
+                               'rev_deleted', RevisionRecord::SUPPRESSED_USER
+                               ) . ' != ' . RevisionRecord::SUPPRESSED_USER;
                }
 
                // $this->getIndexField() must be in the result rows, as reallyDoQuery() tries to access it.
@@ -642,11 +646,12 @@ class ContribsPager extends RangeChronologicalPager {
                                        && $page->quickUserCan( 'edit', $user )
                                ) {
                                        $this->preventClickjacking();
-                                       $topmarktext .= ' ' . Linker::generateRollback( $rev, $this->getContext() );
+                                       $topmarktext .= ' ' . Linker::generateRollback( $rev, $this->getContext(),
+                                               [ 'noBrackets' ] );
                                }
                        }
                        # Is there a visible previous revision?
-                       if ( $rev->userCan( Revision::DELETED_TEXT, $user ) && $rev->getParentId() !== 0 ) {
+                       if ( $rev->userCan( RevisionRecord::DELETED_TEXT, $user ) && $rev->getParentId() !== 0 ) {
                                $difftext = $linkRenderer->makeKnownLink(
                                        $page,
                                        new HtmlArmor( $this->messages['diff'] ),
@@ -696,7 +701,7 @@ class ContribsPager extends RangeChronologicalPager {
                        # Note that only unprivileged users have rows with hidden user names excluded.
                        # When querying for an IP range, we want to always show user and user talk links.
                        $userlink = '';
-                       if ( ( $this->contribs == 'newbie' && !$rev->isDeleted( Revision::DELETED_USER ) )
+                       if ( ( $this->contribs == 'newbie' && !$rev->isDeleted( RevisionRecord::DELETED_USER ) )
                                || $this->isQueryableRange( $this->target ) ) {
                                $userlink = ' <span class="mw-changeslist-separator"></span> '
                                        . $lang->getDirMark()
@@ -756,7 +761,7 @@ class ContribsPager extends RangeChronologicalPager {
                        ];
 
                        # Denote if username is redacted for this edit
-                       if ( $rev->isDeleted( Revision::DELETED_USER ) ) {
+                       if ( $rev->isDeleted( RevisionRecord::DELETED_USER ) ) {
                                $templateParams['rev-deleted-user-contribs'] =
                                        $this->msg( 'rev-deleted-user-contribs' )->escaped();
                        }
index 11a8532..88e1ea8 100644 (file)
@@ -23,6 +23,7 @@
  * @ingroup Pager
  */
 use MediaWiki\MediaWikiServices;
+use MediaWiki\Storage\RevisionRecord;
 use Wikimedia\Rdbms\IDatabase;
 use Wikimedia\Rdbms\IResultWrapper;
 use Wikimedia\Rdbms\FakeResultWrapper;
@@ -88,10 +89,10 @@ class DeletedContribsPager extends IndexPager {
                $user = $this->getUser();
                // Paranoia: avoid brute force searches (T19792)
                if ( !$user->isAllowed( 'deletedhistory' ) ) {
-                       $conds[] = $this->mDb->bitAnd( 'ar_deleted', Revision::DELETED_USER ) . ' = 0';
+                       $conds[] = $this->mDb->bitAnd( 'ar_deleted', RevisionRecord::DELETED_USER ) . ' = 0';
                } elseif ( !$user->isAllowedAny( 'suppressrevision', 'viewsuppressed' ) ) {
-                       $conds[] = $this->mDb->bitAnd( 'ar_deleted', Revision::SUPPRESSED_USER ) .
-                               ' != ' . Revision::SUPPRESSED_USER;
+                       $conds[] = $this->mDb->bitAnd( 'ar_deleted', RevisionRecord::SUPPRESSED_USER ) .
+                               ' != ' . RevisionRecord::SUPPRESSED_USER;
                }
 
                $commentQuery = CommentStore::getStore()->getJoin( 'ar_comment' );
@@ -337,7 +338,7 @@ class DeletedContribsPager extends IndexPager {
                $comment = Linker::revComment( $rev );
                $date = $this->getLanguage()->userTimeAndDate( $rev->getTimestamp(), $user );
 
-               if ( !$user->isAllowed( 'undelete' ) || !$rev->userCan( Revision::DELETED_TEXT, $user ) ) {
+               if ( !$user->isAllowed( 'undelete' ) || !$rev->userCan( RevisionRecord::DELETED_TEXT, $user ) ) {
                        $link = htmlspecialchars( $date ); // unusable link
                } else {
                        $link = $linkRenderer->makeKnownLink(
@@ -351,7 +352,7 @@ class DeletedContribsPager extends IndexPager {
                        );
                }
                // Style deleted items
-               if ( $rev->isDeleted( Revision::DELETED_TEXT ) ) {
+               if ( $rev->isDeleted( RevisionRecord::DELETED_TEXT ) ) {
                        $link = '<span class="history-deleted">' . $link . '</span>';
                }
 
@@ -384,7 +385,7 @@ class DeletedContribsPager extends IndexPager {
                $ret = "{$del}{$link} {$tools} {$separator} {$mflag} {$pagelink} {$comment}";
 
                # Denote if username is redacted for this edit
-               if ( $rev->isDeleted( Revision::DELETED_USER ) ) {
+               if ( $rev->isDeleted( RevisionRecord::DELETED_USER ) ) {
                        $ret .= " <strong>" . $this->msg( 'rev-deleted-user-contribs' )->escaped() . "</strong>";
                }
 
index 41c42ce..5b15e82 100644 (file)
@@ -379,13 +379,6 @@ abstract class UploadBase {
                        return $result;
                }
 
-               $error = '';
-               if ( !Hooks::run( 'UploadVerification',
-                       [ $this->mDestName, $this->mTempPath, &$error ], '1.28' )
-               ) {
-                       return [ 'status' => self::HOOK_ABORTED, 'error' => $error ];
-               }
-
                return [ 'status' => self::OK ];
        }
 
@@ -1129,6 +1122,8 @@ abstract class UploadBase {
         * @throws UploadStashNotLoggedInException
         */
        public function stashFile( User $user = null ) {
+               wfDeprecated( __METHOD__, '1.28' );
+
                return $this->doStashFile( $user );
        }
 
@@ -1146,29 +1141,6 @@ abstract class UploadBase {
                return $file;
        }
 
-       /**
-        * Stash a file in a temporary directory, returning a key which can be used
-        * to find the file again. See stashFile().
-        *
-        * @deprecated since 1.28
-        * @return string File key
-        */
-       public function stashFileGetKey() {
-               wfDeprecated( __METHOD__, '1.28' );
-               return $this->doStashFile()->getFileKey();
-       }
-
-       /**
-        * alias for stashFileGetKey, for backwards compatibility
-        *
-        * @deprecated since 1.28
-        * @return string File key
-        */
-       public function stashSession() {
-               wfDeprecated( __METHOD__, '1.28' );
-               return $this->doStashFile()->getFileKey();
-       }
-
        /**
         * If we've modified the upload file we need to manually remove it
         * on exit to clean up.
index 1bd99c1..cc527e7 100644 (file)
@@ -86,30 +86,9 @@ class UploadFromChunks extends UploadFromFile {
         */
        public function stashFile( User $user = null ) {
                wfDeprecated( __METHOD__, '1.28' );
-               $this->verifyChunk();
-               return parent::stashFile( $user );
-       }
 
-       /**
-        * @inheritDoc
-        * @throws UploadChunkVerificationException
-        * @deprecated since 1.28
-        */
-       public function stashFileGetKey() {
-               wfDeprecated( __METHOD__, '1.28' );
                $this->verifyChunk();
-               return parent::stashFileGetKey();
-       }
-
-       /**
-        * @inheritDoc
-        * @throws UploadChunkVerificationException
-        * @deprecated since 1.28
-        */
-       public function stashSession() {
-               wfDeprecated( __METHOD__, '1.28' );
-               $this->verifyChunk();
-               return parent::stashSession();
+               return parent::stashFile( $user );
        }
 
        /**
index f6ad623..df5ea70 100644 (file)
@@ -1,6 +1,7 @@
 <?php
 
 use MediaWiki\Linker\LinkTarget;
+use MediaWiki\Storage\RevisionRecord;
 use MediaWiki\User\UserIdentity;
 use Wikimedia\Assert\Assert;
 use Wikimedia\Rdbms\IDatabase;
@@ -566,9 +567,9 @@ class WatchedItemQueryService {
                // Avoid brute force searches (T19342)
                $bitmask = 0;
                if ( !$user->isAllowed( 'deletedhistory' ) ) {
-                       $bitmask = Revision::DELETED_USER;
+                       $bitmask = RevisionRecord::DELETED_USER;
                } elseif ( !$user->isAllowedAny( 'suppressrevision', 'viewsuppressed' ) ) {
-                       $bitmask = Revision::DELETED_USER | Revision::DELETED_RESTRICTED;
+                       $bitmask = RevisionRecord::DELETED_USER | RevisionRecord::DELETED_RESTRICTED;
                }
                if ( $bitmask ) {
                        $conds[] = $db->bitAnd( 'rc_deleted', $bitmask ) . " != $bitmask";
index 0e10287..698d223 100644 (file)
@@ -2,9 +2,9 @@
 
 namespace MediaWiki\Widget\Search;
 
+use ISearchResultSet;
 use MediaWiki\MediaWikiServices;
 use Message;
-use SearchResultSet;
 use SpecialSearch;
 use Status;
 
@@ -33,23 +33,23 @@ class BasicSearchResultSetWidget {
        /**
         * @param string $term The search term to highlight
         * @param int $offset The offset of the first result in the result set
-        * @param SearchResultSet|null $titleResultSet Results of searching only page titles
-        * @param SearchResultSet|null $textResultSet Results of general full text search.
+        * @param ISearchResultSet|null $titleResultSet Results of searching only page titles
+        * @param ISearchResultSet|null $textResultSet Results of general full text search.
         * @return string HTML
         */
        public function render(
                $term,
                $offset,
-               SearchResultSet $titleResultSet = null,
-               SearchResultSet $textResultSet = null
+               ISearchResultSet $titleResultSet = null,
+               ISearchResultSet $textResultSet = null
        ) {
                $hasTitle = $titleResultSet ? $titleResultSet->numRows() > 0 : false;
                $hasText = $textResultSet ? $textResultSet->numRows() > 0 : false;
                $hasSecondary = $textResultSet
-                       ? $textResultSet->hasInterwikiResults( SearchResultSet::SECONDARY_RESULTS )
+                       ? $textResultSet->hasInterwikiResults( ISearchResultSet::SECONDARY_RESULTS )
                        : false;
                $hasSecondaryInline = $textResultSet
-                       ? $textResultSet->hasInterwikiResults( SearchResultSet::INLINE_RESULTS )
+                       ? $textResultSet->hasInterwikiResults( ISearchResultSet::INLINE_RESULTS )
                        : false;
 
                if ( !$hasTitle && !$hasText && !$hasSecondary && !$hasSecondaryInline ) {
@@ -71,7 +71,7 @@ class BasicSearchResultSetWidget {
                }
 
                if ( $hasSecondaryInline ) {
-                       $iwResults = $textResultSet->getInterwikiResults( SearchResultSet::INLINE_RESULTS );
+                       $iwResults = $textResultSet->getInterwikiResults( ISearchResultSet::INLINE_RESULTS );
                        foreach ( $iwResults as $interwiki => $results ) {
                                if ( $results instanceof Status || $results->numRows() === 0 ) {
                                        // ignore bad interwikis for now
@@ -88,7 +88,7 @@ class BasicSearchResultSetWidget {
                if ( $hasSecondary ) {
                        $out .= $this->sidebarWidget->render(
                                $term,
-                               $textResultSet->getInterwikiResults( SearchResultSet::SECONDARY_RESULTS )
+                               $textResultSet->getInterwikiResults( ISearchResultSet::SECONDARY_RESULTS )
                        );
                }
 
@@ -112,11 +112,11 @@ class BasicSearchResultSetWidget {
        }
 
        /**
-        * @param SearchResultSet $resultSet The search results to render
+        * @param ISearchResultSet $resultSet The search results to render
         * @param int $offset Offset of the first result in $resultSet
         * @return string HTML
         */
-       protected function renderResultSet( SearchResultSet $resultSet, $offset ) {
+       protected function renderResultSet( ISearchResultSet $resultSet, $offset ) {
                $hits = [];
                foreach ( $resultSet as $result ) {
                        $hits[] = $this->resultWidget->render( $result, $offset++ );
index 135b01d..a8f57e2 100644 (file)
@@ -3,7 +3,7 @@
 namespace MediaWiki\Widget\Search;
 
 use HtmlArmor;
-use SearchResultSet;
+use ISearchResultSet;
 use SpecialSearch;
 
 /**
@@ -20,10 +20,10 @@ class DidYouMeanWidget {
 
        /**
         * @param string $term The user provided search term
-        * @param SearchResultSet $resultSet
+        * @param ISearchResultSet $resultSet
         * @return string HTML
         */
-       public function render( $term, SearchResultSet $resultSet ) {
+       public function render( $term, ISearchResultSet $resultSet ) {
                if ( $resultSet->hasRewrittenQuery() ) {
                        $html = $this->rewrittenHtml( $term, $resultSet );
                } elseif ( $resultSet->hasSuggestion() ) {
@@ -40,11 +40,11 @@ class DidYouMeanWidget {
         * rewritten, and the results of the rewritten query are being returned.
         *
         * @param string $term The users search input
-        * @param SearchResultSet $resultSet The response to the search request
+        * @param ISearchResultSet $resultSet The response to the search request
         * @return string HTML Links the user to their original $term query, and the
         *  one suggested by $resultSet
         */
-       protected function rewrittenHtml( $term, SearchResultSet $resultSet ) {
+       protected function rewrittenHtml( $term, ISearchResultSet $resultSet ) {
                $params = [
                        'search' => $resultSet->getQueryAfterRewrite(),
                        // Don't magic this link into a 'go' link, it should always
@@ -81,10 +81,10 @@ class DidYouMeanWidget {
         * a query that might give more/better results than their current
         * query.
         *
-        * @param SearchResultSet $resultSet
+        * @param ISearchResultSet $resultSet
         * @return string HTML
         */
-       protected function suggestionHtml( SearchResultSet $resultSet ) {
+       protected function suggestionHtml( ISearchResultSet $resultSet ) {
                $params = [
                        'search' => $resultSet->getSuggestionQuery(),
                        'fulltext' => 1,
index 48c624c..c495aa5 100644 (file)
@@ -4,14 +4,14 @@ namespace MediaWiki\Widget\Search;
 
 use MediaWiki\Interwiki\InterwikiLookup;
 use MediaWiki\Linker\LinkRenderer;
-use SearchResultSet;
+use ISearchResultSet;
 use SpecialSearch;
 use Title;
 use Html;
 use OOUI;
 
 /**
- * Renders one or more SearchResultSets into a sidebar grouped by
+ * Renders one or more ISearchResultSets into a sidebar grouped by
  * interwiki prefix. Includes a per-wiki header indicating where
  * the results are from.
  */
@@ -48,7 +48,7 @@ class InterwikiSearchResultSetWidget implements SearchResultSetWidget {
 
        /**
         * @param string $term User provided search term
-        * @param SearchResultSet|SearchResultSet[] $resultSets List of interwiki
+        * @param ISearchResultSet|ISearchResultSet[] $resultSets List of interwiki
         *  results to render.
         * @return string HTML
         */
@@ -82,7 +82,7 @@ class InterwikiSearchResultSetWidget implements SearchResultSetWidget {
                        $iwResultItemOutput = '';
 
                        foreach ( $results as $result ) {
-                               $iwResultItemOutput .= $this->resultWidget->render( $result, $term, $position++ );
+                               $iwResultItemOutput .= $this->resultWidget->render( $result, $position++ );
                        }
 
                        $footerHtml = $this->footerHtml( $term, $iwPrefix );
index 6df6e65..ee9142e 100644 (file)
@@ -2,7 +2,7 @@
 
 namespace MediaWiki\Widget\Search;
 
-use SearchResultSet;
+use ISearchResultSet;
 
 /**
  * Renders a set of search results to HTML
@@ -10,7 +10,7 @@ use SearchResultSet;
 interface SearchResultSetWidget {
        /**
         * @param string $term User provided search term
-        * @param SearchResultSet|SearchResultSet[] $resultSets List of interwiki
+        * @param ISearchResultSet|ISearchResultSet[] $resultSets List of interwiki
         *  results to render.
         * @return string HTML
         */
index 248099a..12bc4b2 100644 (file)
@@ -4,13 +4,13 @@ namespace MediaWiki\Widget\Search;
 
 use MediaWiki\Interwiki\InterwikiLookup;
 use MediaWiki\Linker\LinkRenderer;
-use SearchResultSet;
+use ISearchResultSet;
 use SpecialSearch;
 use Title;
 use Html;
 
 /**
- * Renders one or more SearchResultSets into a sidebar grouped by
+ * Renders one or more ISearchResultSets into a sidebar grouped by
  * interwiki prefix. Includes a per-wiki header indicating where
  * the results are from.
  *
@@ -43,7 +43,7 @@ class SimpleSearchResultSetWidget implements SearchResultSetWidget {
 
        /**
         * @param string $term User provided search term
-        * @param SearchResultSet|SearchResultSet[] $resultSets List of interwiki
+        * @param ISearchResultSet|ISearchResultSet[] $resultSets List of interwiki
         *  results to render.
         * @return string HTML
         */
index 9fc7d73..61a967d 100644 (file)
@@ -21,6 +21,7 @@
 use MediaWiki\MediaWikiServices;
 
 use MediaWiki\Logger\LoggerFactory;
+use MediaWiki\Storage\RevisionRecord;
 
 /**
  * Base class for language conversion.
@@ -1043,7 +1044,7 @@ class LanguageConverter {
                                $revision = Revision::newFromTitle( $title );
                                if ( $revision ) {
                                        if ( $revision->getContentModel() == CONTENT_MODEL_WIKITEXT ) {
-                                               $txt = $revision->getContent( Revision::RAW )->getText();
+                                               $txt = $revision->getContent( RevisionRecord::RAW )->getText();
                                        }
 
                                        // @todo in the future, use a specialized content model, perhaps based on json!
index 49ee88a..03790fa 100644 (file)
 /**
  * Turkish (Türkçe)
  *
- * Turkish has two different i, one with a dot and another without a dot. They
- * are totally different letters in this language, so we have to override the
+ * The Turkish language, like other Turkic languages, distinguishes
+ * a dotted letter 'i' from a dotless letter 'ı' (U+0131 LATIN SMALL LETTER DOTLESS I).
+ * In these languages, each has an equivalent uppercase mapping:
+ * ı (U+0131 LATIN SMALL LETTER DOTLESS I) -> I (U+0049 LATIN CAPITAL LETTER I),
+ * i (U+0069 LATIN SMALL LETTER I) -> İ (U+0130 LATIN CAPITAL LETTER I WITH DOT ABOVE).
+ *
+ * Unicode CaseFolding.txt defines this case as type 'T', a special case for Turkic languages:
+ * tr and az. PHP 7.3 parser ignores this special cases. so we have to override the
  * ucfirst and lcfirst methods.
+ *
  * See https://en.wikipedia.org/wiki/Dotted_and_dotless_I and T30040
  * @ingroup Language
  */
 class LanguageTr extends Language {
 
+       private $uc = [ 'I', 'İ' ];
+       private $lc = [ 'ı', 'i' ];
+
        /**
         * @param string $string
         * @return string
         */
        public function ucfirst( $string ) {
-               if ( strlen( $string ) && $string[0] == 'i' ) {
-                       return 'İ' . substr( $string, 1 );
+               $first = mb_substr( $string, 0, 1 );
+               if ( in_array( $first, $this->lc ) ) {
+                       $first = str_replace( $this->lc, $this->uc, $first );
+                       return $first . mb_substr( $string, 1 );
                }
                return parent::ucfirst( $string );
        }
@@ -48,8 +60,10 @@ class LanguageTr extends Language {
         * @return mixed|string
         */
        function lcfirst( $string ) {
-               if ( strlen( $string ) && $string[0] == 'I' ) {
-                       return 'ı' . substr( $string, 1 );
+               $first = mb_substr( $string, 0, 1 );
+               if ( in_array( $first, $this->uc ) ) {
+                       $first = str_replace( $this->uc, $this->lc, $first );
+                       return $first . mb_substr( $string, 1 );
                }
                return parent::lcfirst( $string );
        }
index adead9a..232a14f 100644 (file)
        "autoblockedtext": "مُنِع عنوان آيبيك تلقائيا لأن مستخدما آخرا منعه $1 استخدمه.\nالسبب المعطى هو التالي:\n\n:<em>$2</em>\n\n* بداية المنع: $8\n* انتهاء المنع: $6\n* الممنوع المقصود: $7\n\nيمكنك أن تتصل ب $1 أو أحد [[{{MediaWiki:Grouppage-sysop}}|الإداريين]] الآخرين لمناقشة المنع.\n\nلاحظ أنه لا يمكنك استخدام خاصية \"{{int:emailuser}}\" إلا لو كان لديك عنوان بريد إلكتروني صحيح مسجل في [[Special:Preferences|تفضيلاتك]] ولم يتم منعك من استخدامه.\n\nعنوان آيبيك الحالي $3، ورقم المنع #$5.\nمن فضلك اذكر كل التفاصيل بالأعلى في أي استعلامات تقوم بها.",
        "systemblockedtext": "اسم المستخدم أو عنوان الأيبي الخاص بك تم منعه تلقائيا بواسطة ميدياويكي.\nالسبب المعطى هو:\n\n:<em>$2</em>\n\n* بداية المنع: $8\n* نهاية المنع: $6\n* المقصود بالمنع: $7\n\nعنوان الأيبي الحالي الخاص بك هو $3.\nمن فضلك ضمن كل التفاصيل بالأعلى في أي استعلام تقوم به.",
        "blockednoreason": "لا سبب معطى",
-       "blockedtext-composite": "<strong>تم منع اسم المستخدم أو عنوان الآيبي الخاص بك.</strong>\n\nالسبب المعطى هو:\n\n:<em>$2</em>.\n\n* بداية المنع: $8\n*  نهاية صلاحية أطول منع: $6\n\nعنوان الآيبي الحالي الخاص بك هو $3.\nيُرجَى تضمين جميع التفاصيل أعلاه في أية استفسارات تقوم بها.",
+       "blockedtext-composite": "<strong>تم منع اسم المستخدم أو عنوان الآيبي الخاص بك.</strong>\n\nالسبب المعطى هو:\n\n:<em>$2</em>.\n\n* بداية المنع: $8\n*  نهاية صلاحية أطول منع: $6\n\n* $5\n\nعنوان الآيبي الحالي الخاص بك هو $3.\nيُرجَى تضمين جميع التفاصيل أعلاه في أية استفسارات تقوم بها.",
+       "blockedtext-composite-ids": "معرفات المنع ذات الصلة: $1 (قد يتم أيضا إدراج عنوان الآيبي الخاص بك في القائمة السوداء)",
+       "blockedtext-composite-no-ids": "يظهر عنوان الآيبي الخاص بك في العديد من القوائم السوداء",
        "blockedtext-composite-reason": "هناك عدة عمليات منع ضد حسابك و/أو عنوان الآيبي الخاص بك",
        "whitelistedittext": "يجب عليك $1 لتتمكن من تعديل الصفحات.",
        "confirmedittext": "يجب عليك تأكيد بريدك الإلكتروني قبل تعديل الصفحات.\nمن فضلك اكتب وأكد بريدك الإلكتروني من خلال [[Special:Preferences|تفضيلاتك]].",
        "search-interwiki-more": "(المزيد)",
        "search-interwiki-more-results": "المزيد من النتائج",
        "search-relatedarticle": "مرتبطة",
+       "search-invalid-sort-order": "ترتيب فرز $1 غير معروفP سيتم تطبيق الفرز الافتراضي، ترتيبات الفرز الصالحة هي: $2",
+       "search-unknown-profile": "لم يتم التعرف على ملف تعريف البحث $1؛ سيتم تطبيق ملف تعريف البحث الافتراضي.",
        "searchrelated": "مرتبطة",
        "searchall": "الكل",
        "showingresults": "معروض بالأسفل {{PLURAL:$1|<strong>1</strong> نتيجة}} بدءا من رقم <strong>$2</strong>.",
        "right-editmyusercss": "تعديل ملفات CSS للمستخدم نفسه",
        "right-editmyuserjson": "تعديل ملفات جسون للمستخدم نفسه",
        "right-editmyuserjs": "تعديل ملفات جافاسكربت للمستخدم نفسه",
+       "right-editmyuserjsredirect": "تحرير ملفات جافا سكريبت المحولة الخاصة بالمستخدم",
        "right-viewmywatchlist": "عرض قائمة مراقبتك",
        "right-editmywatchlist": "حرر قائمة مراقبتك. لاحظ أن بعض الإجراءات لا تزال تضيف الصفحات حتى بدون هذا الحق.",
        "right-viewmyprivateinfo": "استعراض بياناتك الشخصية (مثل البريد الإلكتروني والاسم الحقيقي)",
        "action-editmyusercss": "تحرير ملفات CSS المستخدم الخاصة بك",
        "action-editmyuserjson": "تحرير ملفات جسون المستخدم الخاصة بك",
        "action-editmyuserjs": "تحرير ملفات جافا سكريبت المستخدم الخاصة بك",
+       "action-editmyuserjsredirect": "تحرير ملفات جافا سكريبت المحولة الخاصة بالمستخدم",
        "action-viewsuppressed": "عرض المراجعات المخفية بواسطة أي مستخدم",
        "action-hideuser": "منع اسم مستخدم، مخفيا إياه عن العامة",
        "action-ipblock-exempt": "تفادي عمليات منع الأيبي والمنع التلقائي ومنع النطاق",
        "specialmute-success": "تم تحديث تفضيلات كتم الصوت بنجاح، شاهد كل المستخدمين الصامتين في [[Special:Preferences|تفضيلاتك]].",
        "specialmute-submit": "تأكيد",
        "specialmute-label-mute-email": "كتم رسائل البريد الإلكتروني من هذا المستخدم",
-       "specialmute-header": "Ù\8aÙ\8fرجÙ\8eÙ\89 ØªØ­Ø¯Ù\8aد ØªÙ\81ضÙ\8aÙ\84ات Ù\83تÙ\85 Ø§Ù\84صÙ\88ت Ù\84Ù\80{{BIDI:[[User:$1]]}}.",
+       "specialmute-header": "Ù\8aÙ\8fرجÙ\8eÙ\89 ØªØ­Ø¯Ù\8aد ØªÙ\81ضÙ\8aÙ\84ات Ù\83تÙ\85 Ø§Ù\84صÙ\88ت Ù\84Ù\84Ù\85ستخدÙ\85 <b>{{BIDI:[[User:$1|$1]]}}</b>.",
        "specialmute-error-invalid-user": "لا يمكن العثور على اسم المستخدم المطلوب.",
-       "specialmute-error-email-blacklist-disabled": "لم يتم تمكين كتم المستخدمين من إرسال رسائل البريد الإلكتروني إليك.",
-       "specialmute-error-email-preferences": "يجب تأكيد عنوان بريدك الإلكتروني قبل أن تتمكن من كتم صوت المستخدم، يمكنك القيام بذلك من [[Special:Preferences]].",
-       "specialmute-email-footer": "لإدارة تفضيلات البريد الإلكتروني لـ{{BIDI:$2}}؛ تُرجَى زيارة <$1>",
+       "specialmute-error-no-options": "ميزات كتم الصوت غير متوفرة، قد يكون هذا بسبب: أنك لم تؤكد عنوان بريدك الإلكتروني أو قام إداري الويكي بتعطيل ميزات البريد الإلكتروني و/أو قائمة البريد الإلكتروني السوداء لهذه الويكي.",
+       "specialmute-email-footer": "لإدارة تفضيلات البريد الإلكتروني للمستخدم {{BIDI:$2}}؛ تُرجَى زيارة <$1>",
        "specialmute-login-required": "يُرجَى تسجيل الدخول لتغيير تفضيلات الصمت الخاصة بك.",
+       "mute-preferences": "كتم صوت التفضيلات",
        "revid": "المراجعة $1",
        "pageid": "معرف الصفحة $1",
        "interfaceadmin-info": "$1\n\nتم فصل صلاحيات تحرير ملفات CSS/JS/JSON على مستوى الموقع مؤخرً من صلاحية  <code>editinterface</code>، إذا لم تفهم سبب حصولك على هذا الخطأ، فراجع  [[mw:MediaWiki_1.32/interface-admin]].",
        "passwordpolicies-policy-passwordnotinlargeblacklist": "لا يمكن أن تكون كلمة المرور في قائمة كلمات المرور الـ100.000 الأكثر استخداما.",
        "passwordpolicies-policyflag-forcechange": "يجب أن تتغير عند تسجيل الدخول",
        "passwordpolicies-policyflag-suggestchangeonlogin": "اقتراح التغيير عند تسجيل الدخول",
+       "mycustomjsredirectprotected": "ليست لديك صلاحية لتعديل صفحة جافا سكريبت هذه لأنها تحويلة ولا تشير إلى نطاق المستخدمي الخاص بك.",
        "easydeflate-invaliddeflate": "المحتوى المقدم لا يتم تفريغه بشكل صحيح",
        "unprotected-js": "لأسباب تتعلق بالأمان; لا يمكن تحميل جافا سكريبت من الصفحات غير المحمية; الرجاء إنشاء جافا سكريبت فقط في نطاق ميدياويكي: أو كصفحة فرعية للمستخدم",
        "userlogout-continue": "هل تريد تسجيل الخروج؟"
index b3707a6..ea05ebc 100644 (file)
        "autoblockedtext": "La to direición IP bloquióse automáticamente porque usóla otru usuariu que foi bloquiáu por $1.\nEl motivu conseñáu ye:\n\n:<em>$2</em>\n\n* Principiu del bloquéu: $8\n* Caducidá del bloquéu: $6\n* Usuariu a bloquiar: $7\n\nPues ponete'n contautu con $1 o con otru de los [[{{MediaWiki:Grouppage-sysop}}|alministradores]] p'aldericar sobre'l bloquéu.\n\nTen en cuenta que nun pues usar la función «{{int:emailuser}}» a nun ser que tengas rexistrada una direición de corréu electrónicu válida nes [[Special:Preferences|preferencies d'usuariu]] y que nun tengas torgao usala.\n\nLa to direición IP actual ye $3, y la ID del bloquéu ye #$5.\nPor favor, incluye tolos detalles anteriores nes consultes que faigas.",
        "systemblockedtext": "El to nome d'usuariu o dirección IP bloquióse automáticamente pol software MediaWiki.\nEl motivu dau ye:\n\n:<em>$2</em>\n\n* Entamu del bloquéu: $8\n* Caducidá de bloquéu: $6\n* Destinatariu del bloquéu: $7\n\nLa to dirección IP actual ye $3.\nPor favor, incluye tolos anteriores en cualquier consulta que faigas.",
        "blockednoreason": "nun se dio nengún motivu",
+       "blockedtext-composite": "<strong>El to nome d'usuariu o dirección IP ta bloquiáu.</strong>\n\nEl motivu dau ye:\n\n:<em>$2</em>.\n\n* Entamu del bloquéu: $8\n* Caducidá del bloquéu más llargu: $6\n\n* $5\n\nLa to dirección IP actual ye $3.\nPor favor, incluye tolos anteriores en cualquier consulta que faigas.",
+       "blockedtext-composite-ids": "IDs relevantes del bloquéu: $1 (la to direición IP tamién pué tar na llista prieta)",
+       "blockedtext-composite-no-ids": "La to direición IP apaez en delles llistes prietes",
+       "blockedtext-composite-reason": "Hai múltiples bloqueos escontra la to cuenta y/o direición IP",
        "whitelistedittext": "Tienes d'$1 pa editar páxines.",
        "confirmedittext": "Tienes de confirmar la direición de corréu electrónicu enantes d'editar páxines.\nPor favor, configura y valida la direición de corréu nes [[Special:Preferences|preferencies d'usuariu]].",
        "nosuchsectiontitle": "Nun s'alcontró la seición",
        "allowemail": "Permitir qu'otros usuarios m'unvien correos",
        "email-allow-new-users-label": "Permitir los correos de los usuarios nuevos",
        "email-blacklist-label": "Torgar qu'estos usuarios m'unvien correos electrónicos:",
-       "prefs-searchoptions": "Buscar",
+       "prefs-searchoptions": "Gueta",
        "prefs-namespaces": "Espacios de nome",
        "default": "predetermináu",
        "prefs-files": "Ficheros",
        "right-editmyusercss": "Editar los propios ficheros CSS d'usuariu",
        "right-editmyuserjson": "Editar los ficheros JSON d'usuariu propios",
        "right-editmyuserjs": "Editar los propios ficheros JavaScript d'usuariu",
+       "right-editmyuserjsredirect": "Editar los ficheros JavaScript d'usuariu propios que son redireiciones",
        "right-viewmywatchlist": "Ver la llista de vixilancia propia",
        "right-editmywatchlist": "Editar la llista de vixilancia propia. Tenga en cuenta que dalgunes aiciones amestarán páxines igual, inda ensin esti permisu.",
        "right-viewmyprivateinfo": "Ver los datos privaos propios (p. ex. direición de corréu, nome real)",
        "action-editmyusercss": "editar los ficheros CSS d'usuariu propios",
        "action-editmyuserjson": "editar los ficheros JSON d'usuariu propios",
        "action-editmyuserjs": "editar los ficheros JavaScript d'usuariu propios",
+       "action-editmyuserjsredirect": "editar los ficheros JavaScript d'usuariu propios que son redireiciones",
        "action-viewsuppressed": "ver revisiones anubríes de cualquier usuariu",
        "action-hideuser": "bloquiar un nome d'usuariu, tapeciéndolu al públicu",
        "action-ipblock-exempt": "saltar los bloqueos d'IP, los autobloqueos y los bloqueos de rangos",
        "restrictionsfield-help": "Una única direición IP o rangu CIDR per llinia. P'activar toos, utiliza:<pre>0.0.0.0/0\n::/0</pre>",
        "edit-error-short": "Error: $1",
        "edit-error-long": "Errores:\n\n$1",
+       "specialmute": "Silenciar",
+       "specialmute-submit": "Confirmar",
        "revid": "revisión $1",
        "pageid": "ID de páxina $1",
        "interfaceadmin-info": "$1\n\nLos permisos pa editar los ficheros  CSS, JS y JSON globales del sitiu dixebráronse apocayá del permisu <code>editinterface</code>. Si nun entiendes por qué recibes esti error, llei [[mw:MediaWiki_1.32/interface-admin]].",
index 21151e5..e6581ed 100644 (file)
@@ -34,7 +34,8 @@
                        "Fitoschido",
                        "Toghrul Rahimli",
                        "Vlad5250",
-                       "Hüseynzadə"
+                       "Hüseynzadə",
+                       "Patriot Kur"
                ]
        },
        "tog-underline": "Keçidlərin altını xətlə:",
        "histfirst": "Ən əvvəlki",
        "histlast": "Ən sonuncu",
        "historysize": "({{PLURAL:$1|1 bayt|$1 bayt}})",
-       "historyempty": "(boş)",
+       "historyempty": "boş",
        "history-feed-title": "Redaktə tarixçəsi",
        "history-feed-description": "Vikidə bu səhifənin dəyişikliklər tarixçəsi",
        "history-feed-item-nocomment": "$1 $2-də",
        "recentchangesdays": "Son dəyişiklərdə göstərilən günlərin miqdarı:",
        "recentchangesdays-max": "Maksimum $1 {{PLURAL:$1|gün|gün}}",
        "recentchangescount": "Son dəyişikliklərdə başlıq sayı:",
-       "prefs-help-recentchangescount": "Buraya yeni dəyişikliklər, səhifələrin və jurnalların tarixçəsi daxildir.",
+       "prefs-help-recentchangescount": "Maksimum say: 1000",
        "savedprefs": "Seçiminiz qəbul edildi.",
        "timezonelegend": "Vaxt zonası:",
        "localtime": "Yerli vaxt:",
        "right-sendemail": "Digər istifadəçilərə elektron poçt göndər",
        "grant-group-email": "E-məktub göndər",
        "grant-editmywatchlist": "İzləmə siyahınızda redaktə",
+       "grant-basic": "Əsas hüquqlar",
+       "grant-viewdeleted": "Silinən fayllara və səhifələrə bax",
+       "grant-viewmywatchlist": "İzləmə siyahınıza baxın",
        "newuserlogpage": "Yeni istifadəçilərin qeydiyyatı",
        "newuserlogpagetext": "Yeni qeydiyyatdan keçmiş istifadəçilərin siyahısı.",
        "rightslog": "İstifadəçi hüquqları qeydləri",
        "action-userrights-interwiki": "Digər vikilərdəki istifadəçilərin istifadəçi hüquqlarını dəyişdir",
        "action-siteadmin": "Məlumatlar bazasının bloklanması və blokun götürülməsi",
        "action-sendemail": "e-məktub göndər",
+       "action-editmywatchlist": "izləmə siyahınızda redaktə",
+       "action-viewmywatchlist": "İzləmə siyahınıza baxın",
+       "action-viewmyprivateinfo": "Şəxsi məlumatlarınıza baxın",
+       "action-editmyprivateinfo": "Şəxsi məlumatlarınızı redaktə edin",
        "action-purge": "bu səhifənin yaddaşını təmizlə",
        "nchanges": "$1 {{PLURAL:$1|dəyişiklik|dəyişiklik}}",
        "enhancedrc-history": "tarixçə",
        "rcfilters-savedqueries-add-new-title": "Hazırkı filtr nizamlamalarını yaddaşa ver",
        "rcfilters-restore-default-filters": "Standart filtrləri bərpa et",
        "rcfilters-clear-all-filters": "Bütün filtrləri sil",
-       "rcfilters-show-new-changes": "Ən son dəyişiklikləri göstər",
+       "rcfilters-show-new-changes": "Ən son dəyişiklikləri göstər: $1",
        "rcfilters-search-placeholder": "Son dəyişiklikləri filtrlə (siyahıdan seçin və ya daxil edin)",
        "rcfilters-empty-filter": "Aktiv filtr yoxdur. Bütün redaktələr göstərilir.",
        "rcfilters-filterlist-title": "Filtrlər",
        "rcfilters-highlightmenu-help": "Bu xüsusiyyəti rəngləmək üçün rəng seçin",
        "rcfilters-filtergroup-authorship": "Redaktələrin müəllifliyi",
        "rcfilters-filter-editsbyself-label": "Öz dəyişiklikləriniz",
+       "rcfilters-filter-editsbyself-description": "Sizin öz töhfələriniz.",
        "rcfilters-filter-editsbyother-label": "Başqalarının dəyişiklikləri",
        "rcfilters-filtergroup-user-experience-level": "İstifadəçi qeydiyyatı və təcrübəsi",
        "rcfilters-filter-user-experience-level-registered-label": "Qeydiyyatlı",
+       "rcfilters-filter-user-experience-level-registered-description": "Sistemə daxil olmuş istifadəçilər.",
        "rcfilters-filter-user-experience-level-unregistered-label": "Qeydiyyatsız",
+       "rcfilters-filter-user-experience-level-unregistered-description": "Sistemə daxil olmamış istifadəçilər.",
        "rcfilters-filter-user-experience-level-newcomer-label": "Təcrübəsizlər",
+       "rcfilters-filter-user-experience-level-newcomer-description": "10-dan az redaktəsi və 4 gündən az fəaliyyəti olan qeydiyyatdan keçmiş istifadəçilər.",
        "rcfilters-filter-user-experience-level-learner-label": "Öyrənənlər",
        "rcfilters-filter-user-experience-level-experienced-label": "Təcrübəli istifadəçilər",
        "rcfilters-filtergroup-automated": "Avtomatik redaktələr",
index 7ca94c7..e1e663c 100644 (file)
@@ -21,8 +21,8 @@
        },
        "tog-underline": ":لینکاں کِشک کن",
        "tog-hideminor": "ھوردݔں ٹگلاں پناہ کن",
-       "tog-hidepatrolled": "ته نوکین تغییرات اصلاحاتی که گردگ بیتگن پناه کن",
-       "tog-newpageshidepatrolled": "تاکاتے کہ گندگ بیتگ اَنت پناہ کن",
+       "tog-hidepatrolled": "نۏکݔں ٹگلاں مہ مہ گُڈی نۏکݔں ٹگلاں پݔش مہ دار",
+       "tog-newpageshidepatrolled": "تاکانے کہ گندگ بیتگ اَنت پناہ کن",
        "tog-hidecategorization": "تاکانء تراشوانء پناہ کنگ",
        "tog-extendwatchlist": "چارگ لیستءَ مزن کن کہ دراھیگݔں گندگ بہ بَنت",
        "tog-usenewrc": "گروپء تاک ءُ چارگ لیستء ٹگلاں",
@@ -43,7 +43,7 @@
        "tog-enotifminoredits": "هنچوش پر هوردین ٹگل مان پیج و فایلان پر منء ایمیل دیم بدئ",
        "tog-enotifrevealaddr": "منی ایمیل پیش دار ته ایمیل أن هوژاری",
        "tog-shownumberswatching": "پیش دار تعداد کاربرانی که چارگتن",
-       "tog-oldsig": "انیگین ایمزا کنوک",
+       "tog-oldsig": "ھنیگݔں نامپَد کنۏک",
        "tog-fancysig": "امضاءَ په داب ویکی متنی بزان(بی اتوماتیکی لینک)",
        "tog-uselivepreview": "پیش‌نمایش بدون نیاز به بروزرسانی صفحه",
        "tog-forceeditsummary": "من آ هال دی وهدی وارد کتن یک هالیکین خلاصه ی اصلاح",
@@ -59,7 +59,7 @@
        "tog-norollbackdiff": "تفاوتء حذف کن بعد چه اجرای یک ترینگ",
        "tog-useeditwarning": "وهدی دربیگ مان اصلاح کتگین پیج اگان تغییران سیو نبوت اتنت منء هشتار بدئ",
        "tog-prefershttps": "پر مان بوتنء واسته هروهدء یک ایمنین کنکشنء کارمرز بکن",
-       "underline-always": "دراہءَ",
+       "underline-always": "دراہ‌ئا",
        "underline-never": "هچبر",
        "underline-default": "بروزر پݔسری پئیما",
        "editfont-style": "پونتءِ ٹگلݔنگ",
        "thu": "شرۏچ",
        "fri": "ھرۏچ",
        "sat": "زرۏچ",
-       "january": "ژانویہ",
-       "february": "پبرݔر",
-       "march": "مارچ",
-       "april": "آپرݔل",
-       "may_long": "می",
-       "june": "جۏن",
-       "july": "جۏلی",
-       "august": "Ø¢Ú¯Ù\88ست",
-       "september": "سپتمبر",
-       "october": "اکتوبر",
-       "november": "نوامبر",
-       "december": "دسمبر",
+       "january": "بھاران/جنۏری",
+       "february": "اُستپان/پبرݔر",
+       "march": "مۏلمان/مارچ",
+       "april": "کڑا/آپرݔل",
+       "may_long": "سۏچِکان/مئ",
+       "june": "جُلکان/جۏئن",
+       "july": "جَلکشان/جۏلی",
+       "august": "ساÚ\86اÙ\86/آگؤست",
+       "september": "تÙ\8fÙ\85شاÙ\86³Ù¾ØªÙ\85بر",
+       "october": "سارتاÙ\86§Ú©ØªÙ\88بر",
+       "november": "گوَبشان/نومبر",
+       "december": "تاکشاÙ\86¯Ø³Ù\85بر",
        "january-gen": "جنۏری",
        "february-gen": "پبرݔر",
        "march-gen": "مارچ",
        "feb": "پبر",
        "mar": "مارچ",
        "apr": "آپریل",
-       "may": "می",
+       "may": "مئ",
        "jun": "جۏن",
        "jul": "جۏل",
        "aug": "آگو",
        "returnto": "شوتین بی $1.",
        "tagline": "شه {{SITENAME}}",
        "help": "کومک",
+       "help-mediawiki": "ویکی میدیاء بارہ‌ئا کومک",
        "search": "گردگ",
        "searchbutton": "گردگ",
        "go": "برا",
        "print": "چهاپ",
        "view": "دیستین",
        "view-foreign": "بگیند بی $1",
-       "edit": "ایڈیٹ",
-       "edit-local": "لوکال دسکریپشنء ایڈیٹ کورتین",
+       "edit": "ٹگلݔنگ",
+       "edit-local": "گوشتانکانء ٹگلݔنگ",
        "create": "جوڑ کورتین",
        "create-local": "لوکال دسکریپشنء اڈ کورتین",
        "delete": "پاک کورتین",
        "unprotect": "پروتکشنء ٹگل بدئ",
        "newpage": "نۏکݔں تاک",
        "talkpagelinktext": "گپ کن",
-       "specialpage": "Ù\87اسÛ\8cÙ\86 Ø¯Û\8cÙ\85",
+       "specialpage": "Ù\88تÛ\8cÚ¯Û\8c ØªØ§Ú©",
        "personaltools": "شخصی وسایل",
        "talk": "گپ",
        "views": "چارگان",
        "toolbox": "ابزار",
+       "tool-link-userrights": "{{GENDER:$1|user}}ءِ گروپء ٹگلݔنگ",
+       "tool-link-userrights-readonly": "{{GENDER:$1|user}}ء گروپء سۏج",
+       "tool-link-emailuser": "{{GENDER:$1|user}}ء ایمئیل",
        "imagepage": "بگیند پایلی دیما",
        "mediawikipage": "بگیند پیامی دیما",
        "templatepage": "بگیند تیملیتی دیما",
        "pool-queuefull": "مهزنء صف پر انت",
        "pool-errorunknown": "ناپجارین ارور",
        "pool-servererror": "سرویسء پول سینٹر ودی نبیت ($1).",
+       "poolcounter-usage-error": "اشتباہ اِنت: $1",
        "aboutsite": "{{SITENAME}}ءِ بارہ‌ئا",
        "aboutpage": "Project:باره",
        "copyright": "محتوا مان اجازت نامهٔ $1 انت مگان ایشی که آئی هلاپء آرگ ببیت انت.",
        "edithelp": "ٹگلݔنگء پئیم",
        "helppage-top-gethelp": "کومک",
        "mainpage": "بُنیادی دیم",
-       "mainpage-description": "بُنیادی دیم",
+       "mainpage-description": "بُنتاک",
        "policy-url": "Project:سیاست",
        "portal": "دیوانءِ درگت",
        "portal-url": "Project:پرتال انجمن",
        "newmessageslinkplural": "{{PLURAL:$1|نوکین کله|999=نوکین کله هان}}",
        "newmessagesdifflinkplural": "$1 {{PLURAL:$1|ٹگل داتن|پهکین ٹگل}}",
        "youhavenewmessagesmulti": "شما را نوکین کوله یان هست ته   $1",
-       "editsection": "ایڈیٹ",
-       "editold": "ایڈیٹ",
+       "editsection": "ٹگلݔنگ",
+       "editold": "ٹگلݔنگ",
        "viewsourceold": "به گند منبع ا",
-       "editlink": "ایڈیٹ",
+       "editlink": "ٹگلݔنگ",
        "viewsourcelink": "سرچمّگء چارگ",
        "editsectionhint": ": $1اصلاح انتخاب",
        "toc": "محتوا",
        "showtoc": "پیش دار",
        "hidetoc": "چیهر داتین",
        "collapsible-collapse": "چیهر داتین",
-       "collapsible-expand": "تچک کتن",
+       "collapsible-expand": "تچک کنگ",
        "confirmable-confirm": "آیا {{GENDER:$1|شما}} مطمعین ویت?",
        "confirmable-yes": "هان",
        "confirmable-no": "نه",
        "filerenameerror": "نه تونیت فایل نام عوض کنت  \"$1\" به \"$2\".",
        "filedeleteerror": "نه تونیت فایل حذف کنت  \"$1\".",
        "directorycreateerror": "نه تونیت مسیر شرکتن  \"$1\".",
+       "directoryreadonlyerror": "\"$1\" آمادہ اِنت",
+       "directorynotreadableerror": "\"$1\" آمادہ نئں",
        "filenotfound": "نه تونیت فایل درگیزگ \"$1\".",
        "unexpected": "ارزش نه لوٹتیگن : \"$1\"=\"$2\".",
        "formerror": "حطا: نه تونیت فرم دیم دنت",
        "badarticleerror": "ای کار ته ای صفحه اجرای نه بیت",
        "cannotdelete": "تاک یان پیکچرء هزپ کنگ «$1» بیت نه کنت.\nبلکین پیسرء دگر شهسء آئرا هزپ کتگ.",
        "cannotdelete-title": "نبیت تاکء «$1» هزپ به بیت.",
+       "delete-scheduled": "''$1''ء تاک پہ پاک کنگء واستا گچݔن بیتہ،بہ دار اِت دنکہ پاک بہ بیت۔",
        "delete-hook-aborted": "هزپ گون قلابء واسته ایر دارگ بوت.\nائ بابتء توضیحء درشان نه بوت.",
        "no-null-revision": "امکان نوکین هالیگ نسخهء اڈ کتن پر تاکء «$1» نه انت",
        "badtitle": "عنوان بد",
        "virus-scanfailed": "اسکن پروش وارت(کد $1)",
        "virus-unknownscanner": "ناشناسین آنتی ویروس:",
        "logouttext": "''' شما انیگء در شُت ات'''\nبزان که تانکه شمئی بروزرء چیرداتگین هافظه پهک مبیت، لهتئ چه تاکان ممکن انت رندا هم هنچوش پیش دارگ ببنت که انگار شما لاگین کتگ ات.",
-       "logout-failed": "ھنیگءَ نہ تۏن اِت در بئ اِت:",
+       "logging-out-notify": "شما ھمے ھنی دربیتگ اݔت،کمے سبر بہ کن اݔت",
+       "logout-failed": "ھنیگءَ نہ تۏن اِت در بئ اِت: $1",
+       "cannotlogoutnow-title": "ھنیگ نہ تۏن اݔت در بہ بئ اݔت",
        "welcomeuser": "وشاتک ات $1!",
        "welcomecreation-msg": "نۏکی شمئی ساب جۏڈ کنگ بیتہ.\nمہ شمۏش اِت کہ وتی [[Special:Preferences|واھشتاں {{SITENAME}}]] ٹگل بہ دئ اِت.",
        "yourname": "کار زوروکی نام:",
        "externaldberror": "یک حطا دیتابیس تصدیق هویت دراییگی هست یا شما را اجازت نیست وتی حساب درایی په روچ کنیت.",
        "login": "ورود",
        "nav-login-createaccount": "ورود/شرکتن حساب",
-       "logout": "در بوتین",
-       "userlogout": "در بوتین",
+       "logout": "در بییگ",
+       "userlogout": "در بییگ",
        "notloggedin": "وارد نهت",
        "userlogin-noaccount": "شما رء اکانت نه انت؟",
        "userlogin-joinproject": "مان {{SITENAME}} ناملکی بکن ات!",
        "hr_tip": "خط افقی",
        "summary": "کمݔں:",
        "subject": "موضوع/سرخط:",
-       "minoredit": "ای شی یک هوردین اصلاحیت",
+       "minoredit": "اݔشی یک ھُردݔں ٹگلے",
        "watchthis": "اے تاکا بہ چار",
        "savearticle": "تاکدیمِ ذخیره کورتین",
        "preview": "دیستین",
        "showpreview": "بازبین پیش دار",
-       "showdiff": "تغییرات پیش دار",
+       "showdiff": "ٹگلاں سۏج دئ",
        "blankarticle": "<strong>هشتار:</strong> شما بی یک هالی دیمی جوڑ\t کورتینا ئالاتا ویت.\nاگه \"$1\" ها پدا کلیک کنیت، بدون مئتواین دیمی جوڑ\tا بیت .",
        "anoneditwarning": "<strong>هشتار:</strong> شما لوگین نه بوته ایت . شمی آی پی نشانی په موچان دیستینی وڑ\tا بیت اگه هر \tٹگلی جوڑ\t بداریت . اگه <strong>[$1 لوگین بئیت]</strong> یا <strong>[$2 یک کاربرین حسابی جوڑ بکنیت]</strong>، شمی ایڈیت بی شمی کاربرین نام نسبت داته آ بینت، لوڑ گون دیگرین مزایایان .",
        "anonpreviewwarning": "''شما مان سیستمء لاگین نکتگ. ذخیره کتنء حالت شمئی آی‌پیء نشانیگ مان ائ پیجء هاپزگ سبت بیت انت.''",
        "lineno": "خط$1:",
        "compareselectedversions": "مقایسه انتخاب بوتگین نسخه یان",
        "showhideselectedversions": "سۏج/جوان کنگ اے ورژنئی",
-       "editundo": "خنثی کتن",
+       "editundo": "چھر دیگ",
        "diff-empty": "(بئ پرک)",
        "diff-multi-sameuser": "({{PLURAL:$1|یک میانجیگین نسخگ|$1 میانجیگین نسخگ}} گون همجندیء کاربر که پیش دارگ نه بوتگ انت)",
        "diff-multi-otherusers": "({{PLURAL:$1|یک میانجیگین نسخگ$1 میانجیگین نسخگ ان}} گون {{PLURAL:$2|دگرین کاربر|$2 کاربران}} پیش دارگ نه بوتگ انت)",
        "prefs-help-email": "ایمیلء ادرس ایهتیاری انت، بلئی پسوردء واتر کتن اگان وتی پسوردء شموش بکن ات ممکن بیت کنت انت.",
        "prefs-help-email-others": "شما هنچوشء توان ات اینتهاب بکن ات که کاربران بتوان انت چه شمئی بنتاکء لینک یانکه تران تاکء پر شما ایمیل دیم بده انت.\nشمئی ایمیل ادرس وهدء که ادگر شهسء پر شما ایمیل بجنت پیداگ نه بیت.",
        "prefs-help-email-required": "آدرس ایمیل نیازنت.",
-       "prefs-info": "اولگین اطلاعات",
+       "prefs-info": "اولیگݔں زانشتان",
        "prefs-i18n": "بین المللی کتن",
        "prefs-signature": "دسنام",
        "prefs-dateformat": "تاریح داب",
        "right-move-categorypages": "انتقال مان کتگوریء پیج ان",
        "right-movefile": "جاه په جاه کتن فایلان",
        "right-suppressredirect": "شر نه کتن یک غیر مستقیم چه کهنگین نام وهدی که یک صفحه ای جاه په جاه بیت",
-       "right-upload": "آپلود فایلان",
+       "right-upload": "پایلانء آپلود",
        "right-reupload": "هستین فایلی اوری بنویس",
        "right-reupload-own": "بنویس هستین فایلی که یک نفری آپلود بوتگین",
        "right-reupload-shared": "بنویس فایلانی که ته انبار میدیا شریکی ملکی انت",
        "action-move-rootuserpages": "جاه په جاه کتن صفحات کاربری اصلی",
        "action-move-categorypages": "انتقال مان کتگوریء پیج ان",
        "action-movefile": "ای فایلءَ جاه په جاه کن",
-       "action-upload": "آپلود کتن ای قایل",
+       "action-upload": "آپلود کنگ",
        "action-reupload": "نویسگ سر ای موجودن فایل",
        "action-reupload-shared": "باطل کتن ای فایل ته مخزن شریکی",
        "action-upload_by_url": "آیلود کتن ای فایل چه یک آدرس اینترنتیء",
        "nchanges": "$1 {{PLURAL:$1|تغییر|تغییرات}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|چه آهریگین چارگ}}",
        "enhancedrc-history": "وھدگ",
-       "recentchanges": "نوکین تغییرات",
+       "recentchanges": "نۏکݔں ٹگلاں",
        "recentchanges-legend": "گزینه ی نوکین تغییرات",
        "recentchanges-summary": "رندگر نوکترین تغییرات ته ویکی تی ای صفحه.",
        "recentchanges-noresult": "هچ تغییرء مان درچتگین درگتء گون ائ معیاران همگرنچ نه انت.",
        "rc-enhanced-expand": "جزئیاتء پیس دارگ",
        "rc-enhanced-hide": "پناه کتن جزییات",
        "rc-old-title": "اڈ بیتگ گون «$1»",
-       "recentchangeslinked": "مربوطین تغییرات",
+       "recentchangeslinked": "امبندݔں ٹگلاں",
        "recentchangeslinked-feed": "امبندݔں ٹگلاں",
        "recentchangeslinked-toolbox": "امبندݔں ٹگلاں",
        "recentchangeslinked-title": "تغییراتی مربوط په \"$1\"",
        "recentchangeslinked-summary": "شی یک لیستی چه تغییراتی هستنت که نوکی اعمال بوتگنت په صفحاتی که چه یک صفحه خاصی لینک بوته( یا په اعضای یک خاصین دسته).\nصفحات ته [[Special:Watchlist| شمی لیست چارگ]] '''' پررنگنت''''",
        "recentchangeslinked-page": "تاکدیمِ نام:",
        "recentchangeslinked-to": "پیش دار تغییرات په صفحاتی که لینک بوتگنت به جاه داتگین صفحه",
-       "upload": "آپلود کتن فایل",
+       "upload": "آپلود کنگ",
        "uploadbtn": "پایلء آپلود",
        "reuploaddesc": "کنسل آپلودء و ترر په فرم آپلود",
        "upload-tryagain": "فایلء ٹگا وارتگین توضیحاتء راهیگ بکن ات",
        "filename": "نام فایل",
        "filedesc": "کمݔں",
        "fileuploadsummary": "پائلء باروا:",
-       "filereuploadsummary": "تغییرات فایل:",
+       "filereuploadsummary": "پایلء ٹگلاں:",
        "filestatus": "وضعیت حق کپی:",
        "filesource": "منبع:",
        "ignorewarning": "هوژاری شموش و هرداب منته فایل ذخیره کن",
        "fileexists-shared-forbidden": "یک فایلی گون ای نام الان ته منبع مشترک فایل هستن.\nلطفا برگردیت و ای فایل گون نوکین نامی آپلود کنیت.[[File:$1|انگشتی|مرکز|$1]]",
        "file-exists-duplicate": "ای فایل کپیء چه جهلیگین  {{PLURAL:$1|فایل|فایلان}}:",
        "file-deleted-duplicate": "یک فایلی په داب ای فایل ([[:$1]]) پیسرتر حذف بوتگت. شما بایدن تاریح حذف آ فایلء دگه بچاریت",
-       "uploadwarning": "هوژاری آپلود",
+       "uploadwarning": "آپلودء ھُژاری",
        "savefile": "ذخیره فایل",
        "uploaddisabled": "آپ.د غبر فعال انت",
        "copyuploaddisabled": "بارگذاری از طریق نشانی اینترنتی غیرفعال است.",
        "mostcategories": "صفحات گون گیشترین دسته جات",
        "mostimages": "فایلان گیشنر لینک بوتیگن",
        "mostrevisions": "صفحاتی گون گیشترین بازبینی",
-       "prefixindex": "کل صفحات گون پیش وند",
+       "prefixindex": "پھکݔں تاکاں گۏں پݔشبند",
        "shortpages": "هوردین صفحه",
        "longpages": "صفحات مزنین",
        "deadendpages": "مرتگین صفحات",
        "protectedtitles": "عناوین محافظتی",
        "protectedtitles-summary": "این صفحه فهرست صفحات موجود است که در حال حاضر محافظت از ساخت شده‌اند. برای فهرست عنوان‌هایی که محافظت از ویرایش شده‌اند، به [[{{#special:ProtectedPages}}|{{int:protectedpages}}]] مراجعه کنید.",
        "protectedtitlesempty": "هچ عنوانی هنو گو ای پارامتران محافظت نهنت.",
-       "listusers": "لیست کاربر",
+       "listusers": "کارزورۏکء لیست",
        "listusers-editsonly": "فقط کاربرانی که اصلاحاتش هست پیش بدار",
        "listusers-creationsort": "ترتیب په اساس تاریح",
        "usereditcount": "$1 {{PLURAL:$1|اصلاح|اصلاحات}}",
        "alllogstext": "هور کت پیش دارگ کل موجودین آمار {{SITENAME}}.\nشما تونیت گون انتخاب یک نوع آمار،نام کاربر (حساس په هورد-مزنی)، یا متاثرین صفحه (هنچوش حساس په هورد-مزنی) کمتری کنیت.",
        "logempty": "هچ آیتم هم دپ ته آمار",
        "log-title-wildcard": "بگرد عناوین که گون ای متن شروع بنت",
-       "allpages": "کل صفحات",
+       "allpages": "پھکݔں تاکاں",
        "nextpage": "($1)ء اݔدگہ تاک",
        "prevpage": " ($1)پیشگین صفحه",
        "allpagesfrom": "پیش در صفحات شروع بنت ته:",
        "noemailtext": "ای کاربر یک آدرس ایمیل معتبری مشخص نه کتت.",
        "nowikiemailtext": "ای کاربر نه لوٹیت چه دگه کاربران ایمیل بگیرت.",
        "emailusername": "کار زوروکی نام:",
-       "emailusernamesubmit": "دیم دی",
+       "emailusernamesubmit": "دݔم دئ",
        "email-legend": "یک ایمیلی په دگه کاربر {{SITENAME}} دیم دی",
        "emailfrom": "شه:",
        "emailto": "بی:",
        "emailsubject": "موضوع:",
        "emailmessage": "کوله:",
-       "emailsend": "دیم دی",
+       "emailsend": "دݔم دئ",
        "emailccme": "یک کپی چه منی کوله په من وت ایمیل کن.",
        "emailccsubject": "کپی چه شمی کوله په $1: $2",
        "emailsent": "ایمیل دیم دهگ بوت",
        "undelete-error-long": "حطایانی پیش آت وهدی که فایل حذف ترینگ بوت:\n\n$1",
        "undelete-show-file-confirm": "آیا مطمئن ایت که حذف بوتگین بازبینی فایل \"<nowiki>$1</nowiki>\" از $2 ته $3 را بچاریت؟",
        "undelete-show-file-submit": "بله",
-       "namespace": "Ù\81اصÙ\84Ù\87 Ù\86اÙ\85",
+       "namespace": "Ù\86اÙ\85Ø¡ Ø¬Ø¯Ø§Û\8cÛ\8c",
        "invert": "برگردینگ انتخاب",
        "blanknamespace": "(بُنیادی)",
        "contributions": "مشارکتان کاربر",
        "tooltip-pt-watchlist": "لیست صفحیانی که شما تغییرات آیانا رند گرگیت",
        "tooltip-pt-mycontris": "لیست شمی مشارکتان",
        "tooltip-pt-login": "شر ترنت که وارد بیت، بله شی اجبار نهنت",
-       "tooltip-pt-logout": "در بیگ",
+       "tooltip-pt-logout": "در بییگ",
        "tooltip-ca-talk": "بحث دباره محتوای صفحه",
        "tooltip-ca-edit": "شما تونیت ای صفحه یا اصلاح کنیت. لطفا چه بازبین دکمه پیش چه ذخیره کتن استفاده کنیت.",
        "tooltip-ca-addsection": "یک نوکین بخشی شر کن",
        "tooltip-ca-nstab-help": "صفحه کمک بچار",
        "tooltip-ca-nstab-category": "دسته صفحه ی بچار",
        "tooltip-minoredit": "شی آ په داب یک اصلاح جزی نشان بل",
-       "tooltip-save": "وتی تغییرات ذخیره کن",
+       "tooltip-save": "وتی ٹگلاں سپت کن",
        "tooltip-preview": "بازبین کن وتی تغییراتا، لطفا پیش چه ذخیره کتن شیا استفاده کن.",
        "tooltip-diff": "پیش دار تغییراتی که شما په نوشته دات.",
        "tooltip-compareselectedversions": "بچار تفاوتان بین دو انتخاب بوتگین نسخه یان این صفحه",
index 21c661f..03c57b5 100644 (file)
        "autoblockedtext": "Ваш IP-адрас быў аўтаматычна заблякаваны, таму што ён ужываўся іншым удзельнікам, які быў заблякаваны $1.\nПрычына гэтага:\n\n:<em>$2</em>\n\n* Блякаваньне пачалося: $8\n* Блякаваньне скончыцца: $6\n* Быў заблякаваны: $7\n\nВы можаце скантактавацца з $1 ці з адным зь іншых [[{{MediaWiki:Grouppage-sysop}}|адміністратараў]], каб абмеркаваць блякаваньне.\n\nЗаўважце, што вы ня зможаце ўжываць магчымасьць «{{int:emailuser}}», пакуль ня будзе пазначаны дзейны адрас электроннай пошты ў вашых [[Special:Preferences|наладах удзельніка]], і калі гэта вам не было забаронена.\n\nВаш цяперашні IP-адрас — $3, ідэнтыфікатар блякаваньня — #$5.\nКалі ласка, улучайце ўсю вышэйпададзеную інфармацыю ва ўсе запыты, што вы будзеце рабіць.",
        "systemblockedtext": "Вашае імя ўдзельніка ці IP-адрас былі аўтаматычна заблякаваныя MediaWiki.\nЗ наступнай прычыны:\n\n:<em>$2</em>\n\n* Пачатак блякаваньня: $8\n* Сканчэньне блякаваньня: $6\n* Мэта блякаваньня: $7\n\nВаш цяперашні IP-адрас — $3.\nКалі ласка, уключайце ўсе пададзеныя вышэй дэталі ва ўсе запыты, што вы робіце.",
        "blockednoreason": "прычына не пазначана",
-       "blockedtext-composite": "<strong>Вашае імя ўдзельніка ці IP-адрас былі заблякаваныя.</strong>\n\nПададзеная прычына:\n\n:<em>$2</em>.\n\n* Пачатак блякаваньня: $8\n* Сканчэньне найдаўжэйшага з блякаваньняў: $6\n\nВаш цяперашні IP-адрас — $3.\nКалі ласка, дадайце ўсе падрабязнасьці, прыведзеныя вышэй, у запыты, што вы будзеце рабіць.",
+       "blockedtext-composite": "<strong>Вашае імя ўдзельніка ці IP-адрас былі заблякаваныя.</strong>\n\nПададзеная прычына:\n\n:<em>$2</em>.\n\n* Пачатак блякаваньня: $8\n* Сканчэньне найдаўжэйшага з блякаваньняў: $6\n\n* $5\n\nВаш цяперашні IP-адрас — $3.\nКалі ласка, дадайце ўсе падрабязнасьці, прыведзеныя вышэй, у запыты, што вы будзеце рабіць.",
+       "blockedtext-composite-ids": "Адпаведныя ідэнтыфікатары блякаваньня: $1 (ваш IP-адрас таксама можа знаходзіцца ў чорным сьпісе)",
        "blockedtext-composite-reason": "Маецца некалькі блякаваньняў вашага рахунку і/ці IP-адрасу",
        "whitelistedittext": "Вам трэба $1, каб рэдагаваць старонкі.",
        "confirmedittext": "Вы мусіце пацьвердзіць Ваш адрас электроннай пошты перад рэдагаваньнем старонак. Калі ласка, пазначце і пацьвердзіце адрас электроннай пошты праз Вашы [[Special:Preferences|налады]].",
        "specialmute-success": "Вашыя налады заглушэньня былі абноўленыя. Глядзіце ўсіх заглушаных удзельнікаў на старонцы [[Special:Preferences|вашых наладаў]].",
        "specialmute-submit": "Пацьвердзіць",
        "specialmute-label-mute-email": "Заглушыць лісты электроннай пошты ад гэтага ўдзельніка",
-       "specialmute-header": "Калі ласка, абярыце вашыя налады заглушэньня для {{BIDI:[[User:$1]]}}.",
+       "specialmute-header": "Калі ласка, абярыце вашыя налады заглушэньня для <b>{{BIDI:[[User:$1]]}}</b>.",
        "specialmute-error-invalid-user": "Запытанае імя ўдзельніка ня можа быць знойдзенае.",
-       "specialmute-error-email-blacklist-disabled": "Заглушэньне ўдзельнікам магчымасьці дасылаць вам лісты электроннай поштай ня ўключанае.",
-       "specialmute-error-email-preferences": "Вы мусіце пацьвердзіць ваш адрас электроннай пошты перад тым, як зможаце заглушыць удзельніка. Вы можаце зрабіць гэта ў [[Special:Preferences|наладах]].",
        "specialmute-email-footer": "Для кіраваньня наладамі электроннай пошты для {{BIDI:$2}}, калі ласка, наведайце <$1>.",
        "specialmute-login-required": "Калі ласка, увайдзіце, каб зьмяніць вашыя налады заглушэньня.",
+       "mute-preferences": "Налады заглушэньня",
        "revid": "вэрсія $1",
        "pageid": "Ідэнтыфікатар старонкі $1",
        "interfaceadmin-info": "$1\n\nДазволы на рэдагаваньне агульнасайтавых CSS/JS/JSON-файлаў былі нядаўна вылучаныя з права <code>editinterface</code>. Калі вы не разумееце, чаму атрымліваеце гэтую памылку, глядзіце [[mw:MediaWiki_1.32/interface-admin]].",
index 248b975..50e7aa8 100644 (file)
        "history": "Гісторыя старонкі",
        "history_short": "Гісторыя",
        "history_small": "гісторыя",
-       "updatedmarker": "абноÑ\9eлена Ð°Ð´ Ñ\87аÑ\81Ñ\83 апошняга наведвання",
+       "updatedmarker": "абноÑ\9eлена Ð¿Ð°Ñ\81лÑ\8f Ð²Ð°Ñ\88ага апошняга наведвання",
        "printableversion": "Для друку",
        "permalink": "Нязменная спасылка",
        "print": "Друкаваць",
        "virus-scanfailed": "не ўдалося праверыць (код $1)",
        "virus-unknownscanner": "невядомы антывірус:",
        "logouttext": "<strong>Вы выйшлі з сістэмы.</strong>\n\nЗаўважце, што некаторыя старонкі могуць паказвацца так, быццам вы яшчэ не выйшлі; у такім разе трэба ачысціць кэш вашага браўзера.",
+       "logout-failed": "Немагчыма выйсці зараз: $1",
        "cannotlogoutnow-title": "Зараз немагчыма выйсці",
        "cannotlogoutnow-text": "Пры выкарыстанні $1 выхад з сістэмы немагчымы.",
        "welcomeuser": "Вітаем, $1!",
        "page_first": "перш.",
        "page_last": "апошн.",
        "histlegend": "Выбар розніцы: адзначце радыё-боксы версій, якія трэба параўнаць і націсніце enter або кнопку, што ўнізе.<br /> Тлумачэнне: (з актуальн.) = розніца з актуальнай версіяй, (з папярэд.) = розніца з папярэдняй версіяй, д = дробная праўка.",
-       "history-fieldset-title": "Ð\9fÑ\80аглÑ\8fд Ð³Ñ\96Ñ\81Ñ\82оÑ\80Ñ\8bі",
+       "history-fieldset-title": "ФÑ\96лÑ\8cÑ\82Ñ\80аваÑ\86Ñ\8c Ð¿Ñ\80аÑ\9eкі",
        "history-show-deleted": "Толькі выдаленыя",
        "histfirst": "найстарэйшыя",
        "histlast": "найноўшыя",
        "action-changetags": "дадаваць і выдаляць адвольныя біркі да асобных версій і запісаў у журнале падзей",
        "action-deletechangetags": "выдаляць біркі з базы даных",
        "action-purge": "ачысціць кэш гэтай старонкі",
+       "action-apihighlimits": "карыстацца вышэйшымі лімітамі ў API-зваротах",
+       "action-autoconfirmed": "не падпарадкоўвацца абмежаванням хуткасці, накладзеным на IP",
+       "action-bigdelete": "выдаляць старонкі з вялікімі гісторыямі",
+       "action-blockemail": "забараняць удзельніку адсыланне эл.пошты",
+       "action-bot": "лічыцца аўтаматычным працэсам",
+       "action-editprotected": "правіць старонкі пад аховай \"{{int:protect-level-sysop}}\"",
+       "action-editsemiprotected": "правіць старонкі, што пад аховай \"{{int:protect-level-autoconfirmed}}\"",
+       "action-editinterface": "правіць карыстальніцкі інтэрфейс",
+       "action-editusercss": "правіць CSS-файлы іншых удзельнікаў",
+       "action-edituserjson": "правіць JSON-файлы іншых удзельнікаў",
+       "action-edituserjs": "правіць JavaScript-файлы іншых удзельнікаў",
+       "action-editmyusercss": "правіць уласныя CSS-файлы",
+       "action-editmyuserjson": "правіць уласныя JSON-файлы",
+       "action-editmyuserjs": "правіць уласныя JavaScript-файлы",
+       "action-viewsuppressed": "бачыць версіі, схаваныя ад усіх удзельнікаў",
+       "action-hideuser": "забараняць імя ўдзельніка і рабіць яго нябачным",
+       "action-ipblock-exempt": "перамагаць забароны на IP, аўта- і дыяпазонныя забароны",
+       "action-unblockself": "разблакаваць сябе",
+       "action-noratelimit": "не падпарадкоўвацца абмежаванням хуткасці",
+       "action-reupload-own": "перазапісваць уласныя існуючыя файлы",
+       "action-nominornewtalk": "не паведамляць пра новыя паведамленні ў адказ на дробныя праўкі размоўных старонак",
+       "action-markbotedits": "меціць адкочаныя праўкі як праўкі робатаў",
+       "action-patrolmarks": "бачыць меткі ўхвалення нядаўніх змяненняў",
+       "action-override-export-depth": "экспартаваць старонкі, у тым ліку звязаныя, да глыбіні спасылак 5.",
+       "action-suppressredirect": "не пакідаць перасылку са старой назвы пасля пераносу старонкі",
        "nchanges": "$1 {{PLURAL:$1|змена|змены|змен}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|з часу апошняга наведвання}}",
        "enhancedrc-history": "гісторыя",
        "rcfilters-savedqueries-already-saved": "Гэтыя фільтры ўжо захаваны. Змяніце свае настройкі, каб стварыць новы Захаваны фільтр.",
        "rcfilters-restore-default-filters": "Аднавіць фільтры па змоўчанні",
        "rcfilters-clear-all-filters": "Ачысціць усе фільтры",
-       "rcfilters-show-new-changes": "Паказаць навейшыя змяненні",
+       "rcfilters-show-new-changes": "Паказаць навейшыя змяненні з $1",
        "rcfilters-search-placeholder": "Змяненні фільтра (выкарыстоўвайце меню ці шукайце па назве фільтра)",
        "rcfilters-invalid-filter": "Недапушчальны фільтр",
        "rcfilters-empty-filter": "Няма актыўных фільтраў. Паказваюцца ўсе праўкі.",
        "rcfilters-filterlist-title": "Фільтры",
        "rcfilters-filterlist-whatsthis": "Як гэта працуе?",
-       "rcfilters-filterlist-feedbacklink": "Паведаміце нам сваё меркаванне аб гэтых (новых) інструментах фільтрацыі",
+       "rcfilters-filterlist-feedbacklink": "Паведаміце нам сваё меркаванне аб гэтых інструментах фільтрацыі",
        "rcfilters-highlightbutton-title": "Выдзеліць вынікі",
        "rcfilters-highlightmenu-title": "Выбраць колер",
        "rcfilters-highlightmenu-help": "Выбраць колер для падсвечвання уласцівасці",
        "imagelinks": "Выкарыстанне файла",
        "linkstoimage": "{{PLURAL:$1|Наступная $1 старонка выкарыстоўвае|Наступныя $1 старонкі выкарыстоўваюць|Наступныя $1 старонак выкарыстоўваюць}} гэты файл:",
        "linkstoimage-more": "На гэты файл існуюць спасылкі з больш як $1 {{PLURAL:$1|старонкі|старонак}}.\nНаступны пералік паказвае толькі {{PLURAL:$1|першую спасылку|першыя $1 з іх}}.\nТаксама ёсць [[Special:WhatLinksHere/$2|поўны пералік]].",
-       "nolinkstoimage": "Ð\9dÑ\8fма Ñ\81Ñ\82аÑ\80онак, Ñ\8fкÑ\96Ñ\8f Ð± Ñ\81паÑ\81Ñ\8bлалÑ\96Ñ\81Ñ\8f Ð½Ð° файл.",
+       "nolinkstoimage": "Ð\9dÑ\8fма Ñ\81Ñ\82аÑ\80онак, Ñ\8fкÑ\96Ñ\8f Ð²Ñ\8bкаÑ\80Ñ\8bÑ\81Ñ\82оÑ\9eваÑ\8eÑ\86Ñ\8c Ð³Ñ\8dÑ\82Ñ\8b файл.",
        "morelinkstoimage": "Паказаць [[Special:WhatLinksHere/$1|больш спасылак]] на гэты файл.",
        "linkstoimage-redirect": "$1 (файл-перанакіраванне) $2",
        "duplicatesoffile": "Наступн{{PLURAL:$1|ы файл з’яўляецца дублікатам|ыя $1 файлы з’яўляюцца дублікатамі}} гэтага файла ([[Special:FileDuplicateSearch/$2|падрабязна]]):",
        "apisandbox-submit": "Зрабіць запыт",
        "apisandbox-reset": "Ачысціць",
        "apisandbox-retry": "Паўтарыць",
+       "apisandbox-loading": "Загрузка інфармацыі для API-модуля «$1»...",
        "apisandbox-no-parameters": "Гэты модуль API не мае параметраў.",
        "apisandbox-helpurls": "Спасылкі на даведку",
        "apisandbox-examples": "Прыклады",
        "activeusers-count": "$1 {{PLURAL:$1|дзеянне|дзеянні|дзеянняў}} за апошні{{PLURAL:$3| дзень|я $3 дні|я $3 дзён}}",
        "activeusers-from": "Паказ, пачынаючы з:",
        "activeusers-groups": "Паказаць удзельнікаў, якія належаць да груп:",
+       "activeusers-excludegroups": "Выключыць удзельнікаў, якія належаць да груп:",
        "activeusers-noresult": "Няма такіх удзельнікаў.",
        "activeusers-submit": "Паказаць актыўных удзельнікаў",
        "listgrouprights": "Дазволы для груп удзельнікаў",
        "watchlistanontext": "Каб паглядзець ці змяніць спіс назірання, трэба прадставіцца сістэме.",
        "watchnologin": "Без прадстаўлення",
        "addwatch": "Дадаць у спіс назірання",
-       "addedwatchtext": "Старонка \"[[:$1]]\" была дададзена да [[Special:Watchlist|назіраных]] вамі.\nЗмяненні, якія адбудуцца з гэтай старонкай і з размовамі пра яе, будуць паказвацца ў спісе назірання.",
+       "addedwatchtext": "Старонка \"[[:$1]]\" і яе размовная старонка былі дададзены да [[Special:Watchlist|спісу назірання]].",
+       "addedwatchtext-talk": "Старонка \"[[:$1]]\" і яе звязаная старонка былі дададзены да [[Special:Watchlist|спісу назірання]].",
        "addedwatchtext-short": "Старонка \"$1\" была дададзена ў ваш спіс назірання.",
        "removewatch": "Выдаліць са спісу назірання",
        "removedwatchtext": "Старонка \"[[:$1]]\" была вынята з Вашага [[Special:Watchlist|спісу назірання]].",
        "mycontris": "Уклад",
        "anoncontribs": "Уклад",
        "contribsub2": "Для $1 ($2)",
+       "contributions-subtitle": "Для {{GENDER:$3|$1}}",
        "contributions-userdoesnotexist": "Уліковы запіс удзельніка \"$1\" не зарэгістраваны.",
        "nocontribs": "Не знойдзена змен, адпаведных зададзеным параметрам.",
        "uctop": "апошн.",
        "ipbreason": "Прычына:",
        "ipbreason-dropdown": "*Звычайныя прычыны блоку\n** Упісванне несапраўднай інфармацыі\n** Выдаленне інфармацыі са старонак\n** Спамавыя спасылкі на вонкавыя сайты\n** Упісванне бессэнсоўнай інфармацыі\n** Некультурныя паводзіны/пераследаванне\n** Злоўжыванне некалькімі рахункамі\n** Недапушчальнае імя ўдзельніка",
        "ipb-hardblock": "Забараніць зарэгістраваным удзельнікам рэдагаванне з гэтага IP-адраса",
-       "ipbcreateaccount": "Ð\9dе Ð´Ð°Ð·Ð²Ð°Ð»Ñ\8fÑ\86Ñ\8c Ñ\81Ñ\82ваÑ\80Ñ\8dнне Ñ\80аÑ\85Ñ\83нка",
-       "ipbemailban": "Ð\9dе Ð´Ð°Ð·Ð²Ð°Ð»Ñ\8fÑ\86Ñ\8c Ñ\83дзелÑ\8cнÑ\96кÑ\83 Ñ\81лаÑ\86Ñ\8c Ñ\8dл.поÑ\88Ñ\82Ñ\83",
+       "ipbcreateaccount": "СÑ\82ваÑ\80Ñ\8dнне Ñ\80аÑ\85Ñ\83нкаÑ\9e",
+       "ipbemailban": "Ð\90дпÑ\80аÑ\9eка Ñ\8dл. Ð¿Ð¾Ñ\88Ñ\82Ñ\8b",
        "ipbenableautoblock": "Аўтаматычна блакаваць адрас IP, якім удзельнік карыстаўся апошнім разам, і ўсе наступныя адрасы IP, з-пад якіх ён паспрабуе рабіць праўкі",
        "ipbsubmit": "Заблакаваць удзельніка",
        "ipbother": "Іншы час",
        "ipboptions": "2 гадзіны:2 hours,1 дзень:1 day,3 дні:3 days,1 тыдзень:1 week,2 тыдні:2 weeks,1 месяц:1 month,3 месяцы:3 months,6 месяцаў:6 months,1 год:1 year,назаўсёды:infinite",
        "ipbhidename": "Не паказваць імя ўдзельніка ў гісторыях правак і ў спісах",
        "ipbwatchuser": "Назіраць уласную і размоўную старонкі гэтага ўдзельніка",
-       "ipb-disableusertalk": "Ð\97абаÑ\80анÑ\96Ñ\86Ñ\8c Ð³Ñ\8dÑ\82амÑ\83 Ñ\9eдзелÑ\8cнÑ\96кÑ\83 Ñ\80Ñ\8dдагаваÑ\86Ñ\8c Ñ\81ваÑ\8e Ñ\81Ñ\82аÑ\80онкÑ\83 Ñ\80азмоÑ\9e Ð¿Ð°Ð´Ñ\87аÑ\81 Ð±Ð»Ð°ÐºÑ\96Ñ\80оÑ\9eкÑ\96",
+       "ipb-disableusertalk": "РÑ\8dдагаванне Ñ\81ваÑ\91й Ñ\81Ñ\82аÑ\80онкÑ\96 Ñ\80азмоÑ\9e",
        "ipb-change-block": "Змяніць настройкі блакіравання ўдзельніка",
        "ipb-confirm": "Пацвердзіць блакіроўку",
        "ipb-sitewide": "Ва ўсім праекце",
        "block-actions": "Дзеянні для блакіроўкі:",
        "block-expiry": "Згасае:",
        "block-options": "Дадатковыя опцыі:",
+       "block-prevent-edit": "Праўка",
+       "block-reason": "Прычына:",
        "block-target": "Удзельнік або адрас IP:",
        "unblockip": "Зняць блок з удзельніка",
        "unblockiptext": "З дапамогай формы ніжэй можна вярнуць дазвол на праўкі для раней заблакіраванага IP-адраса або ўдзельніка.",
        "autoblocklist": "Аўтаблакіроўкі",
        "autoblocklist-submit": "Шукаць",
        "autoblocklist-legend": "Спіс аўтаблакіровак",
+       "autoblocklist-localblocks": "{{PLURAL:$1|Лакальная аўтаблакіроўка|Лакальныя аўтаблакіроўкі}}",
        "autoblocklist-empty": "Спіс аўтаблакіровак пусты.",
+       "autoblocklist-otherblocks": "{{PLURAL:$1|Іншая аўтаблакіроўка|Іншыя аўтаблакіроўкі}}",
        "ipblocklist": "Заблакаваныя ўдзельнікі",
        "ipblocklist-legend": "Знайсці заблакаванага ўдзельніка",
        "blocklist-userblocks": "Схаваць блакіроўкі ўліковых запісаў",
        "blocklist-tempblocks": "Схаваць часавыя блакіроўкі",
        "blocklist-addressblocks": "Схаваць блакаванні асобных IP",
+       "blocklist-type": "Тып:",
+       "blocklist-type-opt-all": "Усе",
+       "blocklist-type-opt-sitewide": "Ва ўсім праекце",
+       "blocklist-type-opt-partial": "Частковая",
        "blocklist-rangeblocks": "Схаваць блакіроўкі дыяпазонаў",
        "blocklist-timestamp": "Дата/час",
        "blocklist-target": "Мэта",
        "createaccountblock": "стварэнне рахунка заблакавана",
        "emailblock": "эл.пошта заблакавана",
        "blocklist-nousertalk": "не мае дазволу правіць уласную старонку размоў",
+       "blocklist-editing": "праўка",
+       "blocklist-editing-sitewide": "праўка (ва ўсім праекце)",
+       "blocklist-editing-page": "старонкі",
+       "blocklist-editing-ns": "прасторы назваў",
        "ipblocklist-empty": "Спіс блокаў зараз пусты.",
        "ipblocklist-no-results": "Няма блокаў на такі адрас IP або на такое імя ўдзельніка.",
        "blocklink": "заблакаваць",
        "pageinfo-display-title": "Паказаная назва",
        "pageinfo-default-sort": "Прадвызначаны ключ парадкавання",
        "pageinfo-length": "Аб'ём старонкі (у байтах)",
+       "pageinfo-namespace": "Прастора назваў",
        "pageinfo-article-id": "Ідэнтыфікатар старонкі",
        "pageinfo-language": "Мова змесціва старонкі",
        "pageinfo-language-change": "змяніць",
        "previousdiff": "← Папярэдняя праўка",
        "nextdiff": "Наступная праўка →",
        "mediawarning": "'''Увага''': у гэтым тыпе файлаў бывае зламысны код, выкананне якога можа паставіць пад небяспеку вашу сістэму.",
-       "imagemaxsize": "Ð\9cÑ\8fжа Ð¿Ð°Ð¼ÐµÑ\80Ñ\83 Ð²Ñ\8bÑ\8fваÑ\9e:<br />''(на Ñ\82лÑ\83маÑ\87алÑ\8cнÑ\8bÑ\85 Ñ\81Ñ\82аÑ\80онкаÑ\85)''",
+       "imagemaxsize": "Ð\90бмежаванне Ð¿Ð°Ð¼ÐµÑ\80Ñ\83 Ð²Ñ\8bÑ\8fваÑ\9e Ð½Ð° Ñ\82лÑ\83маÑ\87алÑ\8cнÑ\8bÑ\85 Ñ\81Ñ\82аÑ\80онкаÑ\85 Ñ\84айлаÑ\9e:",
        "thumbsize": "Памеры драбніцы:",
        "widthheightpage": "$1 × $2, $3 {{PLURAL:$3|старонка|старонак}}",
        "file-info": "аб'ём файла: $1, тып MIME: $2",
        "confirmemail_invalidated": "Пацверджанне эл.пошты скасаванае",
        "invalidateemail": "Адмовіцца ад пацверджання эл.пошты",
        "notificationemail_subject_changed": "Адрас электроннай пошты на пляцоўцы {{SITENAME}} зменены",
+       "notificationemail_subject_removed": "Адрас электроннай пошты на пляцоўцы {{SITENAME}} выдалены",
        "scarytranscludedisabled": "[Устаўлянне з іншых вікі не дазволена]",
        "scarytranscludefailed": "[Не ўдалося атрымаць шаблон для $1]",
        "scarytranscludefailed-httpstatus": "[Не ўдалося атрымаць шаблон для $1: HTTP $2]",
        "confirm-unwatch-top": "Выняць гэту старонку з Вашага спісу назірання?",
        "confirm-rollback-button": "Добра",
        "confirm-rollback-top": "Адкаціць праўкі гэтай старонкі?",
+       "confirm-mcrrestore-title": "Аднавіць версію",
+       "confirm-mcrundo-title": "Адмяніць змяненне",
+       "mcrundofailed": "Адмяніць не атрымалася",
+       "mcrundo-missingparam": "У запыце адсутнічаюць абавязковыя параметры.",
        "quotation-marks": "«$1»",
        "imgmultipageprev": "← папярэдняя старонка",
        "imgmultipagenext": "наступная старонка →",
        "version-specialpages": "Адмысловыя старонкі",
        "version-parserhooks": "Хукі парсера",
        "version-variables": "Зменныя",
+       "version-editors": "Рэдактары",
        "version-antispam": "Абарона ад спаму",
        "version-other": "Рознае",
        "version-mediahandlers": "Апрацоўнікі мультымедый",
        "compare-invalid-title": "Абраная вамі назва недапушчальная.",
        "compare-title-not-exists": "Не існуе названай вамі назвы.",
        "compare-revision-not-exists": "Паказанай вамі версіі не існуе.",
-       "diff-form": "'''фармуляр'''",
+       "diff-form": "Адрозненні",
        "diff-form-oldid": "Стары ідэнтыфікатар версіі (неабавязкова)",
        "diff-form-submit": "Паказаць адрозненні",
        "permanentlink": "Пастаянная спасылка",
        "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-partialblock-block-page": "{{PLURAL:$1|старонка|старонкі}} $2",
        "logentry-suppress-block": "$1 {{GENDER:$2|заблакіраваў|заблакіравала}} {{GENDER:$4|$3}} на перыяд $5 $6",
        "logentry-suppress-reblock": "$1 {{GENDER:$2|памяняў|памяняла}} параметры блакіроўкі {{GENDER:$4|$3}} на перыяд $5 $6",
        "logentry-import-upload": "$1 {{GENDER:$2|імпартаваў|імпартавала}} $3 праз укладанне файла",
        "logentry-protect-protect-cascade": "$1 {{GENDER:$2|абараніў|абараніла}} $3 $4 [каскадна]",
        "logentry-protect-modify": "$1 {{GENDER:$2|змяніў узровень|змяніла ўзровень}} аховы $3 $4",
        "logentry-protect-modify-cascade": "$1 {{GENDER:$2|змяніў узровень|змяніла ўзровень}} аховы $3 $4 [каскадна]",
-       "logentry-rights-rights": "$1 {{GENDER:$2|змяніў|змяніла}} прыналежнасць $3 да групы з $4 на $5",
+       "logentry-rights-rights": "$1 {{GENDER:$2|змяніў|змяніла}} прыналежнасць {{GENDER:$6|$3}} да групы з $4 на $5",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|змяніў|змяніла}} прыналежнасць $3 да групы",
        "logentry-rights-autopromote": "$1 аўтаматычна {{GENDER:$2|пераведзены|пераведзена}} з $4 у $5",
        "logentry-upload-upload": "$1 {{GENDER:$2|уклаў|уклала}} $3",
        "pagelang-select-lang": "Выберыце мову",
        "pagelang-reason": "Прычына",
        "pagelang-submit": "Адправіць",
+       "pagelang-nonexistent-page": "Старонка $1 не існуе.",
        "right-pagelang": "Змяняць мову старонкі",
        "action-pagelang": "змяняць мову старонкі",
        "log-name-pagelang": "Журнал змянення мовы",
        "mw-widgets-abandonedit": "Вы сапраўды жадаеце выйсці з рэжыму рэдагавання, не захаваўшы змены?",
        "mw-widgets-abandonedit-discard": "Адмяніць змены",
        "mw-widgets-abandonedit-keep": "Працягнуць рэдагаванне",
+       "mw-widgets-abandonedit-title": "Вы ўпэўненыя?",
+       "mw-widgets-copytextlayout-copy": "Капіраваць",
        "mw-widgets-dateinput-no-date": "Дата не выбрана",
        "mw-widgets-mediasearch-input-placeholder": "Пошук мультымедыя",
+       "mw-widgets-mediasearch-noresults": "Нічога не знойдзена.",
        "mw-widgets-titleinput-description-new-page": "старонка яшчэ не існуе",
        "mw-widgets-titleinput-description-redirect": "перанакіраванне на $1",
+       "mw-widgets-categoryselector-add-category-placeholder": "Дадаць катэгорыю...",
        "mw-widgets-usersmultiselect-placeholder": "Дадаць яшчэ...",
+       "mw-widgets-titlesmultiselect-placeholder": "Дадаць яшчэ...",
        "date-range-from": "Ад даты:",
        "date-range-to": "Да даты:",
        "randomrootpage": "Выпадковая карэнная старонка",
        "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": "Змяненне Contentmodel",
-       "log-action-filter-contentmodel-new": "Стварэнне старонкі з нестандартным Contentmodel",
+       "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": "Выдаленне лога",
        "userjsispublic": "Звярніце ўвагу: укладзеныя JavaScript-старонкі не павінны ўтрымліваць канфідэнцыйныя звесткі, бо іх могуць бачыць іншыя ўдзельнікі.",
        "usercssispublic": "Звярніце ўвагу: укладзеныя CSS-старонкі не павінны ўтрымліваць канфідэнцыйныя звесткі, бо іх могуць бачыць іншыя ўдзельнікі.",
        "restrictionsfield-badip": "Няслушны IP-адрас ці дыяпазон: $1",
-       "restrictionsfield-label": "Дазволеныя дыяпазоны IP-адрасоў:"
+       "restrictionsfield-label": "Дазволеныя дыяпазоны IP-адрасоў:",
+       "edit-error-short": "Памылка: $1",
+       "edit-error-long": "Памылкі:\n\n$1",
+       "specialmute-submit": "Пацвердзіць",
+       "revid": "версія $1",
+       "pageid": "ID старонкі $1",
+       "pagedata-title": "Дадзеныя старонкі",
+       "passwordpolicies-policyflag-forcechange": "мусіць быць зменены пры ўваходзе",
+       "passwordpolicies-policyflag-suggestchangeonlogin": "прапанаваць змяненне пры ўваходзе"
 }
index 832c1ca..fd5c2a0 100644 (file)
        "backend-fail-maxsize": "Файлът „$1“ не може да бъде съхранен, тъй като размерът му надвишава {{PLURAL:$2|един байт|$2 байт}}.",
        "backend-fail-connect": "Не е възможно свързването към бекенда за съхранение „$1“.",
        "backend-fail-internal": "Възникна неизвестна грешка в бекенда за съхранение „$1“.",
+       "backend-fail-contenttype": "Не може да бъде определен типът на съдържанието на този файл, за да бъде съхранен в „$1“.",
        "zip-file-open-error": "Възникна грешка при отваряне на файла за проверка на ZIP.",
        "zip-wrong-format": "Указаният файл не е ZIP файл.",
        "zip-bad": "Файлът е повреден или е нечетим ZIP файл.\nСигурността му не може да бъде проверена.",
        "uploadstash-errclear": "Изчистването на файловете беше неуспешно.",
        "uploadstash-refresh": "Обновяване на списъка с файлове",
        "uploadstash-thumbnail": "преглед на миниатюра",
+       "uploadstash-bad-path": "Пътят не съществува.",
+       "uploadstash-bad-path-invalid": "Пътят не е валиден.",
        "uploadstash-bad-path-unknown-type": "Неизвестен тип „$1“.",
+       "uploadstash-bad-path-unrecognized-thumb-name": "Неразпознато име на миниатюрата.",
+       "uploadstash-bad-path-bad-format": "Ключът „$1“ не е в подходящ формат.",
+       "uploadstash-file-not-found-missing-content-type": "Липсваща заглавка за типа на съдържанието.",
+       "uploadstash-file-not-found-not-exists": "Не може да бъде намерен пътят или файлът не е обикновен (plain).",
        "uploadstash-wrong-owner": "Файлът ($1) не принадлежи на текущия потребител.",
        "uploadstash-no-such-key": "Няма такъв ключ ($1), не може да бъде премахнат.",
        "uploadstash-no-extension": "Разширението е нулево.",
        "blocklist-userblocks": "Скриване блокирането на потребителски сметки",
        "blocklist-tempblocks": "Скриване на временни блокирания",
        "blocklist-addressblocks": "Скриване на отделни блокирания на IP адреси",
+       "blocklist-type-opt-all": "Всички",
        "blocklist-type-opt-sitewide": "За всички уикита",
        "blocklist-type-opt-partial": "Частично",
        "blocklist-rangeblocks": "Скриване на блокиранията по IP диапазон",
        "blocklink": "блокиране",
        "unblocklink": "отблокиране",
        "change-blocklink": "промяна на параметрите на блокирането",
+       "empty-username": "(няма налично потребителско име)",
        "contribslink": "приноси",
        "emaillink": "изпращане на е-писмо",
        "autoblocker": "Бяхте блокиран автоматично, тъй като неотдавна IP-адресът Ви е бил ползван от блокирания в момента потребител „[[User:$1|$1]]“.\nПричината за блокирането на „$1“ е: „$2“.",
        "limitreport-ppgeneratednodes-value": "$1/$2",
        "limitreport-postexpandincludesize-value": "$1/$2 {{PLURAL:$2|байт|байта}}",
        "limitreport-templateargumentsize-value": "$1/$2 {{PLURAL:$2|байт|байта}}",
+       "limitreport-expansiondepth": "Най-голяма дълбочина на разгръщане",
        "limitreport-expansiondepth-value": "$1/$2",
        "limitreport-expensivefunctioncount-value": "$1/$2",
        "expandtemplates": "Разгръщане на шаблони",
        "mediastatistics-header-video": "Видео",
        "mediastatistics-header-multimedia": "Мултимедия",
        "mediastatistics-header-office": "Офис",
+       "mediastatistics-header-text": "Текстови",
+       "mediastatistics-header-executable": "Изпълними",
+       "mediastatistics-header-archive": "Компресирани формати",
        "mediastatistics-header-total": "Всички файлове",
        "json-error-state-mismatch": "Невалиден или грешно структуриран JSON",
        "json-error-ctrl-char": "Грешка в контролния знак. Вероятно е неправилно кодиран",
        "mw-widgets-abandonedit-discard": "Отказване на редакциите",
        "mw-widgets-abandonedit-keep": "Продължаване на редактирането",
        "mw-widgets-abandonedit-title": "Сигурни ли сте?",
+       "mw-widgets-copytextlayout-copy": "Копиране",
+       "mw-widgets-copytextlayout-copy-fail": "Неуспех при копиране в системния буфер.",
+       "mw-widgets-copytextlayout-copy-success": "Копирано в системния буфер.",
        "mw-widgets-dateinput-no-date": "Не е избрана дата",
        "mw-widgets-dateinput-placeholder-day": "ГГГГ-ММ-ДД",
        "mw-widgets-dateinput-placeholder-month": "ГГГГ-ММ",
        "authmanager-provider-password": "Удостоверяване с парола",
        "authmanager-provider-temporarypassword": "Временна парола",
        "authprovider-confirmlink-option": "$1 ($2)",
+       "authprovider-confirmlink-success-line": "$1: Успешно свързване.",
        "authprovider-confirmlink-failed-line": "$1: $2",
+       "authprovider-confirmlink-failed": "Свързването на сметката не е напълно успешно: $1",
+       "authprovider-confirmlink-ok-help": "Продължаване след показване на съобщения за неуспешно свързване.",
        "authprovider-resetpass-skip-label": "Пропускане",
        "authform-newtoken": "Липсва маркер. $1",
        "authform-notoken": "Липсва маркер",
        "restrictionsfield-label": "Позволени IP-диапазони:",
        "edit-error-short": "Грешка: $1",
        "edit-error-long": "Грешки:\n\n$1",
+       "specialmute-submit": "Потвърждаване",
        "revid": "версия $1",
        "pageid": "ID на страницата $1",
        "interfaceadmin-info": "$1\n\nПравата за редактиране на CSS/JS/JSON в целия сайт наскоро бяха отделени от правата <code>editinterface</code>. Ако не разбирате защо получавате тази грешка, погледнете [[mw:MediaWiki_1.32/interface-admin]].",
        "passwordpolicies-policy-passwordcannotmatchblacklist": "Паролата не може да съвпада с пароли от черния списък",
        "passwordpolicies-policy-maximalpasswordlength": "Паролата трябва да бъде по-малко от $1 {{PLURAL:$1|знак|знака}}",
        "passwordpolicies-policy-passwordcannotbepopular": "Паролата не може да бъде {{PLURAL:$1|най-популярната такава|от списъка на най-популярните $1 пароли}}",
-       "passwordpolicies-policyflag-forcechange": "трябва да бъде променена при влизане"
+       "passwordpolicies-policyflag-forcechange": "трябва да бъде променена при влизане",
+       "passwordpolicies-policyflag-suggestchangeonlogin": "предложи промяна при вход",
+       "userlogout-continue": "Искате да излезете?"
 }
index 461ad0a..65ab290 100644 (file)
        "pool-servererror": "El servei de recompte de la reserva no és disponible ($1).",
        "poolcounter-usage-error": "Error d'ús: $1",
        "aboutsite": "Quant al projecte {{SITENAME}}",
-       "aboutpage": "Project:Quant al",
+       "aboutpage": "Project:Quant a",
        "copyright": "El contingut està disponible sota la llicència $1 si no s'indica el contrari.",
        "copyrightpage": "{{ns:project}}:Drets d'autor",
        "currentevents": "Actualitat",
        "edit-gone-missing": "No s'ha pogut actualitzar la pàgina.\nSembla haver estat esborrada.",
        "edit-conflict": "Conflicte d'edició.",
        "edit-no-change": "S'ha ignorat la vostra modificació perquè no feia cap canvi al text.",
+       "edit-slots-cannot-add": "{{PLURAL:$1|L'espai no està|Els espais no estan}} implementats aquí: $2.",
+       "edit-slots-cannot-remove": "{{PLURAL:$1|L'espai següent és necessari i no es pot suprimir|Els espais següents són necessaris i no es poden suprimir}}: $2.",
        "postedit-confirmation-created": "S'ha creat la pàgina.",
        "postedit-confirmation-restored": "S'ha restaurat la pàgina.",
        "postedit-confirmation-saved": "S'ha desat la modificació.",
        "defaultmessagetext": "Missatge per defecte",
        "content-failed-to-parse": "Ha fallat l'anàlisi del contingut de $2 per al model $1: $3",
        "invalid-content-data": "Dades de contingut no vàlides",
-       "content-not-allowed-here": "No és permès el contingut «$1» a la pàgina [[:$2]]",
+       "content-not-allowed-here": "No és permès el contingut «$1» a la pàgina [[:$2]] a l'espai «$3»",
        "editwarning-warning": "Si sortiu d'aquesta pàgina, perdreu tots els canvis que hàgiu fet.\nSi teniu un compte d'usuari, podeu eliminar aquest avís en la secció «{{int:prefs-editing}}» de les vostres preferències.",
        "editpage-invalidcontentmodel-title": "Model de contingut no permès",
        "editpage-invalidcontentmodel-text": "El model de contingut «$1» no és permès.",
        "converter-manual-rule-error": "Error detectat a la norma de conversió de llengua manual",
        "undo-success": "Pot desfer-se la modificació. Si us plau, reviseu la comparació de sota per a assegurar-vos que és el que voleu fer; llavors deseu els canvis per a finalitzar la desfeta de l'edició.",
        "undo-failure": "No pot desfer-se la modificació perquè hi ha edicions intermèdies en conflicte.",
+       "undo-main-slot-only": "No s'ha pogut desfer la modificació perquè implicava contingut de fora de l'espai principal.",
        "undo-norev": "No s'ha pogut desfer l'edició perquè no existeix o s'ha suprimit.",
        "undo-nochange": "Sembla que ja s'ha desfet la modificació.",
        "undo-summary": "Es desfà la revisió $1 de [[Special:Contributions/$2|$2]] ([[User talk:$2|Discussió]])",
        "grant-delete": "Suprimeix pàgines, revisions i entrades de registre",
        "grant-editinterface": "Modifica l'espai de noms MediaWiki i el JSON global del lloc o de l'usuari",
        "grant-editmycssjs": "Modifiqueu el vostre CSS/JSON/JavaScript d'usuari",
-       "grant-editmyoptions": "Editeu les vostres preferències d'usuari",
+       "grant-editmyoptions": "Editeu les vostres preferències d'usuari i la configuració JSON",
        "grant-editmywatchlist": "Modifica la llista de seguiment",
        "grant-editpage": "Modifica les pàgines existents",
        "grant-editprotected": "Modifica pàgines protegides",
        "lockmanager-fail-closelock": "No s'ha pogut blocar el fitxer per «$1».",
        "lockmanager-fail-deletelock": "No s'ha pogut suprimir el fitxer de blocatge per «$1».",
        "lockmanager-fail-acquirelock": "No s'ha pogut adquirir el blocatge de «$1».",
-       "lockmanager-fail-openlock": "No s'ha pogut obrir el fitxer de blocatge de «$1».",
+       "lockmanager-fail-openlock": "No s'ha pogut obrir el fitxer de blocatge de «$1». Assegureu-vos que el directori de càrrega està configurat correctament i que el servidor web té permisos per escriure-hi. Vegeu https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgUploadDirectory per a més informació.",
        "lockmanager-fail-releaselock": "No s'ha pogut alliberar el blocatge de «$1».",
        "lockmanager-fail-db-bucket": "No s'han pogut contactar un nombre suficient de bases de blocatge en el cubell $1.",
        "lockmanager-fail-db-release": "No s'han pogut alliberar els blocatges a la base de dades $1.",
        "cachedspecial-refresh-now": "Mostra la darrera.",
        "categories": "Categories",
        "categories-submit": "Mostra",
-       "categoriespagetext": "{{PLURAL:$1|La següent categoria conté|Les següents categories contenen}} pàgines, o fitxers multimèdia.\n[[Special:UnusedCategories|Les categories no usades]] no s'hi mostren.\nVegeu també [[Special:WantedCategories|les categories sol·licitades]].",
+       "categoriespagetext": "{{PLURAL:$1|La següent categoria existeix|Les següents categories existeixen}} en aquest wiki, tant en ús com no.\nVegeu també [[Special:WantedCategories|les categories sol·licitades]].",
        "categoriesfrom": "Mostra les categories que comencen a:",
        "deletedcontributions": "Contribucions suprimides",
        "deletedcontributions-title": "Contribucions suprimides",
        "revertpage-nouser": "Edicions revertides per un usuari ocult a l'última revisió de {{GENDER:$1|[[User:$1|$1]]}}",
        "rollback-success": "Revertides les edicions de {{GENDER:$3|$1}}; recuperant la darrera versió de {{GENDER:$4|$2}}.",
        "sessionfailure-title": "Error de sessió",
-       "sessionfailure": "S'ha produït un error amb la vostra sessió. S'ha anul·lat aquesta acció en prevenció de pirateig de sessió. Premeu «Torna», recarregueu la pàgina des d'on veniu i torneu-ho a intentar.",
+       "sessionfailure": "S'ha produït un problema amb la vostra sessió d'inici. S'ha cancel·lat aquesta acció en prevenció de pirateig de sessió. Torneu a trametre el formulari.",
        "changecontentmodel": "Canvia el model de contingut d'una pàgina",
        "changecontentmodel-legend": "Canvia el model de contingut",
        "changecontentmodel-title-label": "Títol de la pàgina",
        "blocklist-editing-page": "pàgines",
        "blocklist-editing-ns": "espais de noms",
        "ipblocklist-empty": "La llista de blocatges està buida.",
-       "ipblocklist-no-results": "L'adreça IP o nom d'usuari sol·licitat no està blocat.",
+       "ipblocklist-no-results": "No s'han trobat blocs que coincideixin amb l'adreça o nom d'usuari sol·licitat.",
        "blocklink": "bloca",
        "unblocklink": "desbloca",
        "change-blocklink": "canvia el blocatge",
        "logentry-rights-autopromote": "$1 ha estat {{GENDER:$2|promogut}} automàticament de $4 a $5",
        "logentry-upload-upload": "$1 {{GENDER:$2|ha carregat}} $3",
        "logentry-upload-overwrite": "$1 {{GENDER:$2|ha carregat}} una nova versió de $3",
-       "logentry-upload-revert": "$1 {{GENDER:$2|ha carregat}} $3",
+       "logentry-upload-revert": "$1 {{GENDER:$2|ha revertit}} $3 a una versió antiga",
        "log-name-managetags": "Registre de gestió d'etiquetes",
        "log-description-managetags": "Aquesta pàgina té llistades les tasques de gestió referents a les [[Special:Tags|etiquetes]]. El registre conté només les accions dutes a terme manualment per un administrador; algunes etiquetes poden ser creades o eliminades pel programari wiki sense deixar inventariada una entrada en aquest registre.",
        "logentry-managetags-create": "$1 {{GENDER:$2|va crear}} l'etiqueta «$4»",
        "limitreport-expensivefunctioncount": "Nombre de funcions d'anàlisi dispendioses",
        "limitreport-unstrip-size-value": "$1/$2 {{PLURAL:$2|byte|bytes}}",
        "expandtemplates": "Expansió de plantilles",
-       "expand_templates_intro": "Aquesta pàgina especial expandeix de forma recursiva totes les plantilles d'un text donat.\nTambé expandeix les funcions sintàctiques, com ara <code><nowiki>{{</nowiki>#language:…}}</code>, i les variables predefinides, com <code><nowiki>{{</nowiki>CURRENTDAY}}</code> &mdash;de fet, gairebé tot que estigui entre claus dobles.",
+       "expand_templates_intro": "Aquesta pàgina especial expandeix de forma recursiva totes les plantilles d'un wikitext donat.\nTambé expandeix les funcions sintàctiques, com ara <code><nowiki>{{</nowiki>#language:…}}</code>, i les variables predefinides, com <code><nowiki>{{</nowiki>CURRENTDAY}}</code> &mdash;de fet, gairebé tot que estigui entre claus dobles.",
        "expand_templates_title": "Títol per contextualitzar ({{FULLPAGENAME}}, etc):",
        "expand_templates_input": "Wikitext d'entrada:",
        "expand_templates_output": "Resultat:",
        "specialmute-submit": "Confirma",
        "specialmute-label-mute-email": "Silencia el correu electrònic d'aquest usuari",
        "specialmute-error-invalid-user": "No s’ha trobat el nom d’usuari que heu indicat.",
-       "specialmute-error-email-preferences": "Heu de confirmar l'adreça electrònica abans de poder silenciar un usuari. Podeu fer-ho des de [[Special:Preferences]].",
        "specialmute-login-required": "Inicieu una sessió per canviar les preferències de silenciament.",
        "revid": "revisió $1",
        "pageid": "ID de pàgina $1",
index babd4a1..3bb077b 100644 (file)
        "autoblockedtext": "Vaše IP adresa byla automaticky zablokována, protože ji používal jiný uživatel, kterého zablokoval $1.\nUdaný důvod blokování:\n\n:<em>$2</em>\n\n* Začátek blokování: $8\n* Konec blokování: $6\n* Původně blokovaný uživatel: $7\n\nZablokování můžete prodiskutovat se správcem $1 nebo některým z dalších [[{{MediaWiki:Grouppage-sysop}}|správců]].\n\nUvědomte si však, že funkci „{{int:emailuser}}“ nemůžete použít, pokud nemáte ve svém [[Special:Preferences|uživatelském nastavení]] zadaný platný e-mail a nebylo vám zablokováno jeho užívání.\n\nVaše současná IP adresa je $3, číslo vašeho zablokování je #$5.\nProsíme, uveďte tyto údaje při komunikaci se správci.",
        "systemblockedtext": "Vaše IP adresa byla automaticky zablokována softwarem MediaWiki.\nUdaný důvod blokování:\n\n:<em>$2</em>\n\n* Začátek blokování: $8\n* Konec blokování: $6\n* Původně blokovaný uživatel: $7\n\nVaše současná IP adresa je $3.\nProsíme, uveďte tyto údaje při komunikaci se správci.",
        "blockednoreason": "důvod nebyl zadán",
-       "blockedtext-composite": "<strong>Vaše uživatelské jméno nebo IP adresa byla zablokována.</strong>\n\nUdaný důvod blokování:\n\n:<em>$2</em>\n\n* Začátek blokování: $8\n* Konec nejdelšího blokování: $6\n\nVaše současná IP adresa je $3.\nProsíme, uveďte tyto údaje při komunikaci se správci.",
+       "blockedtext-composite": "<strong>Vaše uživatelské jméno nebo IP adresa byla zablokována.</strong>\n\nUdaný důvod blokování:\n\n:<em>$2</em>\n\n* Začátek blokování: $8\n* Konec nejdelšího blokování: $6\n\n* $5\n\nVaše současná IP adresa je $3.\nProsíme, uveďte tyto údaje při komunikaci se správci.",
        "blockedtext-composite-reason": "Na váš účet a/nebo vaši IP adresu se vztahuje více blokování.",
        "whitelistedittext": "Pro editaci se musíte $1.",
        "confirmedittext": "Pro editaci stránek je vyžadováno potvrzení vaší e-mailové adresy.\nNa stránce [[Special:Preferences|nastavení]] zadejte a nechte potvrdit svou e-mailovou adresu.",
        "right-editmyusercss": "Editace vlastních uživatelských CSS souborů",
        "right-editmyuserjson": "Editace vlastních uživatelských souborů s JSONem",
        "right-editmyuserjs": "Editace vlastních uživatelských JavaScriptových souborů",
+       "right-editmyuserjsredirect": "Editace vlastních uživatelských JavaScriptových souborů, které nejsou přesměrování",
        "right-viewmywatchlist": "Prohlížení vlastního seznamu sledovaných stránek",
        "right-editmywatchlist": "Editace vlastního seznamu sledovaných stránek. Uvědomte si, že některé akce do něj mohou přidat stránky i bez tohoto oprávnění.",
        "right-viewmyprivateinfo": "Prohlížení vlastních soukromých údajů (např. e-mailová adresa, skutečné jméno)",
        "action-editmyusercss": "upravovat vlastní uživatelské CSS soubory",
        "action-editmyuserjson": "upravovat vlastní uživatelské JSON soubory",
        "action-editmyuserjs": "upravovat vlastní uživatelský JavaScript",
+       "action-editmyuserjsredirect": "editovat vlastní uživatelské JavaScriptové soubory, které nejsou přesměrování",
        "action-viewsuppressed": "prohlížet revize skryté všem uživatelům",
        "action-hideuser": "zablokovat uživatelské jméno a skrýt jej",
        "action-ipblock-exempt": "obcházet blokování IP adres, jejich rozsahů a autobloků",
        "undeletehistory": "Pokud stránku obnovíte, budou  v historii obnoveny všechny verze. Pokud byla vytvořena nová stránka se stejným jménem jako smazaná, obnovené verze se zapíší na starší místo v historii novější stránky.",
        "undeleterevdel": "Obnovení nebude provedeno, pokud by vedlo k částečnému odstranění aktuální verze stránky. V takovém případě musíte odznačit nebo odkrýt nejnovější smazanou verzi.",
        "undeletehistorynoadmin": "Tato stránka byla smazána. Důvod smazání je uveden níže, spolu s informacemi o uživatelích, kteří tuto stránku před smazáním editovali. Samotný text stránky je dostupný pouze správcům.",
-       "undelete-revision": "Smazaná verze stránky $1 (z $4 dne $5) od uživatele $3:",
+       "undelete-revision": "Smazaná verze stránky $1 (z $5, $4) od uživatele $3:",
        "undeleterevision-missing": "Nesprávná nebo chybějící revize. Možná máte špatný odkaz, nebo revize byla obnovena či odstraněna z archivu.",
        "undeleterevision-duplicate-revid": "Nebylo možné obnovit {{PLURAL:$1|jednu revizi|$1 revize|$1 revizí}}, protože {{PLURAL:$1|její|jejich}} <code>rev_id</code> již {{PLURAL:$1|bylo obsazeno|byla obsazena}}.",
        "undelete-nodiff": "Nebyla nalezena žádná předchozí verze.",
        "passwordpolicies-policy-passwordnotinlargeblacklist": "Heslo nesmí být v seznamu 100 000 nejčastěji používaných hesel.",
        "passwordpolicies-policyflag-forcechange": "nutné změnit při přihlášení",
        "passwordpolicies-policyflag-suggestchangeonlogin": "navrhnout změnu při přihlášení",
+       "mycustomjsredirectprotected": "Nemáte oprávnění editovat tuto stránku s JavaScriptem, protože je to přesměrování mimo váš uživatelský prostor.",
        "easydeflate-invaliddeflate": "Poskytnutý obsah nebyl správně zkomprimován",
        "unprotected-js": "Z bezpečnostních důvodů nelze načítat JavaScript z nechráněných stran. Vyrábějte prosím JavaScriptové skripty jen ve jmenném prostoru MediaWiki: nebo jako uživatelskou podstránku",
        "userlogout-continue": "Chcete se odhlásit?"
index 1c510f3..fb0fc71 100644 (file)
        "autoblockedtext": "Deine IP-Adresse wurde automatisch gesperrt, da sie von einem anderen Benutzer genutzt wurde, der von $1 gesperrt wurde.\nAls Grund wurde angegeben:\n\n:''$2''\n\n* Beginn der Sperre: $8\n* Ende der Sperre: $6\n* Sperre betrifft: $7\n\nDu kannst $1 oder einen der anderen [[{{MediaWiki:Grouppage-sysop}}|Administratoren]] kontaktieren, um über die Sperre zu diskutieren.\n\nDu kannst die „{{int:emailuser}}“-Funktion nicht nutzen, solange keine gültige E-Mail-Adresse in deinen [[Special:Preferences|Benutzerkonto-Einstellungen]] eingetragen ist oder diese Funktion für dich gesperrt wurde.\n\nDeine aktuelle IP-Adresse ist $3, und die Sperr-ID ist $5.\nBitte füge alle Informationen jeder Anfrage hinzu, die du stellst.",
        "systemblockedtext": "Dein Benutzername oder deine IP-Adresse wurde von MediaWiki automatisch gesperrt.\nDer angegebene Grund ist:\n\n:<em>$2</em>\n\n* Beginn der Sperre: $8\n* Ablauf der Sperre: $6\n* Sperre betrifft: $7\n\nDeine aktuelle IP-Adresse ist $3.\nBitte gib alle oben stehenden Details in jeder Anfrage an.",
        "blockednoreason": "keine Begründung angegeben",
-       "blockedtext-composite": "<strong>Dein Benutzername oder deine IP-Adresse wurde gesperrt.</strong>\n\nDer Angegebene Grund ist:\n\n:<em>$2</em>\n\n* Beginn der Sperre: $8\n* Ablauf der längsten Sperre: $6\n\nDeine aktuelle IP-Adresse ist $3.\nBitte gib alle oben stehenden Details in jeder Anfrage an.",
+       "blockedtext-composite": "<strong>Dein Benutzername oder deine IP-Adresse wurde gesperrt.</strong>\n\nDer Angegebene Grund ist:\n\n:<em>$2</em>\n\n* Beginn der Sperre: $8\n* Ablauf der längsten Sperre: $6\n\n* $5\n\nDeine aktuelle IP-Adresse ist $3.\nBitte gib alle oben stehenden Details in jeder Anfrage an.",
        "blockedtext-composite-reason": "Es gibt mehrere Sperren gegen dein Benutzerkonto und/oder deine IP-Adresse",
        "whitelistedittext": "Du musst dich $1, um Seiten bearbeiten zu können.",
        "confirmedittext": "Du musst deine E-Mail-Adresse erst bestätigen, bevor du Bearbeitungen durchführen kannst. Bitte ergänze und bestätige deine E-Mail in den [[Special:Preferences|Einstellungen]].",
        "logentry-block-block": "$1 {{GENDER:$2|sperrte}} {{GENDER:$4|$3}} für eine Dauer von $5 $6",
        "logentry-block-unblock": "$1 {{GENDER:$2|hob}} die Sperre von {{GENDER:$4|$3}} auf",
        "logentry-block-reblock": "$1 {{GENDER:$2|änderte}} die Sperreinstellungen für {{GENDER:$4|$3}} mit einer Sperrdauer von $5 $6",
-       "logentry-partialblock-block-page": "{{PLURAL:$1|der Seite|den Seiten}} $2",
+       "logentry-partialblock-block-page": "der {{PLURAL:$1|Seite|Seiten}} $2",
        "logentry-partialblock-block-ns": "{{PLURAL:$1|des Namensraums|der Namensräume}} $2",
-       "logentry-partialblock-block": "$1 {{GENDER:$2|sperrte}} {{GENDER:$4|$3}} für das Bearbeiten $7 mit einer Ablaufzeit von $5 $6",
+       "logentry-partialblock-block": "$1 {{GENDER:$2|sperrte}} {{GENDER:$4|$3}} vom Bearbeiten $7 für eine Dauer von $5 $6",
        "logentry-partialblock-reblock": "$1 {{GENDER:$2|änderte}} die Sperreinstellungen für {{GENDER:$4|$3}} zum Verhindern von Bearbeitungen auf $7 mit einer Ablaufzeit von $5 $6",
        "logentry-non-editing-block-block": "$1 {{GENDER:$2|sperrte}} {{GENDER:$4|$3}} für angegebene Nicht-Bearbeitungsaktionen mit einer Ablaufzeit von $5 $6",
        "logentry-non-editing-block-reblock": "$1 {{GENDER:$2|änderte}} die Sperreinstellungen für {{GENDER:$4|$3}} für angegebene Nicht-Bearbeitungsaktionen mit einer Ablaufzeit von $5 $6",
        "specialmute-success": "Deine Stummschaltungseinstellungen wurden aktualisiert. Schau dir alle stummgeschalteten Benutzer in [[Special:Preferences|deinen Einstellungen]] an.",
        "specialmute-submit": "Bestätigen",
        "specialmute-label-mute-email": "E-Mails von diesem Benutzer stummschalten",
-       "specialmute-header": "Bitte wähle deine Stummschaltungseinstellungen für {{BIDI:[[User:$1]]}}.",
+       "specialmute-header": "Bitte wähle deine Stummschaltungseinstellungen für <b>{{BIDI:[[User:$1]]}}</b>.",
        "specialmute-error-invalid-user": "Der gesuchte Benutzername konnte nicht gefunden werden.",
-       "specialmute-error-email-blacklist-disabled": "Das Stummschalten von E-Mails von Benutzern ist nicht aktiviert.",
-       "specialmute-error-email-preferences": "Du musst deine E-Mail Adresse bestätigen bevor du einen Benutzer bestätigen kannst. Du kannst dies [[Special:Preferences|in deinen Einstellungen]] tun.",
        "specialmute-email-footer": "Um deine E-Mail Einstellungen für {{BIDI:$2}} zu verwalten besuche bitte $1.",
        "specialmute-login-required": "Bitte melde dich an um deine Stummschaltungseinstellungen zu ändern.",
        "revid": "Version $1",
index 7e40594..01e1007 100644 (file)
        "search-interwiki-more": "(more)",
        "search-interwiki-more-results": "more results",
        "search-relatedarticle": "Related",
+       "search-invalid-sort-order": "Sort order of $1 is unrecognized, default sorting will be applied. Valid sort orders are: $2",
+       "search-unknown-profile": "Search profile of $1 is unrecognized, default search profile will be applied.",
        "searchrelated": "related",
        "searchall": "all",
        "showingresults": "Showing below up to {{PLURAL:$1|<strong>1</strong> result|<strong>$1</strong> results}} starting with #<strong>$2</strong>.",
        "right-editmyusercss": "Edit your own user CSS files",
        "right-editmyuserjson": "Edit your own user JSON files",
        "right-editmyuserjs": "Edit your own user JavaScript files",
+       "right-editmyuserjsredirect": "Edit your own user JavaScript files that are redirects",
        "right-viewmywatchlist": "View your own watchlist",
        "right-editmywatchlist": "Edit your own watchlist. Note some actions will still add pages even without this right.",
        "right-viewmyprivateinfo": "View your own private data (e.g. email address, real name)",
        "action-editmyusercss": "edit your own user CSS files",
        "action-editmyuserjson": "edit your own user JSON files",
        "action-editmyuserjs": "edit your own user JavaScript files",
+       "action-editmyuserjsredirect": "edit your own user JavaScript files that are redirects",
        "action-viewsuppressed": "view revisions hidden from any user",
        "action-hideuser": "block a username, hiding it from the public",
        "action-ipblock-exempt": "bypass IP blocks, auto-blocks and range blocks",
        "parentheses-start": "(",
        "parentheses-end": ")",
        "brackets": "[$1]",
+       "brackets-start": "[",
+       "brackets-end": "]",
        "quotation-marks": "\"$1\"",
        "imgmultipageprev": "← previous page",
        "imgmultipagenext": "next page →",
        "specialmute-success": "Your mute preferences have been updated. See all muted users in [[Special:Preferences|your preferences]].",
        "specialmute-submit": "Confirm",
        "specialmute-label-mute-email": "Mute emails from this user",
-       "specialmute-header": "Please select your mute preferences for {{BIDI:[[User:$1]]}}.",
+       "specialmute-header": "Please select your mute preferences for user <b>{{BIDI:[[User:$1|$1]]}}</b>.",
        "specialmute-error-invalid-user": "The username requested could not be found.",
-       "specialmute-error-email-blacklist-disabled": "Muting users from sending you emails is not enabled.",
-       "specialmute-error-email-preferences": "You must confirm your email address before you can mute a user. You may do so from [[Special:Preferences]].",
-       "specialmute-email-footer": "To manage email preferences for {{BIDI:$2}} please visit <$1>.",
+       "specialmute-error-no-options": "Mute features are unavailable. This might be because: you haven't confirmed your email address or the wiki administrator has disabled email features and/or email blacklist for this wiki.",
+       "specialmute-email-footer": "To manage email preferences for user {{BIDI:$2}} please visit <$1>.",
        "specialmute-login-required": "Please log in to change your mute preferences.",
        "mute-preferences": "Mute preferences",
        "revid": "revision $1",
        "passwordpolicies-policy-passwordnotinlargeblacklist": "Password cannot be in the list of 100,000 most commonly used passwords.",
        "passwordpolicies-policyflag-forcechange": "must change on login",
        "passwordpolicies-policyflag-suggestchangeonlogin": "suggest change on login",
+       "mycustomjsredirectprotected": "You do not have permission to edit this JavaScript page because it is a redirect and it does not point inside your userspace.",
        "easydeflate-invaliddeflate": "Content provided is not properly deflated",
        "unprotected-js": "For security reasons JavaScript cannot be loaded from unprotected pages. Please only create javascript in the MediaWiki: namespace or as a User subpage",
        "userlogout-continue": "Do you want to log out?"
index b1bc55d..ee1d97a 100644 (file)
        "autoblockedtext": "Via IP-adreso estas aŭtomate forbarita, ĉar uzis ĝin alia uzanto, kiun baris $1.\nLa donita kialo estas jena:\n\n:<em>$2</em>\n\n*Komenco de forbaro: $8\n*Limdato de la blokado: $6\n*Intencis forbari uzanton: $7\n\nVi povas kontakti $1 aŭ iun ajn el la aliaj [[{{MediaWiki:Grouppage-sysop}}|administrantojn]] por diskuti la blokon.\n\nNotu, ke vi ne povas uzi la servon \"{{int:emailuser}}\" krom se vi havas validan retpoŝt-adreson registritan en viaj [[Special:Preferences|preferojn]], kaj vi estas ne blokita kontraŭ ĝia uzado.\n\nVia nuna IP-adreso estas $3, kaj la forbaro-identigo estas $5.\nBonvolu inkluzivi tiujn detalojn en iuj ajn demandoj kiun vi farus.",
        "systemblockedtext": "Via salutnomo aŭ IPa adreso estis aŭtomate forbarita de MediaWiki.\nLa kialo donita estas:\n\n:<em>$2</em>\n\n* Komenco de forbaro: $8\n* Eksvalidiĝo de forbaro: $6\n* Intenca forbarulo: $7\n\nVia nuna IP-adreso estas $3.\nBonvolu inkluzivi ĉiujn suprajn detalojn en ajnaj demandoj kiujn vi faras.",
        "blockednoreason": "neniu kialo estis donita",
-       "blockedtext-composite": "<strong>Oni forbaris vian salutnomon aŭ IP-adreson.</strong>\n\nLa donita kialo estas:\n\n:<em>$2</em>.\n\n* Komenco de forbaro: $8\n* Fino de plej longa forbaro: $6\n\nVia aktuala IP-adreso estas $3.\nPlease include all above details in any queries you make.",
+       "blockedtext-composite": "<strong>Oni forbaris vian salutnomon aŭ IP-adreson.</strong>\n\nLa donita kialo estas:\n\n:<em>$2</em>.\n\n* Komenco de forbaro: $8\n* Fino de plej longa forbaro: $6\n\n* $5\n\nVia aktuala IP-adreso estas $3.\nPlease include all above details in any queries you make.",
+       "blockedtext-composite-ids": "Rilataj identigiloj de forbaro: $1 (via IP-adreso estas eble ankaŭ forbarata)",
+       "blockedtext-composite-no-ids": "Via IP-adreso estas inkluzivita en pluraj forbarlistoj",
        "blockedtext-composite-reason": "Estas pluraj forbaroj kontraŭ via konto kaj/aŭ IP-adreso",
        "whitelistedittext": "Vi devas $1 por redakti paĝojn.",
        "confirmedittext": "Vi devas konfirmi vian retpoŝtan adreson antaŭ ol redakti paĝojn. Bonvolu agordi kaj validigi vian retadreson per viaj [[Special:Preferences|preferoj]].",
        "edit-error-short": "Eraro: $1",
        "edit-error-long": "Eraroj:\n\n$1",
        "specialmute": "Silentigi",
-       "specialmute-success": "Sukcese ĝisdatiĝis viaj preferoj pri kaŝado de mesaĝoj. Vi povas vidi ĉiujn silentigitajn uzantojn ĉe [[Special:Preferences]].",
+       "specialmute-success": "Sukcese ĝisdatiĝis viaj preferoj pri kaŝado de mesaĝoj. Vi povas vidi ĉiujn silentigitajn uzantojn ĉe [[Special:Preferences|viaj preferoj]].",
        "specialmute-submit": "Konfirmi",
        "specialmute-label-mute-email": "Kaŝi retmesaĝojn el ĉi tiu uzanto",
-       "specialmute-header": "Bonvolu elekti viajn preferojn pri kaŝado de mesaĝoj el {{BIDI:[[User:$1]]}}.",
+       "specialmute-header": "Bonvolu elekti viajn preferojn pri kaŝado de mesaĝoj el uzanto <b>{{BIDI:[[User:$1]]}}</b>.",
        "specialmute-error-invalid-user": "La petita uzantnomo ne troviĝis.",
-       "specialmute-error-email-blacklist-disabled": "Malŝaltiĝis kaŝado de retmesaĝoj el specifaj uzantoj.",
-       "specialmute-error-email-preferences": "Vi povas konfirmi vian retpoŝtan adreson, antaŭ vi povas kaŝi mesaĝojn. Vi povas tion fari ĉe [[Special:Preferences]].",
        "specialmute-email-footer": "[$1 Administri preferojn pri retpoŝto por {{BIDI:$2}}.]",
        "specialmute-login-required": "Bonvolu ensaluti por konservi vian preferon pri kaŝado de mesaĝoj.",
+       "mute-preferences": "Agordoj pri silentigo",
        "revid": "revizio $1",
        "pageid": "Identigilo de paĝo $1",
        "interfaceadmin-info": "$1\n\nPermesoj pri redaktado de tut-retejaj CSS/JavaScript/JSON-dosieroj estis lastatempe disigitaj for de la rajto <code>editinterface</code>. Se vi ne komprenas kial vi ricevis ĉi tiun eraron, vidu la paĝon [[mw:MediaWiki_1.32/interface-admin]].",
index 75ecf03..6a31fae 100644 (file)
        "createacct-another-realname-tip": "El nombre real es opcional.\nSi lo proporciona, se usará para dar atribución al trabajo del usuario.",
        "changeemail-password": "Su contraseña en {{SITENAME}}:",
        "anoneditwarning": "<strong>Advertencia:</strong> no ha iniciado sesión. Su dirección IP se hará pública si hace cualquier edición en estas condiciones. Si <strong>[$1 inicia sesión]</strong> o <strong>[$2 crea una cuenta]</strong>, sus ediciones se atribuirán a su nombre de usuario, además de otros beneficios.",
+       "blockedtext-composite-no-ids": "Su dirección IP figura en varias listas negras",
        "newarticletext": "Ha seguido usted un enlace a una página que aún no existe.\nPara crear esta página, escriba en el campo a continuación. Para más información, consulte la [$1 página de ayuda].\nSi ha llegado aquí por error, vuelva a la página anterior.",
        "noarticletext": "En este momento no hay texto en esta página.\nPuede [[Special:Search/{{PAGENAME}}|buscar el título de esta página]] en otras páginas,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} buscar en los registros relacionados],\no [{{fullurl:{{FULLPAGENAME}}|action=edit}} crear esta página]</span>.",
        "copyrightwarning": "Por favor observe que todas las contribuciones realizadas en {{SITENAME}} serán consideradas como liberadas bajo $2 (véase $1 para más detalles).\nSi no desea que sus escritos sean editados o redistribuídos a voluntad, entonces no contribuya aquí.<br />\nAl mismo tiempo está usted prometiendo que lo que usted va a enviar lo ha escrito usted, o copiado de una fuente de dominio público.\n'''¡No envíe textos con derechos de autor sin el debido permiso!'''",
index 55773f5..70add63 100644 (file)
                        "Ryo567",
                        "Agusbou2015",
                        "Waldyrious",
-                       "Johny Weissmuller Jr"
+                       "Johny Weissmuller Jr",
+                       "Dark Dragoon"
                ]
        },
-       "tog-underline": "Enlaces que se van a subrayar:",
+       "tog-underline": "Subrayar enlaces:",
        "tog-hideminor": "Ocultar las ediciones menores en cambios recientes",
        "tog-hidepatrolled": "Ocultar las ediciones verificadas de cambios recientes",
        "tog-newpageshidepatrolled": "Ocultar, de la lista de páginas nuevas, las páginas verificadas",
        "autoblockedtext": "Tu dirección IP ha sido bloqueada automáticamente porque fue utilizada por otro usuario, que resultó bloqueado por $1.\nEl motivo dado es el siguiente:\n\n:<em>$2</em>\n\n* Inicio del bloqueo: $8\n* Caducidad del bloqueo: $6\n* Bloqueo destinado a: $7\n\nPuedes contactar con $1 o con otro de los [[{{MediaWiki:Grouppage-sysop}}|administradores]] para discutir el bloqueo.\n\nObserva que no puedes utilizar la función «{{int:emailuser}}» a menos que hayas registrado una dirección de correo electrónico válida en tus [[Special:Preferences|preferencias de usuario]] y la función no haya sido también bloqueada.\n\nTu dirección IP actual es $3, y el identificador del bloqueo es n.º $5.\nIncluye todos los datos aquí mostrados en cualquier consulta que hagas.",
        "systemblockedtext": "Tu nombre de usuario o dirección IP ha sido bloqueado automáticamente por el software MediaWiki.\nLa razón dada es:\n\n:<em>$2</em>\n\n* Inicio del bloqueo: $8\n* Caducidad de bloqueo: $6\n* Destinatario del bloqueo: $7\n\nTu dirección IP actual es $3.\nPor favor, incluye todos los datos aquí mostrados en cualquier consulta que hagas.",
        "blockednoreason": "no se ha especificado el motivo",
-       "blockedtext-composite": "<strong>Tu nombre de usuario o dirección IP han sido bloqueados.</strong>\n\nLa razón es:\n\n:<em>$2</em>.\n\n* Inicio del bloqueo: $8\n* Vencimiento del bloqueo más largo: $6\n\nTu dirección IP actual es $3.\nPor favor, incluye todos los detalles anteriores en cualquier consulta que realices.",
+       "blockedtext-composite": "<strong>Tu nombre de usuario o dirección IP han sido bloqueados.</strong>\n\nLa razón es:\n\n:<em>$2</em>.\n\n* Inicio del bloqueo: $8\n* Vencimiento del bloqueo más largo: $6\n\n* $5\n\nTu dirección IP actual es $3.\nPor favor, incluye todos los detalles anteriores en cualquier consulta que realices.",
+       "blockedtext-composite-no-ids": "Tu dirección IP figura en varias listas negras",
        "blockedtext-composite-reason": "Hay múltiples bloques contra tu cuenta y/o dirección IP.",
        "whitelistedittext": "Tienes que $1 para editar páginas.",
        "confirmedittext": "Debes confirmar tu dirección de correo electrónico antes de poder editar páginas. Por favor, configura y confirma tu dirección de correo a través de tus [[Special:Preferences|preferencias de usuario]].",
        "edit-error-short": "Error: $1",
        "edit-error-long": "Errores:\n\n$1",
        "specialmute": "Silenciar",
-       "specialmute-success": "\nTus preferencias de silencio han sido actualizadas. Mira todos los usuarios silenciados en [[Especial: Preferencias|tus preferencias]].",
+       "specialmute-success": "Tus preferencias de silencio han sido actualizadas. Mira todos los usuarios silenciados en [[Especial:Preferencias|tus preferencias]].",
        "specialmute-submit": "Confirmar",
        "specialmute-label-mute-email": "Silenciar los correos electrónicos de este usuario",
        "specialmute-error-invalid-user": "No se encontró el nombre de usuario solicitado.",
-       "specialmute-error-email-preferences": "Debes confirmar tu dirección de correo electrónico antes de que puedas silenciar a un usuario. Puedes hacerlo desde [[Special:Preferences|tus preferencias]].",
        "revid": "revisión $1",
        "pageid": "ID de página $1",
        "interfaceadmin-info": "$1\n\nLos permisos para editar los archivos con formato CSS, JS y JSON en todo el sitio han sido recientemente separados del permiso <code>editinterface</code>. Si no comprendes por qué recibes este error, por favor lee [[mw:MediaWiki_1.32/interface-admin]].",
index e8e9086..3245986 100644 (file)
        "autoblockedtext": "Sinu IP-aadress blokeeriti automaatselt, sest seda kasutas teine kasutaja, kelle $1 blokeeris.\nPõhjendus on järgmine:\n\n:<em>$2</em>\n\n* Blokeeringu algus: $8\n* Blokeeringu lõpp: $6\n* Sooviti blokeerida: $7\n\nKüsimuse arutamiseks võid pöörduda kasutaja $1 või mõne teise [[{{MediaWiki:Grouppage-sysop}}|administraatori]] poole.\n\nPane tähele, et sa ei saa kasutada funktsiooni \"{{int:emailuser}}\", kui [[Special:Preferences|konto eelistustes]] pole määratud kehtivat e-posti aadressi või kui sul on keelatud seda funktsiooni kasutada.\n\nSinu praegune IP-aadress on $3 ja blokeeringu number #$5. Palun lisa need andmed kõigile järelpärimistele, mida kavatsed teha.",
        "systemblockedtext": "MediaWiki tarkvara on sinu kasutajanime või IP-aadressi automaatselt blokeerinud.\nToodud on järgmine põhjus:\n\n:<em>$2</em>\n\n* Blokeerimisaeg: $8\n* Blokeeringu aegumistähtaeg: $6\n* Sooviti blokeerida: $7\n\nSinu praegune IP-aadress on $3.\nLisa need andmed kõigile järelepärimistele, mida kavatsed teha.",
        "blockednoreason": "põhjendust ei ole kirja pandud",
-       "blockedtext-composite": "<strong>Sinu kasutajanimi või IP-aadress on blokeeritud.</strong>\n\nÄra on toodud järgmine põhjus:\n\n:<em>$2</em>.\n\n* Blokeeringu algus: $8\n* Pikima blokeeringu aegumistähtaeg: $6\n\nSinu praegune IP-aadress on $3.\nPalun lisa need andmed kõigile järelepärimistele, mida kavatsed teha.",
+       "blockedtext-composite": "<strong>Sinu kasutajanimi või IP-aadress on blokeeritud.</strong>\n\nÄra on toodud järgmine põhjus:\n\n:<em>$2</em>.\n\n* Blokeeringu algus: $8\n* Pikima blokeeringu aegumistähtaeg: $6\n\n* $5\n\nSinu praegune IP-aadress on $3.\nPalun lisa need andmed kõigile järelepärimistele, mida kavatsed teha.",
        "blockedtext-composite-reason": "Sinu IP-aadressi ja/või kasutajanime suhtes on kehtestatud mitu blokeeringut",
        "whitelistedittext": "Lehekülgede toimetamiseks pead $1.",
        "confirmedittext": "Lehekülgi ei saa toimetada enne e-posti aadressi kinnitamist.\nPalun määra ja kinnita e-posti aadress [[Special:Preferences|eelistuste leheküljel]].",
index c6ca43e..9110c93 100644 (file)
        "subject-preview": "Gaiaren aurrebista:",
        "previewerrortext": "Errore bat gertatu da aldaketak aurrezten saiatzean.",
        "blockedtitle": "Erabiltzailea blokeatuta dago",
-       "blocked-email-user": "<strong> Zure erabiltzailea blokeatua izan da eta ezin duzu mezurik bidali. Oraindik wiki honetako beste orri batzuk editatu ditzakezu.</strong> Blokeoaren detaile guztiak hemen ikus ditzakezu [[Special:MyContributions|account contributions]].\n\nBlokeoa $1-(e)k egin zuen.\n\nBlokeoaren arrazoiak hauek dira <em>$2</em>.\n\n*Blokeoa hemen hasten da: $8\n*Blokeoa amaitzen da: $6\n*Berariazko blokeoa: $7\n*Blokeoaren ID #$5",
+       "blocked-email-user": "<strong>Zure erabiltzaile izenari blokeoa ezarri zaio, mezuak bidaltzea eragozteko. Hala ere, wiki honetako beste orri batzuk edita ditzakezu.</strong> Blokeoaren xehetasun guztiak hemen dituzu: [[Special:MyContributions|kontuaren ekarpenak]].\n\nBlokeoa ezarri duena: $1.\n\nEmandako arrazoia: <em>$2</em>.\n\n*Blokeoaldiaren hasiera: $8\n*Blokeoaldiaren amaiera: $6\n*Blokeatua: $7\n*Blokeoaren identifikazioa: #$5",
        "blockedtext-partial": "<strong>Zure erabiltzailea edo IP helbidea blokeatua izan da eta ezin du aldaketarik egin orrialde honetan. Wiki honetako beste orrialdeak oraindik editatu ditzakezu.</strong> Blokeoaren xehetasun guztiak hemen ikus ditzakezu: [[Special:MyContributions|account contributions]].\n\nBlokeoa $1-(e)k egin du.\n\nBlokeoaren arrazoia <em>$2</em> da.\n\n* Blokeoaren hasiera: $8\n* Blokeoaren amaiera: $6\n* Berariazko blokeoa: $7\n* Blokeoaren IDa #$5 da.",
        "blockedtext": "<strong> Zure erabiltzaile izena edo IP helbidea blokeatuta dago. </strong>\n\nBlokeoa $1-ek ezarri du.\nEmandako arrazoia hau da: ''$2''.\n\n* Blokeoaren hasiera: $8\n* Blokeoaren bukaera: $6\n* Blokeatua: $7\n\nBlokeoari buruz eztabaidatzeko, jo ezazu $1 edo beste [[{{MediaWiki:Grouppage-sysop}}|administratzaile]] batengana.\n\"{{int:emailuser}}\" tresna erabili ahal izateko, ezinbestekoa da zure [[Special:Preferences|hobespenetan]] baliozkoa den helbide elektroniko bat emanda izatea, eta tresna hori erabiltzeko aukera blokeatu ez izana.\nOrain duzun IP helbidea $3 da, eta blokeoaren zenbakia #$5.\nMesedez, eman aipatutako datu hauek guztiak, blokeoari buruzko edozein eskaera egitean.",
-       "autoblockedtext": "Zure IP helbidea automatikoki blokeaturik dago, $1-ek blokeatutako beste erabiltzaile batek erabili zuelako. Emandako arrazoia hau da:\n\n:<em>$2</em>\n\n* Blokeoaren hasiera: $8\n* Blokeoaren bukaera: $6\n* Blokeatua: $7\n\nBlokeoari buruz eztabaidatzeko, jo ezazu $1 edo beste [[{{MediaWiki:Grouppage-sysop}}|administratzaile]] batengana.\n\n\"{{int:emailuser}}\" tresna erabili ahal izateko, ezinbestekoa da zure [[Special:Preferences|hobespenetan]] baliozkoa den helbide elektroniko bat emanda izatea, eta tresna hori erabiltzeko aukera blokeatu ez izana.\n\nOrain duzun IP helbidea $3 da, eta blokeoaren zenbakia #$5.\n\nMesedez, eman itzazu aipatutako datu guztiak, blokeoari buruzko edozein eskaera egitean.",
-       "systemblockedtext": "Zure erabiltzaile izena edo IP helbidea MediaWiki-k automatikoki blokeatu du.\nHau da emandako arrazoia:\n\n:<em>$2</em>\n\n*Bloke sarrera: $8\n*Blokearen iraungintzea: $6\n*Blokeo helburua: $7\n\nZure uneko IP helbidea: $3.\nSartu goiko xehetasun guztiak egiten dituzun kontsulta guztietan mesedez.",
+       "autoblockedtext": "Zure IP helbidea automatikoki blokeaturik dago, $1 administratzaileak blokeatutako beste erabiltzaile batek erabili zuelako. Emandako arrazoia hau da:\n\n:<em>$2</em>\n\n* Blokeoaldiaren hasiera: $8\n* Blokeoaldiaren bukaera: $6\n* Blokeatua: $7\n\nBlokeoari buruz eztabaidatzeko, jo ezazu $1 administratzailearengana edo [[{{MediaWiki:Grouppage-sysop}}|beste administratzaile batengana]].\n\n\"{{int:emailuser}}\" tresna erabili ahal izateko, ezinbestekoa da zure [[Special:Preferences|hobespenetan]] baliozkoa den helbide elektroniko bat emanda izatea, eta tresna hori erabiltzeko aukera blokeatuta ez izatea.\n\nOrain duzun IP helbidea $3 da. Blokeoaren identifikazio kodea: #$5.\n\nBlokeoari buruzko eskaerarik egiten baduzu, eman itzazu goian adierazitako datu horiek guztiak.",
+       "systemblockedtext": "Zure erabiltzaile izena edo IP helbidea automatikoki blokeatu du MediaWikik.\nHau da emandako arrazoia:\n\n:<em>$2</em>\n\n*Blokeoaldiaren hasiera: $8\n*Blokeoaldiaren amaiera: $6\n*Blokeatua: $7\n\nOrain darabilzun IP helbidea: $3.\nKontsultarik egiten baduzu, adierazi goiko xehetasun horiek guztiak.",
        "blockednoreason": "ez da arrazoirik zehaztu",
        "whitelistedittext": "$1 behar duzu orrialdeak aldatu ahal izateko..",
        "confirmedittext": "Orrialdeetan aldaketak egin aurretik zure e-posta helbidea egiaztatu beharra daukazu. Mesedez, zehaztu eta egiaztatu zure e-posta helbidea [[Special:Preferences|hobespenetan]].",
        "page_first": "lehena",
        "page_last": "azkena",
        "histlegend": "Alderaketa hautatzea: marka itzazu alderatu nahi dituzun bi bertsioak, eta saka ezazu «Enter» edo klika ezazu beheko botoia.<br />\nAzalpenak: '''({{int:cur}})''' = oraingo bertsioarekiko aldeak,\n'''({{int:last}})''' = aurreko bertsioarekiko aldeak, \n'''{{int:minoreditletter}}''' = aldaketa txikia.",
-       "history-fieldset-title": "Berraztertzeak bilatu",
+       "history-fieldset-title": "Bertsioak iragazi",
        "history-show-deleted": "Berrikusketa ezabatuak soilik",
        "histfirst": "zaharrena",
        "histlast": "berriena",
        "rcfilters-savedqueries-already-saved": "Iragazki hauek dagoeneko gorde dira. Aldatu ezarpenak Gordetako Iragazki berri bat sortzeko.",
        "rcfilters-restore-default-filters": "Leheneratu iragazki lehenetsiak",
        "rcfilters-clear-all-filters": "Iragazki guztiak garbitu",
-       "rcfilters-show-new-changes": "Aldaketa berrienak ikusi",
+       "rcfilters-show-new-changes": "Aldaketa berriak ikusi $1-tik",
        "rcfilters-search-placeholder": "Aldaketak iragazi (menua erabili edo bilatu iragazkiaren izena)",
        "rcfilters-invalid-filter": "Balio ez duen iragazkia",
        "rcfilters-empty-filter": "Filtro aktiborik ez dago. Ekarpen guztiak erakusten.",
        "delete-confirm": "\"$1\" ezabatu",
        "delete-legend": "Ezabatu",
        "historywarning": "<strong>Oharra:</strong> Ezabatzera zoazen orrialdeak {{PLURAL:$1|berrikuspen bateko|$1 berrikuspeneko}} historia du:",
-       "historyaction-submit": "Erakutsi",
+       "historyaction-submit": "Berrikuspenak erakutsi",
        "confirmdeletetext": "Orrialde edo irudi bat eta beste historia guztia datu-basetik ezabatzear zaude. Mesedez, egiaztatu hori egin nahi duzula, ondorioak zeintzuk diren badakizula, eta [[{{MediaWiki:Policy-url}}|politikak]] errespetatuz egingo duzula.",
        "actioncomplete": "Ekintza burutu da",
        "actionfailed": "Ekintzak huts egin du",
        "blocklist-editing-page": "orrialdeak",
        "blocklist-editing-ns": "izen-tarteak",
        "ipblocklist-empty": "Blokeaketa zerrenda hutsik dago.",
-       "ipblocklist-no-results": "Zehaztutako IP helbide edo erabiltzaile izena ez dago blokeatuta.",
+       "ipblocklist-no-results": "Zehaztutako IP helbide edo erabiltzaile izenak ez du bat egiten.",
        "blocklink": "blokeatu",
        "unblocklink": "blokeoa kendu",
        "change-blocklink": "blokeoa aldatu",
index 7b12798..0e4eb28 100644 (file)
        "exif-source": "Източник",
        "exif-editstatus": "Редакционен статус на изображението",
        "exif-urgency": "Спешност",
+       "exif-fixtureidentifier": "Наименование на рубриката",
        "exif-locationdest": "Показано място",
        "exif-locationdestcode": "Код на показаното място",
        "exif-objectcycle": "Време от деня за което е предназначена снимката",
        "exif-giffilecomment": "Коментар на GIF файл",
        "exif-intellectualgenre": "Тип на обекта",
        "exif-subjectnewscode": "Код на темата",
+       "exif-scenecode": "IPTC-код на кадъра",
        "exif-event": "Изобразено събитие",
        "exif-organisationinimage": "Изобразена организация",
        "exif-personinimage": "Изобразена личност",
        "exif-originalimageheight": "Височина на изображението преди изрязването",
        "exif-originalimagewidth": "Ширина на изображението преди изрязването",
        "exif-compression-1": "Декомпресиран",
+       "exif-compression-2": "CCITT Group 3, 1-мерно модифицирано кодиране на дължината на продължителността по Хъфман",
+       "exif-compression-3": "CCITT Group 3, факсово кодиране",
+       "exif-compression-4": "CCITT Group 4, факсово кодиране",
        "exif-compression-5": "LZW",
        "exif-compression-6": "JPEG (стар)",
        "exif-compression-7": "JPEG",
        "exif-gpsdirection-m": "Магнитна",
        "exif-ycbcrpositioning-1": "Центрирани",
        "exif-dc-contributor": "Сътрудници",
+       "exif-dc-coverage": "Пространствен или времеви обхват на медийния файл",
        "exif-dc-date": "Дата(и)",
        "exif-dc-publisher": "Издател",
        "exif-dc-relation": "Свързани медии",
index d555538..887accd 100644 (file)
@@ -16,6 +16,7 @@
        "exif-yresolution": "Difinizioni verthicari",
        "exif-datetime": "Data e ora di lu ciambamentu di lu file",
        "exif-imagedescription": "Deschrizioni di l'immàgina",
+       "exif-make": "Pruduttori di la telecàmmara",
        "exif-model": "Mudellu",
        "exif-software": "Software usaddu",
        "exif-artist": "Autori",
index 1943da5..aa5e61f 100644 (file)
@@ -3,7 +3,8 @@
                "authors": [
                        "Conquistador",
                        "Kolega2357",
-                       "OC Ripper"
+                       "OC Ripper",
+                       "Vlad5250"
                ]
        },
        "exif-imagewidth": "Širina",
        "exif-compression-3": "CCITT Group 3 faks kodiranje",
        "exif-compression-4": "CCITT Group 4 faks kodiranje",
        "exif-copyrighted-true": "Pod autorskim pravima",
-       "exif-copyrighted-false": "Javno vlasništvo",
+       "exif-copyrighted-false": "Autorskopravni status nije postavljen",
+       "exif-photometricinterpretation-0": "Crno-bijelo (bijela je 0)",
+       "exif-photometricinterpretation-1": "Crno-bijelo (crna je 0)",
+       "exif-photometricinterpretation-3": "Paleta",
+       "exif-photometricinterpretation-4": "Maska prozirnosti",
+       "exif-photometricinterpretation-5": "Odvojeno (vjerojatno CMYK)",
+       "exif-photometricinterpretation-8": "CIE L*a*b*",
+       "exif-photometricinterpretation-9": "CIE L*a*b* (ICC kodiranje)",
+       "exif-photometricinterpretation-10": "CIE L*a*b* (ITU kodiranje)",
        "exif-unknowndate": "Nepoznat datum",
        "exif-orientation-1": "Normalna",
        "exif-orientation-2": "Horizontalno preokrenuto",
index 486c908..8d4fd7d 100644 (file)
        "autoblockedtext": "دسترسی نشانی آی‌پی شما قطع شده‌است، زیرا این نشانی آی‌پی توسط کاربر دیگری استفاده شده که دسترسی او توسط $1 قطع شده‌است.\nدلیل ارائه‌شده چنین است:\n\n:''$2''\n\n* شروع قطع دسترسی: $8\n* پایان قطع دسترسی: $6\n* کاربری هدف قطع دسترسی: $7\n\nشما می‌توانید با $1 یا [[{{MediaWiki:Grouppage-sysop}}|مدیری]] دیگر تماس بگیرید و در این باره صحبت کنید.\nتوجه کنید که شما نمی‌توانید از قابلیت «{{int:emailuser}}» استفاده کنید مگر آنکه نشانی ایمیل معتبری در [[Special:Preferences|ترجیحات کاربری]] خودتان ثبت کرده باشید و نیز باید امکان استفاده از این قابلیت برای شما قطع نشده باشد.\nنشانی آی‌پی فعلی شما $3 و شمارهٔ قطع دسترسی شما $5 است.\nلطفاً تمامی جزئیات فوق را در کلیهٔ درخواست‌هایی که در این باره مطرح می‌کنید ذکر کنید.",
        "systemblockedtext": "نام کاربری یا نشانی آی‌پی شما خودکار توسط مدیاویکی مسدود شده‌است.\nدلیل ارائه‌شده:\n\n:<em>$2</em>\n\n* آغاز بلاک: $8\n* پایان بلاک: $6\n* قطع دسترسی‌شده مورد نظر: $7\n\nنشانی آی‌پی کنونی شما $3 است.\nخواهشمند است تمام جزئیات بالا را در هر پرس‌وجویی که انجام می‌دهید قرار دهید.",
        "blockednoreason": "دلیلی مشخص نشده‌است",
-       "blockedtext-composite": "<strong>نام کاربری یا نشانی آی‌پی شما خودکار توسط مدیاویکی مسدود شده‌است.</strong>\nدلیل ارائه‌شده:\n\n:<em>$2</em>\n\n* آغاز بلاک: $8\n* پایان بلاک: $6\n\nنشانی آی‌پی کنونی شما $3 است.\nخواهشمند است تمام جزئیات بالا را در هر پرس‌وجویی که انجام می‌دهید قرار دهید.",
+       "blockedtext-composite": "<strong>نام کاربری یا نشانی آی‌پی شما خودکار توسط مدیاویکی مسدود شده‌است.</strong>\nدلیل ارائه‌شده:\n\n:<em>$2</em>\n\n* آغاز بلاک: $8\n* پایان بلاک: $6\n\n* $5\n\nنشانی آی‌پی کنونی شما $3 است.\nخواهشمند است تمام جزئیات بالا را در هر پرس‌وجویی که انجام می‌دهید قرار دهید.",
        "blockedtext-composite-reason": "حساب/آی‌پی شما به چند طریق بسته شده‌است",
        "whitelistedittext": "برای ویرایش مقاله‌ها باید $1.",
        "confirmedittext": "شما باید، پیش از ویرایش صفحات، آدرس ایمیل خود را مشخص و تأیید کنید. لطفاً از طریق [[Special:Preferences|ترجیحات کاربر]] این کار را صورت دهید.",
        "revdelete-unsuppress": "حذف محدودیت‌ها در بازبینی‌های ترمیم‌شده",
        "revdelete-log": "دلیل:",
        "revdelete-submit": "اعمال بر {{PLURAL:$1|نسخهٔ|نسخه‌های}} انتخاب شده",
-       "revdelete-success": "پیدایی نسخه، روزآمد شد.",
+       "revdelete-success": "پیدایی نسخه روزآمد شد.",
        "revdelete-failure": "'''پیدایی نسخه‌ها قابل به روز کردن نیست:'''\n$1",
        "logdelete-success": "تغییر پیدایی مورد انجام شد.",
        "logdelete-failure": "'''پیدایی سیاهه‌ها قابل تنظیم نیست:'''\n$1",
        "specialmute-success": "تنظیمات بی‌صدا به روز شد. دیدن فهرست همهٔ کاربرانی که در [[Special:Preferences|ترجیحاتتان]] به عنوان بی‌صدا انتخاب کردید.",
        "specialmute-submit": "تأیید",
        "specialmute-label-mute-email": "بی‌صدا کردن ایمیل از این کاربر",
-       "specialmute-header": "لطفاً ترجیحات بی‌صدا برای {{BIDI:[[User:$1]]}} را انتخاب کنید.",
+       "specialmute-header": "لطفاً ترجیحات بی‌صدا برای <b>{{BIDI:[[User:$1]]}}</b> را انتخاب کنید.",
        "specialmute-error-invalid-user": "نام کاربری درخواست شده یافت نشد.",
-       "specialmute-error-email-blacklist-disabled": "بی‌صدا کردن کاربران برای ارسال ایمیل فعال نشده‌است.",
-       "specialmute-error-email-preferences": "پیش از بی‌صدا کردن دیگر کاربران باید آدرس ایمیلیتان را تائید کنید. که از [[Special:Preferences|ترجیحاتتان]] مقدور است.",
        "specialmute-email-footer": "[$1 مدیریت ترجیحات ایمیل برای {{BIDI:$2}}.]",
        "specialmute-login-required": "لطفاً برای تغییر ترجیحات بی‌صدا به سامانه وارد شوید.",
        "revid": "نسخهٔ $1",
index 80c17e0..755b38f 100644 (file)
        "index-category": "Indeksoidut sivut",
        "noindex-category": "Indeksointikiellolliset sivut",
        "broken-file-category": "Sivut, joissa on toimimattomia tiedostolinkkejä",
+       "categoryviewer-pagedlinks": "($1) ($2)",
+       "category-header-numerals": "$1–$2",
        "about": "Tietoja",
        "article": "Sisältösivu",
        "newwindow": "(avautuu uuteen ikkunaan)",
        "versionrequiredtext": "MediaWikistä tarvitaan vähintään versio $1 tämän sivun käyttämiseen. Katso [[Special:Version|versio]].",
        "ok": "OK",
        "pagetitle": "$1 – {{SITENAME}}",
+       "pagetitle-view-mainpage": "{{SITENAME}}",
+       "backlinksubtitle": "← $1",
        "retrievedfrom": "Noudettu kohteesta ”$1”",
        "youhavenewmessages": "Sinulle on $1 ($2).",
        "youhavenewmessagesfromusers": "{{PLURAL:$4|Sinulle on}} $1 {{PLURAL:$3|toiselta käyttäjältä|$3 käyttäjältä}} ($2).",
        "site-atom-feed": "$1-Atom-syöte",
        "page-rss-feed": "$1 (RSS-syöte)",
        "page-atom-feed": "$1 (Atom-syöte)",
+       "feed-atom": "Atom",
+       "feed-rss": "RSS",
        "red-link-title": "$1 (sivua ei ole)",
        "sort-descending": "Lajittele laskevassa järjestyksessä",
        "sort-ascending": "Lajittele nousevassa järjestyksessä",
        "virus-unknownscanner": "tuntematon virustutka:",
        "logouttext": "<strong>Olet nyt kirjautunut ulos.</strong>\n\nOta huomioon, että jotkut sivut saattavat näkyä edelleen ikään kuin olisit vielä kirjautuneena sisään siihen saakka kunnes tyhjennät selaimesi välimuistin.",
        "logging-out-notify": "Sinua kirjataan ulos, odota hetki.",
+       "logout-failed": "Ei voida kirjautua ulos: $1",
        "cannotlogoutnow-title": "Nyt ei voi kirjautua ulos",
        "cannotlogoutnow-text": "Kirjautuminen ulos ei ole mahdollista käytettäessä $1.",
        "welcomeuser": "Tervetuloa $1!",
        "nocookiesnew": "Käyttäjätunnus on luotu, mutta et ole kirjautunut sisään. \n{{SITENAME}} käyttää evästeitä sisäänkirjautumisen yhteydessä. \nSelaimesi ei salli evästeitä. \nSalli evästeiden käyttö, ja sen jälkeen kirjaudu sisään juuri luomallasi käyttäjätunnuksella ja salasanalla.",
        "nocookieslogin": "{{SITENAME}} käyttää evästeitä sisäänkirjautumisen yhteydessä. Selaimesi ei salli evästeitä. Ota ne käyttöön, ja yritä uudelleen.",
        "nocookiesfornew": "Käyttäjätunnusta ei luotu, koska sen lähdettä ei kyetty varmistamaan. Varmista, että selaimessasi on käytössä evästeet, päivitä tämä sivu ja yritä uudelleen.",
+       "nocookiesforlogin": "{{int:nocookieslogin}}",
        "createacct-loginerror": "Tunnus luotiin onnistuneesti, mutta automaattista sisäänkirjautumista ei voitu tehdä. Siirry [[Special:UserLogin|manuaaliseen kirjautumiseen]].",
        "noname": "Et ole määritellyt kelvollista käyttäjänimeä.",
        "loginsuccesstitle": "Olet kirjautunut sisään",
        "previewerrortext": "Muokkaustesi esikatselun toteuttamisessa on tapahtunut virhe.",
        "blockedtitle": "Käyttäjä on estetty",
        "blocked-email-user": "<strong>Käyttäjänimeäsi on estetty lähettämästä sähköpostia. Voit silti muokata muita sivuja tässä wikissä.</strong> Voit katsoa eston täydelliset tiedot [[Special:MyContributions|käyttäjän muokkauksista]].\n\nEston antoi $1.\n\nAnnettu syy on <em>$2</em>.\n\n* Eston alkamisaika: $8\n* Eston päättymisaika: $6\n* Kohde: $7\n* Eston tunnus #$5",
-       "blockedtext-partial": "<strong>Käyttäjänimesi tai IP-osoitteesi on estetty muokkaamasta tätä sivua.</strong> Voit katsoa eston täydelliset tiedot [[Special:MyContributions|käyttäjän muokkauksista]].\n\nEston antoi $1.\n\nAnnettu syy on <em>$2</em>.\n\n* Eston alkamisaika: $8\n* Eston päättymisaika: $6\n* Kohde: $7\n* Eston tunnus #$5",
+       "blockedtext-partial": "<strong>Käyttäjänimesi tai IP-osoitteesi on estetty muokkaamasta tätä sivua. Voit yhä muokata muita sivuja tässä wikissä.</strong> Voit katsoa eston täydelliset tiedot [[Special:MyContributions|käyttäjän muokkaussivulta]].\n\nEston antoi $1.\n\nAnnettu syy on <em>$2</em>.\n\n* Eston alkamisaika: $8\n* Eston päättymisaika: $6\n* Eston kohde: $7\n* Eston tunnus #$5",
        "blockedtext": "<strong>Käyttäjätunnuksesi tai IP-osoitteesi on estetty.</strong>\n\nEston on asettanut $1.\nAnnettu syy on <em>$2</em>.\n\n* Eston alkamisaika: $8\n* Eston päättymisaika: $6\n* Kohde: $7\n\nVoit keskustella ylläpitäjän $1 tai toisen [[{{MediaWiki:Grouppage-sysop}}|ylläpitäjän]] kanssa estosta.\nHuomaa, ettet voi lähettää sähköpostia {{GRAMMAR:genitive|{{SITENAME}}}} kautta, ellet ole asettanut olemassa olevaa sähköpostiosoitetta [[Special:Preferences|asetuksissa]] tai jos esto on asetettu koskemaan myös sähköpostin lähettämistä.\nIP-osoitteesi on $3 ja estotunnus on #$5.\nLiitä kaikki yllä olevat tiedot mahdollisiin kyselyihisi.",
        "autoblockedtext": "IP-osoitteesi on estetty automaattisesti, koska sitä on käyttänyt toinen käyttäjä, jonka on estänyt ylläpitäjä $1.\nAnnettu syy on:\n\n:<em>$2</em>\n\n* Eston alkamisaika: $8\n* Eston päättymisaika: $6\n* Kohde: $7\n\nVoit keskustella ylläpitäjän $1 tai toisen [[{{MediaWiki:Grouppage-sysop}}|ylläpitäjän]] kanssa estosta.\n\nHuomaa, ettet voi lähettää sähköpostia {{GRAMMAR:genitive|{{SITENAME}}}} kautta, ellet ole asettanut olemassa olevaa sähköpostiosoitetta [[Special:Preferences|asetuksissa]] tai jos esto on asetettu koskemaan myös sähköpostin lähettämistä.\n\nIP-osoitteesi on $3 ja estotunnus on #$5.\nLiitä kaikki yllä olevat tiedot mahdollisiin kyselyihisi.",
        "systemblockedtext": "Käyttäjätunnuksesi tai IP-osoitteesi on automaattisesti estetty MediaWikin toimesta.\nAnnettu syy on:\n\n:<em>$2</em>\n\n* Start of block: $8\n* Expiration of block: $6\n* Intended blockee: $7\n\nTämänhetkinen IP-osoitteesi on $3.\nOle hyvä ja liitä kaikki yllä olevat tiedot mahdollisiin kyselyihisi.",
        "blockednoreason": "(syytä ei annettu)",
-       "blockedtext-composite": "<strong>Käyttäjätunnuksesi tai IP-osoitteesi on estetty.</strong>\n\nAnnettu syy on:\n\n:<em>$2</em>.\n\n* Esto alkoi: $8\n* Pisin esto vanhentuu: $6\n\nTämänhetkinen IP-osoitteesi on $3.\nOle hyvä ja liitä kaikki yllä olevat tiedot mahdollisiin kyselyihisi.",
+       "blockedtext-composite": "<strong>Käyttäjätunnuksesi tai IP-osoitteesi on estetty.</strong>\n\nAnnettu syy on:\n\n:<em>$2</em>.\n\n* Esto alkoi: $8\n* Pisin esto vanhentuu: $6\n\n* $5\n\nTämänhetkinen IP-osoitteesi on $3.\nOle hyvä ja liitä kaikki yllä olevat tiedot mahdollisiin kyselyihisi.",
+       "blockedtext-composite-reason": "Käyttäjätunnuksellesi ja/tai IP-osoitteellesi on asetettu useita päällekkäisiä estoja.",
        "whitelistedittext": "Sinun täytyy $1, jotta voisit muokata sivuja.",
        "confirmedittext": "Et voi muokata sivuja, ennen kuin olet varmentanut sähköpostiosoitteesi. Voit tehdä varmennuksen [[Special:Preferences|asetussivulla]].",
        "nosuchsectiontitle": "Pyydettyä osiota ei ole",
        "template-semiprotected": "(osittain suojattu)",
        "hiddencategories": "Tämä sivu kuuluu {{PLURAL:$1|seuraavaan piilotettuun luokkaan|seuraaviin piilotettuihin luokkiin}}:",
        "edittools": "<!-- Tässä oleva teksti näytetään muokkauskentän alla. -->",
+       "edittools-upload": "-",
        "nocreatetext": "Et voi luoda uusia sivuja. Voit muokata olemassa olevia sivuja tai [[Special:UserLogin|kirjautua sisään tai luoda käyttäjätunnuksen]].",
        "nocreate-loggedin": "Sinulla ei ole oikeutta luoda uusia sivuja.",
        "sectioneditnotsupported-title": "Osioiden muokkaamista ei tueta.",
        "content-model-text": "pelkkä teksti",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
+       "content-model-json": "JSON",
        "content-json-empty-object": "Tyhjä objekti",
        "content-json-empty-array": "Tyhjä array",
        "deprecated-self-close-category": "Sivut, joissa on virheellisiä itsensäsulkevia HTML-tageja",
        "mergehistory-comment": "Yhdisti sivun [[:$1]] sivuun [[:$2]]: $3",
        "mergehistory-same-destination": "Lähde- ja kohdesivut eivät voi olla samat",
        "mergehistory-reason": "Syy:",
+       "mergehistory-revisionrow": "$1 ($2) $3 . . $4 $5 $6",
        "mergelog": "Yhdistämisloki",
        "revertmerge": "Peru yhdistäminen",
        "mergelogpagetext": "Alla on loki viimeisimmistä muutoshistorioiden yhdistämisistä.",
        "youremail": "Sähköpostiosoite",
        "username": "{{GENDER:$1|Käyttäjätunnus}}",
        "prefs-memberingroups": "{{GENDER:$2|Jäsenenä}} {{PLURAL:$1|ryhmässä|ryhmissä}}",
+       "prefs-memberingroups-type": "$1",
        "group-membership-link-with-expiry": "$1 ($2 asti)",
        "prefs-registration": "Rekisteröintiaika",
+       "prefs-registration-date-time": "$1",
        "yourrealname": "Oikea nimi",
        "yourlanguage": "Käyttöliittymän kieli",
        "yourvariant": "Sisällön kielivariantti",
        "saveusergroups": "Tallenna {{GENDER:$1|käyttäjän}} ryhmät",
        "userrights-groupsmember": "Jäsenenä ryhmissä:",
        "userrights-groupsmember-auto": "Automaattisesti jäsenenä ryhmissä:",
+       "userrights-groupsmember-type": "$1",
        "userrights-groups-help": "Voit muuttaa ryhmiä, joissa tämä käyttäjä on.\n* Merkattu valintaruutu tarkoittaa, että käyttäjä on kyseisessä ryhmässä.\n* Merkkaamaton valintaruutu tarkoittaa, että käyttäjä ei ole kyseisessä ryhmässä.\n* <nowiki>*</nowiki> tarkoittaa, että et pysty enää poistamaan käyttäjää ryhmästä, kun olet hänet siihen lisännyt, tai päinvastoin.\n* <nowiki>#</nowiki> tarkoittaa, että voit ainoastaan pidentää tämän ryhmän jäsenten oikeuksien vanhentumisen määräaikaa, mutta et voi lyhentää sitä.",
        "userrights-reason": "Syy:",
        "userrights-no-interwiki": "Sinulla ei ole oikeutta muokata käyttöoikeuksia muissa wikeissä.",
        "userrights-nodatabase": "Tietokantaa $1 ei ole tai se ei ole paikallinen.",
        "userrights-changeable-col": "Ryhmät, joita voit muuttaa",
        "userrights-unchangeable-col": "Ryhmät, joita et voi muuttaa",
+       "userrights-irreversible-marker": "$1*",
+       "userrights-no-shorten-expiry-marker": "$1#",
        "userrights-expiry-current": "Vanhentuu $1",
        "userrights-expiry-none": "Ei vanhennu",
        "userrights-expiry": "Vanhentuu:",
        "action-override-export-depth": "viedä sivuja sisältäen viitatut sivut viiden syvyydellä",
        "action-suppressredirect": "siirtää sivuja luomatta automaattisia ohjauksia",
        "nchanges": "$1 {{PLURAL:$1|muutos|muutosta}}",
+       "ntimes": "$1×",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|viimeisen käynnin jälkeen}}",
        "enhancedrc-history": "historia",
        "recentchanges": "Tuoreet muutokset",
        "minoreditletter": "p",
        "newpageletter": "U",
        "boteditletter": "b",
+       "unpatrolledletter": "!",
+       "rc-change-size": "$1",
        "rc-change-size-new": "$1 {{PLURAL:$1|tavu|tavua}} muutosten jälkeen",
        "newsectionsummary": "/* $1 */ uusi osio",
        "rc-enhanced-expand": "Näytä yksityiskohdat",
        "move": "Siirrä",
        "movethispage": "Siirrä tämä sivu",
        "unusedimagestext": "Seuraavat tiedostot ovat olemassa, mutta niitä ei käytetä millään sivulla.\nHuomaa, että muut verkkosivut saattavat viitata tiedostoon suoran URL:n avulla, jolloin tiedosto saattaa olla tässä listassa, vaikka sitä käytetäänkin.",
+       "unusedimagestext-categorizedimgisused": "Seuraavat tiedostot ovat olemassa, mutta niitä ei ole upotettu mihinkään sivuun. Luokitellut kuvat lasketaan käytössä oleviksi, vaikka niitä ei ole upotettu mihinkään sivuun.\nHuomaa, että muut verkkosivustot voivat linkittää suoraan URL-osoitteeseen, joten ne voivat silti olla tässä luettelossa, vaikka niitä on käytetty aktiivisesti.",
        "unusedcategoriestext": "Nämä luokat ovat olemassa, mutta niitä ei käytetä.",
        "notargettitle": "Ei kohdetta",
        "notargettext": "Et ole määritellyt kohteeksi sivua tai käyttäjää, johon toiminto suoritetaan.",
        "apisandbox-request-selectformat-label": "Näytä pyyntödata muodossa:",
        "apisandbox-request-format-url-label": "URL-kyselymerkkijono",
        "apisandbox-request-url-label": "Pyynnön URL",
+       "apisandbox-request-format-json-label": "JSON",
        "apisandbox-request-json-label": "Pyydetty JSON:",
        "apisandbox-request-time": "Pyyntöön kulunut aika: {{PLURAL:$1|$1 ms}}",
        "apisandbox-results-fixtoken": "Korjaa ”token” ja lähetä uudelleen",
        "listgrants-summary": "Alla on luettelo toimintaoikeuksista sekä niiden vastaavista pääsytavoista käyttäjäoikeuksiin. Käyttäjät voivat valtuuttaa sovelluksia käyttämään heidän tiliään rajoitetuin oikeuksien riippuen toimintaoikeuksista, jota käyttäjä on sovellukselle myöntänyt. Käyttäjän puolesta toimiva sovellus ei kuitenkaan voi käyttää oikeuksia, joita käyttäjällä ei ole.\nYksittäisistä oikeuksista saattaa olla saatavilla [[{{MediaWiki:Listgrouprights-helppage}}|lisätietoa]].",
        "listgrants-grant": "Toimintaoikeus (grant)",
        "listgrants-rights": "Oikeudet (rights)",
+       "listgrants-grant-display": "$1 <code>($2)</code>",
        "trackingcategories": "Tarkkailuluokat",
        "trackingcategories-summary": "Tällä sivulla on luettelo sellaisista ongelmia havaitsevista luokista (tarkkailuluokat), joiden sisällön koostaa automaattisesti MediaWiki-ohjelmisto. Luokkien nimiä voi vaihtaa muuttamalla asianomaista järjestelmäviestiä nimiavaruudessa {{ns:8}}.",
        "trackingcategories-msg": "Tarkkailuluokka",
        "protect-fallback": "Salli vain käyttäjät, joilla on oikeus $1",
        "protect-level-autoconfirmed": "Vain hyväksytyt käyttäjät",
        "protect-level-sysop": "Salli vain ylläpitäjät",
+       "protect-summary-desc": "[$1=$2] ($3)",
        "protect-summary-cascade": "tarttuva",
        "protect-expiring": "vanhentuu $1 (UTC)",
        "protect-expiring-local": "vanhentuu $1",
        "undelete-error-long": "Tiedoston palauttaminen epäonnistui:\n\n$1",
        "undelete-show-file-confirm": "Haluatko varmasti nähdä poistetun version tiedostosta <nowiki>$1</nowiki>, joka on tallennettu $2 kello $3?",
        "undelete-show-file-submit": "Kyllä",
+       "undelete-revision-row2": "$1 ($2) $3 . . $4 $5 $6 $7 $8",
        "namespace": "Nimiavaruus:",
        "invert": "Käänteinen valinta",
        "tooltip-invert": "Valitse tämä kohta, jos haluat piilottaa muutokset sivuihin valitussa nimiavaruudessa (ja liittyviin nimiavaruuksiin, jos valittu)",
        "blocklist-nousertalk": "oman keskustelusivun muokkaaminen estetty",
        "blocklist-editing": "muokkaaminen",
        "blocklist-editing-sitewide": "muokkaaminen (sivuston laajuisesti)",
-       "blocklist-editing-page": "sivut",
-       "blocklist-editing-ns": "nimiavaruudet",
+       "blocklist-editing-page": "sivuja",
+       "blocklist-editing-ns": "nimiavaruuksia",
        "ipblocklist-empty": "Estolista on tyhjä.",
-       "ipblocklist-no-results": "Pyydettyä IP-osoitetta tai käyttäjätunnusta ei ole estetty.",
+       "ipblocklist-no-results": "Pyydetylle IP-osoitteelle tai käyttäjätunnukselle ei löytynyt vastaavia estoja.",
        "blocklink": "estä",
        "unblocklink": "poista esto",
        "change-blocklink": "muuta estoa",
        "ipb_expiry_old": "Vanhentumisaika on menneisyyttä.",
        "ipb_expiry_temp": "Piilotettujen käyttäjätunnusten estojen tulee olla pysyviä.",
        "ipb_hide_invalid": "Tämän tunnuksen piilottaminen ei onnistu; sillä on enemmän kuin {{PLURAL:$1|yksi muokkaus|$1 muokkausta}}.",
-       "ipb_hide_partial": "Hidden username blocks must be sitewide blocks.",
+       "ipb_hide_partial": "Jos käyttäjän tunnus piilotetaan kun tunnus estetään, muokkauseston pitää olla sivuston laajuinen.",
        "ipb_already_blocked": "”$1” on jo estetty.",
        "ipb-needreblock": "$1 on jo estetty. Haluatko muuttaa eston asetuksia?",
        "ipb-otherblocks-header": "{{PLURAL:$1|Muu esto|Muut estot}}",
        "pageinfo-few-watchers": "Vähemmän kuin $1 {{PLURAL:$1|tarkkailija|tarkkailijaa}}",
        "pageinfo-few-visiting-watchers": "Tuoreita muutoksia saatetaan tarkkailla, mutta tämä ei ole varmaa",
        "pageinfo-redirects-name": "Sivulle johtavat ohjaukset",
+       "pageinfo-redirects-value": "$1",
        "pageinfo-subpages-name": "Sivun alasivut",
        "pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|ohjaus|ohjausta}}; $3 {{PLURAL:$3|ei-ohjausta}})",
        "pageinfo-firstuser": "Sivun luonut",
        "mediawarning": "'''Varoitus''': Tämä tiedostomuoto saattaa sisältää vahingollista koodia.\nSuorittamalla sen järjestelmäsi voi muuttua epäluotettavaksi.",
        "imagemaxsize": "Kuvien enimmäiskoko tiedostokuvaussivuilla",
        "thumbsize": "Pienoiskuvien koko",
+       "widthheight": "$1 × $2",
        "widthheightpage": "$1 × $2, $3 {{PLURAL:$3|sivu|sivua}}",
        "file-info": "$1, MIME-tyyppi: $2",
        "file-info-size": "$1 × $2 kuvapistettä, $3, MIME-tyyppi: $4",
        "ilsubmit": "Hae",
        "bydate": "päiväyksen mukaan",
        "sp-newimages-showfrom": "Näytä uudet tiedostot alkaen $1 kello $2",
+       "video-dims": "$1, $2 × $3",
+       "seconds-abbrev": "$1 s",
+       "minutes-abbrev": "$1 min",
+       "hours-abbrev": "$1 h",
+       "days-abbrev": "$1 d",
        "seconds": "{{PLURAL:$1|$1 sekunti|$1 sekuntia}}",
        "minutes": "{{PLURAL:$1|$1 minuutti|$1 minuuttia}}",
        "hours": "{{PLURAL:$1|$1 tunti|$1 tuntia}}",
        "sunday-at": "Sunnuntaina klo $1",
        "yesterday-at": "Eilen klo $1",
        "bad_image_list": "Listan muoto on seuraava:\n\nVain *-merkillä alkavat rivit otetaan huomioon.\nRivin ensimmäisen linkin on osoitettava tiedostoon.\nKaikki muut linkit ovat poikkeuksia eli toisin sanoen sivuja, joissa tiedostoa saa käyttää.",
+       "variantname-zh-hans": "hans",
+       "variantname-zh-hant": "hant",
        "metadata": "Sisältökuvaukset",
        "metadata-help": "Tämä tiedosto sisältää esimerkiksi kuvanlukijan, digikameran tai kuvankäsittelyohjelman lisäämiä lisätietoja. Kaikki tiedot eivät enää välttämättä vastaa todellisuutta, jos kuvaa on muokattu sen alkuperäisen luonnin jälkeen.",
        "metadata-expand": "Näytä kaikki sisältökuvaukset",
        "confirm-unwatch-top": "Poistetaanko tämä sivu tarkkailulistaltasi?",
        "confirm-rollback-button": "OK",
        "confirm-rollback-top": "Palauta tämän sivun muokkaukset?",
+       "confirm-rollback-bottom": "Tämä toiminto palauttaa välittömästi takaisinpäin valitut muutokset tällä sivulla.",
        "confirm-mcrrestore-title": "Palauta takaisin yksittäinen versio",
        "confirm-mcrundo-title": "Kumoa muutos",
        "mcrundofailed": "Kumoaminen epäonnistui",
        "mcrundo-missingparam": "Tarvittavat parametrit puuttuvat pyynnöstä.",
        "mcrundo-changed": "Sivu on muuttunut siitä lähtien, kun katsoit tätä muokkausta. Arvioi uusi muokkaus.",
        "mcrundo-parse-failed": "Uuden version jäsentäminen epäonnistui: $1",
+       "semicolon-separator": ";&#32;",
+       "comma-separator": ",&#32;",
+       "colon-separator": ":&#32;",
+       "pipe-separator": "&#32;|&#32;",
+       "word-separator": "&#32;",
+       "ellipsis": "...",
        "percent": "$1&#160;%",
+       "parentheses": "($1)",
+       "parentheses-start": "(",
+       "parentheses-end": ")",
        "quotation-marks": "”$1”",
        "imgmultipageprev": "← edellinen sivu",
        "imgmultipagenext": "seuraava sivu →",
        "logentry-block-block": "$1 {{GENDER:$2|esti}} käyttäjän {{GENDER:$4|$3}}. Eston kesto on $5 $6",
        "logentry-block-unblock": "$1 {{GENDER:$2|poisti muokkauseston}} käyttäjältä {{GENDER:$4|$3}}",
        "logentry-block-reblock": "$1 {{GENDER:$2|muutti}} eston asetuksia kohteessa {{GENDER:$4|$3}}. Eston kesto on $5 $6",
-       "logentry-partialblock-block-page": "{{PLURAL:$1|sivulla|sivuilla}} $2",
-       "logentry-partialblock-block-ns": "{{PLURAL:$1|nimiavaruuteen|nimiavaruuksiin}} $2",
-       "logentry-partialblock-block": "$1 {{GENDER:$2|blocked}} {{GENDER:$4|$3}} from editing $7 with an expiration time of $5 $6",
+       "logentry-partialblock-block-page": "{{PLURAL:$1|sivua|sivuja}} $2",
+       "logentry-partialblock-block-ns": "{{PLURAL:$1|nimiavaruutta|nimiavaruuksia}} $2",
+       "logentry-partialblock-block": "$1 {{GENDER:$2|esti}} käyttäjää {{GENDER:$4|$3}} muokkaamasta $7. Eston kesto on $5 $6",
        "logentry-partialblock-reblock": "$1 {{GENDER:$2|muutti}} käyttäjän {{GENDER:$4|$3}} muokkauseston asetuksia estäen muokkausten tekemisen $7. Eston kesto on $5 $6",
        "logentry-non-editing-block-block": "$1 {{GENDER:$2|esti}} käyttäjää {{GENDER:$4|$3}} suorittamasta määrättyjä toimenpiteitä (lukuun ottamatta muokkaamista). Eston kesto on $5 $6",
        "logentry-non-editing-block-reblock": "$1 {{GENDER:$2|muutti}} käyttäjän {{GENDER:$4|$3}} toimintaeston asetuksia, jotka koskevat määrättyjä toimenpiteitä. Eston kesto on $5 $6",
        "mw-widgets-abandonedit-keep": "Jatka muokkaamista",
        "mw-widgets-abandonedit-title": "Oletko varma?",
        "mw-widgets-copytextlayout-copy": "Kopioi",
+       "mw-widgets-copytextlayout-copy-fail": "Leikepöydälle kopioiminen epäonnistui.",
        "mw-widgets-copytextlayout-copy-success": "Kopioitu leikepöydälle",
        "mw-widgets-dateinput-no-date": "Ei ole valittu mitään päivää",
        "mw-widgets-dateinput-placeholder-day": "VVVV-KK-PP",
        "specialmute-success": "Vaimennusasetuksesi on päivitetty. Näet kaikki vaimennetut käyttäjät [[Special:Preferences|asetuksistasi]].",
        "specialmute-submit": "Vahvista",
        "specialmute-label-mute-email": "Vaimenna sähköpostit tältä käyttäjältä",
-       "specialmute-header": "Valitse vaimennusasetuksesi käyttäjälle {{BIDI:[[User:$1]]}}.",
+       "specialmute-header": "Valitse vaimennusasetuksesi käyttäjälle <b>{{BIDI:[[User:$1]]}}</b>.",
        "specialmute-error-invalid-user": "Pyydettyä käyttäjänimeä ei löydy.",
-       "specialmute-error-email-blacklist-disabled": "Sähköpostin lähettämistä käyttäjiltä ei ole vaimennettu.",
-       "specialmute-error-email-preferences": "Sinun täytyy vahvistaa sähköpostiosoitteesi ennen kuin voit vaimentaa käyttäjän. Voit tehdä sen sivulta [[Special:Preferences]].",
        "specialmute-email-footer": "Hallitaksesi sähköpostiasetuksia käyttäjälle {{BIDI:$2}}, käy sivulla <$1>.",
        "specialmute-login-required": "Kirjaudu sisään muuttaaksesi vaimentamisasetuksiasi.",
        "revid": "versio $1",
        "passwordpolicies-summary": "Tämä on luettelo voimassa olevista salasanakäytännöistä tämän wikin käyttäjäryhmille.",
        "passwordpolicies-group": "Ryhmä",
        "passwordpolicies-policies": "Käytännöt",
+       "passwordpolicies-policy-display": "<span class=\"passwordpolicies-policy\">$1 <code>($2)</code></span>",
+       "passwordpolicies-policy-displaywithflags": "<span class=\"passwordpolicies-policy\">$1 <code>($2)</code></span> <span class=\"passwordpolicies-policy-flags\">($3)</span>",
        "passwordpolicies-policy-minimalpasswordlength": "Salasanan tulee olla vähintään {{PLURAL:$1|yhden merkin|$1 merkin}} pituinen",
        "passwordpolicies-policy-minimumpasswordlengthtologin": "Salasanassa on oltava vähintään $1 {{PLURAL:$1|merkki|merkkiä}} pystyäksesi kirjautumaan",
        "passwordpolicies-policy-passwordcannotmatchusername": "Salasana ei saa olla sama kuin käyttäjänimi",
        "passwordpolicies-policy-maximalpasswordlength": "Salasanan tulee olla lyhyempi kuin $1 {{PLURAL:$1|merkki|merkkiä}}",
        "passwordpolicies-policy-passwordcannotbepopular": "Salasana ei saa olla {{PLURAL:$1|suosittu salasana|$1 suosituimman salasanan listalla}}",
        "passwordpolicies-policy-passwordnotinlargeblacklist": "Salasana ei voi olla 100,000 yleisimmin käytetyn joukossa.",
+       "passwordpolicies-policyflag-forcechange": "täytyy vaihtaa kirjautuessa",
+       "passwordpolicies-policyflag-suggestchangeonlogin": "ehdota vaihtamista kirjautuessa",
+       "easydeflate-invaliddeflate": "Annettua sisältöä ei ole tyhjennetty kunnolla",
        "unprotected-js": "Turvallisuussyistä JavaScriptiä ei voi ladata suojaamattomilta sivuilta. Luo JavaScript-sivuja vain MediaWiki-nimiavaruuteen tai käyttäjän alasivulle.",
        "userlogout-continue": "Haluatko kirjautua ulos?"
 }
index 698d3b5..6f96360 100644 (file)
        "autoblockedtext": "Votre adresse IP a été bloquée automatiquement car elle a été utilisée par un autre utilisateur, lui-même bloqué par $1.\nLa raison invoquée est :\n\n: <em>$2</em>.\n\n* Début du blocage : $8\n* Expiration du blocage : $6\n* Compte bloqué : $7\n\nVous pouvez contacter $1 ou l’un des autres [[{{MediaWiki:Grouppage-sysop}}|administrateurs]] pour discuter de ce blocage.\n\nNotez que vous ne pourrez utiliser la fonctionnalité « {{int:emailuser}} » que si vous avez une adresse de courriel validée dans vos [[Special:Preferences|préférences]] et que cette fonctionnalité ne vous a pas été désactivée.\n\nVotre adresse IP actuelle est $3, et le numéro de blocage est $5.\nVeuillez inclure tous les détails ci-dessus dans chacune des requêtes que vous ferez.",
        "systemblockedtext": "Votre nom d'utilisateur ou votre adresse IP ont été bloqués automatiquement par MediaWiki.\nLa raison donnée est la suivante:\n\n: <em>$2</em>.\n\n* Le début du blocage: $8\n* Expiration du délai de blocage: $6\n* Elément concerné: $7\n\nVotre adresse IP actuelle est $3.\nVeuillez inclure tous les détails ci-dessus dans chacune des requêtes que vous ferez.",
        "blockednoreason": "aucune raison donnée",
-       "blockedtext-composite": "<strong>Votre nom d'utilisateur ou votre adresse IP ont été bloqués.</strong>\n\nLa raison invoquées est :\n\n:<em>$2</em>.\n\n* Début du blocage : $8\n* Expiration du blocage le plus long : $6\n\nVotre adresse IP actuelle est $3.\nVeuillez inclure tous les détails ci-dessus dans chaque demande que vous ferez.",
+       "blockedtext-composite": "<strong>Votre nom d'utilisateur ou votre adresse IP ont été bloqués.</strong>\n\nLa raison invoquées est :\n\n:<em>$2</em>.\n\n* Début du blocage : $8\n* Expiration du blocage le plus long : $6\n\n* $5\n\nVotre adresse IP actuelle est $3.\nVeuillez inclure tous les détails ci-dessus dans chaque demande que vous ferez.",
+       "blockedtext-composite-ids": "ID de bloc pertinents : $1 (votre adresse IP peut aussi être en liste noire)",
+       "blockedtext-composite-no-ids": "Votre adresse IP apparaît dans plusieurs listes noires",
        "blockedtext-composite-reason": "Il existe plusieurs blocages sur votre compte et/ou votre adresse IP",
        "whitelistedittext": "Vous devez vous $1 pour avoir la permission de modifier le contenu.",
        "confirmedittext": "Vous devez confirmer votre adresse de courriel avant de modifier les pages.\nVeuillez entrer et valider votre adresse de courriel dans vos [[Special:Preferences|préférences]].",
        "search-interwiki-more": "(plus)",
        "search-interwiki-more-results": "résultats supplémentaires",
        "search-relatedarticle": "Reliés",
+       "search-invalid-sort-order": "L’ordre de tri de $1 n’est pas reconnu, le tri par défaut sera appliqué. Les ordres de tri valides sont : $2",
+       "search-unknown-profile": "Le profil de recherche de $1 n’est pas reconnu, le profil de recherche par défaut sera appliqué.",
        "searchrelated": "reliés",
        "searchall": "tout",
        "showingresults": "Affichage de <strong>$1</strong> résultat{{PLURAL:$1||s}} à partir du n°<strong>$2</strong>.",
        "right-editmyusercss": "Modifier vos propres fichiers CSS utilisateur",
        "right-editmyuserjson": "Modifier vos propres fichiers utilisateur JSON",
        "right-editmyuserjs": "Modifier vos propres fichiers JavaScript utilisateur",
+       "right-editmyuserjsredirect": "Modifier vos propres fichiers JavaScript utilisateur qui sont des redirections",
        "right-viewmywatchlist": "Afficher votre propre liste de suivi",
        "right-editmywatchlist": "Modifier votre propre liste de suivi. Remarquez que certaines actions ajouteront encore des pages sans ce droit.",
        "right-viewmyprivateinfo": "Voir vos données personnelles (par exemple votre adresse, votre vrai nom)",
        "action-editmyusercss": "modifier vos propres fichiers CSS utilisateur",
        "action-editmyuserjson": "modifier vos propres fichiers JSON utilisateur",
        "action-editmyuserjs": "modifier vos propres fichiers JavaScript utilisateur",
+       "action-editmyuserjsredirect": "modifier vos propres fichiers JavaScript utilisateur qui sont des redirections",
        "action-viewsuppressed": "afficher les révisions masquées pour n’importe quel utilisateur",
        "action-hideuser": "bloquer un nom d’utilisateur, en le masquant au public",
        "action-ipblock-exempt": "contourner les blocages d’IP, blocages automatiques et blocages de plages d’IP",
        "specialmute-success": "Vos préférences de mise en sourdine on été mises à jour. Voyez tous les utilisateurs impliqués dans [[Special:Preferences|vos préférences]].",
        "specialmute-submit": "Confirmer",
        "specialmute-label-mute-email": "Mettre en sourdine les courriels de cet utilisateur",
-       "specialmute-header": "Veuillez sélectionner vos préférences de mise en sourdine pour {{BIDI:[[User:$1]]}}.",
+       "specialmute-header": "Veuillez sélectionner vos préférences de mise en sourdine pour l’utilisateur <b>{{BIDI:[[User:$1|$1]]}}</b>.",
        "specialmute-error-invalid-user": "Le nom d’utilisateur demandé n’a pu être trouvé.",
-       "specialmute-error-email-blacklist-disabled": "La mise en sourdine des utilisateurs pour vous envoyer des courriels n’est pas activée.",
-       "specialmute-error-email-preferences": "Vous devez confirmer votre adresse courriel avant de pouvoir mettre en sourdine un utilisateur. Vous pouvez le faire depuis [[Special:Preferences]].",
-       "specialmute-email-footer": "Veuillez voir <$1> pour gérer les préférences courriel pour {{BIDI:$2}}.",
+       "specialmute-error-no-options": "Les fonctionnalités de misse en silence ne sont pas disponibles. Cela peut être dû à ce que vous n’avez pas confirmé votre adresse de messagerie, ou que l’administrateur du wiki a désactivé les fonctionnalités de courriel, ou que votre adresse est en liste noire pour ce wiki.",
+       "specialmute-email-footer": "Veuillez voir <$1> pour gérer les préférences courriel pour l’utilisateur {{BIDI:$2}}.",
        "specialmute-login-required": "Veuillez vous connecter pour mettre-à-jour vos préférences de mise en sourdine d’utilisateurs.",
+       "mute-preferences": "Préférences de misse en silence",
        "revid": "version $1",
        "pageid": "ID de page $1",
        "interfaceadmin-info": "$1\n\nLes droits pour modifier les fichiers CSS/JS/JSON globaux au site ont été récemment séparés du droit <code>editinterface</code>. Si vous ne comprenez pas pourquoi vous avez cette erreur, voyez [[mw:MediaWiki_1.32/interface-admin]].",
        "passwordpolicies-policy-passwordnotinlargeblacklist": "Le mot de passe ne peut pas faire partie de la liste des 100 000 mots de passe les plus communément utilisés.",
        "passwordpolicies-policyflag-forcechange": "doit changer à la reconnexion",
        "passwordpolicies-policyflag-suggestchangeonlogin": "suggérer une modification à la connexion",
+       "mycustomjsredirectprotected": "Vous n’avez pas le droit de modifier cette page JavaScript parce qu’elle est une redirection et qu’elle ne pointe pas dans votre espace utilisateur.",
        "easydeflate-invaliddeflate": "Le contenu fourni n'est pas correctement développé",
        "unprotected-js": "Pour des raisons de sécurité, JavaScript ne peut pas être chargé depuis des pages non protégées. Veuillez ne créer du javascript que dans l’espace de noms MediaWiki: ou comme sous-page utilisateur",
        "userlogout-continue": "Voulez-vous vous déconnecter ?"
index 7fc5b45..a6eca3d 100644 (file)
        "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:<em>$2</em>\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 \"{{int:emailuser}}\" 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.",
        "systemblockedtext": "O seu nome de usuario ou enderezo IP foi bloqueado automaticamente polo sistema MediaWiki.\nO motivo do bloqueo é:\n\n:<em>$2</em>\n\n* Comezo do bloqueo: $8\n* Expiración do bloqueo: $6\n* Destinatario do bloqueo: $7\n\nO seu enderezo IP actual é $3.\nPor favor, inclúa todos estes detalles en calquera consulta que realice.",
        "blockednoreason": "non se deu ningunha razón",
-       "blockedtext-composite": "<strong>O seu nome de usuario ou enderezo IP foron bloqueados.</strong>\n\nO motivo dado é:\n\n:<em>$2</em>.\n\n* Comezo do bloqueo: $8\n* Remate do bloqueo máis longo: $6\n\nO seu enderezo IP actual é $3.\nPor favor, inclúa todos os detalles de arriba en calquera contacto sobre este asunto.",
+       "blockedtext-composite": "<strong>O seu nome de usuario ou enderezo IP foron bloqueados.</strong>\n\nO motivo dado é:\n\n:<em>$2</em>.\n\n* Comezo do bloqueo: $8\n* Remate do bloqueo máis longo: $6\n\n* $5\n\nO seu enderezo IP actual é $3.\nPor favor, inclúa todos os detalles de arriba en calquera contacto sobre este asunto.",
        "blockedtext-composite-reason": "Existen varios bloqueos contra a súa conta ou enderezo IP",
        "whitelistedittext": "Debe $1 para poder editar páxinas.",
        "confirmedittext": "Debe confirmar o correo electrónico antes de comezar a editar. Por favor, configure e dea validez ao correo mediante as súas [[Special:Preferences|preferencias de usuario]].",
        "specialmute-success": "As súas preferencias de silenciamento foron actualizadas. Ver todos os usuarios silenciados en [[Special:Preferences]].",
        "specialmute-submit": "Confirmar",
        "specialmute-label-mute-email": "Silenciar os correos electrónicos deste usuario",
-       "specialmute-header": "Por favor, seleccione as súas preferencias de silenciamento para {{BIDI:[[User:$1]]}}.",
+       "specialmute-header": "Por favor, seleccione as súas preferencias de silenciamento para <b>{{BIDI:[[User:$1]]}}</b>.",
        "specialmute-error-invalid-user": "Non se atopou o nome de usuario indicado.",
-       "specialmute-error-email-blacklist-disabled": "O silenciamento de usuario para impedir que lle envíen correos electrónicos non está activado.",
-       "specialmute-error-email-preferences": "Debe confirmar o seu enderezo de correo electrónico antes de poder silenciar a un usuario. Pode facelo en [[Special:Preferences]].",
        "specialmute-email-footer": "Para xestionar as preferencias de correo electrónico de {{BIDI:$2}}, por favor,  visite <$1>.",
        "specialmute-login-required": "Por favor, inicie sesión para alterar as súas preferencias de silenciamento.",
        "revid": "revisión $1",
index f76e312..9c54b07 100644 (file)
        "history": "Riwāyati lo halaman",
        "history_short": "Riwāyati",
        "history_small": "riwāyati",
-       "updatedmarker": "biloli'o to'u bililohe pulitiyo",
+       "updatedmarker": "loboli'a to'u bililohe'u pulitiyo",
        "printableversion": "Persi cetak",
        "permalink": "Wūmbuta kakali",
        "print": "Cetakiya",
        "pt-login-continue-button": "Turusi tumuwoto log",
        "pt-createaccount": "Mohutu akun",
        "pt-userlogout": "Lumuwalo log",
+       "resetpass_header": "Tulo'i tahe u'unti lo akun",
+       "oldpassword": "Tahe u'unti mulolo:",
+       "newpassword": "Tahe u'unti bohu:",
+       "retypenew": "Tepuwa taheu'unti bohu:",
        "botpasswords-label-create": "Mohutu",
        "botpasswords-label-update": "Mopobohu",
        "botpasswords-label-cancel": "Bataliya",
index 5b522e2..79f0e30 100644 (file)
        "autoblockedtext": "כתובת ה־IP שלך נחסמה באופן אוטומטי כיוון שמשתמש אחר, שנחסם על־ידי $1, השתמש בה.\nהסיבה שניתנה לחסימה היא:\n\n:<em>$2</em>\n\n* תחילת החסימה: $8\n* פקיעת החסימה: $6\n* החסימה שבוצעה: $7\n\nבאפשרותך ליצור קשר עם $1 או עם כל אחד מ[[{{MediaWiki:Grouppage-sysop}}|מפעילי המערכת]] האחרים כדי לדון בחסימה.\n\nכמו־כן, באפשרותך להשתמש בתכונת \"{{int:emailuser}}\", אלא אם לא ציינת כתובת דוא\"ל תקפה ב[[Special:Preferences|העדפות המשתמש שלך]] או אם נחסמת משליחת דוא\"ל.\n\nכתובת ה־IP הנוכחית שלך היא $3, ומספר החסימה שלך הוא #$5.\nיש לציין את כל הפרטים הללו בכל פנייה לבירור החסימה.",
        "systemblockedtext": "שם המשתמש או כתובת ה־IP שלך נחסמו באופן אוטומטי על־ידי תוכנת מדיה־ויקי.\nהסיבה שניתנה לחסימה היא:\n\n:<em>$2</em>\n\n* תחילת החסימה: $8\n* פקיעת החסימה: $6\n* החסימה שבוצעה: $7\n\nכתובת ה־IP הנוכחית שלך היא $3.\nיש לציין את כל הפרטים הללו בכל פנייה לבירור החסימה.",
        "blockednoreason": "לא ניתנה סיבה",
-       "blockedtext-composite": "<strong>שם המשתמש או כתובת ה־IP שלך נחסמו.</strong>\n\nהסיבה שניתנה לכך היא:\n\n:<em>$2</em>.\n\n* תחילת החסימה: $8\n* פקיעת החסימה הארוכה ביותר: $6\n\nכתובת ה־IP הנוכחית שלך היא $3.\nיש לציין את כל הפרטים הללו בכל פנייה לבירור החסימה.",
+       "blockedtext-composite": "<strong>שם המשתמש או כתובת ה־IP שלך נחסמו.</strong>\n\nהסיבה שניתנה לכך היא:\n\n:<em>$2</em>.\n\n* תחילת החסימה: $8\n* פקיעת החסימה הארוכה ביותר: $6\n\n* $5\n\nכתובת ה־IP הנוכחית שלך היא $3.\nיש לציין את כל הפרטים הללו בכל פנייה לבירור החסימה.",
+       "blockedtext-composite-ids": "מזהי החסימות הרלוונטיים: $1 (גם כתובת ה־IP שלך יכולה להיות ברשימה השחורה)",
+       "blockedtext-composite-no-ids": "כתובת ה־IP שלך מופיעה במספר רשימות שחורות",
        "blockedtext-composite-reason": "הופעלו מספר חסימות על חשבון המשתמש שלך או על כתובת ה־IP שלך (או על שניהם)",
        "whitelistedittext": "נדרשת $1 כדי לערוך דפים.",
        "confirmedittext": "יש לאמת את כתובת הדוא\"ל לפני עריכת דפים.\nנא להגדיר ולאמת את כתובת הדוא\"ל שלך באמצעות [[Special:Preferences|העדפות המשתמש]] שלך.",
        "right-editmyusercss": "עריכת קובצי CSS של המשתמש עצמו",
        "right-editmyuserjson": "עריכת קובצי JSON של המשתמש עצמו",
        "right-editmyuserjs": "עריכת קובצי JavaScript של המשתמש עצמו",
+       "right-editmyuserjsredirect": "עריכת דפי JavaScript שלך שהם הפניות",
        "right-viewmywatchlist": "צפייה ברשימת המעקב של המשתמש עצמו",
        "right-editmywatchlist": "עריכת רשימת המעקב של המשתמש עצמו. מספר פעולות יוסיפו דפים גם ללא הרשאה זו.",
        "right-viewmyprivateinfo": "צפייה במידע הפרטי של המשתמש עצמו (כגון: כתובת דוא\"ל, שם אמיתי)",
        "action-editmyusercss": "לערוך קובצי CSS של עצמך",
        "action-editmyuserjson": "לערוך קובצי JSON של עצמך",
        "action-editmyuserjs": "לערוך קובצי JavaScript של עצמך",
+       "action-editmyuserjsredirect": "לערוך את דפי ה־JavaScript שלך שהם הפניות",
        "action-viewsuppressed": "לצפות בגרסאות שהוסתרו מכל המשתמשים",
        "action-hideuser": "לחסום שם משתמש תוך הסתרתו מהציבור",
        "action-ipblock-exempt": "לעקוף חסימות של כתובות IP, חסימות אוטומטיות וחסימות טווחים",
        "specialmute-success": "העדפות ההשתקה שלך עודכנו. רשימת כל המשתמשים המושתקים זמינה ב[[Special:Preferences|העדפות שלך]].",
        "specialmute-submit": "אישור",
        "specialmute-label-mute-email": "השתקת הודעות דואר אלקטרוני מהמשתמש הזה",
-       "specialmute-header": "×\91×\97×\99ר×\95ת ×\94×¢×\93פ×\95ת ×\94×\94שתק×\94 ×©×\9c×\9a ×¢×\91×\95ר {{BIDI:[[User:$1]]}}.",
+       "specialmute-header": "× ×\90 ×\9c×\91×\97×\95ר ×\90ת ×\94×¢×\93פ×\95ת ×\94×\94שתק×\94 ×©×\9c×\9a ×¢×\91×\95ר ×\94×\9eשת×\9eש <b>{{BIDI:[[User:$1|$1]]}}</b>.",
        "specialmute-error-invalid-user": "שם המשתמש המבוקש לא נמצא.",
-       "specialmute-error-email-blacklist-disabled": "האפשרות להשתקת משתמשים משליחת דואר אלקטרוני אליך אינה מופעלת.",
-       "specialmute-error-email-preferences": "יש לאמת את כתובת הדואר האלקטרוני שלך לפני שתהיה לך אפשרות להשתיק משתמש. אפשר לעשות זאת מהדף [[Special:Preferences]].",
-       "specialmute-email-footer": "כדי לנהל את העדפות קבלת הדואר האלקטרוני שנשלח על־ידי {{BIDI:$2}}, באפשרותך לבקר בדף <$1>.",
+       "specialmute-error-no-options": "אפשרויות ההשתקה אינן זמינות. ייתכן שזה קורה כי: לא עשית אימות כתובת דואר אלקטרוני או שמנהל הוויקי כיבה את אפשרויות הדואר האלקטרוני או את הרשימה השחורה של הדואר האלקטרוני עבור הוויקי הזה.",
+       "specialmute-email-footer": "כדי לנהל את העדפות קבלת הדואר האלקטרוני שנשלח על־ידי המשתמש {{BIDI:$2}}, באפשרותך לבקר בדף <$1>.",
        "specialmute-login-required": "נדרשת כניסה לחשבון כדי לשנות את העדפות ההשתקה שלך.",
+       "mute-preferences": "העדפות השתקה",
        "revid": "גרסה $1",
        "pageid": "מזהה דף $1",
        "interfaceadmin-info": "$1\n\nההרשאות לעריכת קובצי CSS/JS/JSON של האתר כולו הופרדו לאחרונה מההרשאה <code>editinterface</code>. אם לא ברור לך מדוע קיבלת את הודעת השגיאה הזאת, ר' [[mw:MediaWiki_1.32/interface-admin]].",
        "passwordpolicies-policy-passwordnotinlargeblacklist": "הסיסמה לא יכולה להיות ברשימת 100,000 הסיסמאות הנפוצות ביותר.",
        "passwordpolicies-policyflag-forcechange": "לדרוש שינוי בעת כניסה לחשבון",
        "passwordpolicies-policyflag-suggestchangeonlogin": "להציע שינוי בעת כניסה לחשבון",
+       "mycustomjsredirectprotected": "אין לך הרשאה לערוך את דף ה־JavaScript הזה כי זאת הפניה ואינה מצביעה לדף בתוך מרחב המשתמש שלך.",
        "easydeflate-invaliddeflate": "התוכן שהועבר אינו דחוס כנדרש",
        "unprotected-js": "מסיבות אבטחה, לא ניתן לטעון JavaScript מדפים שאינם מוגנים. ניתן ליצור סקריפטי JavaScript רק במרחב השם \"מדיה ויקי:\" או בדפי משנה של דף המשתמש.",
        "userlogout-continue": "האם ברצונך לצאת מהחשבון?"
index 1bffe93..3c2da97 100644 (file)
        "specialmute-success": "Vaše postavke utišavanja su uspješno ažurirane. Vidite sve utišane korisnike ovdje: [[Special:Preferences]].",
        "specialmute-submit": "Potvrdi",
        "specialmute-error-invalid-user": "Korisničko ime koje ste tražili nije moguće pronaći.",
-       "specialmute-error-email-preferences": "Morate potvrditi svoju adresu e-pošte prije nego što možete utišati ovoga korisnika. To možete učiniti putem [[Special:Preferences]].",
        "specialmute-login-required": "Molimo Vas, prijavite se da biste promijenili postavke.",
        "gotointerwiki": "Napuštate projekt {{SITENAME}}",
        "gotointerwiki-invalid": "Navedeni naslov nije valjan.",
index 9cd104b..eaf2f0c 100644 (file)
        "autoblockedtext": "Az IP-címed automatikusan blokkolva lett, mert korábban egy olyan szerkesztő használta, akit $1 blokkolt, az alábbi indoklással:\n\n:''$2''\n\n*A blokk kezdete: '''$8'''\n*A blokk lejárata: '''$6'''\n*Blokkolt szerkesztő: '''$7'''\n\nKapcsolatba léphetsz $1 szerkesztőnkkel, vagy egy másik [[{{MediaWiki:Grouppage-sysop}}|adminisztrátorral]], és megbeszélheted vele a blokkolást.\n\nAz „{{int:emailuser}}” funkciót csak akkor használhatod, ha érvényes e-mail címet adtál meg\n[[Special:Preferences|fiókbeállításaidban]], és nem blokkolták a használatát.\n\nJelenlegi IP-címed: $3, a blokkolás azonosítószáma: #$5.\nKérjük, hogy érdeklődés esetén mindkettőt add meg.",
        "systemblockedtext": "A felhasználónevedet vagy IP-címedet automatikusan blokkolta a MediaWiki.\nA blokkolás indoka:\n\n:<em>$2</em>\n\n* A blokk kezdete: $8\n* A blokk lejárata: $6\n* Blokkolt szerkesztő: $7\n\nA jelenlegi IP-címed: $3.\nKérjük, hogy érdeklődés esetén minden fenti részletet adj meg.",
        "blockednoreason": "nem adott meg okot",
-       "blockedtext-composite": "<strong>A felhasználónevedet vagy IP-címedet blokkolták.</strong>\nA blokkolás indoka:\n\n:<em>$2</em>\n\n* A blokk kezdete: $8\n* A leghoszabb blokk lejárata: $6\n\nA jelenlegi IP-címed: $3.\nKérjük, hogy érdeklődés esetén minden fenti részletet adj meg.",
+       "blockedtext-composite": "<strong>A felhasználónevedet vagy IP-címedet blokkolták.</strong>\nA blokkolás indoka:\n\n:<em>$2</em>\n\n* A blokk kezdete: $8\n* A leghoszabb blokk lejárata: $6\n\n* $5\n\nA jelenlegi IP-címed: $3.\nKérjük, hogy érdeklődés esetén minden fenti részletet adj meg.",
        "blockedtext-composite-reason": "Fiókoddal és/vagy IP-címeddel szemben több blokk is érvényben van",
        "whitelistedittext": "Lapok szerkesztéséhez $1.",
        "confirmedittext": "Lapok szerkesztése előtt meg kell erősítened az e-mail címedet. Kérjük, hogy a [[Special:Preferences|szerkesztői beállításaidban]] add meg, majd erősítsd meg az e-mail címedet.",
        "specialmute-submit": "Megerősítés",
        "specialmute-label-mute-email": "E-mailek némítása ettől a felhasználótól",
        "specialmute-error-invalid-user": "A kért felhasználónév nem található.",
-       "specialmute-error-email-blacklist-disabled": "Felhasználók e-mailküldési lehetőségének némítása nincs bekapcsolva.",
-       "specialmute-error-email-preferences": "Először meg kell erősítened az e-mail-címedet, mielőtt lenémíthatnál egy felhasználót. Ezt a [[Special:Preferences]] oldalon tudod megtenni.",
        "specialmute-email-footer": "[$1 {{BIDI:$2}} e-mail beállításainak kezelése.]",
        "specialmute-login-required": "Kérjük, jelentkezz be a némítási beállításaid módosításához.",
        "revid": "$1 változat",
index 1c23bb8..0410ad8 100644 (file)
        "specialpage-empty": "Հայցումը արդյունքներ չվերադարձրեց։",
        "lonelypages": "Որբ էջեր",
        "lonelypagestext": "Հետևյալ էջերին չկան հղումներ այս վիքիի այլ էջերից։",
-       "uncategorizedpages": "Չդասակարգված էջեր",
+       "uncategorizedpages": "Առանց կատեգորիաների էջեր",
        "uncategorizedcategories": "Չդասակարգված կատեգորիաներ",
        "uncategorizedimages": "Չդասակարգված պատկերներ",
        "uncategorizedtemplates": "Չդասակարգված կաղապարներ",
index e5d0156..f3254dd 100644 (file)
        "changeemail-none": "(ոչ մէկ)",
        "changeemail-password": "Ձեր {{SITENAME}} անցաբառը՝",
        "changeemail-submit": "Փոխել ելեկտրոնային հասցէն",
-       "bold_sample": "Շեշտուած տառերով գրութիւն",
-       "bold_tip": "Շեշտուած տառերով գրութիւն",
+       "bold_sample": "Թաւատառ գրութիւն",
+       "bold_tip": "Թաւատառ գրութիւն",
        "italic_sample": "Շեղատառ գրութիւն",
        "italic_tip": "Շեղատառ գրութիւն",
        "link_sample": "Յղման վերնագիր",
        "minoredit": "Ասիկա մանր խմբագրում է",
        "watchthis": "Հսկել այս էջը",
        "savearticle": "Էջը պահել",
-       "savechanges": "Õ\8aÕ¡Õ°ÕºÕ¡Õ¶Õ¥Õ¬ Ö\83Õ¸Ö\83Õ¸Õ­Õ¸Ö\82Õ©Õ«Ö\82Õ¶Õ¶Õ¥Ö\80Õ¨",
+       "savechanges": "Պահել փոփոխութիւնները",
        "publishpage": "Ստեղծել էջը",
        "publishchanges": "Հրապարակել փոփոխութիւնները",
        "savearticle-start": "Էջը պահել...",
-       "savechanges-start": "Õ\8aÕ¡Õ°ÕºÕ¡Õ¶Õ¥Õ¬ Ö\83Õ¸Ö\83Õ¸Õ­Õ¸Ö\82Õ©Õ«Ö\82Õ¶Õ¶Õ¥Ö\80Õ¨...",
+       "savechanges-start": "Պահել փոփոխութիւնները...",
        "publishpage-start": "Ստեղծել էջը...",
        "preview": "Կանխաստուգել",
        "showpreview": "Կանխաստուգել",
        "showdiff": "Ցուցնել փոփոխութիւնները",
-       "anoneditwarning": "<strong>Ô¶Õ£Õ¸Ö\82Õ·Õ¡Ö\81Õ¸Ö\82Õ´Ö\89</strong> Õ\84Õ¸Ö\82Õ¿Ö\84 Õ£Õ¸Ö\80Õ®Õ¡Õ® Õ¹Õ§Ö\84 Õ°Õ¡Õ´Õ¡Õ¯Õ¡Ö\80Õ£Ö\89 Õ\88Ö\80Õ¥Ö\82Õ§ Õ­Õ´Õ¢Õ¡Õ£Ö\80Õ¸Ö\82Õ´Õ« ÕºÕ¡Ö\80Õ¡Õ£Õ¡ÕµÕ«Õ¶ Õ±Õ¥Ö\80 IP Õ°Õ¡Õ½Ö\81Õ§Õ¶ Õ¿Õ¥Õ½Õ¡Õ¶Õ¥Õ¬Õ« Õ¯Õ¨ Õ¤Õ¡Õ¼Õ¶Õ¡Õµ Õ¢Õ¸Õ¬Õ¸Ö\80Õ«Õ¶Ö\89 ÔµÕ©Õ§ <strong>[$1 Õ´Õ¸Ö\82Õ¿Ö\84 Õ£Õ¸Ö\80Õ®Õ§Ö\84]</strong> Õ¯Õ¡Õ´ <strong>[$2 Õ½Õ¿Õ¥Õ²Õ®Õ§Ö\84 Õ´Õ¡Õ½Õ¶Õ¡Õ¯Õ«Ö\81Õ« Õ°Õ¡Õ·Õ«Ö\82]</strong>, Õ±Õ¥Ö\80 Õ¯Õ¡Õ¿Õ¡Ö\80Õ¡Õ® Õ­Õ´Õ¢Õ¡Õ£Ö\80Õ¸Ö\82Õ´Õ¶Õ¥Ö\80Õ¨ Õ¯Õ¨ Õ¯Õ¡ÕºÕ¸Ö\82Õ«Õ¶ Õ±Õ¥Ö\80 Õ´Õ¡Õ½Õ¶Õ¡Õ¯Õ«Ö\81Õ« Õ¡Õ¶Õ¸Ö\82Õ¶Õ«Õ¶ Õ°Õ¥Õ¿, ինչպէս նաեւ կ՚ունենաք այլ առաւելութիւններ։",
+       "anoneditwarning": "<strong>Ô¶Õ£Õ¸Ö\82Õ·Õ¡Ö\81Õ¸Ö\82Õ´Ö\89</strong> Õ\80Õ¡Õ´Õ¡Õ¯Õ¡Ö\80Õ£ Õ´Õ¸Ö\82Õ¿Ö\84 Õ¹Õ§Ö\84 Õ£Õ¸Ö\80Õ®Õ¡Õ®Ö\89 Õ\88Ö\80Õ¥Ö\82Õ§ Õ­Õ´Õ¢Õ¡Õ£Ö\80Õ´Õ¡Õ¶ ÕºÕ¡Ö\80Õ¡Õ£Õ¡ÕµÕ«Õ¶ Õ\81Õ¥Ö\80 IP Õ°Õ¡Õ½Ö\81Õ§Õ¶ Õ¿Õ¥Õ½Õ¡Õ¶Õ¥Õ¬Õ« Õ¯Õ¨ Õ¤Õ¡Õ¼Õ¶Õ¡Õµ Õ¢Õ¸Õ¬Õ¸Ö\80Õ«Õ¶Ö\89 ÔµÕ©Õ§ <strong>[$1 Õ´Õ¸Ö\82Õ¿Ö\84 Õ£Õ¸Ö\80Õ®Õ§Ö\84]</strong> Õ¯Õ¡Õ´ <strong>[$2 Õ´Õ¡Õ½Õ¶Õ¡Õ¯Õ«Ö\81Õ« Õ°Õ¡Õ·Õ«Ö\82 Õ½Õ¿Õ¥Õ²Õ®Õ§Ö\84]</strong>, Õ\81Õ¥Ö\80 Õ¯Õ¡Õ¿Õ¡Ö\80Õ¡Õ® Õ­Õ´Õ¢Õ¡Õ£Ö\80Õ¸Ö\82Õ´Õ¶Õ¥Ö\80Õ¨ Õ¯Õ¨ Õ¯Õ¡ÕºÕ¸Ö\82Õ«Õ¶ Õ±Õ¥Ö\80 Õ´Õ¡Õ½Õ¶Õ¡Õ¯Õ«Ö\81Õ« Õ¡Õ¶Õ¸Ö\82Õ¶Õ«Õ¶, ինչպէս նաեւ կ՚ունենաք այլ առաւելութիւններ։",
        "blockedtitle": "Մասնակիցը արգելափակուած է",
        "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Չէք կրնար օգտագործել \"{{int:emailuser}}\" հնարաւորութիւնը բացի եթէ նշած էք իմակի վաւերական հասցէ մը ձեր [[Special:Preferences|account preferences]] եւ արգելակուած չէ վեր անոր օգտագործումը.\nՁեր ընթացիկ IP հասցէն է $3, եւ արգելակման ինքնութեան համարն է #$5.\nԿը շնդրենք որ այս մանրամասնութիւնները նշէք ձեր բոլոր թղթակցութիւններուն մէջ։",
        "loginreqtitle": "Կը խնդրուի մուտք գործել համակարգ",
        "rcfilters-activefilters-hide": "Թաքցնել",
        "rcfilters-activefilters-show": "Ցուցնել",
        "rcfilters-limit-title": "Ցուցադրուող արդիւնքներ",
+       "rcfilters-filtergroup-authorship": "Ներդրումներու հեղինակ",
+       "rcfilters-filter-editsbyself-label": "Կողմէդ կատարուած փոփոխութիւնները",
+       "rcfilters-filter-editsbyself-description": "Անձնական ներդրումներդ։",
+       "rcfilters-filter-editsbyother-label": "Ուրիշներու կողմէ կատարուած փոփոխութիւնները",
+       "rcfilters-filter-editsbyother-description": "Բոլոր փոփոխութիւնները բացի կատարածէդ",
+       "rcfilters-filtergroup-user-experience-level": "Մասնակիցի արձանագրութիւն եւ փորձառութիւն",
+       "rcfilters-filter-user-experience-level-registered-label": "Արձանագրուած",
+       "rcfilters-filter-user-experience-level-registered-description": "Մուտք գործած խմբագիրներ։",
+       "rcfilters-filter-user-experience-level-unregistered-label": "Չարձանագրուած",
+       "rcfilters-filter-user-experience-level-unregistered-description": "Մուտք չգործած խմբագիրներ",
+       "rcfilters-filter-user-experience-level-newcomer-label": "Նորեկներ",
+       "rcfilters-filter-user-experience-level-newcomer-description": "10-էն նուազ խմբագրումներ կամ 4 օրուան աշխուժութիւն ունեցող արձանագրուած խմբագիրներ։",
+       "rcfilters-filter-user-experience-level-learner-label": "Սորվողներ",
+       "rcfilters-filter-user-experience-level-learner-description": "Արձանագրուած խմբագիրներ, որոնց փորձառութիւնը նորեկներու եւ փորձառու խմբագիրներու միջեւ է։",
+       "rcfilters-filter-user-experience-level-experienced-label": "Փորձառու մասնակիցներ",
+       "rcfilters-filter-user-experience-level-experienced-description": "500-էն աւելի խմբագրումներ եւ 30 օրուան աշխուժութիւն ունեցող արձանագրուած խմբագիրներ։",
+       "rcfilters-filtergroup-automated": "Մեքենայական ներդրումներ",
+       "rcfilters-filter-bots-label": "Մեքենայիկ",
+       "rcfilters-filter-bots-description": "Մեքենայական գործիքներով կատարուած խմբագրումներ",
+       "rcfilters-filter-humans-label": "Մարդ (ոչ մեքենայիկ)",
+       "rcfilters-filter-humans-description": "Մարդ-խմբագիրներէ կատարուած խմբագրումներ",
+       "rcfilters-filtergroup-reviewstatus": "Կարգավիճակը վերատեսնել",
+       "rcfilters-filter-reviewstatus-unpatrolled-label": "Չհսկուած",
+       "rcfilters-filter-reviewstatus-manual-description": "Որպէս հսկուած ձեռքով նշուած խմբագրումներ։",
+       "rcfilters-filter-reviewstatus-manual-label": "Ձեռքով հսկուած",
+       "rcfilters-filter-reviewstatus-auto-description": "Փորձառու մասնակիցներու խմբագրումները, որոնք մեքենայականօրէն նշուած են իբրեւ հսկուած։",
+       "rcfilters-filter-reviewstatus-auto-label": "Ինքնահսկուած",
+       "rcfilters-filtergroup-significance": "Կարեւորութիւն",
+       "rcfilters-filter-minor-label": "Ջնջին խմբագրումներ",
        "rcnotefrom": "Ներքեւ {{PLURAL:$5|փոփոխութիւնն է|փոփոխութիւններն են}} սկսեալ <strong>$3, $4</strong> (մինչեւ <strong>$1</strong> ցոյց տրուած).",
        "rclistfrom": "Ցոյց տալ նոր փոփոխութիւնները սկսած $3 $2",
        "rcshowhideminor": "$1 չնչին խմբագրումներ",
        "sharedupload-desc-here": "Այս նիշքը առնուած է $1-էն եւ կրնայ օգտագործուիլ այլ նախագիծերու մէջ։ $1-ի մէջ անոր [$2 նիշքը նկարագրող էջի]ի նկարագրութիւնը ներկայացուած է ստորեւ։",
        "filepage-nofile": "Այս անունով նիշք մը գոյութիւն չունի։",
        "upload-disallowed-here": "Այս նիշքը կարելի չէ ջնջել ու փոխարինել։",
+       "unusedtemplates": "Չօգտագործուող կաղապարներ",
        "randompage": "Պատահական էջ",
        "statistics": "Վիճակագրութիւն",
        "statistics-header-pages": "Էջերու վիճակագրութիւն",
        "statistics-edits-average": "Իւրաքանչիւր էջի խմբագրումներուն միջին թիւը",
        "statistics-users-active": "Աշխոյժ մասնակիցներ",
        "pageswithprop-submit": "Յառաջ",
+       "doubleredirects": "Կրկնակի վերայղումներ",
        "double-redirect-fixer": "Վերայղումներու շտկիչ",
+       "brokenredirects": "Չշղթայուած յղումներ",
        "brokenredirects-edit": "խմբագրել",
        "brokenredirects-delete": "ջնջել",
-       "withoutinterwiki": "Լեզւային յղումներ չպարունակող էջեր",
+       "withoutinterwiki": "Լեզուային յղումներ չպարունակող էջեր",
        "withoutinterwiki-submit": "Ցուցնել",
+       "fewestrevisions": "Նուազ վերաքաղուած էջեր",
        "nbytes": "$1 {{PLURAL:$1|պայթ}}",
        "nmembers": "$1 {{PLURAL:$1|անդամ|անդամներ}}",
+       "uncategorizedpages": "Առանց ստորոգութիւններու էջեր",
+       "uncategorizedcategories": "Ենթաստորոգութիւն չունեցող ստորոգութիւններ",
+       "uncategorizedimages": "Առանց ստորոգութիւններու պատկերներ",
+       "uncategorizedtemplates": "Առանց ստորոգութիւններու կաղապարներ",
+       "unusedcategories": "Չօգտագործուող ստորոգութիւններ",
+       "unusedimages": "Չօգտագործուող նիշքեր",
+       "wantedcategories": "Անհրաժեշտ ստորոգութիւններ",
        "prefixindex": "Բոլոր նախածանցներով էջերը",
        "prefixindex-submit": "Ցուցնել",
+       "deadendpages": "Յղումներ չունեցող էջեր",
+       "protectedpages": "Պաշտպանուած էջեր",
        "protectedpages-page": "Էջ",
+       "protectedtitles": "Պաշտպանուած վերնագրեր",
        "listusers": "Մասնակիցներու ցանկ",
        "newpages": "Նոր էջեր",
        "newpages-submit": "Ցուցնել",
        "tooltip-ca-addsection": "Ստեղծել նոր բաժին",
        "tooltip-ca-viewsource": "Այս էջը պահպանուած է։ \nԿրնաք տեսնել անոր աղբիւրը",
        "tooltip-ca-history": "Այս էջի նախորդ խմբագրումները",
-       "tooltip-ca-protect": "Õ\8aÕ¡Õ°ÕºÕ¡Õ¶Õ¥Õ¬ Õ¡ÕµÕ½ Õ§Õ»Õ¨",
+       "tooltip-ca-protect": "Պահել այս էջը",
        "tooltip-ca-delete": "Ջնջել այս էջը",
        "tooltip-ca-move": "Տեղափոխել այս էջը",
        "tooltip-ca-watch": "Այս էջը աւելցնել հսկողութեան ցանկիդ վրան",
        "redirect-revision": "Էջի տարբերակներ",
        "redirect-file": "Նիշքի անունը",
        "specialpages": "Յատուկ էջեր",
+       "specialpages-group-maintenance": "Շարունակական տեղեկագրեր",
        "tag-filter": "[[Special:Tags|Պիտակներու]] զտիչ՝",
        "tag-list-wrapper": "[[Special:Tags|{{PLURAL:$1|Պիտակ}}]]: $2",
        "tags-active-yes": "Այո",
        "pagelang-name": "Էջ",
        "pagelang-language": "Լեզու",
        "special-characters-group-latin": "Լատիներէն",
+       "special-characters-group-latinextended": "Ընդլայնուած լատիներէն",
+       "special-characters-group-ipa": "Միջ․ Հնչիւնային Այբուբեն (IPA)",
+       "special-characters-group-symbols": "Նշաններ",
+       "special-characters-group-greek": "Յունարէն",
+       "special-characters-group-greekextended": "Ընդլայնուած յունարէն",
+       "special-characters-group-cyrillic": "Կիւրեղագիր",
        "special-characters-group-arabic": "Արաբերէն",
+       "special-characters-group-arabicextended": "Ընդլայնուած արաբերէն",
+       "special-characters-group-persian": "Պարսկերէն",
+       "special-characters-group-hebrew": "Եբրայերէն",
+       "special-characters-group-bangla": "Պենկալերէն",
+       "special-characters-group-tamil": "Թամիլերէն",
+       "special-characters-group-telugu": "Թելուկերէն",
+       "special-characters-group-sinhala": "Սինհալերէն",
+       "special-characters-group-gujarati": "Կուճարաթի",
+       "special-characters-group-devanagari": "Տեւանակարի",
+       "special-characters-group-thai": "Թայերէն",
+       "special-characters-group-lao": "Լաուերէն",
+       "special-characters-group-canadianaboriginal": "Քանատական վանկագիր",
        "randomrootpage": "Պատահական արմատ էջ"
 }
index 851afba..8e7f829 100644 (file)
        "autoblockedtext": "Tu adresse IP ha essite automaticamente blocate perque un altere usator lo usava qui esseva blocate per $1.\nLe motivo presentate es:\n\n:<em>$2</em>\n\n* Initio del blocada: $8\n* Expiration del blocada: $6\n* Blocato intendite: $7\n\nTu pote contactar $1 o un del altere [[{{MediaWiki:Grouppage-sysop}}|administratores]] pro discuter le blocada.\n\nNota que tu pote solmente utilisar le function \"{{int:emailuser}}\" si tu ha registrate un adresse de e-mail valide in tu [[Special:Preferences|preferentias de usator]] e tu non ha essite blocate de usar lo.\n\nTu adresse IP actual es $3, e le ID del blocada es #$5.\nPer favor include tote le detalios supra specificate in omne correspondentia.",
        "systemblockedtext": "Tu nomine de usator o adresse IP ha essite blocate automaticamente per MediaWiki.\nLe motivo presentate es:\n\n:<em>$2</em>\n\n* Initio del blocada: $8\n* Expiration del blocada: $6\n* Blocato intendite: $7\n\nTu adresse IP actual es $3.\nPer favor, include tote le detalios enumerate hic supra in omne questiones que tu pone.",
        "blockednoreason": "nulle motivo specificate",
-       "blockedtext-composite": "<strong>Tu nomine de usator o adresse IP ha essite blocate.</strong>\n\nLe motivo presentate es:\n\n:<em>$2</em>.\n\n* Initio del blocada: $8\n* Expiration del blocada le plus longe: $6\n\nTu adresse IP actual es $3.\nPer favor, include tote le detalios enumerate hic supra in omne questiones que tu pone.",
+       "blockedtext-composite": "<strong>Tu nomine de usator o adresse IP ha essite blocate.</strong>\n\nLe motivo presentate es:\n\n:<em>$2</em>.\n\n* Initio del blocada: $8\n* Expiration del blocada le plus longe: $6\n\n* $5\n\nTu adresse IP actual es $3.\nPer favor, include tote le detalios enumerate hic supra in omne questiones que tu pone.",
        "blockedtext-composite-reason": "Il ha plure blocadas contra tu conto e/o adresse IP",
        "whitelistedittext": "Tu debe $1 pro poter modificar paginas.",
        "confirmedittext": "Tu debe confirmar tu adresse de e-mail pro poter modificar paginas.\nPer favor entra e valida tu adresse de e-mail per medio de tu [[Special:Preferences|preferentias de usator]].",
        "specialmute-success": "Tu preferentias de silentio ha essite actualisate. Vide tote le usatores silentiate in [[Special:Preferences]].",
        "specialmute-submit": "Confirmar",
        "specialmute-label-mute-email": "Silentiar e-mail de iste usator",
-       "specialmute-header": "Selige tu preferentias de silentio pro {{BIDI:[[User:$1]]}}.",
+       "specialmute-header": "Selige tu preferentias de silentio pro <b>{{BIDI:[[User:$1]]}}</b>.",
        "specialmute-error-invalid-user": "Le nomine de usator que tu requestava non pote esser trovate.",
-       "specialmute-error-email-blacklist-disabled": "Le silentiamento de usatores pro inviar te e-mail non ha essite activate.",
-       "specialmute-error-email-preferences": "Tu debe confirmar tu adresse de e-mail ante de poter silentiar un usator. Face isto in [[Special:Preferences]].",
        "specialmute-email-footer": "Pro gerer le preferentias de e-mail pro {{BIDI:$2}}, visita <$1>.",
        "specialmute-login-required": "Es necessari aperir session pro cambiar le preferentias de silentio.",
        "revid": "version $1",
index a965592..6e94139 100644 (file)
        "pagelanguage": "Modifikar la linguo di la pagino",
        "pagelang-language": "Linguo",
        "right-pagelang": "Modifikar l'idiomo di la pagino",
+       "mediastatistics": "Statistiki pri arkivi",
+       "mediastatistics-summary": "Statistiki pri arkivi sendita. To nur montras la maxim recenta versiono de ula arkivo. Anciena od efacata versioni ne montresas.",
        "mediastatistics-nbytes": "{{PLURAL:$1|$1 bicoko*|$1 bicoki*}} ($2; $3%)",
+       "mediastatistics-bytespertype": "Grandezo dil arkivi de ca sesiono: {{PLURAL:$1|$1 bicoko*|$1 bicoki*}} ($2; $3%).",
+       "mediastatistics-allbytes": "Grandeso totala por omna arkivi: {{PLURAL:$1|$1 bicoko*|$1 bicoki*}} ($2).",
+       "mediastatistics-table-extensions": "Posibla tipo di arkivi (.webm, .png...)",
+       "mediastatistics-table-count": "Quanto di arkivi",
+       "mediastatistics-table-totalbytes": "Totala grandeso",
+       "mediastatistics-header-bitmap": "Imaji di \"bitmap\"",
+       "mediastatistics-header-total": "Omna arkivi",
        "special-characters-group-latin": "Latina",
        "special-characters-group-latinextended": "Latina extensita",
        "special-characters-group-symbols": "Simboli",
index 1dd959a..31bd626 100644 (file)
                        "Manfredi26",
                        "Albe Albe 460",
                        "Senpremì",
-                       "Ignazio Cannata"
+                       "Ignazio Cannata",
+                       "Frubino",
+                       "TheRukk"
                ]
        },
        "tog-underline": "Sottolinea i collegamenti:",
        "virus-scanfailed": "scansione fallita (codice $1)",
        "virus-unknownscanner": "antivirus sconosciuto:",
        "logouttext": "'''Logout effettuato.'''\n\nNota che alcune pagine potrebbero continuare ad apparire come se il logout non fosse avvenuto finché non viene pulita la cache del proprio browser.",
+       "logging-out-notify": "La tua sessione sta terminando, attendi.",
+       "logout-failed": "Impossibile uscire ora: $1",
        "cannotlogoutnow-title": "Impossibile uscire ora",
        "cannotlogoutnow-text": "La disconnessione non è possibile quando si sta usando $1.",
        "welcomeuser": "Benvenuto, $1!",
        "subject-preview": "Anteprima dell'oggetto:",
        "previewerrortext": "Si è verificato un errore durante il tentativo di mostrare l'anteprima delle tue modifiche.",
        "blockedtitle": "Utente bloccato.",
+       "blocked-email-user": "<strong>Alla tua utenza è stato vietato l'invio di email. Puoi ancora modificare altre pagine di questa wiki.</strong> Puoi vedere tutti i dettagli del blocco su [[Special:MyContributions|contributi dell'utenza]].\n\nIl blocco è stato effettuato da $1.\n\nLa ragione data è <em>$2</em>.\n\n* Inizio del blocco: $8\n* Scadenza del blocco: $6\n* Destinatario del blocco: $7\n* ID Blocco #$5",
+       "blockedtext-partial": "<strong>Alla tua utenza o indirizzo IP è stato vietato di apportare modifiche a questa pagina. Puoi ancora modificare altre pagine di questa wiki.</strong> Puoi vedere tutti i dettagli del blocco su [[Special:MyContributions|contributi dell'utenza]].\n\nIl blocco è stato effettuato da $1.\n\nLa ragione data è <em>$2</em>.\n\n* Inizio del blocco: $8\n* Scadenza del blocco: $6\n* Destinatario del blocco: $7\n* ID Blocco #$5",
        "blockedtext": "<strong>Il tuo nome utente o indirizzo IP è stato bloccato.</strong>\n\nIl blocco è stato imposto da $1. La motivazione del blocco è la seguente: <em>$2</em>.\n\n* Inizio del blocco: $8\n* Scadenza del blocco: $6\n* Intervallo di blocco: $7\n\nSe lo si desidera, è possibile contattare $1 o un altro [[{{MediaWiki:Grouppage-sysop}}|amministratore]] per discutere del blocco.\n\nSi noti che la funzione \"{{int:emailuser}}\" non è attiva se non è stato registrato un indirizzo email valido nelle proprie [[Special:Preferences|preferenze]] o se l'utilizzo di tale funzione è stato bloccato.\n\nL'indirizzo IP attuale è $3, il numero ID del blocco è #$5.\nSi prega di specificare tutti i dettagli precedenti in qualsiasi richiesta di chiarimenti.",
        "autoblockedtext": "Questo indirizzo IP è stato bloccato automaticamente perché condiviso con un altro utente, a sua volta bloccato da $1.\nLa motivazione del blocco è la seguente:\n\n:<em>$2</em>\n\n* Inizio del blocco: $8\n* Scadenza del blocco: $6\n* Intervallo di blocco: $7\n\nÈ possibile contattare $1 o un altro [[{{MediaWiki:Grouppage-sysop}}|amministratore]] per richiedere eventuali chiarimenti circa il blocco.\n\nSi noti che la funzione \"{{int:emailuser}}\" non è attiva se non è stato registrato un indirizzo e-mail valido nelle proprie [[Special:Preferences|preferenze]] e, comunque, se nell'applicare il blocco, tale funzione è stata disabilitata (per la durata del blocco).\n\nL'indirizzo IP attuale è $3, il numero ID del blocco è #$5\nSi prega di specificare tutti i dettagli qui inclusi nel compilare qualsiasi richiesta di chiarimenti.",
        "systemblockedtext": "Il tuo nome utente o l'indirizzo IP è stato bloccato automaticamente da MediaWiki.\nLa motivazione del blocco è la seguente:\n\n:''$2''\n\n* Inizio del blocco: $8\n* Scadenza del blocco: $6\n* Intervallo di blocco: $7\n\nL'indirizzo IP attuale è $3.\nSi prega di specificare tutti i dettagli qui inclusi nel compilare qualsiasi richiesta di chiarimenti.",
        "blockednoreason": "nessuna motivazione indicata",
+       "blockedtext-composite": "<strong>Il tuo nome utente o indirizzo IP sono stati bloccati.</strong>\n\nLa motivazione del blocco è la seguente:\n\n:<em>$2</em>.\n\n* Inizio del blocco: $8\n* Scadenza del blocco più lungo: $6\n\n* $5\n\nL'indirizzo IP attuale è $3.\nSi prega di specificare tutti i dettagli qui inclusi nel compilare qualsiasi richiesta di chiarimenti.",
+       "blockedtext-composite-ids": "ID del blocco rilevante: $1 (anche il tuo indirizzo IP potrebbe essere nella lista nera)",
+       "blockedtext-composite-no-ids": "Il tuo indirizzo IP è contenuto in varie liste nere.",
+       "blockedtext-composite-reason": "Sono attivi più blocchi sulla tua utenza e/o indirizzo IP",
        "whitelistedittext": "Per modificare le pagine è necessario $1.",
        "confirmedittext": "Per essere abilitati alla modifica delle pagine è necessario confermare il proprio indirizzo e-mail. Per impostare e confermare l'indirizzo servirsi delle [[Special:Preferences|preferenze]].",
        "nosuchsectiontitle": "Impossibile trovare la sezione",
        "edit-gone-missing": "Impossibile aggiornare la pagina.\nSembra che sia stata cancellata.",
        "edit-conflict": "Conflitto di edizione.",
        "edit-no-change": "La modifica è stata ignorata poiché non sono stati apportati cambiamenti al testo.",
+       "edit-slots-cannot-add": "{{PLURAL:$1|Il seguente slot non è supportato|I seguenti slot non sono supportati}} qui: $2",
        "postedit-confirmation-created": "La pagina è stata creata.",
        "postedit-confirmation-restored": "La pagina è stata ripristinata.",
        "postedit-confirmation-saved": "La modifica è stata salvata.",
        "expansion-depth-exceeded-warning": "Questa pagina ha superato la profondità di espansione",
        "parser-unstrip-loop-warning": "Rilevato ciclo di Unstrip",
        "unstrip-depth-warning": "Superati i limiti di ricorsione di Unstrip ($1)",
+       "unstrip-depth-category": "Pagine nelle quali il limite di ricorsione di Unstrip viene superato",
+       "unstrip-size-warning": "Superati i limiti di grandezza di Unstrip ($1)",
+       "unstrip-size-category": "Pagine nelle quali il limite di grandezza di Unstrip viene superato",
        "converter-manual-rule-error": "Rilevato errore nella regola manuale di conversione della lingua",
        "undo-success": "Questa modifica può essere annullata.\nControlla le differenze mostrate sotto fra le due versioni per essere certo che il contenuto corrisponda a quanto desiderato, e quindi salvare le modifiche per completare la procedura di annullamento.",
        "undo-failure": "Impossibile annullare la modifica a causa di un conflitto con modifiche intermedie.",
        "action-changetags": "aggiungere o rimuovere specifiche etichette su singole versioni o voci di registro",
        "action-deletechangetags": "cancellare le etichette dal database",
        "action-purge": "aggiornare questa pagina",
+       "action-editinterface": "modificare l'interfaccia utente",
+       "action-editusercss": "modificare i file CSS di altri utenti",
+       "action-edituserjson": "modificare i file JSON di altri utenti",
+       "action-edituserjs": "modificare i file JavaScript di altri utenti",
+       "action-editsitecss": "modificare il CSS globale del sito",
+       "action-editsitejson": "modificare il JSON globale del sito",
+       "action-editsitejs": "modificare il Javascript globale del sito",
+       "action-editmyusercss": "modificare i propri file CSS",
+       "action-editmyuserjson": "modificare i propri file JSON",
+       "action-editmyuserjs": "modificare i propri file JavaScript",
        "nchanges": "$1 {{PLURAL:$1|modifica|modifiche}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|dall'ultima visita}}",
        "enhancedrc-history": "cronologia",
        "limitreport-templateargumentsize-value": "$1/$2 {{PLURAL:$2|byte}}",
        "limitreport-expansiondepth": "Massima profondità di espansione",
        "limitreport-expensivefunctioncount": "Numero funzioni parser dispendiose",
+       "limitreport-unstrip-depth": "Profondità di ricorsione di Unstrip",
+       "limitreport-unstrip-size": "Dimensione post-espansione di Unstrip",
        "limitreport-unstrip-size-value": "$1/$2 {{PLURAL:$2|byte}}",
        "expandtemplates": "Espandi i template",
        "expand_templates_intro": "Questa pagina speciale elabora un wikitesto espandendo tutti i template presenti.\nCalcola inoltre il risultato delle funzioni supportate dal parser come\n<code><nowiki>{{</nowiki>#language:…}}</code> e delle variabili di sistema quali\n<code><nowiki>{{</nowiki>CURRENTDAY}}</code>,\nvale a dire praticamente tutto ciò che si trova tra doppie parentesi graffe.",
index 7764a21..58383e9 100644 (file)
        "protectedinterface": "このページにはこのウィキのソフトウェアのインターフェイスに使用されるテキストが保存されており、いたずらなどの防止のために保護されています。\nすべてのウィキに対して翻訳を追加/変更する場合は、MediaWiki の地域化プロジェクト [https://translatewiki.net/wiki/Main_Page?setlang=ja translatewiki.net] を使用してください。",
        "editinginterface": "<strong>警告:</strong> ソフトウェアのインターフェイスに使用されるテキストのページを編集しています。\nこのページを変更すると、このウィキの他の利用者のユーザーインターフェイスの外観に影響します。",
        "translateinterface": "すべてのウィキに対して翻訳を追加/変更する場合は、MediaWiki の地域化プロジェクト [https://translatewiki.net/wiki/Main_Page?setlang=ja translatewiki.net] を使用してください。",
-       "cascadeprotected": "このページは、「カスケード保護」が指定された状態で保護されている以下の{{PLURAL:$1|ページ|ページ群}}でトランスクルードのため読み込まれているので、編集できないように保護されています:\n$2",
+       "cascadeprotected": "このページは、「カスケード保護」が指定された状態で保護されている以下の{{PLURAL:$1|ページ|ページ群}}で参照読み込みされているため、編集できないように保護されています:\n$2",
        "namespaceprotected": "<strong>$1</strong>名前空間にあるページを編集する権限がありません。",
        "customcssprotected": "この CSS ページは他の利用者の個人設定を含んでいるため、あなたには編集する権限がありません。",
        "customjsonprotected": "この JSON ページは他の利用者の個人設定を含んでいるため、あなたには編集する権限がありません。",
        "autoblockedtext": "このIPアドレスは、$1によりブロックされた利用者によって使用されたため、自動的にブロックされています。\n理由は次の通りです。\n\n:<em>$2</em>\n\n* ブロック開始日時: $8\n* ブロック解除予定: $6\n* ブロック対象: $7\n\n$1または他の[[{{MediaWiki:Grouppage-sysop}}|管理者]]にこのブロックについて問い合わせることができます。\n\nただし、[[Special:Preferences|個人設定]]に正しいメールアドレスが登録されていない場合、またはメール送信がブロックされている場合、「{{int:emailuser}}」機能を使用できないことに注意してください。\n\n現在ご使用中のIPアドレスは$3 、このブロックIDは#$5です。\nお問い合わせの際は、上記の情報を必ず書いてください。",
        "systemblockedtext": "あなたの利用者名またはIPアドレスはMediaWikiによって自動的にブロックされています。\n理由は次の通りです。\n\n:<em>$2</em>\n\n* ブロック開始日時: $8\n* ブロック解除予定: $6\n* ブロック対象: $7\n\nあなたの現在のIPアドレスは $3 です。\nお問い合わせの際は、上記の詳細情報をすべて含めてください。",
        "blockednoreason": "理由が設定されていません",
-       "blockedtext-composite": "<strong>あなたのアカウントまたはIPアドレスはブロックされています</strong>\n\n理由:\n\n:<em>$2</em>.\n\n* ブロック開始日: $8\n* ブロックの有効期限: $6\n\nあなたの現在のIPアドレスは$3です。\n上記の詳細は,ご質問にお答えください。",
+       "blockedtext-composite": "<strong>あなたのアカウントまたはIPアドレスはブロックされています</strong>\n\n理由:\n\n:<em>$2</em>.\n\n* ブロック開始日: $8\n* ブロックの有効期限: $6\n\n* $5\n\nあなたの現在のIPアドレスは$3です。\n上記の詳細は,ご質問にお答えください。",
        "blockedtext-composite-reason": "アカウントまたはIPアドレスに対して複数のブロックが存在します",
        "whitelistedittext": "このページを編集するには$1してください。",
        "confirmedittext": "ページの編集を始める前にメールアドレスの確認をする必要があります。\n[[Special:Preferences|個人設定]]でメールアドレスを設定し、確認を行ってください。",
        "search-interwiki-more-results": "結果をさらに取得",
        "search-relatedarticle": "関連",
        "searchrelated": "関連",
-       "searchall": "て",
+       "searchall": "すべて",
        "showingresults": "<strong>$2</strong> 件目以降の最大 {{PLURAL:$1|<strong>$1</strong> 件の結果}}を表示しています。",
        "showingresultsinrange": "<strong>$2</strong> 件目から<strong>$3</strong> 件目までの範囲内で最大 {{PLURAL:$1|<strong>$1</strong> 件の結果}}を表示しています。",
        "search-showingresults": "{{PLURAL:$4|<strong>$3</strong> 件中の <strong>$1</strong> 件目|<strong>$3</strong> 件中の <strong>$1</strong> 件目から <strong>$2</strong> 件目}}",
        "powersearch-ns": "名前空間を指定して検索:",
        "powersearch-togglelabel": "チェックを入れる:",
        "powersearch-toggleall": "すべて",
-       "powersearch-togglenone": "て外す",
+       "powersearch-togglenone": "すべて外す",
        "powersearch-remember": "この選択を今後の検索のために記憶させる",
        "search-external": "外部検索",
        "searchdisabled": "{{SITENAME}}の検索機能は無効化されています。\nさしあたってはGoogleなどで検索できます。\nただし外部の検索エンジンの索引にある{{SITENAME}}のコンテンツは古い場合があります。",
        "specialmute-success": "ミュートの個人設定が更新されました。[[Special:Preferences|ご自分の個人設定ページ]]でミューとした利用者の一覧を確認できます。",
        "specialmute-submit": "確定",
        "specialmute-label-mute-email": "この利用者からのウィキメールをミュートする",
-       "specialmute-header": "{{BIDI:[[User:$1]]}}さんに対するミュートを個人設定で選択してください。",
+       "specialmute-header": "<b>{{BIDI:[[User:$1|$1]]}}</b>さんに対するミュートを個人設定で選択してください。",
        "specialmute-error-invalid-user": "あなたが要求した利用者名は見つかりませんでした。",
-       "specialmute-error-email-blacklist-disabled": "利用者からメールを受け取らないようにするミュートは設定されていません。",
-       "specialmute-error-email-preferences": "発信者をミューとする準備として、ご自分のeメールアドレスの認証が必要です。手続きは[[Special:Preferences|個人設定]]のページで行います。",
-       "specialmute-email-footer": "{{BIDI:$2}}のeメール発信者の個人設定を変更するには<$1>を開いてください。",
+       "specialmute-email-footer": "{{BIDI:$2}}のメール発信者の個人設定を変更するには<$1>を開いてください。",
        "specialmute-login-required": "ミュートの個人設定を変更するにはログインしてください。",
        "revid": "版 $1",
        "pageid": "ページID $1",
index f5ca1fe..1d1fab9 100644 (file)
        "category-subcat-count": "{{PLURAL:$2|ចំណាត់ថ្នាក់ក្រុមនេះមានតែកូនចំណាត់ថ្នាក់ក្រុមមួយដូចខាងក្រោមទេ។|ចំណាត់ថ្នាក់ក្រុមនេះមាន{{PLURAL:$1|កូនចំណាត់ថ្នាក់ក្រុមមួយ|កូនចំណាត់ថ្នាក់ក្រុមចំនួន$1}}ដូចខាងក្រោម ក្នុងចំណោមកូនចំណាត់ថ្នាក់ក្រុមសរុបចំនួន$2។}}",
        "category-subcat-count-limited": "ចំណាត់ថ្នាក់ក្រុមនេះមាន {{PLURAL:$1|កូនចំណាត់ថ្នាក់ក្រុមមួយ|កូនចំណាត់ថ្នាក់ក្រុមចំនួន$1}}ដូចខាងក្រោម។",
        "category-article-count": "{{PLURAL:$2|ចំណាត់ថ្នាក់ក្រុមនេះមានទំព័រមួយដូចខាងក្រោម។|{{PLURAL:$1|ទំព័រមួយ|ទំព័រចំនួន$1}}ក្នុងចំណោមទំព័រសរុប $2 ដូចខាងក្រោមស្ថិតក្នុងចំណាត់ថ្នាក់ក្រុមនេះ។}}",
-       "category-article-count-limited": "{{PLURAL:$1|ទំព័រ|ទំព័រចំនួន$1}}ខាងក្រោមស្ថិតនៅក្នុងចំណាត់ថ្នាក់ក្រុមនេះ។",
+       "category-article-count-limited": "{{PLURAL:$1|ទំព័រ|ទំព័រចំនួន$1}}ខាងក្រោម ស្ថិតនៅក្នុងចំណាត់ថ្នាក់ក្រុមនេះ។",
        "category-file-count": "{{PLURAL:$2|ចំណាត់ថ្នាក់ក្រុមនេះមានឯកសារមួយដូចខាងក្រោម។|{{PLURAL:$1|ឯកសារមួយ|ឯកសារចំនួន$1}}ក្នុងចំណោមឯកសារសរុប $2 ដូចខាងក្រោមស្ថិតនៅក្នុងចំណាត់ថ្នាក់ក្រុមនេះ។}}",
        "category-file-count-limited": "{{PLURAL:$1|ឯកសារមួយ|ឯកសារចំនួន$1}}ដូចខាងក្រោមស្ថិតនៅក្នុងចំណាត់ថ្នាក់ក្រុមនេះ។",
        "listingcontinuesabbrev": "បន្ត",
index 3a4ba28..5d7d405 100644 (file)
        "autoblockedtext": "당신의 IP 주소는 $1님이 차단한 사용자가 사용했던 IP이기 때문에 자동으로 차단되었습니다.\n차단된 이유는 다음과 같습니다:\n\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이고, 차단 ID는 #$5입니다.\n문의할 때에 이 정보를 같이 알려주세요.",
        "systemblockedtext": "당신의 사용자 이름 또는 IP 주소가 자동으로 미디어위키에 의해 차단되었습니다.\n이유는 다음과 같습니다:\n\n:<em>$2</em>\n\n* 차단 시작: $8\n* 차단 만료: $6\n* 차단 대상: $7\n\n당신의 현재 IP 주소는 $3입니다.\n문의에 대해 상기의 상세 설명을 모두 포함해 주십시오.",
        "blockednoreason": "이유를 입력하지 않음",
-       "blockedtext-composite": "<strong>당신의 사용자 이름 또는 IP 주소가 미디어위키에 의해 차단되었습니다.\n\n이유는 다음과 같습니다:\n\n:<em>$2</em>\n\n* 차단 시작: $8\n* 차단 만료: $6\n\n당신의 현재 IP 주소는 $3입니다.\n문의에 대해 상기의 상세 설명을 모두 포함해 주십시오.",
+       "blockedtext-composite": "<strong>당신의 사용자 이름 또는 IP 주소가 미디어위키에 의해 차단되었습니다.\n\n이유는 다음과 같습니다:\n\n:<em>$2</em>\n\n* 차단 시작: $8\n* 차단 만료: $6\n\n* $5\n\n당신의 현재 IP 주소는 $3입니다.\n문의에 대해 상기의 상세 설명을 모두 포함해 주십시오.",
        "whitelistedittext": "문서를 편집하기 전에 $1해야 합니다.",
        "confirmedittext": "문서를 고치려면 이메일 인증 절차가 필요합니다.\n[[Special:Preferences|사용자 환경 설정]]에서 이메일 주소를 입력하고 이메일 주소 인증을 해주시기 바랍니다.",
        "nosuchsectiontitle": "문단을 찾을 수 없음",
        "specialmute-success": "알림 미표시 환경 설정이 업데이트되었습니다. [[Special:Preferences|환경 설정]]에서 알림이 표시되지 않는 모든 사용자를 확인하십시오.",
        "specialmute-submit": "확인",
        "specialmute-label-mute-email": "이 사용자의 이메일 알림을 표시하지 않습니다",
-       "specialmute-header": "{{BIDI:[[User:$1]]}}의 알림 미표시 환경 설정을 선택해 주십시오.",
+       "specialmute-header": "<b>{{BIDI:[[User:$1]]}}</b>의 알림 미표시 환경 설정을 선택해 주십시오.",
        "specialmute-error-invalid-user": "요청한 사용자 이름을 찾을 수 없습니다.",
-       "specialmute-error-email-blacklist-disabled": "이메일 보내기로부터 사용자 알림 미표시가 활성화되어 있지 않습니다.",
-       "specialmute-error-email-preferences": "사용자의 알림을 미표시 처리하기 전에 이메일 주소를 확인해야 합니다. [[Special:Preferences]]에서 이 작업을 할 수 있습니다.",
        "specialmute-email-footer": "{{BIDI:$2}}의 이메일 환경 설정을 관리하려면 <$1>을(를) 방문해 주십시오.",
        "specialmute-login-required": "알림 미표시 환경 설정을 변경하려면 로그인해 주십시오.",
        "revid": "$1 판",
index c8c8e15..4c0e672 100644 (file)
        "directorynotreadableerror": "تیرنشونگٱ \"$1\" ڤٱننی نؽ.",
        "filenotfound": "نمؽ تونؽت جانؽا $1 ناْ بٱجۊرؽت.",
        "unexpected": "ٱرزایش نهاستٱ: \"$1\"=\"$2\".",
-       "formerror": "خٱتا:نمۊئٱ نوم بٱلگٱ ناْ ڤمو بۉیؽت.",
+       "formerror": "خٱتا:نمۊئٱ نوم بٱلگٱ ناْ ڤمو بۉئؽت.",
        "badarticleerror": "اؽ کنشکاری د اؽ بٱلگٱ ٱنجوم نمۊئٱ.",
        "cannotdelete": "نمۊئٱ بٱلگٱیا جانؽا $1 پاکسا با.\nگاسؽ د ایسنی کٱسؽ تر ڤٱ ناْ پاکسا کردٱ.",
        "cannotdelete-title": "نمۊئٱ بٱلگٱ $1 پاکسا با",
        "delete-hook-aborted": "پاکسا کاری ڤا قولاڤ نوئاگیری بیٱ.\nهیچ تۉزیهی سیش نؽ.",
        "no-null-revision": "سی بٱلگٱ $1 ڤانیٱری خونسا ناْ دۏرس بٱکؽت",
-       "badtitle": "داسون گٱن",
+       "badtitle": "داسوݩ گٱن",
        "badtitletext": "داسون بٱلگٱ هاستنی نادؽارٱ، یٱ یاٛ داسوݩ مؽنجا زڤونی یا مؽنجا ڤیکی اْشتبائٱ.\nگاسؽ یٱ د ڤٱر گرتٱ یاٛ کاراکتر یا چٱن تا کاراکتر با کاْ نمۊئٱ د داسونؽا ڤ کارشو گرت.",
        "title-invalid-empty": "داسون بٱلگٱ هاستنی هالٛیٱ یا فقٱت مؽنونٱ دار یاٛ نوم یا نوم جا ئٱ.",
        "title-invalid-utf8": "داسون بٱلگٱ هاستنی مؽنونٱ دار یاٛ نماجا UTF-8 نادؽارٱ.",
        "passwordremindertitle": "رازینٱ گوئارسن موڤٱقٱتی تازٱ سی {{SITENAME}}",
        "passwordremindertext": "یئ نأفأر (گاسی خوتوٙ،د تیرنئشوٙن آی پی $1) یئ گئل رازینە گوڤاردئن هأنی سی {{SITENAME}}($4) حاستە.یئ گئل رازینە گوڤاردئن موڤأقأتی سی کاریاری\"$2\" رأڤأندیاری بیە و د \"$3\" جاگئر بییە. أر یە نە حاستیتە،شما بایأد ئیسئ روٙییت ڤامین و یئ گئل رازینە گوڤاردئن هأنی نە ئنتئخاڤ بأکیت.\nرازینە گوڤاردئن موڤأقأتی د {{PLURAL:$5|یئ روٙ|$5 روٙزیا}}  تأموٙم بوٙە.\n\nأر یئ نأفأر هأنی ئی حاست نە داشتوٙە، یا أر رازینە گوڤاردئن توٙنە د ڤیرتوٙ ئوٙما، و أر حاستیت ڤئنە آلئشت کاری بأکیت، گاسی شوما د ئی پئیغوم تیە پوٙشی بأکیت و بئحایت ڤئ کار گئرئتئن رازینە گوڤاردئن دئماتریتوٙ نە دئماداری بأکیت.",
        "noemail": "هیژ تیرنشوݩ ٱنجوماناماٛیی سی کاریار $1 زٱفت ناٛییٱ.",
-       "noemailcreate": "شما بایٱد یاٛ تیرنشوݩ ٱنجومانامٱ جادیار سی خوتو داشتۊیؽت.",
-       "passwordsent": "یاٛ رازینٱ گوئارسن هنی کلٛ بیٱ سی تیرنشوݩ ٱنجوماناماٛیی کاْ \"$1\" ڤاش سٱبت نوم کردٱ.\nخاهش مؽکم هنی رۉیؽت ڤامؽن ۉ اۊساْ باٛیرتش.",
+       "noemailcreate": "شما بایٱد یاٛ تیرنشوݩ ٱنجومانامٱ جادیار سی خوتو داشتۊئؽت.",
+       "passwordsent": "یاٛ رازینٱ گوئارسن هنی کلٛ بیٱ سی تیرنشوݩ ٱنجوماناماٛیی کاْ \"$1\" ڤاش سٱبت نوم کردٱ.\nخاهش مؽکم هنی رۉئؽت ڤامؽن ۉ اۊساْ باٛیرؽتش.",
        "blocked-mailpassword": "نئها آی پی شوما سی ڤیرایئشت کاری گئرئتە بییە، هأنی صئلا یە نە نارە کئ د رازینە گوڤاردئن د نۊ کئل بییە سی نئهاگئری د گأن کاری نارە.",
        "eauthentsent": "یاٛ ٱنجومانامٱ پوشت دۏرس کردنی د یاٛ تیرنشوݩ ڤیژٱ کلٛ بیٱ.\nدما یٱ کاْ یاٛ ٱنجومانامٱ هنی د هساو کلٛ بۊئٱ، شما بایٱد دما رٱدؽارکونی ناْ د ٱنجومانامٱ باٛیرؽت، سی یٱ کاْ هساو شما راسٱکی پوشت دۏرش بۊئٱ.",
        "throttled-mailpassword": "یاٛ رازینٱ گوئارسن د نۊ زنٱ بیٱ ۉ ایساْ کلٛ بیٱ، د آخری {{PLURAL:$1|ساعٱت|$1 ساعٱتؽا}}.\nسی نهاگیری د ٱزیٱت بیئن، فقٱت یاٛ رازینٱ گوئارسن د ٱنجومانامٱ د نۊ زنٱ بیٱ د هٱر {{PLURAL:$1|ساعٱت|$1 ساعٱتؽا}} کلٛ بیٱ.",
        "cantcreateaccount-range-text": "حساو دروس بیه وا تیرنشون آی پی که د پوشینه <strong>$1</strong> ، که وه ئم مینونه دار تیرنشون آی پی شما ئم هئ(<strong>$4</strong>)، وه دس [[کاریار:$3|$3]]قلف بیه.\n\nدلیل دئه بیه وا $3، \"$2\" ئه.",
        "viewpagelogs": "ساٛلٛ پهرستنومٱیا اؽ بٱلگٱ بٱکؽت",
        "nohistory": "هیژ ڤیرگار ڤیرایشتی د اؽ بٱلگٱ نؽ.",
-       "currentrev": "آخرÛ\8c Ø¯Ù\88ئارٱ Ø¯Û\8cئÙ\86",
+       "currentrev": "آخری دوئرٱ دیئن",
        "currentrev-asof": "آخری ڤانری چی $1",
        "revisionasof": "دوئرٱ دیئن $1",
        "revision-info": "دوئارٱ ساٛلٛ بیٱ چی $1 ڤا $2",
        "logdelete-text": "ڤانریا پاکسا بیٱ هنی د بٱلگٱ ڤیرگار دؽاری مؽکٱن، ڤلی کوتؽا مینونٱیاشو د مؽن خٱلک دؽار نؽسن.",
        "revdelete-text-others": "دیڤوندارؽا هنی مؽ تونٱن ڤ مینونٱیا قام بیٱ دٱسرسی داشتۊئٱن ۉ ڤٱناْ د نۊ زنٱ بٱکٱن، مگٱر مٱئدۊدؽیٱتؽا اْزافی میزوکاری بان.",
        "revdelete-confirm": "لوتف بٱکؽت پشت راسی بٱکؽت کاْ مؽهایت اؽ کار ناْ ٱنجوم باٛیؽت، ۉ یاٛ دل بۊیؽت کاْ شما نٱتیجٱیا اؽ کار ناْ فٱمسؽتٱ ۉ اؽ کار ناْ موتابق ڤا  [[{{MediaWiki:Policy-url}}|the policy]].ٱنجوم ماٛیؽت.",
-       "revdelete-suppress-text": "پاکساگری فقط با <strong>تئنا</strong> سی جایایی که هان د هار وه کار گرته بوئه:\n*دونسمنیایی که فره تنادارن\n*دونسمنیا نامناسو شخصی\n*: <em>تیرنشون حونه، شماره تیلیفون،رازینه زایاره ای و چیا تر</em>",
-       "revdelete-legend": "میزونکاری محدودیتیا دیار بیین.",
-       "revdelete-hide-text": "متن دوواره دیئن",
-       "revdelete-hide-image": "چی یا مین جانیا نه قام کو",
-       "revdelete-hide-name": "آرمون و انجوم گر نه قام بکید",
-       "revdelete-hide-comment": "Ú\86کسÙ\87 Ù\86Ù\87 Ù\88Û\8cراÛ\8cشت Ø¨Ú©Û\8cد",
-       "revdelete-hide-user": "نوم کاریاری ویرایشتگر/تیرنشون آی پی",
-       "revdelete-hide-restricted": "پاکساگری کردن رسینه یا سی دیوونداریا و کسونا تر",
-       "revdelete-radio-same": "آلشت نکید",
-       "revdelete-radio-set": "قام بیه",
-       "revdelete-radio-unset": "دیینی",
-       "revdelete-suppress": "پاکساگری کردن رسینه یا سی دیوونداریا و کسونا تر",
-       "revdelete-unsuppress": "محدودیتیانه د وانیریا امباربیه جا وه جا بکید",
-       "revdelete-log": "دألیل:",
-       "revdelete-submit": "سی {{PLURAL:$1|وانیری|وانیریا}} انتخاو بیه وه کار بوریتو",
+       "revdelete-suppress-text": "پاکساگری فقٱت با <strong>تٱنڳؽا</strong> سی جایایؽ کاْ هان د هار ڤ کار گرتٱ مۊئٱ:\n*دونسمٱنیایؽ کاْ فرٱ تنادارٱن\n*دونسمٱنیا ناموناسب شٱخسی\n*: <em>تیرنشوݩ هونٱ، شمارٱ تلٛفوݩ، رازیٱ زایاراٛیی ۉ چیا تر</em>",
+       "revdelete-legend": "میزونکاری مٱئدۊدؽٱتؽا دؽار بیئن.",
+       "revdelete-hide-text": "متن دوئارٱ دیئن",
+       "revdelete-hide-image": "چی یا مؽن جانؽا ناْ قایم کو",
+       "revdelete-hide-name": "آرموݩ ۉ ٱنجومگر ناْ قایم بٱکؽت",
+       "revdelete-hide-comment": "Ú\86کسٱ Ù\86اÙ\92 Ú¤Û\8cراÛ\8cØ´ Ø¨Ù±Ú©Ø½Øª",
+       "revdelete-hide-user": "نوم کاریاری ڤیرایشگٱر/تیرنشوݩ آی پی",
+       "revdelete-hide-restricted": "پاکساگری کردن رٱسینٱیا سی دیڤوندارؽا ۉ کٱسونؽا تر",
+       "revdelete-radio-same": "آلشت نٱکؽت",
+       "revdelete-radio-set": "قایم بیٱ",
+       "revdelete-radio-unset": "دیئنی",
+       "revdelete-suppress": "پاکساگری کردن رٱسینٱیا سی دیڤوندارؽا ۉ کٱسونؽا تر",
+       "revdelete-unsuppress": "مٱئدۊدؽٱتؽا ناْ د ڤانیریا ٱمبار بیٱ جا ڤ جا بٱکؽت",
+       "revdelete-log": "دلٛیلٛ:",
+       "revdelete-submit": "سی {{PLURAL:$1|ڤانیری|ڤانیرؽا}} اْنتخاب بیٱ ڤ کار بۉرؽتو",
        "revdelete-success": "'''دیئن وانیری وه خوئی وه هنگوم بی.'''",
-       "revdelete-failure": "'''دیئن وانیری وه خوئی وه هنگوم نبی:'''$1",
+       "revdelete-failure": "'''دیئن ڤانیری ڤ خۊیی ڤ هٱنگوم نبی:'''$1",
        "logdelete-success": "پهرستنومه دیار بیین د خوئی میزونکاری بی.",
-       "logdelete-failure": "Ù¾Ù\87رستÙ\86Ù\88Ù\85Ù\87 Ø¯Û\8cار Ø¨Û\8cÛ\8cÙ\86 Ù\86بÙ\88ئÙ\87 میزونکاری با. $1",
-       "revdel-restore": "آلشت حال و بال ديئن",
-       "pagehist": "ڤیرگار بألگە",
-       "deletedhist": "ڤیرگار پاکسا بییە",
-       "revdelete-hide-current": "خطا Ø¯ Ù\82اÙ\85 Ú©Ø±Ø¯Ù\86 Ú\86Û\8c Ú©Ù\87 Ù\87ا Ø¯ Ù\88Û\8cرگار $2 Ø³Ø§Ø¹Øª $1: Ø§Û\8c Ù\86سÙ\82Ù\87Ø\8c Ù\86سÙ\82Ù\87 Ø§Û\8cسÙ\86Û\8c Û\8cÙ\87 Ù\88 Ù\86بÙ\88ئÙ\87 Ù\86Ù\87Ù\88Ø´ Ø¨Ú©Û\8cت.",
-       "revdelete-show-no-access": "خطا Ø¯ Ù\82اÙ\85 Ú©Ø±Ø¯Ù\86 Ú\86Û\8cÛ\8c Ú©Ù\87 Ù\87ا Ø¯ Ù\88Û\8cرگار $2 Ø³Ø§Ø¹Øª $1: Ø§Û\8c Ù\86سÙ\82Ù\87 Ù\86Ø´Ù\88Ù\86 Â«Ù\85ئÙ\86 ØªÙ\86Ú¯Ù\84ا Ø¨Û\8cئÙ\86» Ø¯Ø§Ø±Ù\87 Ù\88 Ø´Ù\85ا Ù\86Ù\85Û\8c ØªÙ\88Ù\86Û\8cت Ù\88Ù\87 Ø´ Ø¯Ø³Ø±Ø³Û\8c Ø¯Ø§Ø´ØªÙ\88Û\8cت.",
-       "revdelete-modify-no-access": "خطا Ø¯ Ù\82اÙ\85 Ú©Ø±Ø¯Ù\86 Ú\86Û\8cÛ\8c Ú©Ù\87 Ù\87ا Ø¯ Ù\88Û\8cرگار $2 Ø³Ø§Ø¹Øª $1: Ø§Û\8c Ù\86سÙ\82Ù\87 Ù\86Ø´Ù\88Ù\86 Â«Ù\85ئÙ\86 ØªÙ\86Ú¯Ù\84ا Ø¨Û\8cئÙ\86» Ø¯Ø§Ø±Ù\87 Ù\88 Ø´Ù\85ا Ù\86Ù\85Û\8c ØªÙ\88Ù\86Û\8cت Ù\88Ù\87 Ø´ Ø¯Ø³Ø±Ø³Û\8c Ø¯Ø§Ø´ØªÙ\88Û\8cت.",
-       "revdelete-modify-missing": "خطا Ø¯ Ù\82اÙ\85 Ú©Ø±Ø¯Ù\86 Ú\86Û\8c Ø´Ù\85ارÙ\87Ù\94 $1: Ø§Û\8c Ù\86سÙ\82Ù\87 Ø¯ Ø±Ø³Û\8cÙ\86Ù\87 Ú¯Ø§ Ù\86Û\8cئش!",
-       "revdelete-no-change": "'''زئنار:''' چی که ها د ویرگا $2 ساعت $1 د دماتر دیاری میزونکاری حاسته بینه داشته.",
-       "revdelete-concurrent-change": "خطا Ø¯ Ù\82اÙ\85 Ú©Ø±Ø¯Ù\86 Ú\86Û\8cÛ\8c Ú©Ù\87 Ù\87ا Ø¯ Ù\88Û\8cرگار $2 Ø³Ø§Ø¹Øª $1: Ù\88Ù\87 Ù\88Û\8cر Ù\88 Ø¨Ø§Ù\88ر Ù\85Û\8cا Ú©Ù\87 Ø¯ Ø§Ù\88 Ú¯Ø§ØªÛ\8c Ú©Ù\87 Ø´Ù\85ا Ø³Û\8c Ø¢Ù\84شت Ø¯Ø¦Ù\86 Ø­Ø§Ù\84 Ù\88 Ø¨Ø§Ø± Ù\88Ù\87 Ø³Ø¹Û\8c Ù\85Û\8c Ú©Ø±Ø¯Û\8cتÙ\87Ø\8c Ø­Ø§Ù\84 Ù\88 Ø¨Ø§Ø±Ø´ Ù\88Ù\87 Ø¯Ø³ Ú©Ø³Û\8c ØªØ± Ø¢Ù\84شت Ø¯Ø¦Ù\87 Ø¨Û\8cÙ\87.\nÙ\84Ø·Ù\81Ù\86 Ù¾Ù\87رستÙ\86Ù\88Ù\85Ù\87 Û\8cا Ù\86Ù\87 Ù\88ارسÛ\8c Ø¨Ú©Û\8cت.",
-       "revdelete-only-restricted": "خطا Ø¯ Ù\82اÙ\85 Ú©Ø±Ø¯Ù\86 Ú\86Û\8cÛ\8c Ú©Ù\87 Ù\87ا Ø¯ Ù\88Û\8cرگار $2 Ø³Ø§Ø¹Øª $1: Ø´Ù\85ا Ù\86Û\8cÙ\85Û\8c ØªÙ\88Ù\86Û\8cت Ú\86Û\8cاÙ\86Ù\87 Ø¯ Ù\88رتÛ\8cÙ\87 Ø¯Û\8cÙ\88Ù\88Ù\86دارÛ\8cا Ù\82اÙ\85 Ø¨Ú©Û\8cتÙ\88 Ù\85ر Û\8cÙ\87 Ú©Ù\87 Û\8cÙ\87 Ú¯Ù\84 Ø¯ Ú¯Ø²Û\8cÙ\86Ù\87 Û\8cا Ø¯Û\8cارÛ\8c Ú©Ø±Ø¯Ù\86 Ù\87Ù\86Û\8c Ù\86Ù\87 Ø§Ù\86تخاÙ\88 Ø¨کیت.",
-       "revdelete-reason-dropdown": "*دلیلیا جاونه سی پاکسا کردن\n** تیه پوشی د حق درتیچ کردن\n** ویر و باور یا دونسمنیا شخصی نامناسو\n** نوم کاریاری نامناسو\n** دونسمنیا فره تنادار",
-       "revdelete-otherreason": "دألیل ھأنی:",
-       "revdelete-reasonotherlist": "دألیل ھأنی",
-       "revdelete-edit-reasonlist": "دلیلیا پاکسا کردنه نه ویرایشت بکید",
-       "revdelete-offender": "Ù\86Û\8cسÙ\86Ù\87 Ù\88انیری:",
-       "suppressionlog": "Ù¾Ù\87رستÙ\86Ù\88Ù\85Ù\87 پاکساگری",
-       "suppressionlogtext": "د هار یه گل نوم گه ای هئ که مینونه یا پاکسا بیه و قلف بیه  که هان دش د ورتیه دیوونداریا قام بینه.\n[[ویجه:نوم گه قلف بیه|نوم گه قلف بیئنیا]]نه سی نوم گه ایی که انجومکاریا قدقن بیه و قلف بینیا هان دش بونیت.",
-       "mergehistory": "ویرگاریا بلگه نه یکی بکید",
+       "logdelete-failure": "Ù¾Ù\87رستÙ\86Ù\88Ù\85Ù± Ø¯Ø½Ø§Ø± Ø¨Û\8cئÙ\86 Ù\86Ù\85Û\8aئٱ میزونکاری با. $1",
+       "revdel-restore": "آلشت هال ۉ بال ديئن",
+       "pagehist": "ڤیرگار بٱلگٱ",
+       "deletedhist": "ڤیرگار پاکسا بیٱ",
+       "revdelete-hide-current": "ختا Ø¯ Ù\82اÛ\8cÙ\85 Ú©Ø±Ø¯Ù\86 Ú\86Û\8c Û\8cؽ Ú©Ø§Ù\92 Ù\87ا Ø¯ Ú¤Û\8cرگار $2 Ø³Ø§Ø¹Ù±Øª $1: Ø§Ø½ Ù\86Û\8fسخٱØ\8c Ù\86Û\8fسخٱ Ø§Û\8cسÙ\86Û\8c Ø¦Ù± Û\89 Ù\86Ù\85Û\8aئٱ Ù\82اÛ\8cÙ\85Ø´ Ø¨Ù±Ú©Ø½ت.",
+       "revdelete-show-no-access": "ختا Ø¯ Ù\82اÛ\8cÙ\85 Ú©Ø±Ø¯Ù\86 Ú\86Û\8c Û\8cؽ Ú©Ø§Ù\92 Ù\87ا Ø¯ Ú¤Û\8cرگار $2 Ø³Ø§Ø¹Ù±Øª $1: Ø§Ø½ Ù\86Û\8fسخٱ Ù\86Ø´Ù\88Ý© Â«Ù\85ؽÙ\86 ØªÙ±Ù\86Ú³Ù\84اتÛ\8c Ø¨Û\8cئÙ\86» Ø¯Ø§Ø±Ù± Û\89 Ø´Ù\85ا Ù\86Ù\85ؽ ØªÙ\88Ù\86ؽت  Ú¤Ø´ Ø¯Ù±Ø³Ø±Ø³Û\8c Ø¯Ø§Ø´ØªÛ\8aئؽت.",
+       "revdelete-modify-no-access": "ختا Ø¯ Ù\82اشÙ\85 Ú©Ø±Ø¯Ù\86 Ú\86Û\8c Û\8cؽ Ú©Ø§Ù\92 Ù\87ا Ø¯ Ú¤Û\8cرگار $2 Ø³Ø§Ø¹Ù±Øª $1: Ø§Ø½ Ù\86Û\8fسخٱ Ù\86Ø´Ù\88Ý© Â«Ù\85ؽÙ\86 ØªÙ±Ù\86Ú³Ù\84اتÛ\8c Ø¨Û\8cئÙ\86» Ø¯Ø§Ø±Ù± Û\89 Ø´Ù\85ا Ù\86Ù\85ؽ ØªÙ\88Ù\86ؽت Ú¤Ø´ Ø¯Ù±Ø³Ø±Ø³Û\8c Ø¯Ø§Ø´ØªÛ\8aئؽت.",
+       "revdelete-modify-missing": "ختا Ø¯ Ù\82اÛ\8cÙ\85 Ú©Ø±Ø¯Ù\86 Ú\86Û\8c Ø´Ù\85ارٱ $1: Ø§Ø½ Ù\86Û\8fسخٱ Ø¯ Ø±Ù±Ø³Û\8cÙ\86Ù±Ú¯Ù± Ù\86ؽسش!",
+       "revdelete-no-change": "'''زٱنڳؽار:''' چی یؽ کاْ ها د ڤیرگار $2 ساعٱت $1 د دماتر دؽاری میزونکاری هاستٱ بینٱ داشتٱ.",
+       "revdelete-concurrent-change": "ختا Ø¯ Ù\82اÛ\8cÙ\85 Ú©Ø±Ø¯Ù\86 Ú\86Û\8c Û\8cؽ Ú©Ø§Ù\92 Ù\87ا Ø¯ Ú¤Û\8cرگار $2 Ø³Ø§Ø¹Ù±Øª $1: Ú¤ Ú¤Û\8cر Û\89 Ø¨Ø§Ú¤Ù±Ø± Ù\85ؽا Ú©Ø§Ù\92 Ø¯ Ø§Ù\88 Ú¯Ø§ØªØ½ Ú©Ø§Ù\92 Ø´Ù\85ا Ø³Û\8c Ø¢Ù\84شت Ø¯Ø§Ù\9bئÙ\86 Ù\87اÙ\84 Û\89 Ø¨Ø§Ø± Ú¤Ù± ØªÙ±Ù\81رٱ Ù\85ؽ Ú©Ø±Ø¯Ø½ØªÙ±Ø\8c Ù\87اÙ\84 Û\89 Ø¨Ø§Ø±Ø´ Ú¤ Ø¯Ù±Ø³ Ú©Ù±Ø³Ø½ ØªØ± Ø¢Ù\84شت Ø¯Ø§Ù\9bئٱ Ø¨Û\8cÙ±.\nÙ\84Ù\88تÙ\81Ù±Ù\86 Ù¾Ù\87رستÙ\86Ù\88Ù\85Ù±Û\8cا Ù\86اÙ\92 Ú¤Ø§Ø±Ø³Û\8c Ø¨Ù±Ú©Ø½ت.",
+       "revdelete-only-restricted": "ختا Ø¯ Ù\82اÛ\8cÙ\85 Ú©Ø±Ø¯Ù\86 Ú\86Û\8c Û\8cؽ Ú©Ø§Ù\92 Ù\87ا Ø¯ Ú¤Û\8cرگار $2 Ø³Ø§Ø¹Ù±Øª $1: Ø´Ù\85ا Ù\86Ù\85ؽ ØªÙ\88Ù\86ؽت Ú\86Û\8cا Ù\86اÙ\92 Ø¯ Ú¤Ù±Ø± ØªÛ\8cÙ± Ø¯Û\8cÚ¤Ù\88Ù\86دارÛ\8cا Ù\82اÛ\8cÙ\85 Ø¨Ù±Ú©Ø½ØªÙ\88 Ù\85ٱر Û\8cÙ± Ú©Ø§Ù\92 Û\8cٱکؽ Ø¯ Ú¯Ù\88زÛ\8cÙ\86Ù±Û\8cا Ø¯Ø½Ø§Ø±Û\8c Ú©Ø±Ø¯Ù\86 Ù\87Ù\86Û\8c Ù\86اÙ\92 Ø§Ù\92Ù\86تخاب Ø¨Ù±کیت.",
+       "revdelete-reason-dropdown": "*دلٛیلٛؽا جاڤٱنٱ سی پاکسا کردن\n** تیٱ پۊشی د هٱق درتیچ کردن\n** ڤیر ۉ باڤٱرؽا دونسمٱنیا شٱخسی ناموناسب\n** نوم کاریاری ناموناسب\n** دونسمٱنیا فرٱ اْفترا آمیز",
+       "revdelete-otherreason": "دلٛیلٛ ھنی:",
+       "revdelete-reasonotherlist": "دلٛیلٛ ھنی",
+       "revdelete-edit-reasonlist": "دلٛیلٛؽا پاکسا کردن ناْ ڤیرایش بٱکؽت",
+       "revdelete-offender": "Ù\86Û\8cسٱÙ\86Ù± Ú¤انیری:",
+       "suppressionlog": "Ù¾Ù\87رستÙ\86Ù\88Ù\85Ù± پاکساگری",
+       "suppressionlogtext": "د هار یاٛ نومگٱیؽ هؽ کاْ مؽنونٱیا پاکسا بیٱ ۉ قلف بیٱ کاْ هان دش د ڤٱر تیٱ دیڤوندارؽا قایم بینٱ.\n[[ڤیژٱ:نومگٱ قلف بیٱ|نومگٱ قلف بیئنؽا]] ناْ سی نومگاٛیؽ کاْ ٱنجومکارؽا قٱدقٱن بیٱ ۉ قلف بیئنؽا هان دش بونؽت.",
+       "mergehistory": "ڤیرگارؽا بٱلگٱ ناْ یٱکؽ بٱکؽت",
        "mergehistory-header": "ای بلگه وه شما اجازه می ئه که وانیریانه ویرگار سرچشمه بلگه نه د یه گل بلگه تازه سریک سازی بکید.\nمطمئن بویت که ای آلشت د لحاظ ویرگاری د مین بلگه موندگاره.",
-       "mergehistory-box": "دوواره دیئن دوبلگه ای نه سر یک سازی کو:",
-       "mergehistory-from": "بألگە سأرچئشمە:",
-       "mergehistory-into": "بÙ\84Ú¯Ù\87 Ù\85Ù\82صد:",
-       "mergehistory-list": "ویرگار ویرایشت سر یک سازی بیئنی",
-       "mergehistory-merge": "نسقه یا هاری که د [[:$1]] وه یک شیوسنی وا[[:$2]] هئن.\nستین دگمه یا رادیویی نه به کار به ونیت سی یه که نسقه یایی نه که د گاتی دماتر دروس بینه انتخاو بکیت.\nد ویرتو با که پورسن ری پیوندیا باعث بوئه که ستین وه شکل اولیه خوش ؤرئرده.",
-       "mergehistory-go": "ویرایشتیایی که سریک سازی بوئن نشو بیئه",
-       "mergehistory-submit": "سر یک سازی دوواره دیئنیا",
-       "mergehistory-empty": "هیپ دوواره دیئنی نبوئه یکی سازی بوئه.",
+       "mergehistory-box": "دوئارٱ دیئن دۏ بٱلگٱ ناْ سٱریٱک سازی کو:",
+       "mergehistory-from": "بٱلگٱ سرچشمٱ:",
+       "mergehistory-into": "بٱÙ\84Ú¯Ù± Ù\85Ù±Ù\82سٱد:",
+       "mergehistory-list": "ڤیرگار ڤیرایش سٱریٱک سازی بیئنی",
+       "mergehistory-merge": "نۏسخٱیا هاری کاْ د [[:$1]] ڤٱ یاٛ شؽڤسنی ڤا[[:$2]] هؽسن.\nستین دۏگمٱیا رادیویی ناْ ڤ کار بڤٱنؽت سی یٱ کاْ نۏسخٱیایؽ ناْ کاْ د گاتؽ دماتر دۏرس بینٱ اْنتخاب بٱکؽت.\nد ڤیرتو با کاْ پۊرسن ری پاٛڤٱنؽا باعس مۊئٱ کاْ ستین ڤٱ شکل ٱڤلٛیٱ خوش ناْ ڤرارٱ.",
+       "mergehistory-go": "ڤیرایشؽایؽ کاْ سٱریٱک سازی مۊئٱن نشوݩ باٛ",
+       "mergehistory-submit": "سٱریٱک سازی دوئرٱ دیئنؽا",
+       "mergehistory-empty": "هیژ دوئرٱ دیئنی نمۊئٱ یٱکؽ سازی بۊئٱ.",
        "mergehistory-done": "$3 {{PLURAL:$3|وانیری|وانیریا}} د $1 وه خوئی د [[:$2]] سریک سازی بی.",
-       "mergehistory-fail": "سریک سازی ویرگار انجوم نبوئه، لطفن پینیاریا گات و بلگه نه د نو وارسی بکید.",
-       "mergehistory-fail-toobig": "نبوئه وه یک شیوسن ویرگا انجوم دئه سی یکه وه بیشتر د محدودیت $1 {{PLURAL:$1|نسقه}}جا وه جا موئه.",
-       "mergehistory-no-source": "سرÚ\86Ø´Ù\85Ù\87 Ø¨Ù\84Ú¯Ù\87 $1 Ù\88جÙ\88د Ù\86ارÙ\87.",
-       "mergehistory-no-destination": "بÙ\84Ú¯Ù\87 Ù\85Ù\82صد $1 Ù\88جÙ\88د Ù\86ارÙ\87.",
-       "mergehistory-invalid-source": "نوم ون بلگه سرچشمه با معتور بوئه.",
-       "mergehistory-invalid-destination": "نوم ون بلگه سرچشمه با معتور بوئه.",
-       "mergehistory-autocomment": " [[:$1]]وا[[:$2]] یکی بیه",
-       "mergehistory-comment": " [[:$1]]وا[[:$2]] یکی بیه:$3",
-       "mergehistory-same-destination": "سرÚ\86Ø´Ù\85Ù\87 Ù\88 Ø¨Ù\84Ú¯Ù\87 Û\8cا Ù\85Ù\82صد Ù\86بÙ\88ئÙ\87 Û\8cÚ©Û\8c Ø¨Ù\88ئن",
-       "mergehistory-reason": "دأليل:",
+       "mergehistory-fail": "سٱریٱک سازی ڤیرگار ٱنجوم نمۊئٱ، لوتفٱن پین یارؽا گات ۉ بٱلگٱ ناْ د نۊ ڤارسی بٱکؽت.",
+       "mergehistory-fail-toobig": "نمۊئٱ ڤ یٱک شؽڤسن ڤیرگا ٱنجوم داٛئٱ سی یٱ کاْ ڤۉ بؽشتر د مٱئدۊدیٱت $1 {{PLURAL:$1|نۏسخٱ}}جا ڤ جا مۊئٱ.",
+       "mergehistory-no-source": "سرÚ\86Ø´Ù\85Ù± Ø¨Ù±Ù\84Ú¯Ù± $1 Ú¤Ø¬Û\8aد Ù\86ارٱ.",
+       "mergehistory-no-destination": "بٱÙ\84Ú¯Ù± Ù\85Ù±Ù\82سٱد $1 Ú¤Ø¬Û\8aد Ù\86ارٱ.",
+       "mergehistory-invalid-source": "نوم ڤٱن بٱلگٱ سرچشمٱ بایٱد موعتٱبٱر بۊئٱ.",
+       "mergehistory-invalid-destination": "نوم ڤٱن بٱلگٱ سرچشمٱ بایٱد موعتٱبٱر بۊئٱ.",
+       "mergehistory-autocomment": " [[:$1]]ڤا[[:$2]] یٱکؽ بیٱ",
+       "mergehistory-comment": " [[:$1]]ڤا[[:$2]] یٱکؽ بیٱ:$3",
+       "mergehistory-same-destination": "سرÚ\86Ø´Ù\85Ù± Û\89 Ø¨Ù±Ù\84Ú¯Ù±Û\8cا Ù\85Ù±Ù\82سٱد Ù\86Ù\85Û\8aئٱ Û\8cٱکؽ Ø¨Û\8aئٱن",
+       "mergehistory-reason": "دلٛیلٛ:",
        "mergehistory-revisionrow": "$1 ($2) $3 . . $4 $5 $6",
        "mergelog": "سٱریٱک سازی پهرستنومٱ",
-       "revertmerge": "بی لوئه",
-       "mergelogpagetext": "شما د هار نوم گه آخرین چیا وه یک شیوسن ویرگار یه بلگه نه د بلگه تر میئنیت.",
-       "history-title": "دÙ\88ئارٱ Ø¯Û\8cئÙ\86 Ú¤Û\8cرگار $1",
+       "revertmerge": "بؽ لوئٱ",
+       "mergelogpagetext": "شما د هار نومگٱ آخری چیا ڤ یٱک شؽڤسن ڤیرگار یاٛ بٱلگٱ ناْ د بٱلگاٛ تر ماٛینؽت.",
+       "history-title": "دوئرٱ دیئن ڤیرگار $1",
        "difference-title": "فٱرخ مؽنجا ڤانیرؽا \"$1\"",
-       "difference-title-multipage": "فرخ مینجا بلگه یا \"$1\" و \"$2\"",
-       "difference-multipage": "(فرخ مینجا بلگه یا)",
+       "difference-title-multipage": "فٱرخ مؽنجا بٱلگٱیا \"$1\" و \"$2\"",
+       "difference-multipage": "(فٱرخ مؽنجا بٱلگٱیا)",
        "lineno": "خٱت $1:",
-       "compareselectedversions": "دÙ\88ئارٱ Ø¯Û\8cئÙ\86ؽاÛ\8cؽ Ú©Ø§Ù\92 Ø§Ù\92Ù\86تخاÙ\88 بینٱ ناْ موقایسٱ بٱکؽت",
-       "showhideselectedversions": "شلک دیئن وانیریا انتخاو بیه نه آلشت بکید",
+       "compareselectedversions": "دÙ\88ئرٱ Ø¯Û\8cئÙ\86ؽاÛ\8cؽ Ú©Ø§Ù\92 Ø§Ù\92Ù\86تخاب بینٱ ناْ موقایسٱ بٱکؽت",
+       "showhideselectedversions": "شکل دیئن ڤانیریا اْنتخاب بیٱ ناْ آلشت بٱکؽت",
        "editundo": "ناٱنجومگر کردن",
        "diff-empty": "(بؽ فٱرق)",
        "diff-multi-sameuser": "({{PLURAL:$1|یاٛ نۏسخٱ مؽنجایی|$1 نۏسخٱیا مؽنجایی}} ڤ دٱس{{PLURAL:$2|کاریارؽ تر|$2 کاریارؽا}} نشوݩ داٛئٱ ناٛیٱ)",
        "diff-multi-otherusers": "({{PLURAL:$1|یاٛ نۏسخٱ مؽنجایی|$1 نۏسخٱیا مؽنجایی}} ڤ دٱس{{PLURAL:$2|کاریاری تر|$2 کاریارؽا}} نشوݩ داٛئٱ ناٛیٱ)",
-       "diff-multi-manyusers": "({{PLURAL:$1|یه گل وانیری مینجاگرته|$1وانیریا مینجا گرته}} بیشتر د $2 {{PLURAL:$2|کاریار|کاریاریا}} نشو دئه نبیه)",
-       "difference-missing-revision": "{{PLURAL:$2|یه گل ویرایشت|$2 ویرایشت}} د فرق مینجا($1) {{PLURAL:$2|پیدا نبی|پیدا نبینه}}.\n\nشایت بانی جاونه وه وا یه گل ویرگار وه هنگوم نبیه که د یه گل بلگه پاکسا بیه هوم پیوند بیه بوئه.\nشایت جزئیات د   [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log]  پیدا بوئن.",
+       "diff-multi-manyusers": "({{PLURAL:$1|یاٛ ڤانیری مؽنجاگرتٱ|$1ڤانیریا مؽنجا گرتٱ}} بؽشتر د $2 {{PLURAL:$2|کاریار|کاریارؽا}} نشوݩ داٛئٱ ناٛییٱ)",
+       "difference-missing-revision": "{{PLURAL:$2|یاٛ ڤیرایش|$2 ڤیرایش}} د فٱرخ مؽنجا($1) {{PLURAL:$2|پاٛدا ناٛی|پاٛدا ناٛییٱ}}.\n\nشایٱد بانی جاڤٱنٱ ڤٱ ڤا یاٛ ڤیرگار ڤٱ هٱنگوم ناٛییٱ کاْ د یاٛ بٱلگٱ پاکسا بیٱ هوم پاٛڤٱن باٛئٱ بۊئٱ.\nشایٱد جۏزییات د  [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log]  پاٛدا مۊئٱن.",
        "searchresults": "نتيجٱیا پاٛ جۊری",
-       "searchresults-title": "نتيجٱیا پاٛ جۊری سی \"$1\"",
+       "searchresults-title": "نٱتيجٱیا پاٛ جۊری سی \"$1\"",
        "titlematches": "داسون بلگه یکی بیه",
-       "textmatches": "Ù\87Ù\88Ù\85سازÛ\8c Ù\86Û\8cسسÙ\87 Ø¨Ù\84Ú¯Ù\87.",
-       "notextmatches": "Ù\86Û\8cسسÙ\87 Ø¨Ù\84Ú¯Ù\87 Ù\87Ù\88Ù\85سازÛ\8c Ù\86ارÙ\87",
+       "textmatches": "Ù\87Ù\88Ù\85سازÛ\8c Ù\86Û\8cسسٱ Ø¨Ù\84Ú¯Ù±.",
+       "notextmatches": "Ù\86Û\8cسسٱ Ø¨Ù±Ù\84Ú¯Ù± Ù\87Ù\88Ù\85سازÛ\8c Ù\86ارٱ",
        "prevn": "ڤادما {{PLURAL:$1|$1}}",
        "nextn": "نوئایی {{PLURAL:$1|$1}}",
-       "prev-page": "بÙ\84Ú¯Ù\87 دمايی",
-       "next-page": "بÙ\84Ú¯Ù\87 Ù\86Ù\87ایی",
+       "prev-page": "بٱÙ\84Ú¯Ù± دمايی",
+       "next-page": "بٱÙ\84Ú¯Ù± Ù\86Ù\88ئایی",
        "prevn-title": "زیتر $1 {{PLURAL:$1|نٱتیجٱ|نٱتيجٱيا}}",
        "nextn-title": "دمایی $1 {{PLURAL:$1|نٱتيجٱ|نٱتيجؽا}}",
        "shown-title": "نشوݩ داٛین $1 {{PLURAL:$1|نتیجٱ|نتیجٱیا}} سی هٱر بٱلگٱ",
        "newtitle": "سی سرون هنی:",
        "move-watch": "دیئن بٱلگٱ سرچشمٱ ۉ بٱلگٱ هاستنی",
        "movepagebtn": "بٱلگٱ جا ڤ جا کو",
-       "pagemovedsub": "د خوئی جا وه جا بیه",
+       "pagemovedsub": "ڤ خۊیی جا ڤ جا بی",
        "movepage-moved": "<strong>\"$1\" جا وه جا بیه سی \"$2\"</strong>",
        "movepage-moved-redirect": "یاٛ ڤاگٱردونی دۏرس بیٱ.",
        "movepage-moved-noredirect": "د دروس کردن واگردونی جلوگری بیه.",
index c29f5d6..9f73d05 100644 (file)
@@ -17,7 +17,8 @@
                        "Amjad Khan",
                        "Zakiy",
                        "Vlad5250",
-                       "S Kartika"
+                       "S Kartika",
+                       "NoiX180"
                ]
        },
        "tog-underline": "Garisbawahi tautan:",
        "tags": "Tag parubahan nan sah",
        "tag-filter": "[[Special:Tags|Tag]] sariang:",
        "tag-filter-submit": "Sariang",
-       "tag-list-wrapper": "[[Istimewa:Tag|{{PLURAL:$1|Tag}}]]: $2",
+       "tag-list-wrapper": "[[Special:Tags|{{PLURAL:$1|Tag}}]]: $2",
        "tags-title": "Tag",
        "tags-intro": "Laman ko barisi daftar tag nan dapek ditandoi dek parangkaik lunak jo suntiangan dan maknanyo.",
        "tags-tag": "Namo tag",
index 5dafc1a..1ecabd7 100644 (file)
        "autoblockedtext": "Вашата IP-адреса е автоматски блокирана бидејќи била користена од страна на друг корисник, кој бил блокиран од $1.\nДаденото образложение е следново:\n\n:<em>$2</em>\n\n* Почеток на блокирањето: $8\n* Истекување на блокирањето: $6\n* Со намера да се блокира: $7\n\nМоже да контактирате со $1 или некој друг [[{{MediaWiki:Grouppage-sysop}}|администратор]] за да разговарате во врска со ова блокирање.\n\nИмајте предвид дека можеби нема да можете да ја искористите можноста „{{int:emailuser}}“ доколку не е назначена важечка е-поштенска адреса во [[Special:Preferences|вашите нагодувања]] и ви е забрането користење на истата.\n\nВашата IP-адреса е $3, a назнака на блокирањетo е $5.\nВе молиме наведете ги овие подробности доколку реагирате на блокирањето.",
        "systemblockedtext": "Вашето корисничко име или IP-адреса е автоматски блокирано од МедијаВики.\nНаведената причина гласи:\n\n:<em>$2</em>\n\n* Почеток на блокот: $8\n* Истек на блокот: $6\n* Блокот е наменет за: $7\n\nВашата тековна IP-адреса гласи $3.\nПрепишете ги сите горенаведени поединости доколку сакате да се распрашате кај надлежните во врска со блокот.",
        "blockednoreason": "не е наведена причина",
-       "blockedtext-composite": "<strong>Вашето корисничко име или IP-адреса е блокирано.</strong>\n\nНаведената причина гласи:\n\n:<em>$2</em>.\n\n* Почеток на блокот: $8\n* Истек на најдолгиот блок: $6\n\nВашата тековна IP-адреса гласи $3.\nПрепишете ги сите горенаведени поединости доколку сакате да се распрашате кај надлежните во врска со блокот.",
+       "blockedtext-composite": "<strong>Вашето корисничко име или IP-адреса е блокирано.</strong>\n\nНаведената причина гласи:\n\n:<em>$2</em>.\n\n* Почеток на блокот: $8\n* Истек на најдолгиот блок: $6\n\n* $5\n\nВашата тековна IP-адреса гласи $3.\nПрепишете ги сите горенаведени поединости доколку сакате да се распрашате кај надлежните во врска со блокот.",
+       "blockedtext-composite-ids": "Релеватни назнаки на блоковите: $1 (вашата IP-адреса може воедно да е на црниот список)",
+       "blockedtext-composite-no-ids": "Вашата IP-адреса стои на повеќе црни списоци",
        "blockedtext-composite-reason": "Вашата сметка и/или IP-адреса има неколку блокови",
        "whitelistedittext": "Мора да сте $1 за да уредувате страници.",
        "confirmedittext": "Морате да ја потврдите вашата е-поштенска адреса пред да уредувате страници.\nПоставете ја и валидирајте ја вашата е-поштенска адреса преку вашите [[Special:Preferences|нагодувања]].",
        "right-editmyusercss": "Уредување на сопствените кориснички каскадни стилски податотеки (CSS)",
        "right-editmyuserjson": "Уредување на сопствените кориснички JSON-податотеки",
        "right-editmyuserjs": "Уредување на сопствените кориснички податотеки со JavaScript",
+       "right-editmyuserjsredirect": "Уредување на сопствените кориснички JavaScript-податотеки кои се пренасочувања",
        "right-viewmywatchlist": "Преглед на вашиот список на набљудувања",
        "right-editmywatchlist": "Уредување на вашите набљудувани. Извесни дејства сепак ќе ставаат страници во нив и без да го имате ова право.",
        "right-viewmyprivateinfo": "Преглед на сопствените лични податоци (на пр. е-пошта, вистинско име и презиме)",
        "action-editmyusercss": "уредување на сопствените кориснички каскадни стилски податотеки (CSS)",
        "action-editmyuserjson": "уредување на сопствените кориснички JSON-податотеки",
        "action-editmyuserjs": "уредување на сопствените кориснички податотеки со JavaScript",
+       "action-editmyuserjsredirect": "уредување на сопствените кориснички JavaScript-податотеки кои се пренасочувања",
        "action-viewsuppressed": "преглед на преработки скриени од било кој корисник",
        "action-hideuser": "блокирање корисници, сокривање од јавноста",
        "action-ipblock-exempt": "заобиколување на IP-блокови, автоблокови и опсежни блокови",
        "edit-error-short": "Грешка: $1",
        "edit-error-long": "Грешки:\n\n$1",
        "specialmute": "Искл. известувања",
-       "specialmute-success": "Ð\9fÑ\80омениÑ\82е Ñ\81е Ñ\83Ñ\81пеÑ\88но Ð½Ð°Ð¿Ñ\80авени. Ð\9fогледаÑ\98Ñ\82е Ð³Ð¸ Ñ\81иÑ\82е Ð¸Ñ\81клÑ\83Ñ\87ени ÐºÐ¾Ñ\80иÑ\81ниÑ\86и Ð½Ð° [[Special:Preferences]].",
+       "specialmute-success": "Ð\9fÑ\80омениÑ\82е Ñ\81е Ñ\83Ñ\81пеÑ\88но Ð½Ð°Ð¿Ñ\80авени. Ð\9fогледаÑ\98Ñ\82е Ð³Ð¸ Ñ\81иÑ\82е Ð¸Ñ\81клÑ\83Ñ\87ени ÐºÐ¾Ñ\80иÑ\81ниÑ\86и Ð²Ð¾ [[Special:Preferences|ваÑ\88иÑ\82е Ð½Ð°Ð³Ð¾Ð´Ñ\83ваÑ\9aа]].",
        "specialmute-submit": "Потврди",
        "specialmute-label-mute-email": "Исклучи е-пошта од корисников",
-       "specialmute-header": "Изберете поставки за известувања од {{BIDI:[[User:$1]]}}.",
+       "specialmute-header": "Изберете поставки за исклучување на известувања од <b>{{BIDI:[[User:$1|$1]]}}</b>.",
        "specialmute-error-invalid-user": "Не можев да го најдам корисничкото име.",
-       "specialmute-error-email-blacklist-disabled": "Исклучувањето на е-пошта од корисници не е овозможено.",
-       "specialmute-error-email-preferences": "Ќе мора да ја потврдите вашата е-пошта пред да исклучите известувања од други. Тоа се прави на страницата [[Special:Preferences]].",
-       "specialmute-email-footer": "За нагодување на поставките за {{BIDI:$2}}, појдете на <$1>.",
+       "specialmute-error-no-options": "Исклучувањето на известувања е недостапно. Ова може да биде бидејќи ја немате потврдено е-поштата, или пак бидејќи администраторот оневозможил можности за е-пошта и/или го оневозможил црниот список на ова вики.",
+       "specialmute-email-footer": "За нагодување на поставките за корисникот {{BIDI:$2}}, појдете на <$1>.",
        "specialmute-login-required": "Најавете се за да ги направите промените.",
+       "mute-preferences": "Нагодувања за исклучување",
        "revid": "преработка $1",
        "pageid": "назнака на страницата $1",
        "interfaceadmin-info": "$1\n\nДозволите за уредување на CSS/JS/JSON податотеки низ цело вики неодамна се одвоени од правото <code>editinterface</code>. Ако не разбирате зошто ја добивате оваа грешка, погл. [[mw:MediaWiki_1.32/interface-admin]].",
        "passwordpolicies-policy-passwordnotinlargeblacklist": "Лозинката не може да биде меѓу 100.000-те најчести лозинки.",
        "passwordpolicies-policyflag-forcechange": "мора да се промени при најава",
        "passwordpolicies-policyflag-suggestchangeonlogin": "предложи измена при најава",
+       "mycustomjsredirectprotected": "Немате дозвола да ја уредувате оваа страница со JavaScript бидејќи претставува пренасочување и не води кон вашиот именски простор.",
        "easydeflate-invaliddeflate": "Содржината не е соодветно прочистена",
        "unprotected-js": "JavaScript не може да се вчита од незаштитени страници од безбедносни причини. Создавајте JavaScript само во именскиот простор МедијаВики: или како корисничка потстраница",
        "userlogout-continue": "Дали сакате да се одјавите?"
index 565a91d..2bbc077 100644 (file)
        "autoblockedtext": "താങ്കളുടെ ഐ.പി. വിലാസം സ്വയം തടയപ്പെട്ടിരിക്കുന്നു, മറ്റൊരു ഉപയോക്താവ് ഉപയോഗിച്ച കാരണത്താൽ $1 എന്ന കാര്യനിർവാഹകനാണ് തടഞ്ഞുവെച്ചത്.\nഇതിനു കാരണമായി നൽകിയിട്ടുള്ളത്:\n\n:<em>$2</em>\n\n* തടയൽ തുടങ്ങിയത്: $8\n* തടയൽ അവസാനിക്കുന്നത്: $6\n* തടയാൻ ഉദ്ദേശിച്ചത്: $7\n\nഈ തടയലിനെ കുറിച്ച് ചർച്ച ചെയ്യാൻ താങ്കൾക്കു $1 എന്ന കാര്യനിവാഹകനേയോ മറ്റു [[{{MediaWiki:Grouppage-sysop}}|കാര്യനിർവാഹകരെയോ]] ബന്ധപ്പെടാവുന്നതാണ്.\n\nശ്രദ്ധിക്കുക [[Special:Preferences|താങ്കളുടെ ക്രമീകരണങ്ങളിൽ]] സാധുവായ ഇമെയിൽ വിലാസം രേഖപ്പെടുത്താതിരിക്കുകയോ, അത് ഉപയോഗിക്കുന്നതിൽ നിന്ന് താങ്കളെ തടയുകയോ ചെയ്തിട്ടുണ്ടെങ്കിൽ \"{{int:emailuser}}\" എന്ന സം‌വിധാനം പ്രവർത്തന രഹിതമായിരിക്കും.\n\nതാങ്കളുടെ നിലവിലുള്ള ഐ.പി. വിലാസം $3 ആണ്, താങ്കളുടെ തടയലിന്റെ ഐ.ഡി. #$5 ആകുന്നു.\nദയവായി മുകളിൽ കൊടുത്തിരിക്കുന്ന വിവരങ്ങളെല്ലാം താങ്കൾ നടത്തുന്ന അന്വേഷണങ്ങളിൽ ഉൾപ്പെടുത്തുവാൻ ശ്രദ്ധിക്കുക.",
        "systemblockedtext": "താങ്കളുടെ ഉപയോക്തൃനാമം അല്ലെങ്കിൽ ഐ.പി. വിലാസം മീഡിയവിക്കി സ്വയം തടഞ്ഞിരിക്കുന്നു.\nതടയാനുള്ള കാരണം:\n\n:<em>$2</em>\n\n* തടയൽ തുടങ്ങിയത്: $8\n* തടയൽ കാലഹരണപ്പെടുന്നത്: $6\n* തടയാനുദ്ദേശിച്ചയാൾ: $7\n\nതാങ്കളുടെ നിലവിലെ ഐ.പി. വിലാസം $3 ആണ്.\nതാങ്കൾക്കെന്തെങ്കിലും ചോദ്യങ്ങളുണ്ടെങ്കിൽ മുകളിലെ എല്ലാ വിവരങ്ങളും ഉൾപ്പെടുത്തുക.",
        "blockednoreason": "കാരണമൊന്നും സൂചിപ്പിച്ചിട്ടില്ല",
+       "blockedtext-composite-no-ids": "താങ്കളുടെ ഐ.പി. വിലാസം വിവിധ കരിമ്പട്ടികകളിൽ ഉൾപ്പെട്ടിരിക്കുന്നു",
+       "blockedtext-composite-reason": "താങ്കളുടെ അംഗത്വത്തിന് അല്ലെങ്കിൽ ഐ.പി. വിലാസത്തിന് വിവിധ തടയലുകൾ നിലവിലുണ്ട്.",
        "whitelistedittext": "താളുകൾ തിരുത്താൻ താങ്കൾ $1 ചെയ്യേണ്ടതാണ്",
        "confirmedittext": "താളുകൾ തിരുത്തുന്നതിനു മുൻപ് താങ്കൾ താങ്കളുടെ ഇമെയിൽ വിലാസം സ്ഥിരീകരിക്കേണ്ടതാണ്‌. ഇമെയിൽ വിലാസം ക്രമപ്പെടുത്തി സാധുത പരിശോധിക്കാൻ [[Special:Preferences|എന്റെ ക്രമീകരണങ്ങൾ]] എന്ന സം‌വിധാനം ഉപയോഗിക്കുക.",
        "nosuchsectiontitle": "ഉപവിഭാഗം കണ്ടെത്താനായില്ല",
        "right-editmyusercss": "താങ്കളുടെ സ്വന്തം ഉപയോക്തൃ സി.എസ്.എസ്. പ്രമാണങ്ങൾ തിരുത്തുക",
        "right-editmyuserjson": "താങ്കളുടെ സ്വന്തം ഉപയോക്തൃ ജെസൺ പ്രമാണങ്ങൾ തിരുത്തുക",
        "right-editmyuserjs": "താങ്കളുടെ സ്വന്തം ഉപയോക്തൃ ജാവാസ്ക്രിപ്റ്റ് പ്രമാണങ്ങൾ തിരുത്തുക",
+       "right-editmyuserjsredirect": "തിരിച്ചുവിടലുകൾ ആയ താങ്കളുടെ സ്വന്തം ഉപയോക്തൃ ജാവാസ്ക്രിപ്റ്റ് പ്രമാണങ്ങൾ തിരുത്തുക",
        "right-viewmywatchlist": "താങ്കളുടെ ശ്രദ്ധിക്കുന്നവയുടെ പട്ടിക സ്വയം കാണുക",
        "right-editmywatchlist": "താങ്കൾ ശ്രദ്ധിക്കുന്നവയുടെ പട്ടിക സ്വയം തിരുത്തുക. ഈ അവകാശമില്ലാതെതന്നെ ചില പ്രവൃത്തികൾ താളുകൾ കൂട്ടിച്ചേർക്കുമെന്ന് അറിഞ്ഞിരിക്കുക.",
        "right-viewmyprivateinfo": "താങ്കളുടെ സ്വകാര്യവിവരങ്ങൾ കാണുക (ഉദാ: ഇമെയിൽ വിലാസം, യഥാർത്ഥനാമം)",
        "uploadstash-bad-path-unknown-type": "അപരിചിതമായ തരം \"$1\".",
        "uploadstash-file-not-found-no-thumb": "ലഘുചിത്രം സംഘടിപ്പിക്കാൻ കഴിഞ്ഞില്ല.",
        "uploadstash-file-not-found-no-remote-thumb": "ലഘുചിത്രം എടുക്കൽ പരാജയപ്പെട്ടു: $1\nയു.ആർ.എൽ.= $2",
+       "uploadstash-file-too-large": "$1 ബൈറ്റുകളിലും വലിയ പ്രമാണം സെർവ് ചെയ്യാൻ കഴിയില്ല.",
+       "uploadstash-not-logged-in": "ഉപയോക്താവ് പ്രവേശിച്ചിട്ടില്ല, പ്രമാണം ഉപയോക്താക്കളെ പ്രതിനിധീകരിക്കുന്നു.",
        "uploadstash-no-extension": "എക്സ്റ്റെൻഷൻ ശൂന്യമാണ്.",
        "uploadstash-zero-length": "പ്രമാണത്തിന്റെ നീളം ശൂന്യമാണ്.",
        "img-auth-accessdenied": "പ്രവേശനമില്ല",
        "apisandbox-dynamic-parameters-add-label": "ചരം ചേർക്കുക:",
        "apisandbox-dynamic-parameters-add-placeholder": "ചരത്തിന്റെ പേര്",
        "apisandbox-dynamic-error-exists": "\"$1\" എന്ന പേരിലുള്ള ചരം നിലവിലുണ്ട്.",
+       "apisandbox-deprecated-parameters": "ഒഴിവാക്കപ്പെട്ട ചരങ്ങൾ",
        "apisandbox-add-multi": "കൂട്ടിച്ചേർക്കുക",
        "apisandbox-submit-invalid-fields-title": "ചില മണ്ഡലങ്ങൾ അസാധുവാണ്",
        "apisandbox-results": "ഫലങ്ങൾ",
+       "apisandbox-request-format-url-label": "യു.ആർ.എൽ. ക്വറി പദശകലം",
        "apisandbox-request-url-label": "അഭ്യർത്ഥനാ യൂ.ആർ.എൽ.:",
        "apisandbox-request-json-label": "ജെസൺ അപേക്ഷിക്കുക:",
        "apisandbox-request-time": "അഭ്യർത്ഥനയുടെ സമയം: {{PLURAL:$1|$1 മി.സെ.}}",
        "activeusers-intro": "ഇത് കഴിഞ്ഞ {{PLURAL:$1|ദിവസം|$1 ദിവസങ്ങളിൽ}} ഏതെങ്കിലും വിധത്തിലുള്ള പ്രവർത്തനങ്ങൾ ചെയ്ത ഉപയോക്താക്കളുടെ പട്ടികയാണ്.",
        "activeusers-count": "കഴിഞ്ഞ {{PLURAL:$3|ഒരു ദിവസം|$3 ദിവസങ്ങളിൽ}} {{PLURAL:$1|ഒരു പ്രവൃത്തി|$1 പ്രവൃത്തികൾ}}",
        "activeusers-from": "ഇങ്ങനെ തുടങ്ങുന്ന ഉപയോക്താക്കളെ കാട്ടുക:",
+       "activeusers-groups": "സംഘങ്ങളിൽ ഉൾപ്പെട്ട ഉപയോക്താക്കളെ പ്രദർശിപ്പിക്കുക:",
+       "activeusers-excludegroups": "സംഘങ്ങളിൽ ഉൾപ്പെടാത്ത ഉപയോക്താക്കളെ പ്രദർശിപ്പിക്കുക:",
        "activeusers-noresult": "ഉപയോക്താക്കളില്ല",
        "activeusers-submit": "സജീവ ഉപയോക്താക്കളെ പ്രദർശിപ്പിക്കുക",
        "listgrouprights": "ഉപയോക്തൃവിഭാഗത്തിന്റെ അവകാശങ്ങൾ",
        "trackingcategories-msg": "പിന്തുടരൽ വർഗ്ഗം",
        "trackingcategories-name": "സന്ദേശത്തിന്റെ പേര്",
        "trackingcategories-desc": "വർഗ്ഗം ഉൾപ്പെടുത്തുന്നതിനുള്ള മാനദണ്ഡം",
+       "restricted-displaytitle-ignored": "അവഗണിക്കപ്പെട്ട പ്രദർശന തലക്കെട്ടുകളോടു കൂടിയ താളുകൾ",
        "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> എന്നതിലും കൂടുതലാവുമെന്നതിനാൽ, ചില ഫലകങ്ങൾ വികസിപ്പിച്ചിരുന്നില്ല.",
        "contribsub2": "ഉപയോക്താവ് {{GENDER:$3|$1}} ($2)",
        "contributions-subtitle": "ഉപയോക്താവ് {{GENDER:$3|$1}}",
        "contributions-userdoesnotexist": "\"$1\" എന്ന ഉപയോക്തൃ അം‌ഗത്വം നിലവിലില്ല.",
+       "negative-namespace-not-supported": "നെഗറ്റീവ് വിലകളോടുകൂടിയ നാമമേഖലകൾ പിന്തുണയ്ക്കുന്നില്ല.",
        "nocontribs": "ഈ മാനദണ്ഡങ്ങളുമായി യോജിക്കുന്ന മാറ്റങ്ങൾ ഒന്നും കണ്ടില്ല.",
        "uctop": "നിലവിലുള്ളത്",
        "month": "മാസം:",
        "blocklink": "തടയുക",
        "unblocklink": "സ്വതന്ത്രമാക്കുക",
        "change-blocklink": "തടയലിൽ മാറ്റം വരുത്തുക",
+       "empty-username": "(ഉപയോക്തൃനാമം ഒന്നും ലഭ്യമല്ല)",
        "contribslink": "സംഭാവനകൾ",
        "emaillink": "ഇമെയിൽ അയയ്ക്കുക",
        "autoblocker": "താങ്കളുടെ ഐ.പി. വിലാസം \"[[User:$1|$1]]\" എന്ന ഉപയോക്താവ് ഈ അടുത്ത് ഉപയോഗിക്കുകയും പ്രസ്തുത ഉപയോക്താവിനെ വിക്കിയിൽ നിന്നു തടയുകയും ചെയ്തിട്ടുള്ളതാണ്‌. അതിനാൽ താങ്കളും യാന്ത്രികമായി തടയപ്പെട്ടിരിക്കുന്നു. $1 എന്ന ഉപയോക്താവിന്റെ തടയലിനു സൂചിപ്പിക്കപ്പെട്ട കാരണം \"$2\" എന്നാണ്‌",
        "authmanager-provider-temporarypassword": "താത്കാലിക രഹസ്യവാക്ക്",
        "authprovider-confirmlink-success-line": "$1: വിജയകരമായി കണ്ണി ചേർത്തു.",
        "authprovider-resetpass-skip-label": "മറികടക്കുക",
+       "authprovider-resetpass-skip-help": "രഹസ്യവാക്ക് പുനർസജ്ജീകരണം വിട്ടേക്കുക.",
        "authform-newtoken": "ചീട്ട് കാണുന്നില്ല. $1",
        "authform-notoken": "ചീട്ട് കാണുന്നില്ല",
        "authform-wrongtoken": "തെറ്റായ ചീട്ട്",
        "restrictionsfield-label": "അനുവദിച്ചിട്ടുള്ള ഐ.പി. പരിധികൾ:",
        "edit-error-short": "പിഴവ്: $1",
        "edit-error-long": "പിഴവുകൾ:\n\n$1",
+       "specialmute": "നിശബ്ദമാക്കുക",
+       "specialmute-submit": "സ്ഥിരീകരിക്കുക",
+       "specialmute-label-mute-email": "ഈ ഉപയോക്താവിൽ നിന്നുമുള്ള ഇമെയിലുകൾ നിശബ്ദമാക്കുക",
        "revid": "നാൾപ്പതിപ്പ് $1",
        "pageid": "താൾ ഐ.ഡി. $1",
        "interfaceadmin-info": "$1\n\nസൈറ്റ്‌വ്യാപക സി.എസ്.എസ്./ജെ.എസ്./ജെസൺ പ്രമാണങ്ങൾ തിരുത്താനുള്ള അവകാശം സമീപകാലത്ത് <code>editinterface</code> അവകാശത്തിൽനിന്നും വേർപെടുത്തിയതാണ്. ഈ പിഴവ് എന്തുകൊണ്ടാണ് പ്രദർശിക്കപ്പെടുന്നതെന്ന് താങ്കൾക്ക് മനസ്സിലാകുന്നില്ലെങ്കിൽ [[mw:MediaWiki_1.32/interface-admin]] കാണുക.",
index 5664207..8b4341b 100644 (file)
        "autoblockedtext": "Alamat IP anda telah disekat secara automatik kerana ia telah digunakan oleh pengguna lain, yang telah disekat oleh $1.\nSebab yang diberikan ialah:\n\n:<em>$2</em>\n\n* Mula sekatan: $8\n* Tarikh mansuh sekatan: $6\n* Pengguna sasaran: $7\n\nAnda boleh menghubungi $1 atau salah seorang [[{{MediaWiki:Grouppage-sysop}}|penyelia]] yang lain untuk membincangkan sekatan tersebut.\n\nSila ambil perhatian bahawa anda tidak boleh menggunakan ciri \"{{int:emailuser}}\" kecuali anda mempunyai alamat e-mel yang sah yang didaftarkan dalam [[Special:Preferences|keutamaan pengguna]] anda dan anda tidak disekat dari menggunakannya.\n\nAlamat IP semasa anda ialah $3, dan ID sekatan ialah #$5.\nSila sertakan semua butiran di atas dalam sebarang pertanyaan yang anda buat.",
        "systemblockedtext": "Nama pengguna atau alamat IP anda telah diblok secara automatik oleh MediaWiki. Alasan diberikan ialah:\n\n:<em>$2</em>\n\n* Mula blok: $8\n* Luput blok: $6\n* Yang diblok yang dimaksudkan: $7\n\nAlamat IP anda sekarang ialah $3.\nSila sertakan butiran di atas dalam sebarang pertanyaan yang anda buat.",
        "blockednoreason": "tiada sebab diberikan",
-       "blockedtext-composite": "<strong>Nama pengguna atau alamat IP anda telah disekat.</strong>\n\nSebab yang diberikan ialah:\n\n:<em>$2</em>.\n\n* Mula sekatan: $8\n* Tarikh mansuh sekatan terpanjang: $6\n\nAlamat IP semasa anda ialah $3.\nSila sertakan semua butiran di atas dalam sebarang pertanyaan yang anda buat.",
+       "blockedtext-composite": "<strong>Nama pengguna atau alamat IP anda telah disekat.</strong>\n\nSebab yang diberikan ialah:\n\n:<em>$2</em>.\n\n* Mula sekatan: $8\n* Tarikh mansuh sekatan terpanjang: $6\n\n* $5\n\nAlamat IP semasa anda ialah $3.\nSila sertakan semua butiran di atas dalam sebarang pertanyaan yang anda buat.",
        "blockedtext-composite-reason": "Terdapat sekatan berganda terhadap akaun dan/atau alamat IP anda.",
        "whitelistedittext": "Anda hendaklah $1 terlebih dahulu untuk menyunting laman.",
        "confirmedittext": "Anda perlu mengesahkan alamat e-mel anda terlebih dahulu untuk menyunting mana-mana laman. Sila tetapkan dan sahkan alamat e-mel anda melalui [[Special:Preferences|laman keutamaan]].",
index 3f36ff2..088c2e8 100644 (file)
        "blockedtitle": "အသုံးပြုသူကို ပိတ်ပင်ထားသည်",
        "blockedtext": "<strong>သင်၏ အသုံးပြုသူအမည် သို့မဟုတ် အိုင်ပီလိပ်စာသည် ပိတ်ပင်ခြင်း ခံထားရသည်။</strong>\n\nဤပိတ်ပင်မှုအား $1 က ဆောင်ရွက်ခဲ့သည်။\nအကြောင်းရင်းမှာ <em>$2</em> ဖြစ်သည်။\n\n* ပိတ်ပင်ခြင်း စတင်ချိန်: $8\n* ပိတ်ပင်ခြင်း သက်တမ်းကုန်ချိန်: $6\n* ရည်ရွယ်ရာ blockee: $7\n\nသင်သည် ပိတ်ပင်မှုအတွက် ဆွေးနွေးရန် $1 သို့မဟုတ် အခြား [[{{MediaWiki:Grouppage-sysop}}|စီမံခန့်ခွဲသူ]] အား ဆက်သွယ်နိုင်သည်။\nသင့်အနေဖြင့် [[Special:Preferences|အကောင့်၏ ရွေးချယ်စရာများ]]ထဲတွင် ရေရာသော အီးမေးလိပ်စာအား မထည့်သွင်းထားပါက \"{{int:emailuser}}\" လုပ်ဆောင်ချက်ကို အသုံးပြုနိုင်မည် မဟုတ်ပါ။ အလားတူ ယင်းလုပ်ဆောင်ချက်ကို ပိတ်ပင်မခံရမှ လုပ်ဆောင်နိုင်မည်ဖြစ်သည်။\nသင်၏ လက်ရှိ အိုင်ပီလိပ်စာမှာ $3 ဖြစ်ပြီး၊ ပိတ်ပင်မှုအိုင်ဒီမှာ #$5 ဖြစ်သည်။\nသင်ပြုလုပ်မည့် စုံစမ်းမေးမြန်းမှုများတွင် အထက်ပါ အချက်များ အားလုံး ပါဝင်နေပါစေ။",
        "blockednoreason": "အကြောင်းပြချက် မပေးထားပါ",
-       "blockedtext-composite": "<strong>သင်၏အသုံးပြုသူအမည် သို့ အိုင်ပီလိပ်စာကို ပိတ်ပင်ထားပါသည်။</strong>\n\nပေးထားသော အကြောင်းပြချက်မှာ:\n\n:<em>$2</em>။\n\n* စတင်ပိတ်ပင်ခြင်း: $8\n* ပိတ်ပင်မှု ကုန်ဆုံးရက်: $6\n\nသင်၏လက်ရှိအိုင်ပီလိပ်စာမှာ $3 ဖြစ်သည်။\nသင် တောင်းဆိုချက်များလုပ်ဆောင်ပါက အထက်ပါအချက်အလက်များကို ထည့်သွင်းပါ။",
+       "blockedtext-composite": "<strong>သင်၏အသုံးပြုသူအမည် သို့ အိုင်ပီလိပ်စာကို ပိတ်ပင်ထားပါသည်။</strong>\n\nပေးထားသော အကြောင်းပြချက်မှာ:\n\n:<em>$2</em>။\n\n* စတင်ပိတ်ပင်ခြင်း: $8\n* ပိတ်ပင်မှု ကုန်ဆုံးရက်: $6\n\n* $5\n\nသင်၏လက်ရှိအိုင်ပီလိပ်စာမှာ $3 ဖြစ်သည်။\nသင် တောင်းဆိုချက်များလုပ်ဆောင်ပါက အထက်ပါအချက်အလက်များကို ထည့်သွင်းပါ။",
+       "blockedtext-composite-reason": "သင်၏အကောင့် သို့မဟုတ် အိုင်ပီလိပ်စာနှင့်ပတ်သက်၍ တားဆီးမှုများစွာ ရှိနေသည်",
        "whitelistedittext": "စာမျက်နှာများကို တည်းဖြတ်ရန် $1ရမည်။",
        "nosuchsectiontitle": "အပိုင်းကို ရှာမရနိုင်ပါ",
        "loginreqtitle": "လော့ဂ်အင်ဝင်ထားရန် လိုသည်",
        "yourtext": "သင့်စာသား",
        "storedversion": "သိမ်းဆည်းထားသောမူ",
        "editingold": "<strong>သတိပေးချက်: သင်သည် ဤစာမျက်နှာ၏ ခေတ်နောက်ကျသောမူကို တည်းဖြတ်နေခြင်းဖြစ်သည်။</strong>\nသိမ်းဆည်းလိုက်ပါက ယခင်မူဟောင်းမှ မည်သည့်ပြောင်းလဲချက်များမဆို ပျောက်ဆုံးသွားမည်ဖြစ်သည်။",
+       "unicode-support-fail": "သင်၏ဘရောက်ဆာမှာ ယူနီကုဒ်ကို မထောက်ပံ့ထားသကဲ့သို့ဖြစ်နေသည်။ စာမျက်နှာမျယးကိုတည်းဖြတ်ရန် ယင်းအား လိုအပ်ပါသည်၊ သင်၏တည်းဖြတ်မှုများ မသိမ်းဆည်းပါ။",
        "yourdiff": "ကွဲပြားချက်များ",
        "copyrightwarning": "{{SITENAME}} တွင် ရေးသားမှုအားလုံးကို $2 အောက်တွင် ဖြန့်ဝေရန် ဆုံးဖြတ်ပြီး ဖြစ်သည်ကို ကျေးဇူးပြု၍ သတိပြုပါ။။ (အသေးစိတ်ကို $1 တွင်ကြည့်ပါ။)\nအကယ်၍ သင့်ရေးသားချက်များကို အညှာအတာမရှိ တည်းဖြတ်ခံရခြင်း၊ စိတ်တိုင်းကျ ဖြန့်ဝေခံရခြင်းတို့ကို အလိုမရှိပါက ဤနေရာတွင် မတင်ပါနှင့်။<br />\nသင်သည် ဤဆောင်းပါးကို သင်ကိုယ်တိုင်ရေးသားခြင်း၊ သို့မဟုတ် အများပြည်သူဆိုင်ရာဒိုမိန်းများ၊ ယင်းကဲ့သို့ လွတ်လပ်သည့် ရင်းမြစ်မှ ကူးယူထားခြင်း ဖြစ်ကြောင်းလည်း ဝန်ခံ ကတိပြုပါသည်။\n<strong>မူပိုင်ခွင့်ရှိသော စာ၊ပုံများကို ခွင့်ပြုချက်မရှိဘဲ မတင်ပါနှင့်။</strong>",
        "copyrightwarning2": "{{SITENAME}} တွင် ရေးသားမှုအားလုံးသည် အခြားပုံပိုးသူများ၏ တည်းဖြတ်၊ ပြောင်းလဲ၊ ဖယ်ရှားခံရနိုင်သည်ကို သတိပြုပါ။\nအကယ်၍ သင့်ရေးသားချက်များကို အညှာအတာမရှိ တည်းဖြတ်ခံရခြင်း၊ စိတ်တိုင်းကျ ဖြန့်ဝေခံရခြင်းတို့ကို အလိုမရှိပါက ဤနေရာတွင် မတင်ပါနှင့်။<br />\nသင်သည် ဤဆောင်းပါးကို သင်ကိုယ်တိုင်ရေးသားခြင်း၊ သို့မဟုတ် အများပြည်သူဆိုင်ရာဒိုမိန်းများ၊ ယင်းကဲ့သို့ လွတ်လပ်သည့် ရင်းမြစ်မှ ကူးယူထားခြင်း ဖြစ်ကြောင်းလည်း ဝန်ခံ ကတိပြုပါသည် (အသေးစိတ်ကို $1 တွင်ကြည့်ပါ)။\n<strong>မူပိုင်ခွင့်ရှိသော စာ၊ပုံများကို ခွင့်ပြုချက်မရှိဘဲ မတင်ပါနှင့်။</strong>",
        "ipbreason-dropdown": "*ယေဘုယျ ပိတ်ပင်တားဆီးရခြင်း အကြောင်းပြချက်များ\n** မှားယွင်းအချက်အလက်များကို ထည့်သွင်းမှု\n** စာမျက်နှာများမှ အကြောင်းအရာကို ဖယ်ရှားမှု\n** ပြင်ပဆိုဒ်များသို့လင့်ခ်ချိတ်၍ ဖွမှု\n** စာမျက်နှာများတွင် ပေါက်တတ်ကရများ ထည့်သွင်းမှု\n** ခြိမ်းခြောက်ခြင်း အပြုအမူ/အနှောက်အယှက်ပေးခြင်း\n** အကောင့်များစွာကို အလွဲသုံးစားလုပ်မှု\n** လက်ခံနိုင်ဖွယ်မရှိသော အသုံးပြုသူအမည်",
        "ipb-hardblock": "ဤအိုင်ပီလိပ်စာမှ လော့ဂ်အင်ဝင်ထားသော အသုံးပြုသူများကို တည်းဖြတ်ခြင်းမှ တားမြစ်ရန်",
        "ipbcreateaccount": "အကောင့်ဖန်တီးခြင်း",
-       "ipbemailban": "á\80¡á\80®á\80¸á\80\99á\80±á\80¸á\80\9cá\80ºá\80\95á\80­á\80¯á\80·á\80\94á\80±á\80\9eá\80\8aá\80º",
+       "ipbemailban": "á\80¡á\80®á\80¸á\80\99á\80±á\80¸á\80\9cá\80ºá\80\95á\80­á\80¯á\80·á\80\81á\80¼á\80\84á\80ºá\80¸",
        "ipbenableautoblock": "ဤအသုံးပြုသူ အသုံးပြုသော အိုင်ပီလိပ်စာနှင့် သူတို့ ပြင်ဆင်ရန် ကြိုးစားသည့် နောက်ဆက်တွဲ အိုင်ပီလိပ်စာများကိုပါ အလိုအလျောက်ပိတ်ပင်ရန်",
        "ipbsubmit": "ဤအသုံးပြုသူကို ပိတ်ပင်ရန်",
        "ipbother": "အခြားအချိန်:",
        "ipboptions": "၂ နာရီ:2 hours,၁ ရက်:1 day,၃ ရက်:3 days,၁ ပတ်:1 week,၂ ပတ်:2 weeks,၁ လ:1 month,၃ လ:3 months,၆ လ:6 months,၁ နှစ်:1 year,အနန္တ:infinite",
        "ipbhidename": "အသုံးပြုသူအမည်ကို တည်းဖြတ်မှုများနှင့် စာရင်းမှထဲတွင် ဝှက်ထားရန်",
        "ipbwatchuser": "ဤအသုံးပြုသူ၏ စာမျက်နှာနှင့် ဆွေးနွေးချက်တို့ကို စောင့်ကြည့်ရန်",
-       "ipb-disableusertalk": "သူတို့၏ ကိုယ်ပိုင်ဆွေးနွေးချက် စာမျက်နှာကို ပြင်ဆင်ခြင်းနေသည်",
+       "ipb-disableusertalk": "သူတို့၏ ကိုယ်ပိုင်ဆွေးနွေးချက် စာမျက်နှာကို ပြင်ဆင်ခြင်း",
        "ipb-change-block": "အသုံးပြုသူအား ဤအပြင်အဆင်များဖြင့် ထပ်မံပိတ်ပင်ရန်",
        "ipb-confirm": "ပိတ်ပင်မှုကို အတည်ပြု",
        "ipb-partial": "တစ်စိတ်တစ်ပိုင်း",
        "ipb-blocklist": "ရှိနှင့်ပြီးသား ပိတ်ပင်မှုများကို ကြည့်ရန်",
        "ipb-blocklist-contribs": "{{GENDER:$1|$1}} အတွက် ဆောင်ရွက်ချက်များ",
        "ipb-blocklist-duration-left": "$1 ကျန်ရှိ",
+       "block-actions": "ပိတ်ပင်ရန် ဆောင်ရွက်ချက်များ:",
        "block-expiry": "သက်တမ်းကုန်လွန်ရက် -",
        "block-prevent-edit": "တည်းဖြတ်ခြင်း",
        "block-reason": "အ​ကြောင်း​ပြ​ချက်:",
        "watchlistedit-normal-explain": "သင်၏ စောင့်ကြည့်စာရင်းရှိ ခေါင်းစဉ်များကို အောက်တွင် ပြသထားသည်။\nခေါင်းစဉ်တစ်ခုကို ဖယ်ရှားရန် ထိုခေါင်းစဉ်ဘေးရှိ အကွက်တွင် အမှန်ခြစ်ပြီး \"{{int:Watchlistedit-normal-submit}}\" ကိုနှိပ်ပါ။\n[[Special:EditWatchlist/raw|စောင့်ကြည့်စာရင်း အကြမ်း]]ကိုလည်း ကြည့်နိုင်ပါသည်။",
        "watchlistedit-normal-submit": "ခေါင်းစဉ်များကို ဖယ်ရှားရန်",
        "watchlistedit-normal-done": "{{PLURAL:$1|ခေါင်းစဉ်တစ်ခု|ခေါင်းစဉ် $1 ခုတို့}}ကို သင်၏ စောင့်ကြည့်စာရင်းမှ ဖယ်ရှားပြီးပြီ:",
+       "watchlistedit-raw-title": "စောင့်ကြည့်စာရင်း အကြမ်းကို တည်းဖြတ်ရန်",
+       "watchlistedit-raw-legend": "စောင့်ကြည့်စာရင်း အကြမ်းကို တည်းဖြတ်ရန်",
+       "watchlistedit-raw-explain": "သင်၏ စောင့်ကြည့်စာရင်းကို အောက်တွင်ဖော်ပြထားသည်၊ မျဉ်းကြောင်းတစ်ခုလျင် ခေါင်းစဉ်တစ်ခုချင်းစီ စာရင်းမှ ပေါင်းထည့်/ဖယ်ရှားခြင်းဖြင့် တည်းဖြတ်နိုင်ပါသည်။ ပြီးပါက \"{{int:Watchlistedit-raw-submit}}\" ကိုနှိပ်ပါ။ [[Special:EditWatchlist|စံနှုန်း အယ်ဒီတာ]]ကိုလည်း အသုံးပြုနိုင်ပါသည်။",
        "watchlistedit-raw-titles": "ခေါင်းစဉ်များ -",
        "watchlistedit-raw-submit": "စောင့်ကြည့်စာရင်းကို မွမ်းမံရန်",
        "watchlistedit-raw-done": "သင်၏ စောင့်ကြည့်စာရင်းကို မွမ်းမံပြီးဖြစ်သည်။",
        "specialpage-securitylevel-not-allowed-title": "ခွင့်မပြုပါ",
        "cannotauth-not-allowed-title": "ခွင့်ပြုချက် ငြင်းပယ်လိုက်သည်",
        "cannotauth-not-allowed": "သင်သည် ဤစာမျက်နှာကို အသုံးပြုခွင့်မရှိပါ",
+       "changecredentials": "အထောက်အထားများကို ပြောင်းလဲရန်",
+       "changecredentials-submit": "အထောက်အထားများကို ပြောင်းလဲရန်",
+       "credentialsform-provider": "အထောက်အထားများ အမျိုးစား:",
        "credentialsform-account": "အကောင့်နာမည်-",
        "userjsispublic": "ကျေးဇူးပြု၍ မှတ်သားပါ- JavaScript စာမျက်နှာခွဲများတွင် အခြားအသုံးပြုသူများ ကြည့်ရှုနိုင်သော လျို့ဝှက်အပ်သည့်အချက်အလက် မပါဝင်သင့်ပါ။",
        "edit-error-short": "အမှား - $1",
index fb5a296..496bb0c 100644 (file)
        "autoblockedtext": "Din IP-adresse har blitt automatisk blokkert fordi den ble brukt av en annen bruker som ble blokkert av $1.\nDen oppgitte grunnen var:\n\n:'''$2'''\n\n* Blokkeringen begynte: $8\n* Blokkeringen utgår: $6\n* Blokkeringen er ment for: $7\n\nDu kan kontakte $1 eller en av de andre [[{{MediaWiki:Grouppage-sysop}}|administratorene]] for å diskutere blokkeringen.\n\nMerk at du ikke kan bruke «{{int:emailuser}}»-funksjonen med mindre du har registrert en gyldig e-postadresse i [[Special:Preferences|innstillingene dine]].\n\nDin IP-adresse er $3, og blokkerings-ID-en er #$5.\nVennligst ta med all denne informasjonen ved henvendelser.",
        "systemblockedtext": "Ditt brukernavn eller IP-adresse har blitt blokkert automatisk av MediaWiki.\n\nBlokkeringen grunnes:\n\n:<em>$2</em>\n\n* Blokkeringen startet: $8\n* Blokkeringen gjelder til: $6\n* Blokkeringen er ment for: $7\n\nDin nåværende IP-adresse er $3.\nVennligst inkluder informasjonen over i alle spørsmål du spør angående dette.",
        "blockednoreason": "ingen grunn gitt",
-       "blockedtext-composite": "<strong>Brukernavnet ditt eller IP-adressa di har blitt blokkert.</strong>\n\nBlokkeringen grunnes:\n\n:<em>$2</em>\n\n* Blokkeringen startet: $8\n* Blokkeringen løper ut: $6\n\nIP-adressa di er $3.\nVennligst inkluder alle detaljene ovenfor i spørsmål du måtte ha angående dette.",
+       "blockedtext-composite": "<strong>Brukernavnet ditt eller IP-adressa di har blitt blokkert.</strong>\n\nBlokkeringen grunnes:\n\n:<em>$2</em>\n\n* Blokkeringen startet: $8\n* Blokkeringen løper ut: $6\n\n* $5\n\nIP-adressa di er $3.\nVennligst inkluder alle detaljene ovenfor i spørsmål du måtte ha angående dette.",
        "blockedtext-composite-reason": "Det foreligger flere blokkeringer på din konto og/eller IP-adresse",
        "whitelistedittext": "Du må $1 for å redigere artikler.",
        "confirmedittext": "Du må bekrefte e-postadressen din før du kan redigere sider. Vennligst oppgi og bekreft e-postadressen din via [[Special:Preferences|innstillingene dine]].",
        "specialmute-success": "Dempingsinnstillingene dine har blitt oppdatert. Se alle dempede brukere i [[Special:Preferences|innstillingene]].",
        "specialmute-submit": "Bekreft",
        "specialmute-label-mute-email": "Demp eposter fra denne brukeren",
-       "specialmute-header": "Velg dempingsinnstillenger som gjelder {{BIDI:[[User:$1|$1]]}}.",
+       "specialmute-header": "Velg dempingsinnstillenger som gjelder <b>{{BIDI:[[User:$1]]}}</b>.",
        "specialmute-error-invalid-user": "Det forespurte brukernavnet ble ikke funnet.",
-       "specialmute-error-email-blacklist-disabled": "Muligheten for å hindre enkeltbrukere fra å sende deg epost er ikke slått på.",
-       "specialmute-error-email-preferences": "Du må bekrefte epostadressa di før du kan dempe en bruker. Du kan gjøre det fra [[Special:Preferences|innstillingene]].",
        "specialmute-email-footer": "Besøk <$1> for å behandle epostinnstillingene som gjelder {{BIDI:$2}}.",
        "specialmute-login-required": "Logg inn for å endre dempingsinnstillingene dine.",
        "revid": "revisjon $1",
index de39a2e..10f26ab 100644 (file)
        "watchlistedit-raw-done": "Joew volglieste is bie-ewörken.",
        "watchlistedit-raw-added": "Der {{PLURAL:$1|is 1 zied|bin $1 ziejen}} bie edaon:",
        "watchlistedit-raw-removed": "Der {{PLURAL:$1|is 1 zied|bin $1 ziejen}} vortedaon:",
+       "watchlistedit-clear-done": "Juw volglyste is eleadigd.",
        "watchlisttools-clear": "Volglieste leegmaken",
        "watchlisttools-view": "Wiezigingen bekieken",
        "watchlisttools-edit": "Volglieste bekieken en bewarken",
index 34af306..7a7589c 100644 (file)
        "autoblockedtext": "Uw IP-adres is automatisch geblokkeerd, omdat het gebruikt is door een andere gebruiker, die geblokkeerd is door $1.\nDe opgegeven reden is:\n\n:''$2''\n\n* Aanvang blokkade: $8\n* Einde blokkade: $6\n* Bedoeld te blokkeren: $7\n\nU kunt contact opnemen met $1 of een andere [[{{MediaWiki:Grouppage-sysop}}|beheerder]] om de blokkade te bespreken.\n\nU kunt geen gebruik maken van de functie \"{{int:emailuser}}\", tenzij u een geldig e-mailadres hebt opgegeven in uw [[Special:Preferences|voorkeuren]], en het gebruik van deze functie niet is geblokkeerd.\n\nUw huidige IP-adres is $3 en het blokkadenummer is #$5.\nVermeld alle bovenstaande gegevens als u ergens op deze blokkade reageert.",
        "systemblockedtext": "Uw gebruikersaccount of IP-adres is automatisch geblokkeerd door MediaWiki.\nDe opgegeven reden is:\n\n:<em>$2</em>\n\n* Aanvang blokkade: $8\n* Einde blokkade: $6\n* Bedoeld te blokkeren: $7\n\nUw huidige IP-adres is $3.\nVermeld alle bovenstaande gegevens als u ergens op deze blokkade reageert.",
        "blockednoreason": "geen reden opgegeven",
-       "blockedtext-composite": "Uw gebruikersaccount of IP-adres is geblokkeerd.\n\nDe opgegeven reden is:\n\n:<em>$2</em>\n\n* Aanvang blokkade: $8\n* Einde van de langste blokkade: $6\n\nUw huidige IP-adres is $3.\nVermeld alle bovenstaande gegevens als u ergens op deze blokkade reageert.",
+       "blockedtext-composite": "Uw gebruikersaccount of IP-adres is geblokkeerd.\n\nDe opgegeven reden is:\n\n:<em>$2</em>\n\n* Aanvang blokkade: $8\n* Einde van de langste blokkade: $6\n\n* $5\n\nUw huidige IP-adres is $3.\nVermeld alle bovenstaande gegevens als u ergens op deze blokkade reageert.",
+       "blockedtext-composite-ids": "Relevante blokkade-IDs: $1 (uw IP-adres is mogelijk ook op een zwarte lijst geplaatst)",
+       "blockedtext-composite-no-ids": "Uw IP-adres bevindt zich in meerdere zwarte lijsten",
        "blockedtext-composite-reason": "Er zijn meerdere blokkades tegen uw account en/of IP-adres",
        "whitelistedittext": "U moet $1 om pagina's te bewerken.",
        "confirmedittext": "U moet uw e-mailadres bevestigen voor u kunt bewerken.\nVoer uw e-mailadres in en bevestig het via uw [[Special:Preferences|voorkeuren]].",
        "right-editmyusercss": "Uw eigen CSS-pagina's bewerken",
        "right-editmyuserjson": "Uw eigen JSON-pagina's bewerken",
        "right-editmyuserjs": "Uw eigen JavaScriptpagina's bewerken",
+       "right-editmyuserjsredirect": "Uw eigen doorverwijs-JavaScriptpagina's bewerken",
        "right-viewmywatchlist": "Uw eigen volglijst bekijken",
        "right-editmywatchlist": "Uw eigen volglijst bewerken. Via sommige handelingen kunnen nog steeds pagina's toegevoegd worden, zelfs zonder deze bevoegdheid",
        "right-viewmyprivateinfo": "Uw eigen privégegevens bekijken (bijvoorbeeld e-mailadres, echte naam)",
        "action-editmyusercss": "uw eigen CSS-pagina's te bewerken",
        "action-editmyuserjson": "uw eigen JSON-pagina's te bewerken",
        "action-editmyuserjs": "uw eigen JavaScriptpagina's te bewerken",
+       "action-editmyuserjsredirect": "ww eigen doorverwijs-JavaScriptpagina's te bewerken",
        "action-viewsuppressed": "versies verborgen voor elke gebruiker te bekijken",
        "action-hideuser": "een gebruiker voor de overige gebruikers te verbergen",
        "action-ipblock-exempt": "IP-blokkades, automatische blokkades en IP-bereik blokkades te omzeilen",
        "specialmute-success": "Uw voorkeuren voor het negeren zijn bijgewerkt. Bekijk een lijst met alle genegeerde gebruikers in [[Special:Preferences|uw voorkeuren]].",
        "specialmute-submit": "Bevestig",
        "specialmute-label-mute-email": "Negeer e-mails van deze gebruiker",
-       "specialmute-header": "Selecteer uw voorkeur voor het negeren van {{BIDI:[[User:$1]]}}.",
+       "specialmute-header": "Selecteer uw voorkeur voor het negeren van gebruiker <b>{{BIDI:[[User:$1|$1]]}}</b>.",
        "specialmute-error-invalid-user": "De ingevoerde gebruikersnaam kon niet worden gevonden.",
-       "specialmute-error-email-blacklist-disabled": "Het negeren van e-mails verstuurd door andere gebruikers is niet ingeschakeld.",
-       "specialmute-error-email-preferences": "U moet uw e-mailadres bevestigen voordat u een gebruiker kunt negeren. U kunt dit doen in [[Special:Preferences|uw voorkeuren]].",
-       "specialmute-email-footer": "Om uw e-mailvoorkeuren voor {{BIDI:$2}} te beheren gaat u naar <$1>.",
+       "specialmute-error-no-options": "De negeerfunctionaliteit is niet beschikbaar. Dit kan zijn omdat uw e-mailadres nog niet bevestigd is of omdat een administrator de e-mailfunctionaliteit en/of de zwarte lijst voor e-mails uitgeschakeld heeft.",
+       "specialmute-email-footer": "Om uw e-mailvoorkeuren voor gebruiker {{BIDI:$2}} te beheren gaat u naar <$1>.",
        "specialmute-login-required": "U moet aanmelden om voorkeuren voor het negeren van gebruikers in te stellen.",
+       "mute-preferences": "Negeervoorkeuren",
        "revid": "versie $1",
        "pageid": "Pagina-ID $1",
        "interfaceadmin-info": "$1\n\nRechten voor het bewerken van wikibrede CSS/JS/JSON-bestanden zijn recentelijk gescheiden van het <code>editinterface</code> recht. Als u niet begrijpt waarom u deze foutmelding te zien krijgt, ga dan naar [[mw:MediaWiki_1.32/interface-admin]].",
        "passwordpolicies-policy-passwordnotinlargeblacklist": "Wachtwoorden mogen niet voorkomen in de lijst met 100.000 veelvoorkomende wachtwoorden.",
        "passwordpolicies-policyflag-forcechange": "moet gewijzigd worden bij het aanmelden",
        "passwordpolicies-policyflag-suggestchangeonlogin": "raad wijzigen aan bij het aanmelden",
+       "mycustomjsredirectprotected": "U hebt geen rechten om deze JavaScriptpagina te bewerken omdat het een doorverwijzing is en deze niet verwijst naar een pagina in uw gebruikersruimte.",
+       "easydeflate-invaliddeflate": "De opgegeven inhoud is onjuist gecomprimeerd",
        "unprotected-js": "Vanwege veiligheidsredenen kan er geen JavaScript geladen worden vanaf onbeveiligde pagina's. Gelieve alleen JavaScript pagina's aan te maken in de MediaWiki: naamruimte of als een subpagina van een gebruikerspagina.",
        "userlogout-continue": "Wilt u zich afmelden?"
 }
index 446174f..7f5cefe 100644 (file)
        "watchlisttools-edit": "Vis og endre overvakingslista",
        "watchlisttools-raw": "Endre på overvakingslista i råformat",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|diskusjon]])",
-       "duplicate-defaultsort": "Åtvaring: Standardsorteringa «$2» tar over for den tidlegare sorteringa «$1».",
+       "duplicate-defaultsort": "<strong>Åtvaring:</strong> Standardsorteringa «$2» tar over for den tidlegare sorteringa «$1».",
        "restricted-displaytitle": "<strong>Åtvaring:</strong> Visingstittelen «$1» vart sett bort frå sidan han ikkje svarar til den faktiske tittelen til sida.",
        "version": "Versjon",
        "version-extensions": "Installerte utvidingar",
index cc77368..522fbb7 100644 (file)
        "autoblockedtext": "Ten adres IP został zablokowany automatycznie, gdyż korzysta z niego inny użytkownik, zablokowany przez administratora $1.\nPowód blokady:\n\n:<em>$2</em>\n\n* Początek blokady: $8\n* Wygaśnięcie blokady: $6\n* Zablokowany został: $7\n\nMożesz skontaktować się z $1 lub jednym z pozostałych [[{{MediaWiki:Grouppage-sysop}}|administratorów]] w celu uzyskania informacji o blokadzie.\n\nNie możesz użyć funkcji „{{int:emailuser}}”, jeśli brak jest poprawnego adresu e‐mail w Twoich [[Special:Preferences|preferencjach]] lub jeśli taka możliwość została Ci zablokowana.\n\nTwój obecny adres IP to $3, a numer identyfikacyjny blokady to #$5.\nProsimy o podanie obu tych numerów przy wyjaśnianiu blokady.",
        "systemblockedtext": "Twoja nazwa użytkownika lub adres IP zostały automatycznie zablokowane przez MediaWiki.\nPodany powód to:\n\n:<em>$2</em>\n\n* Początek blokady: $8\n* Wygaśnięcie blokady: $6\n* Zamierzano zablokować: $7\n\nTwój obecny adres IP to $3.\nProsimy o dołączenie powyższych szczegółów w jakichkolwiek zadawanych pytaniach.",
        "blockednoreason": "nie podano przyczyny",
-       "blockedtext-composite": "<strong>Twoja nazwa użytkownika lub adres IP zostały zablokowane.</strong>\n\nPodany powód to:\n\n:<em>$2</em>\n\n* Początek blokady: $8\n* Wygaśnięcie blokady: $6\n\nTwój obecny adres IP to $3.\nProsimy o dołączenie powyższych szczegółów w jakichkolwiek zadawanych pytaniach.",
+       "blockedtext-composite": "<strong>Twoja nazwa użytkownika lub adres IP zostały zablokowane.</strong>\n\nPodany powód to:\n\n:<em>$2</em>\n\n* Początek blokady: $8\n* Wygaśnięcie blokady: $6\n\n* $5\n\nTwój obecny adres IP to $3.\nProsimy o dołączenie powyższych szczegółów w jakichkolwiek zadawanych pytaniach.",
+       "blockedtext-composite-ids": "ID powiązanych blokad: $1 (twój adres IP może się także znajdować na czarnej liście)",
+       "blockedtext-composite-no-ids": "Twój adres IP znajduje się na wielu czarnych listach",
        "blockedtext-composite-reason": "Na twoje konto i/lub adresy IP nałożono wiele blokad.",
        "whitelistedittext": "Musisz $1, by edytować strony.",
        "confirmedittext": "Edytowanie jest możliwe dopiero po zweryfikowaniu adresu e‐mail.\nPodaj adres e‐mail i potwierdź go w swoich [[Special:Preferences|ustawieniach użytkownika]].",
        "search-interwiki-more": "(więcej)",
        "search-interwiki-more-results": "Więcej wyników",
        "search-relatedarticle": "Pokrewne",
+       "search-invalid-sort-order": "Kolejność sortowania $1 jest nierozpoznawana. Zastosowane zostanie domyślne sortowanie. Właściwymi kolejnościami są: $2",
        "searchrelated": "pokrewne",
        "searchall": "wszystkie",
        "showingresults": "Poniżej znajduje się lista {{PLURAL:$1|z '''1''' wynikiem|'''$1''' wyników}}, rozpoczynając od wyniku numer '''$2'''.",
        "right-editmyusercss": "Edycja własnych plików CSS",
        "right-editmyuserjson": "Edycja własnych plików JSON",
        "right-editmyuserjs": "Edycja własnych plików JavaScript",
+       "right-editmyuserjsredirect": "Edycja własnych plików JavaScript które są przekierowaniami",
        "right-viewmywatchlist": "Podgląd swojej listy obserwowanych stron",
        "right-editmywatchlist": "Edycja swojej listy obserwowanych stron. Niektóre akcje mogą dodawać strony do obserwowanych bez tego uprawnienia.",
        "right-viewmyprivateinfo": "Podgląd swoich prywatnych danych (np. adres e-mail, prawdziwe imię i nazwisko)",
        "action-editmyusercss": "edytowania własnych plików CSS",
        "action-editmyuserjson": "edytowania własnych plików JSON",
        "action-editmyuserjs": "edytowania własnych plików JavaScript",
+       "action-editmyuserjsredirect": "edytowania własnych plików JavaScript które są przekierowaniami",
        "action-viewsuppressed": "podglądu wersji ukrytych przed każdym użytkownikiem",
        "action-hideuser": "blokowania użytkownika i ukrywania go od publiczności",
        "action-ipblock-exempt": "obchodzenia blokad i blokad zakresów adresów IP",
        "specialmute-success": "Twoje preferencje ignorowania zostały zaktualizowane. Zobacz wszystkich ignorowanych użytkowników w [[Special:Preferences|swoich preferencjach]].",
        "specialmute-submit": "Potwierdź",
        "specialmute-label-mute-email": "Ignoruj e-maile od tego użytkownika",
-       "specialmute-header": "Wybierz swoje preferencje ignorowania dla {{BIDI:[[User:$1]]}}.",
+       "specialmute-header": "Wybierz swoje preferencje ignorowania dla {{GENDER:$1|użytkownika|użytkowniczki}} <b>{{BIDI:[[User:$1|$1]]}}</b>.",
        "specialmute-error-invalid-user": "Pożądana nazwa użytkownika nie została odnaleziona.",
-       "specialmute-error-email-blacklist-disabled": "Ignorowanie e-maili od użytkowników nie jest włączone.",
-       "specialmute-error-email-preferences": "Musisz potwierdzić swój adres e-mail zanim będziesz {{GENDER:|mógł|mogła}} ignorować użytkownika. Możesz to zrobić w [[Special:Preferences|preferencjach]].",
-       "specialmute-email-footer": "Aby zarządzać preferencjami ignorowania dla {{BIDI:$2}} odwiedź <$1>.",
+       "specialmute-error-no-options": "Funkcje wyciszania są niedostępne. Jest tak dlatego że nie {{GENDER:|potwierdziłeś|potwierdziłaś}} swojego adresu e-mail, administrator wiki wyłączył funkcję wysyłania maili i/lub czarną listę adresów e-mail dla tej wiki.",
+       "specialmute-email-footer": "Aby zarządzać preferencjami ignorowania dla {{GENDER:$2|użytkownika|użytkowniczki}} {{BIDI:$2}} odwiedź <$1>.",
        "specialmute-login-required": "Zaloguj się, aby zmienić swoje preferencje wyignorowania.",
+       "mute-preferences": "Ustawienia ignorowania",
        "revid": "wersja $1",
        "pageid": "ID strony: $1",
        "interfaceadmin-info": "$1\n\nUprawnienia do edycji plików CSS/JS/JSON całej witryny zostały wydzielone z dotychczasowego uprawnienia <code>editinterface</code>. Jeżeli nie rozumiesz, dlaczego otrzymujesz ten komunikat, przeczytaj [[mw:MediaWiki_1.32/interface-admin]].",
        "passwordpolicies-policy-passwordnotinlargeblacklist": "Hasło nie może znajdować się na liście 100 000 najczęściej używanych haseł.",
        "passwordpolicies-policyflag-forcechange": "musi zmienić po zalogowaniu",
        "passwordpolicies-policyflag-suggestchangeonlogin": "sugerowana zmiana po zalogowaniu",
+       "mycustomjsredirectprotected": "Nie masz uprawnień do edytowania tej strony JavaScript ponieważ jest ona przekierowaniem i nie wchodzi w skład twojej przestrzeni użytkownika.",
        "easydeflate-invaliddeflate": "Dostarczona zawartość nie jest poprawnie skompresowana",
        "unprotected-js": "Ze względów bezpieczeństwa kod JavaScript nie może zostać załadowany z niezabezpieczonych stron. Prosimy dodawać JavaScript w przestrzeni MediaWiki lub jako podstronę strony użytkownika.",
        "userlogout-continue": "Chcesz się wylogować?"
index 18d850a..d96cbbe 100644 (file)
        "autoblockedtext": "O seu endereço IP foi bloqueado de forma automática porque foi utilizado recentemente por outro usuário, o qual foi bloqueado por $1.\nO motivo apresentado foi:\n\n:<em>$2</em>\n\n* Início do bloqueio: $8\n* Expiração do bloqueio: $6\n* Destinatário do bloqueio: $7\n\nPode contactar $1 ou outro [[{{MediaWiki:Grouppage-sysop}}|administrador]] para discutir o bloqueio.\n\nNote que para utilizar a funcionalidade \"{{int:emailuser}}\" precisa de ter um endereço de e-mail válido nas suas [[Special:Preferences|preferências]] e de não lhe ter sido bloqueado o uso desta funcionalidade.\n\nO seu endereço IP neste momento é $3 e a identificação (ID) do bloqueio é #$5.\nInclua todos os detalhes acima em quaisquer contatos relacionados com este bloqueio, por favor.",
        "systemblockedtext": "O seu nome de usuário ou endereço IP foram bloqueados automaticamente pelo MediaWiki.\nO motivo fornecido é:\n\n:<em>$2</em>\n\n* Início do bloqueio: $8\n* Expiração do bloqueio: $6\n* Destinatário do bloqueio: $7\n\nO seu endereço IP atual é $3.\nInclua todos os detalhes acima em quaisquer contatos sobre este assunto, por favor.",
        "blockednoreason": "sem motivo especificado",
-       "blockedtext-composite": "<strong>Seu nome de usuário ou endereço IP foi bloqueado.</strong>\n\nO motivo fornecido é:\n\n:<em>$2</em>.\n\n* Início do bloqueio: $8\n* Expiração do bloqueio mais longo: $6\n\nSeu endereço IP atual é $3.\nPor favor inclua todos os detalhes acima em qualquer questão que você faça.",
+       "blockedtext-composite": "<strong>Seu nome de usuário ou endereço IP foi bloqueado.</strong>\n\nO motivo fornecido é:\n\n:<em>$2</em>.\n\n* Início do bloqueio: $8\n* Expiração do bloqueio mais longo: $6\n\n* $5\n\nSeu endereço IP atual é $3.\nPor favor inclua todos os detalhes acima em qualquer questão que você faça.",
+       "blockedtext-composite-ids": "IDs de bloqueio relevantes: $1 (seu endereço IP também pode estar na lista negra)",
+       "blockedtext-composite-no-ids": "Seu endereço IP aparece em várias listas negras",
        "blockedtext-composite-reason": "Existem vários bloqueios contra sua conta e/ou endereço IP",
        "whitelistedittext": "Você precisa $1 para poder editar páginas.",
        "confirmedittext": "Você precisa confirmar o seu endereço de e-mail antes de começar a editar páginas.\nPor favor, introduza um e valide-o através das suas [[Special:Preferences|preferências de usuário]].",
        "search-interwiki-more": "(mais)",
        "search-interwiki-more-results": "Mais resultados",
        "search-relatedarticle": "Relacionado",
+       "search-invalid-sort-order": "A ordem de classificação de $1 não é reconhecida, a classificação padrão será aplicada. Ordens de classificação válidas são: $2",
+       "search-unknown-profile": "O perfil de pesquisa de $1 não é reconhecido, o perfil de pesquisa padrão será aplicado.",
        "searchrelated": "relacionados",
        "searchall": "todos",
        "showingresults": "A seguir {{PLURAL:$1|é mostrado '''um''' resultado|são mostrados até '''$1''' resultados}}, iniciando no '''$2'''º.",
        "right-editmyusercss": "Edite seu próprio arquivo CSS de usuário",
        "right-editmyuserjson": "Edite seus próprios arquivos JSON do usuário",
        "right-editmyuserjs": "Edite seu próprio arquivo JavaScript de usuário",
+       "right-editmyuserjsredirect": "Editar seus próprios arquivos JavaScript de usuários que são redirecionados",
        "right-viewmywatchlist": "Ver sua lista de vigiados",
        "right-editmywatchlist": "Editar sua lista de vigiados. Observe que algumas ações seguirão adicionando páginas, mesmo sem este direito.",
        "right-viewmyprivateinfo": "Ver seus próprios dados privados (por exemplo: endereço de e-mail, nome real)",
        "action-editmyusercss": "edite seus próprios arquivos CSS de usuário",
        "action-editmyuserjson": "editar seus próprios arquivos JSON do usuário",
        "action-editmyuserjs": "editar seus próprios arquivos JavaScript de usuário",
+       "action-editmyuserjsredirect": "editar seus próprios arquivos JavaScript de usuários que são redirecionados",
        "action-viewsuppressed": "ver revisões ocultas de qualquer usuário",
        "action-hideuser": "bloquear um nome de usuário, escondendo-o do público",
        "action-ipblock-exempt": "ignorar bloqueios IP, bloqueios automáticos e bloqueios de alcance",
        "specialmute-success": "Suas preferências de silêncio foram atualizadas com sucesso. Ver todos os usuários silenciados nas [[Special:Preferences|suas preferencias]].",
        "specialmute-submit": "Confirmar",
        "specialmute-label-mute-email": "Silenciar e-mails deste usuário",
-       "specialmute-header": "Por favor, selecione suas preferências de mudo para {{BIDI:[[User:$1]]}}.",
+       "specialmute-header": "Por favor, selecione suas preferências de silenciar para usuário <b>{{BIDI:[[User:$1|$1]]}}</b>.",
        "specialmute-error-invalid-user": "O nome de usuário solicitado não foi encontrado.",
-       "specialmute-error-email-blacklist-disabled": "O silenciamento de usuários do envio de e-mails não está ativado.",
-       "specialmute-error-email-preferences": "Você deve confirmar seu endereço de e-mail antes de poder silenciar um usuário. Você pode fazer isso de [[Special:Preferences]].",
-       "specialmute-email-footer": "Para gerenciar as preferências de e-mail para {{BIDI:$2}} por favor visite <$1>.",
+       "specialmute-error-no-options": "Os recursos de silenciar estão indisponíveis. Isso pode ser porque: você não confirmou seu endereço de e-mail ou o administrador da wiki desabilitou os recursos de e-mail e/ou lista negra de e-mail para este wiki.",
+       "specialmute-email-footer": "Para gerenciar as preferências de e-mail para usuário {{BIDI:$2}} por favor visite <$1>.",
        "specialmute-login-required": "Por favor, entre para alterar suas preferências de mudo.",
+       "mute-preferences": "Preferências do silenciador",
        "revid": "revisão $1",
        "pageid": "ID da página $1",
        "interfaceadmin-info": "$1\n\nAs permissões para edição de arquivos CSS/JS/JSON em todo o site foram separadas recentemente do direito <code>editinterface</code>. Se você não entende porque está recebendo este erro, veja [[mw:MediaWiki_1.32/interface-admin]].",
        "passwordpolicies-policy-passwordnotinlargeblacklist": "A senha não pode estar na lista de 100.000 senhas mais usadas.",
        "passwordpolicies-policyflag-forcechange": "deve mudar no login",
        "passwordpolicies-policyflag-suggestchangeonlogin": "sugerir mudança na entrada",
+       "mycustomjsredirectprotected": "Você não tem permissão para editar esta página JavaScript porque é um redirecionamento e não aponta dentro do seu espaço do usuário.",
        "easydeflate-invaliddeflate": "O conteúdo fornecido não está devidamente comprimido",
        "unprotected-js": "Por razões de segurança o JavaScript não pode ser carregado de páginas desprotegidas. Por favor, crie apenas javascript no MediaWiki: namespace ou como uma subpágina do usuário",
        "userlogout-continue": "Você quer sair?"
index 7863e0c..7756b2d 100644 (file)
        "autoblockedtext": "O seu endereço IP foi bloqueado de forma automática porque foi utilizado recentemente por outro utilizador, o qual foi bloqueado por $1.\nO motivo apresentado foi:\n\n:<em>$2</em>\n\n* Início do bloqueio: $8\n* Expiração do bloqueio: $6\n* Destinatário do bloqueio: $7\n\nPode contactar $1 ou outro [[{{MediaWiki:Grouppage-sysop}}|administrador]] para discutir o bloqueio.\n\nNote que para utilizar a funcionalidade \"{{int:emailuser}}\" precisa de ter um endereço de correio eletrónico válido nas suas [[Special:Preferences|preferências]] e de não lhe ter sido bloqueado o uso desta funcionalidade.\n\nO seu endereço IP neste momento é $3 e a identificação (ID) do bloqueio é #$5.\nInclua todos os detalhes acima em quaisquer contactos relacionados com este bloqueio, por favor.",
        "systemblockedtext": "O seu nome de utilizador ou endereço IP foram bloqueados automaticamente pelo MediaWiki.\nO motivo fornecido é:\n\n:<em>$2</em>\n\n* Início do bloqueio: $8\n* Expiração do bloqueio: $6\n* Destinatário do bloqueio: $7\n\nO seu endereço IP atual é $3.\nInclua todos os detalhes acima em quaisquer contactos sobre este assunto, por favor.",
        "blockednoreason": "sem motivo especificado",
-       "blockedtext-composite": "<strong>O seu nome de utilizador ou endereço IP foram bloqueados.</strong>\n\nO motivo fornecido é:\n\n:<em>$2</em>.\n\n* Início do bloqueio: $8\n* Expiração do bloqueio mais longo: $6\n\nO seu endereço IP atual é $3.\nInclua todos os detalhes acima em quaisquer contactos sobre este assunto, por favor.",
+       "blockedtext-composite": "<strong>O seu nome de utilizador ou endereço IP foram bloqueados.</strong>\n\nO motivo fornecido é:\n\n:<em>$2</em>.\n\n* Início do bloqueio: $8\n* Expiração do bloqueio mais longo: $6\n\n* $5\n\nO seu endereço IP atual é $3.\nInclua todos os detalhes acima em quaisquer contactos sobre este assunto, por favor.",
+       "blockedtext-composite-ids": "Identificadores de bloqueio relevantes: $1 (o seu endereço IP também pode estar na lista negra)",
+       "blockedtext-composite-no-ids": "O seu endereço IP aparece em várias listas negras",
        "blockedtext-composite-reason": "Existem vários bloqueios da sua conta ou endereço IP",
        "whitelistedittext": "Precisa de $1 para poder editar páginas.",
        "confirmedittext": "Precisa de confirmar o seu endereço de correio eletrónico antes de começar a editar páginas.\nIntroduza e valide o endereço através das suas [[Special:Preferences|preferências de utilizador]], por favor.",
        "search-interwiki-more": "(mais)",
        "search-interwiki-more-results": "mais resultados",
        "search-relatedarticle": "Relacionado",
+       "search-invalid-sort-order": "A ordenação $1 não é reconhecida, será aplicada a ordenação padrão. As ordenações válidas são: $2",
+       "search-unknown-profile": "O perfil de pesquisa $1 não é reconhecido, será aplicado o perfil de pesquisa padrão.",
        "searchrelated": "relacionados",
        "searchall": "todos",
        "showingresults": "{{PLURAL:$1|É apresentado <strong>um</strong> resultado|São apresentados até <strong>$1</strong> resultados}} abaixo{{PLURAL:$1||, começando pelo <strong>$2</strong>º}}.",
        "right-editmyusercss": "Editar os seus próprios ficheiros CSS de utilizador",
        "right-editmyuserjson": "Editar os ficheiros JSON do próprio utilizador",
        "right-editmyuserjs": "Editar os seus próprios ficheiros JavaScript de utilizador",
+       "right-editmyuserjsredirect": "Editar os seus próprios ficheiros JavaScript de utilizador que são redirecionamentos",
        "right-viewmywatchlist": "Ver a sua lista de páginas vigiadas",
        "right-editmywatchlist": "Editar a sua própria lista de páginas vigiadas. Observe que algumas ações continuaram a adicionar páginas, mesmo sem este direito.",
        "right-viewmyprivateinfo": "Ver os seus próprios dados privados (ex.: endereço de correio eletrónico, nome real)",
        "action-editmyusercss": "editar os seus próprios ficheiros CSS de utilizador",
        "action-editmyuserjson": "editar os seus próprios ficheiros JSON de utilizador",
        "action-editmyuserjs": "editar os seus próprios ficheiros JavaScript de utilizador",
+       "action-editmyuserjsredirect": "editar os seus próprios ficheiros JavaScript de utilizador que são redirecionamentos",
        "action-viewsuppressed": "ver revisões ocultadas de todos os utilizadores",
        "action-hideuser": "bloquear um nome de utilizador, escondendo-o do público",
        "action-ipblock-exempt": "contornar bloqueios de IP, bloqueios automáticos e bloqueios de gamas de IP",
        "edit-error-short": "Erro: $1",
        "edit-error-long": "Erros:\n\n$1",
        "specialmute": "Silenciamento",
-       "specialmute-success": "As suas preferências de silenciamento foram atualizadas. Ver todos os utilizadores silenciados em [[Special:Preferences]].",
+       "specialmute-success": "As suas preferências de silenciamento foram atualizadas. Ver todos os utilizadores silenciados nas [[Special:Preferences|suas preferências]].",
        "specialmute-submit": "Confirmar",
        "specialmute-label-mute-email": "Silenciar os correios eletrónicos deste utilizador",
-       "specialmute-header": "Selecione as suas preferências de silenciamento para {{BIDI:[[User:$1]]}}, por favor.",
+       "specialmute-header": "Selecione as suas preferências de silenciamento para o utilizador <b>{{BIDI:[[User:$1|$1]]}}</b>, por favor.",
        "specialmute-error-invalid-user": "Não foi possível encontrar o nome de utilizador pedido.",
-       "specialmute-error-email-blacklist-disabled": "O silenciamento de utilizadores para impedi-los de enviar-lhe correio eletrónico não está ativado.",
-       "specialmute-error-email-preferences": "Tem de confirmar o seu endereço de correio eletrónico antes de poder silenciar um utilizador. Pode fazê-lo em [[Special:Preferences]].",
-       "specialmute-email-footer": "Para gerir as preferências de correio eletrónico de {{BIDI:$2}} visite <$1>, por favor.",
+       "specialmute-error-no-options": "As funcionalidades de silenciamento estão indisponíveis. Isto pode ser porque: não confirmou o seu endereço de correio eletrónico ou o administrador da wiki desativou as funcionalidades de correio eletrónico e/ou a lista negra de endereços de correio eletrónico para esta wiki.",
+       "specialmute-email-footer": "Para gerir as preferências de correio eletrónico do utilizador {{BIDI:$2}} visite <$1>, por favor.",
        "specialmute-login-required": "Para alterar as suas preferências de silenciamento, inicie uma sessão, por favor.",
+       "mute-preferences": "Preferências de silenciamento",
        "revid": "revisão $1",
        "pageid": "identificador de página $1",
        "interfaceadmin-info": "$1\n\nAs permissões de edição de ficheiros CSS/JS/JSON que afetam todo o ''site'' foram recentemente separadas do privilégio <code>editinterface</code>. Se não compreende porque está a receber este erro, consulte [[mw:MediaWiki_1.32/interface-admin]].",
        "passwordpolicies-policy-passwordnotinlargeblacklist": "A palavra-passe não pode constar na lista das 100 000 palavras-passe usadas com mais frequência.",
        "passwordpolicies-policyflag-forcechange": "deve mudar ao iniciar sessão",
        "passwordpolicies-policyflag-suggestchangeonlogin": "sugerir alteração ao iniciar sessão",
+       "mycustomjsredirectprotected": "Não tem autorização para editar esta página de JavaScript porque ela é um redirecionamento e não aponta para o interior do seu espaço do utilizador.",
        "easydeflate-invaliddeflate": "O conteúdo fornecido não está devidamente comprimido",
        "unprotected-js": "Por motivos de segurança o JavaScript de páginas desprotegidas não pode ser carregado. Crie javascript só no espaço nominal/domínio MediaWiki: ou numa subpágina do utilizador",
        "userlogout-continue": "Quer sair?"
index a58010e..081bb66 100644 (file)
        "search-interwiki-more": "{{Identical|More}}",
        "search-interwiki-more-results": "Label for a link that leads to more search results from a given wiki.",
        "search-relatedarticle": "This is a search result (and I guess search engine) dependent messages. I do not know how to trigger the feature. The message is displayed if the search result contains information that related pages can also be provided from the search engine. I assume this is \"More Like This\" functionality. Microsoft glossary defines MLT as \"A way to refine search by identifying the right set of documents and then locating similar documents. This allows the searcher to control the direction of the search and focus on the most fruitful lines of inquiry.\"[http://www.microsoft.com/enterprisesearch/en/us/search-glossary.aspx]\n{{Identical|Related}}",
+       "search-invalid-sort-order": "Warning displayed on Special:Search when an unrecognized sorting order is requested.",
+       "search-unknown-profile": "Warning displayed on Special:Search when an unrecognized search profile is requested.",
        "searchrelated": "This is a search result (and I guess search engine) dependent messages. I do not know how to trigger the feature. The message is displayed if the search result contains information that related pages can also be provided from the search engine. I assume this is \"More Like This\" functionality. Microsoft glossary defines MLT as \"A way to refine search by identifying the right set of documents and then locating similar documents. This allows the searcher to control the direction of the search and focus on the most fruitful lines of inquiry.\"[http://www.microsoft.com/enterprisesearch/en/us/search-glossary.aspx]\n{{Identical|Related}}",
        "searchall": "{{Identical|All}}",
        "showingresults": "This message is used on some special pages such as [[Special:WantedCategories]]. Parameters:\n* $1 - the total number of results in the batch shown\n* $2 - the number of the first item listed\nSee also:\n* {{msg-mw|Showingresultsnum}}",
        "right-editsitejs": "{{doc-right|editsitejs}}",
        "right-editmyusercss": "{{doc-right|editmyusercss}}\nSee also:\n* {{msg-mw|Right-editusercss}}",
        "right-editmyuserjson": "{{doc-right|editmyuserjson}}\nSee also:\n* {{msg-mw|Right-edituserjson}}",
-       "right-editmyuserjs": "{{doc-right|editmyuserjs}}\nSee also:\n* {{msg-mw|Right-edituserjs}}",
+       "right-editmyuserjs": "{{doc-right|editmyuserjs}}\nSee also:\n* {{msg-mw|Right-edituserjs}}\n* {{msg-mw|Right-editmyuserjsredirect}}",
+       "right-editmyuserjsredirect": "{{doc-right|editmyuserjsredirect}}\nSame as {{msg-mw|Right-editmyuserjs}} except if page is a redirect.\n\nSee also:\n* {{msg-mw|Right-edituserjs}}",
        "right-viewmywatchlist": "{{doc-right|viewmywatchlist}}",
        "right-editmywatchlist": "{{doc-right|editmywatchlist}}",
        "right-viewmyprivateinfo": "{{doc-right|viewmyprivateinfo}}",
        "action-editmyusercss": "{{doc-action|editmyusercss}}",
        "action-editmyuserjson": "{{doc-action|editmyuserjson}}",
        "action-editmyuserjs": "{{doc-action|editmyuserjs}}",
+       "action-editmyuserjsredirect": "{{doc-action|editmyuserjsredirect}}",
        "action-viewsuppressed": "{{doc-action|viewsuppressed}}",
        "action-hideuser": "{{doc-action|hideuser}}",
        "action-ipblock-exempt": "{{doc-action|ipblock-exempt}}",
        "parentheses-start": "{{optional}}",
        "parentheses-end": "{{optional}}",
        "brackets": "{{Optional}}\n{{Format|plain}}",
+       "brackets-start": "{{optional}}\n{{Format|plain}}",
+       "brackets-end": "{{optional}}\n{{Format|plain}}",
        "quotation-marks": "Quotation marks, for quoting, sometimes titles etc., depending on the language.\n\nSee: [[w:Quotation mark#Summary table|Non-English usage of quotation marks on Wikipedia]].\n\nParameters:\n* $1 - text to be wrapped in quotation marks",
        "imgmultipageprev": "{{Identical|Previous page}}",
        "imgmultipagenext": "{{Identical|Next page}}",
        "specialmute-label-mute-email": "Label for the checkbox that mutes/unmutes emails from the specified user.",
        "specialmute-header": "Used as header text on [[Special:Mute]]. Shown before the form with the muting options.\n* $1 - User selected for muting",
        "specialmute-error-invalid-user": "Error displayed when the username cannot be found.",
-       "specialmute-error-email-blacklist-disabled": "Error displayed when email blacklist is not enabled.",
-       "specialmute-error-email-preferences": "Error displayed when the user has not confirmed their email address.",
+       "specialmute-error-no-options": "Error displayed when there are no options available to mute on [[Special:Mute]].",
        "specialmute-email-footer": "Email footer in plain text linking to [[Special:Mute]] preselecting the sender to manage muting options.\n* $1 - Url linking to [[Special:Mute]].\n* $2 - The user sending the email.",
        "specialmute-login-required": "Error displayed when a user tries to access [[Special:Mute]] before logging in.",
        "mute-preferences": "Link in the sidebar to manage muting preferences for a user. It links to [[Special:Mute]] with the user in context as the subpage.",
        "passwordpolicies-policy-passwordnotinlargeblacklist": "Password policy that enforces that a password is not in a list of 100,000 number of \"popular\" passwords.",
        "passwordpolicies-policyflag-forcechange": "Password policy flag that enforces changing invalid passwords on login.",
        "passwordpolicies-policyflag-suggestchangeonlogin": "Password policy flag that suggests changing invalid passwords on login.",
+       "mycustomjsredirectprotected": "Error message shown when user tries to edit their own JS page that is a foreign redirect without the 'mycustomjsredirectprotected' right. See also {{msg-mw|mycustomjsprotected}}.",
        "easydeflate-invaliddeflate": "Error message if the content passed to easydeflate was not deflated (compressed) properly",
        "unprotected-js": "Error message shown when trying to load javascript via action=raw that is not protected",
        "userlogout-continue": "Shown if user attempted to log out without a token specified. Probably the user clicked on an old link that hasn't been updated to use the new system. $1 - url that user should click on in order to log out."
index 14aaa08..db1bf05 100644 (file)
        "passwordreset-emailtext-user": "L'utende $1 sus a {{SITENAME}} ave richieste 'na mail pe arrecurdarse le dettaglie d'u cunde sue pe {{SITENAME}}\n($4). {{PLURAL:$3|'U cunde utende seguende jè|le cunde utinde seguende sonde}} associate cu st'indirizze e-mail:\n\n$2\n\n{{PLURAL:$3|Sta passuord temboranèe scade|Ste passuord temboranèe scadene}}  'mbrà {{PLURAL:$5|'nu sciurne|$5 sciurne}}.\nTu avissa trasè e scacchià 'na passuord nova. Ce quacchedun'otre ha fatte sta richieste, o ce tu t'è arrecurdate 'a passuord origgenale toje, e non g'a vuè ccu cange cchiù, tu puè ignorà stu messagge e condinuà ausanne 'a passuord vecchie.",
        "passwordreset-emailelement": "Nome utende: \n$1\n\nPassuord temboranèe: \n$2",
        "passwordreset-emailsentemail": "Ce queste éte 'n'e-mail pu cunde tune, allore 'na password azzerate ha state mannate addà.",
+       "passwordreset-emailsentusername": "Ce ste 'n'e-mail pu cunde tune, allore 'na passuord azzerate ha state mannate addà.",
        "passwordreset-nocaller": "'Nu chiamande adda essere mise",
        "passwordreset-nosuchcaller": "'U chiamande nnon g'esiste: $1",
        "passwordreset-ignored": "'A 'mbostazione nove d'a passuord non g'è gestite. Pò essere ca no ste nisciune provider configurate?",
        "expansion-depth-exceeded-warning": "Pàggene ca sbonnane 'a profonnetà de espanzione",
        "parser-unstrip-loop-warning": "Cicle infinite acchiate",
        "unstrip-depth-warning": "Limite de ricorsione infinite sbunnate ($1)",
+       "unstrip-size-warning": "Limite de lunghezze d'a scretture sbunnate ($1)",
+       "unstrip-size-category": "Pàggene addò 'u limite d'a lunghezze d'a scretture jè sbunnate",
        "converter-manual-rule-error": "Errore assute jndr'à le regole de conversione d'a lènghe manuale",
        "undo-success": "'U cangiamende pò essere annullate.\nPe piacere verifichesce 'u combronde sotte pe condrollà ca quiste ca tu vuè ccu face e pò reggistrè le cangiaminde aqquà sotte pe spiccià l'annullamende d'u cangiamende.",
        "undo-failure": "'U cangiamende non ge pò essere annullete purcè stè 'nu conflitte de cangiaminde indermedije.",
        "diff-multi-sameuser": "({{PLURAL:$1|'Na revisione de mmienze|$1 revisiune de mmienze}} da 'u stesse utende non g'avènene fatte vedè)",
        "diff-multi-otherusers": "({{PLURAL:$1|'Na revisione de mmienze|$1 revisiune de mmienze}} da {{PLURAL:$2|'n'otre utende|$2 utinde}} non g'avènene fatte vedè)",
        "diff-multi-manyusers": "({{PLURAL:$1|'Na revisione de 'mmienze|$1 revisiune de 'mmienze}} non g'è viste da cchiù de $2 {{PLURAL:$2|utende|utinde}})",
+       "diff-paragraph-moved-tonew": "'U paragrafe ha state spustate. Cazze pe passà a 'a posiziona nove.",
+       "diff-paragraph-moved-toold": "'U paragrafe ha state spustate. Cazze pe passà a 'a posiziona vecchie.",
        "difference-missing-revision": "{{PLURAL:$2|'Na revisione|$2 revisiune}} de sta differenze ($1) {{PLURAL:$2|non g'onne|non g'onne}} state acchiate.\n\nQuiste succede normalmende purcé 'u cunde jè collegate a 'na pàgene ca ha state scangellate.\nLe dettaglie le puè acchià jndr'à l'[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} archivije de le scangellaziune].",
        "searchresults": "Resultete d'a ricerche",
        "search-filter-title-prefix-reset": "Cirche tutte le pàggene",
index 3783e26..6267b0d 100644 (file)
        "autoblockedtext": "Ваш IP-адрес автоматически заблокирован в связи с тем, что он ранее использовался кем-то из участников, заблокированных администратором $1. \nБыла указана следующая причина блокировки:\n\n: «$2».\n\n* Начало блокировки: $8\n* Окончание блокировки: $6\n* Цель блокировки: $7\n\nВы можете связаться с $1 или любым другим [[{{MediaWiki:Grouppage-sysop}}|администратором]], чтобы обсудить блокировку.\n\nОбратите внимание, что вы не сможете использовать функцию «{{int:emailuser}}», если в своих [[Special:Preferences|персональных настройках]] не задали или не подтвердили корректный адрес электронной почты, или если ваша блокировка включает запрет отправки писем подобным образом.\n\nВаш IP-адрес — $3, идентификатор блокировки — #$5.\nПожалуйста, указывайте эти сведения в любых своих обращениях.",
        "systemblockedtext": "Ваше имя участника или IP-адрес были автоматически заблокированы MediaWiki.\nУказана следующая причина:\n\n:<em>$2</em>\n\n* Начало блокировки: $8\n* Окончание блокировки: $6\n* Цель блокировки: $7\n\nВаш текущий IP-адрес $3.\nПожалуйста, указывайте все эти сведения в любых своих обращениях.",
        "blockednoreason": "причина не указана",
-       "blockedtext-composite": "<strong>Ваше имя участника или IP-адрес были заблокированы.</strong>\n\nУказана следующая причина:\n\n:<em>$2</em>\n\n* Начало блокировки: $8\n* Окончание блокировки: $6\n\nВаш текущий IP-адрес $3.\nПожалуйста, указывайте все эти сведения в любых своих обращениях.",
+       "blockedtext-composite": "<strong>Ваше имя участника или IP-адрес были заблокированы.</strong>\n\nУказана следующая причина:\n\n:<em>$2</em>\n\n* Начало блокировки: $8\n* Окончание блокировки: $6\n\n* $5\n\nВаш текущий IP-адрес $3.\nПожалуйста, указывайте все эти сведения в любых своих обращениях.",
+       "blockedtext-composite-ids": "Релевантные идентификаторы блокировок: $1 (ваш IP-адрес может быть в чёрном списке)",
+       "blockedtext-composite-no-ids": "Ваш IP-адрес присутствует в нескольких чёрных списках",
        "blockedtext-composite-reason": "Есть несколько блокировок вашей учётной записи и/или IP-адреса",
        "whitelistedittext": "Вы должны $1 для изменения страниц.",
        "confirmedittext": "Вы должны подтвердить свой адрес электронной почты перед правкой страниц.\nПожалуйста, введите и подтвердите свой адрес электронной почты в своих [[Special:Preferences|персональных настройках]].",
        "right-editmyusercss": "Редактирование своих пользовательских CSS-файлов",
        "right-editmyuserjson": "Редактирование своих пользовательских JSON-файлов",
        "right-editmyuserjs": "Редактирование своих пользовательских JavaScript-файлов",
+       "right-editmyuserjsredirect": "Редактирование собственных JavaScript-файлов, которые являются перенаправлениями",
        "right-viewmywatchlist": "Просмотр своего списка наблюдения",
        "right-editmywatchlist": "Редактирование своего списка наблюдения. Некоторые действия будут добавлять страницы даже без такого права.",
        "right-viewmyprivateinfo": "Просмотр собственных личных данных (например, адрес электронной почты, настоящее имя)",
        "action-editmyusercss": "редактирование собственных CSS-файлов",
        "action-editmyuserjson": "редактирование собственных JSON-файлов",
        "action-editmyuserjs": "редактирование собственных JavaScript-файлов",
+       "action-editmyuserjsredirect": "редактирование собственных JavaScript-файлов, которые являются перенаправлениями",
        "action-viewsuppressed": "просмотр версий, скрытых от всех участников",
        "action-hideuser": "запрет имени участника и его сокрытие",
        "action-ipblock-exempt": "обход блокировок по IP, автоблокировок и блокировок диапазонов",
        "specialmute-success": "Изменения были успешно сделаны. Просмотрите всех отключённых участников на [[Special:Preferences|ваших настройках]].",
        "specialmute-submit": "Подтвердить",
        "specialmute-label-mute-email": "Отключить эл. почту от этого участника",
-       "specialmute-header": "Ð\9fожалÑ\83йÑ\81Ñ\82а, Ð²Ñ\8bбеÑ\80иÑ\82е Ð½Ð°Ñ\81Ñ\82Ñ\80ойки Ñ\83ведомлений Ð¾Ñ\82 {{BIDI:[[User:$1]]}}.",
+       "specialmute-header": "Ð\9fожалÑ\83йÑ\81Ñ\82а, Ð²Ñ\8bбеÑ\80иÑ\82е Ð½Ð°Ñ\81Ñ\82Ñ\80ойки Ñ\83ведомлений Ð´Ð»Ñ\8f {{GENDER:$1|Ñ\83Ñ\87аÑ\81Ñ\82ника|Ñ\83Ñ\87аÑ\81Ñ\82ниÑ\86Ñ\8b}} <b>{{BIDI:[[User:$1|$1]]}}</b>.",
        "specialmute-error-invalid-user": "Указанное вами имя участника не может быть найдено.",
-       "specialmute-error-email-blacklist-disabled": "Не активирован функционал запрета участникам слать вам письма.",
-       "specialmute-error-email-preferences": "Вы должны подтвердить вашу электронную почту, прежде чем отключить уведомление от других. Это можно сделать на странице [[Special:Preferences]].",
-       "specialmute-email-footer": "Для управления настройками эл. почты для {{BIDI:$2}}, пожалуйста, посмотрите <$1>.",
+       "specialmute-email-footer": "Для управления настройками эл. почты {{GENDER:$2|участника|участницы}} {{BIDI:$2}}, пожалуйста, посетите <$1>.",
        "specialmute-login-required": "Пожалуйста, войдите, чтобы совершить изменения.",
+       "mute-preferences": "Настройки выключения",
        "revid": "версия $1",
        "pageid": "ID страницы $1",
        "interfaceadmin-info": "$1\n\nПрава на редактирование общесайтных CSS/JS/JSON-файлов были недавно вынесены из права <code>editinterface</code>. Если вы не понимаете, почему вы наткнулись на эту ошибку, см. [[mw:MediaWiki_1.32/interface-admin]].",
index 7cc15a5..92e10f0 100644 (file)
        "createacct-yourpasswordagain-ph": "Уведьте гесло знову",
        "userlogin-remembermypassword": "Приголосити ня на довго",
        "userlogin-signwithsecure": "Хосновати забеспечене споїня",
+       "cannotcreateaccount-title": "Не є можне вытворїня конт",
        "yourdomainname": "Ваша домена:",
        "password-change-forbidden": "На тій вікі не можете мінити гесла.",
        "externaldberror": "Або ся стала хыба екстерной автентіфікачной датабазы, або не маєте дозволено мінити своє екстерне конто.",
        "sig_tip": "Ваш підпис з датумом і часом",
        "hr_tip": "Горізонтална лінія (хоснуйте єй скупо)",
        "summary": "Куртый опис змін:",
-       "subject": "Тема/надпис:",
+       "subject": "Тема:",
        "minoredit": "Незначна зміна",
        "watchthis": "Слїдовати тоту сторінку",
        "savearticle": "Уложыти сторінку",
+       "savechanges": "Уложыти зміны",
+       "savearticle-start": "Уложыти сторінку…",
+       "savechanges-start": "Уложыти зміны…",
        "preview": "Нагляд",
        "showpreview": "Указати нагляд",
        "showdiff": "Указати зміны",
        "permissionserrorstext": "Не маєте поволїня той операції з  {{PLURAL:$1|такой причіны|такых причін}}:",
        "permissionserrorstext-withaction": "Не маєте дозволїня на $2 з {{PLURAL:$1|такой прічіны|такых прічін}}:",
        "recreate-moveddeleted-warn": "'''Увага: Пробуєте знову створити сторінку, котра была в минулости змазана.'''\n\nУважте, ці справды треба знову створити тоту сторінку.\nНиже видите запис переменовань і змазань той сторінкы:",
-       "moveddeleted-notice": "Тота сторінка была змазана.\nЗапис змазаня а переменованя сі можете посмотрити ниже.",
+       "moveddeleted-notice": "Тота сторінка была змазана.\nЗапис змазаня, замкнутя а переменованя сі можете посмотрити ниже.",
        "log-fulllog": "Зобразити вшыток запис",
        "edit-hook-aborted": "Едітованя было сторноване процедуров без близшого пояснїня.",
        "edit-gone-missing": "Сторінку ся не вдало обновити.\nАсі была змазана.",
        "content-failed-to-parse": "Не вдало ся проаналізовати $2 як тіп $1: $3",
        "invalid-content-data": "Неприпустны даны",
        "content-not-allowed-here": "Обсяг «$1» недозволеный на сторінцї [[:$2]]",
-       "editwarning-warning": "Зохаблїнём той стрінкы ся можуть вшыткы учінены зміны стратити.\nКідь сьте приголошеный, можете тото варованя выпнути на картї „Едітованя“ в хосновательскім інтерфейсї.",
+       "editwarning-warning": "Зохаблїнём той стрінкы ся можуть вшыткы учінены зміны стратити.\nКідь сьте приголошеный, можете тото варованя выпнути на картї „{{int:prefs-editing}}“ в хосновательскім інтерфейсї.",
+       "editpage-invalidcontentmodel-title": "Непідпорованый модел обсягу",
        "editpage-notsupportedcontentformat-title": "Непідпорованый формат обсягу",
        "slot-name-main": "Головна",
        "content-model-wikitext": "вікітекст",
        "page_first": "перша",
        "page_last": "послїдня",
        "histlegend": "(теперь) = роздїлы од актуалной верзії,\n(послїдня) = роздїлы од попереднёй верзії, '''м''' = мале едітованя",
-       "history-fieldset-title": "Ð\9fеÑ\80еглÑ\8fднÑ\83Ñ\82и Ñ\96Ñ\81Ñ\82оÑ\80Ñ\96Ñ\8e",
-       "history-show-deleted": "Лем змазаны",
+       "history-fieldset-title": "ФÑ\96лÑ\8cÑ\82Ñ\80оваÑ\82и Ñ\80евÑ\96зÑ\96Ñ\97",
+       "history-show-deleted": "Лем змазаны ревізії",
        "histfirst": "найстаршы",
        "histlast": "найновшы",
        "historysize": "($1 {{PLURAL:$1|байт|байты|байтів}})",
-       "historyempty": "(порожнє)",
+       "historyempty": "порожня",
        "history-feed-title": "Історія едітовань",
        "history-feed-description": "Історія едітовань той сторінкы на вікі",
        "history-feed-item-nocomment": "$1 в $2",
        "revdelete-legend": "Наставити обмеджіня ревізії",
        "revdelete-hide-text": "Текст ревізії",
        "revdelete-hide-image": "Сховати обсяг файлу",
-       "revdelete-hide-name": "Сховати дїю а ціль",
-       "revdelete-hide-comment": "СÑ\85оваÑ\82и ÐºÐ¾Ð¼ÐµÐ½Ñ\82аÑ\80Ñ\8c",
+       "revdelete-hide-name": "Сховати ціль і параметры",
+       "revdelete-hide-comment": "Ð\9eпиÑ\81 Ð·Ð¼Ñ\96н",
        "revdelete-hide-user": "Імя автора/IP адреса",
        "revdelete-hide-restricted": "Затаїти дата перед адміністраторами",
        "revdelete-radio-same": "(не мінити)",
        "prefs-editwatchlist": "Едітованя списку слїдованых сторінок",
        "prefs-watchlist-days": "Чісло днїв зображеных в слїдованых сторінках:",
        "prefs-watchlist-days-max": "Максімално $1 {{PLURAL:$1|день|днї|днїв}}",
-       "prefs-watchlist-edits": "Чісло едітовань зображеных во вылїпшенім списку слїдованых сторінок:",
+       "prefs-watchlist-edits": "Чісло едітовань зображеных в списку слїдованых сторінок:",
        "prefs-watchlist-edits-max": "Максімалне чісло: 1000",
        "prefs-watchlist-token": "Ключ до списку слїдованых сторінок:",
        "prefs-misc": "Іншы наставлїня",
        "prefs-resetpass": "Змінити гесло",
-       "prefs-changeemail": "Змінити імейл",
+       "prefs-changeemail": "Змінити або выдалити імейл",
        "prefs-setemail": "Наставити імейлову адресу",
        "prefs-email": "Параметры електронічной пошты",
        "prefs-rendering": "Взгляд",
        "restoreprefs": "Обновити вшыткы штандартны наставлїня (у вшыткых секціях)",
        "prefs-editing": "Едітованя",
        "searchresultshead": "Гляданя",
-       "stub-threshold": "Поріг про форматованя одказу як <a href=\"#\" class=\"stub\">одказів на \"stub\"</a> (v bajtech):",
+       "stub-threshold": "Поріг про форматованя одказу як одказів на ''stub'' ($1):",
        "stub-threshold-disabled": "Выпнуте",
        "recentchangesdays": "За кілько днїв вказовати новы едітованя",
        "recentchangesdays-max": "(максімум $1 {{PLURAL:$1|день|днї|днїв}})",
        "prefs-tokenwatchlist": "Кліч",
        "prefs-diffs": "Порівнаня верзії",
        "prefs-help-prefershttps": "Тот параметер набуде чінности по вашім далшім входї до сістемы.",
-       "userrights": "СпÑ\80ава Ñ\85оÑ\81новаÑ\82елÑ\8cÑ\81кÑ\8bÑ\85 Ò\91Ñ\80Ñ\83п",
+       "userrights": "ХоÑ\81новаÑ\82елÑ\8cÑ\81кÑ\8b Ð¿Ñ\80ава",
        "userrights-lookup-user": "Управовати хосновательскы ґрупы",
        "userrights-user-editname": "Задайте мено хоснователя:",
        "editusergroup": "Едітовати хосновательскы ґрупы",
-       "editinguser": "Зміна прав хоснователя '''[[User:$1|$1]]''' $2",
-       "userrights-editusergroup": "Змінити ґрупы хоснователя",
-       "saveusergroups": "Уложыти хосновательскы ґрупы",
+       "editinguser": "Зміна прав {{GENDER:$1|хоснователя}} <strong>[[User:$1|$1]]</strong> $2",
+       "viewinguserrights": "Перегляд прав {{GENDER:$1|хоснователя}} <strong>[[User:$1|$1]]</strong> $2",
+       "userrights-editusergroup": "Змінити ґрупы {{GENDER:$1|хоснователя}}",
+       "userrights-viewusergroup": "Зобразити ґрупы {{GENDER:$1|хоснователя}}",
+       "saveusergroups": "Уложыти {{GENDER:$1|хосновательскы}} ґрупы",
        "userrights-groupsmember": "Член ґруп:",
        "userrights-groupsmember-auto": "Автоматічный  член ґруп:",
        "userrights-groups-help": "Можете мінити ґрупы, до котрых належыть хоснователь:\n* Кідь є позначене  поличко, хоснователь належыть до той ґрупы.\n* Не позначене  поличко значіть, же хоснователь у тій ґрупі не є.\n* Звіздочка (*) значіть, же не можете тоту ґрупу одобрати, буде ли придана, або наспак.",
        "userrights-nodatabase": "Датабаза $1 не екзістує або не є місцёва.",
        "userrights-changeable-col": "Ґрупы, котры можете змінити",
        "userrights-unchangeable-col": "Ґрупы, котры не можете змінити",
+       "userrights-expiry": "Кінчіть:",
+       "userrights-expiry-existing": "Сучасный час експірації: $3, $2",
        "userrights-expiry-othertime": "Іншый час:",
        "userrights-conflict": "Конфлікт змін прав хоснователїв! Просиме, перевірьте зміны і потвердьте їх.",
        "group": "Ґрупа:",
        "right-protect": "Зміна ровни замків і едітованя каскадово замкнутых сторінок",
        "right-editprotected": "Едітованя сторінок замкнутых на „{{int:protect-level-sysop}}“",
        "right-editsemiprotected": "Едітованя сторінок замкнутых на „{{int:protect-level-autoconfirmed}}“",
+       "right-editcontentmodel": "Едітовати модел обсягу сторінкы",
        "right-editinterface": "Едітованя інтерфейсу хоснователя",
        "right-editusercss": "Едітованя CSS файлів іншых хоснователїв",
        "right-edituserjson": "Едітованя JSON файлів іншых хоснователїв",
        "right-sendemail": "Посыланя пошты іншым хоснователям",
        "right-managechangetags": "Вытворїня і (де)актівація [[Special:Tags|значок]]",
        "right-applychangetags": "Придаваня [[Special:Tags|значок]] до властных змін",
+       "grant-group-email": "Послати ел. пошту",
        "grant-blockusers": "Блоковати і одблоковати хоснователїв",
        "grant-createaccount": "Закладаня конт",
        "grant-editmywatchlist": "Едітовати ваш список слїдованых сторінок",
        "grant-editprotected": "Едітованя замкнутых сторінок",
        "grant-uploadfile": "Наладовати новы файлы",
+       "grant-viewdeleted": "Перегляд вымазаных файлів і сторінок",
        "grant-viewmywatchlist": "Перезерати ваш список слїдованых сторінок",
        "newuserlogpage": "Лоґ вытварянь хоснователїв",
        "newuserlogpagetext": "Тото є список ново реґістрованых хоснователїв.",
        "action-writeapi": "хосновати API про писаня",
        "action-delete": "Вымазати тоту сторінку",
        "action-deleterevision": "вымазаня ревізій",
+       "action-deletelogentry": "вымазаня записів лоґів",
        "action-deletedhistory": "зобразити історію змазаных ревізій сторінкы",
        "action-deletedtext": "зобразити змазаны тексты ревізії",
        "action-browsearchive": "глядати змазаны сторінкы",
        "action-viewmyprivateinfo": "перезерати вашы пріватны даны",
        "action-editmyprivateinfo": "едітовати вашы пріватны інформації",
        "action-editcontentmodel": "едітовати модел обсягу сторінкы",
+       "action-apihighlimits": "хоснованя высшых лімітів в API запытах",
+       "action-autoconfirmed": "не тыкать ся лімітів основаных на IP",
+       "action-bigdelete": "мазаня сторінок з довгов історіёв",
+       "action-blockemail": "блокованя хоснователя од посыланя е-пошты",
+       "action-bot": "быти поважованый за автоматічный процес",
+       "action-editprotected": "едітованя сторінок замкнутых на „{{int:protect-level-sysop}}“",
+       "action-editsemiprotected": "едітованя сторінок замкнутых на „{{int:protect-level-autoconfirmed}}“",
+       "action-editinterface": "едітованя інтерфейсу хоснователя",
+       "action-editusercss": "едітованя CSS файлів іншых хоснователїв",
+       "action-edituserjson": "едітованя JSON файлів іншых хоснователїв",
+       "action-edituserjs": "едітованя JavaScript файлів іншых хоснователїв",
+       "action-editmyusercss": "едітовати вашы властны хосновательскы CSS файлы",
+       "action-editmyuserjson": "едітовати вашы властны хосновательскы JSON файлы",
+       "action-editmyuserjs": "едітовати вашы властны хосновательскы JavaScript файлы",
+       "action-hideuser": "блокованя мена хоснователя і ёго схованя",
+       "action-ipblock-exempt": "обходжіня блокованя IP адрес, їх россягів і автоблокованя",
+       "action-unblockself": "одблоковати самого себе",
+       "action-noratelimit": "не має обмеджіня в швыдкости",
+       "action-reupload-own": "переписованя файлів ладованых од себе самого",
+       "action-nominornewtalk": "невыписованя новых повідомлїнь по малых управах діскузной сторінкы",
+       "action-markbotedits": "означованя ревертів як едітованя робота",
+       "action-patrolmarks": "зобразованя патролёваных сторінок в Послїднїх змінах",
+       "action-override-export-depth": "експорт сторінок включаючі звязаны сторінкы з глубков до 5",
+       "action-suppressredirect": "нестворіня напрямлїня про переменоваю сторінкы",
        "nchanges": "$1 {{PLURAL:$1|зміна|зміны|змін}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|од остатнёй навщівы}}",
        "enhancedrc-history": "історія",
index 29da774..64968da 100644 (file)
@@ -39,7 +39,7 @@
        "tog-oldsig": "توھان جو موجوده دستخط:",
        "tog-fancysig": "صحيح کي وڪيٽيڪسٽ سمجھو (ڪنھن خوڪار ڳنڍڻي کانسواءِ)",
        "tog-uselivepreview": "صفحي کي ٻيھر اتارڻ سواءِ پيش نگاھ ڏيکاريو",
-       "tog-forceeditsummary": "جÙ\8aÚªÚ\8fÙ\87Ù\86 Ø®Ù\84اصÙ\88 Ø®Ø§Ù\84Ù\8a Ú\87Ú\8fÙ\8aÙ\84 Ù\87جÙ\8a ØªÙ\87 مونکي چتاءُ ڏيو",
+       "tog-forceeditsummary": "جÙ\8aÚªÚ\8fÙ\87Ù\86 ØªØ±Ù\85Ù\8aÙ\85Ù\8a ØªÙ\8eتÙ\8f Ø®Ø§Ù\84Ù\8a Ú\87Ú\8fÙ\8aÙ\84 Ù\87جÙ\8a ØªÛ\81 مونکي چتاءُ ڏيو",
        "tog-watchlisthideown": "نظر ۾ فھرست مان منھنجون ترميمون لڪايو",
        "tog-watchlisthidebots": "نظر ۾ فھرست تان بوٽ جون ترميمون لڪايو",
        "tog-watchlisthideminor": "نظر ۾ فھرست تان معمولي ترميمون لڪايو",
        "viewhelppage": "مددي صفحو ڏسو",
        "categorypage": "زمراتي صفحو ڏسو",
        "viewtalkpage": "بحث ڏسو",
-       "otherlanguages": "Ù»Ù\8aÙ\86 Ù»Ù\88Ù\84Ù\8aÙ\86 Û¾",
+       "otherlanguages": "Ù»Ù\8aÙ\88Ù\86 Ù»Ù\88Ù\84Ù\8aÙ\88Ù\86",
        "redirectedfrom": "($1 کان چوريل)",
        "redirectpagesub": "چوريل صفحو",
        "redirectto": "ڏانھن چوريو:",
        "resetpass-temp-emailed": "توهان برقٽپال ذريعي اماڻيل عارضي ڳجھي لفظ سان داخل ٿيا آهيو. داخل ٿيڻ کي مڪمل ڪرڻ لاءِ توهان کي هتي نئون ڳجھولفظ طَي ڪرڻو ئي پوندو:",
        "resetpass-temp-password": "عارضي ڳجھولفظ:",
        "resetpass-expired": "توهان جو ڳجھولفظ مدي خارج ٿي چڪو آهي. نئون ڳجھولفظ مقرر ڪريو ۽ داخل ٿيو.",
-       "resetpass-expired-soft": "توهان جو ڳجھو لفظ مدي خارج ٿي چڪو آهي. مهرباني ڪري نئون ڳجھو لفظ چونڊيو، يا ساڳيو ڪم ڪنهن ٻي وقت ڪرڻ لاءِ \"{{int:authprovider-resetpass-skip-label}}\" تي ڪلڪ ڪريو.",
+       "resetpass-expired-soft": "توهان جو ڳجھولفظ مدي خارج ٿي چڪو آهي ۽ ان کي تبديليءَ جي ضرورت آھي. مھرباني ڪري ھاڻي ڪو نئون ڳجھولفظ چونديو يا انکي بعد ۾ بدلائڻ لاءِ \"{{int:authprovider-resetpass-skip-label}}\" تي ٽڙڪ ڪريو.",
        "resetpass-validity-soft": "توهان جو ڳجھولفظ ناقابلڪار آهي: $1\n\nمھرباني ڪري نئون ڳجھولفظ چونڊيو، يا ان کي پوءِ بدلائڻ لاءِ \"{{int:authprovider-resetpass-skip-label}}\" تي ٽڙڪ ڪريو.",
        "passwordreset": "ڳجھولفظ مَٽايو",
        "passwordreset-text-one": "برقٽپال ذريعي عارضي ڳجھولفظ حاصل ڪرڻ لاءِ هيءُ فارم پُر ڪريو.",
        "media_tip": "فائيل جو ڳنڍڻو",
        "sig_tip": "توھان جي صحيح بمع اوقاتي مھر",
        "hr_tip": "افقي لڪير (ڪفايت سان استعمال ڪريو)",
-       "summary": "Ø®Ù\84اصÙ\88:",
+       "summary": "تÙ\8eتÙ\8f:",
        "subject": "موضوع:",
        "minoredit": "ھيءَ ھڪ معمولي ترميم آھي",
        "watchthis": "هيءُ صفحو نظر ۾ رکو",
        "postedit-confirmation-saved": "توهان جي ترميم سانڍجي چڪي آهي.",
        "edit-already-exists": "نئون صفحو سرجي نہ سگھيو. اهو اڳ ۾ ئي وجود رکي ٿو.",
        "invalid-content-data": "ناقابل ڪار موادي اعداد",
-       "content-not-allowed-here": "\"$1\" مواد هن صفحي [[:$2]] تي رکي نہ ٿو سگھجي.",
+       "content-not-allowed-here": "\"$1\" مواد جي هن صفحي [[:$2]] جي جڳھ \"$3\" تي اجازت ناھي.",
        "content-model-wikitext": "وڪي‌ٽيڪسٽ",
        "content-model-text": "سادو ٽيڪسٽ",
        "content-model-javascript": "جاوا اسڪرپٽ",
        "last": "پويون",
        "page_first": "پهريون",
        "page_last": "آخري",
-       "history-fieldset-title": "Ù\85سÙ\88دا Ú³Ù\88Ù\84يو",
+       "history-fieldset-title": "Ù\85سÙ\88دا Ú\87اڻيو",
        "history-show-deleted": "رڳو ڊاٺل مسودا",
        "histfirst": "اوائلي ترين",
        "histlast": "تازه ترين",
        "historysize": "({{PLURAL:$1|1 بائيٽ|$1 بائيٽس}})",
-       "historyempty": "(خالي)",
+       "historyempty": "خالي",
        "history-feed-title": "ترميمي سوانح",
        "history-feed-description": "وڪي جي هن صفحي جي ترميمي سوانح",
        "history-feed-item-nocomment": "$2 تي $1",
-       "rev-deleted-comment": "(ترÙ\85Ù\8aÙ\85Ù\8a Ø®Ù\84اصÙ\88 ھٽايل)",
+       "rev-deleted-comment": "(ترÙ\85Ù\8aÙ\85Ù\8a ØªÙ\8eتÙ\8f ھٽايل)",
        "rev-deleted-user": "(واپرائيندڙ-نانءُ ڊاٿو ويو)",
        "rev-deleted-event": "(لاگ تفصيل هٽايا ويا)",
        "rev-deleted-user-contribs": "[واپرائيندڙ-نانءُ يا آءِپِي پتو مِٽايو ويو - ڀاڱيدارين مان ترميمون لڪايون ويون]",
        "rcfilters-savedqueries-add-new-title": "ھاڻوڪيون ڇاڻين جون ترتيبون سانڍيو",
        "rcfilters-restore-default-filters": "ڏنل ڇاڻيون ريسٽور ڪريو",
        "rcfilters-clear-all-filters": "سڀئي لڳل ڇاڻيو هٽايو",
-       "rcfilters-show-new-changes": "نيون ترين تبديليون ڏيکاريو",
+       "rcfilters-show-new-changes": "$1 کان نيون تبديليون ڏسو",
        "rcfilters-search-placeholder": "تبديليون ڇاڻيو (مينيو استعمال ڪريو يا ڇاڻيءَ جي ڳولا ڪريو)",
        "rcfilters-invalid-filter": "ناقابلِڪار ڇاڻي",
        "rcfilters-empty-filter": "ڪي بہ سرگرم ڇاڻيون ناھن. سڀ ڀاڱيداريون ڏيکاريل آھن.",
        "rcfilters-filter-user-experience-level-newcomer-label": "نوان ايندڙ",
        "rcfilters-filter-user-experience-level-learner-label": "سکندڙ",
        "rcfilters-filter-user-experience-level-experienced-label": "تجربيڪار واپرائيندڙ",
+       "rcfilters-filtergroup-automated": "خودڪار ڀاڱيداريون",
        "rcfilters-filter-bots-label": "بوٽ",
        "rcfilters-filter-bots-description": "خودڪار اوزارن پاران ڪيل ترميمون.",
        "rcfilters-filter-humans-label": "انسان (بوٽ نہ)",
        "uploadtext": "فائل چاڙهڻ لاءِ هيٺيون فارم استعمال ڪيو.\nپراڻا چاڙهيل فائل ڏسڻ يا ڳولڻ لاءِ [[Special:FileList|چاڙهيل فائلن جي فهرست]] تي وڃو، ٻهير چاڙهيل فائل [[Special:Log/upload|چاڙهيل لاگ]] ۽ ختم ڪيل [[Special:Log/delete|ڊاٺ لاگ]] تي ڏسي سگھجن ٿا.\n\nفائل جي استعمال لاءِ هيٺ ڏيکاريل طريقو استعمال ڪري سگھجي ٿو:\n* <strong><code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:فائل جو نالو.jpg]]</nowiki></code></strong> فائل جي مڪمل استعمال لاءِ\n* <strong><code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:فائل جو نالو.png|200px|thumb|left|متبادل اکر]]</nowiki></code></strong> هن جي مدد سان تصوير جي سائيز ڏئي سگھجي ٿي جيئن 200 پگزل\n* <strong><code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code></strong> فائل کي ڏيکارڻ کان بغير شامل ڪرڻ",
        "uploadlogpage": "چاڙھ لاگ",
        "filename": "فائيل نانءُ",
-       "filedesc": "Ø®Ù\84اصÙ\88",
-       "fileuploadsummary": "Ø®Ù\84اصÙ\88:",
+       "filedesc": "تÙ\8eتÙ\8f",
+       "fileuploadsummary": "تÙ\8eتÙ\8f:",
        "filereuploadsummary": "فائيل تبديليون:",
        "filesource": "ذريعو:",
        "ignorewarnings": "چتائن کي نظرانداز ڪريو",
        "delete-confirm": "\"$1\" ڊهي چڪو",
        "delete-legend": "ڊاهيو",
        "historywarning": "<strong>خبردار:</strong> جيڪو صفحو توهان ڊاهڻ وڃي رهيا آهيو ان ساڻ هڪ تاريخ آهي $1 {{PLURAL:$1|revision|revisions}}:",
-       "historyaction-submit": "ڏيکاريو",
+       "historyaction-submit": "ورجاءَ ڏيکاريو",
        "confirmdeletetext": "توهان هڪ صفحي کي ان جي سموري سوانح سميت ڊاهڻ وارا آهيو. مهرباني ڪري پڪ ڪندا ته توهان اهو ئي ڪرڻ گھرو ٿا، ۽ اهو ته توهان ان جي نتيجن کان واقف آهيو، ۽ اهو پڻ ته توهان اهو ڪم [[{{MediaWiki:Policy-url}}|پاليسي]]ءَ مطابق ڪري رهيا آهيو.",
        "actioncomplete": "ڪم پُورو",
        "actionfailed": "عمل ناڪام",
        "tooltip-rollback": "\"واپس ورايو\" ھن صفحي ۾ پوئين ڀاڱيدار جي ڪيل ترميم(ن) کي ھڪ ٽڙڪ سان اڻڪري ٿو",
        "tooltip-undo": "\"اڻڪريو\" هن ترميم کي واپس ڪيو ۽ پيش نگاه ۾ ترميم کي کوليو. اهو اوهان کي تت شامل ڪرڻ جو موقعو ڏيندو.",
        "tooltip-preferences-save": "ترجيحون سانڍيو",
-       "tooltip-summary": "Ù\86Ù\86Ú\8dÙ\88 Ø®Ù\84اصÙ\88 ڏيو",
+       "tooltip-summary": "Ù\86Ù\86Ú\8dÙ\88 ØªÙ\8eتÙ\8f ڏيو",
        "anonymous": "{{SITENAME}} جا گمنام {{PLURAL:$1|واپرائيندڙ|واپرائيندڙَ}}",
        "simpleantispam-label": "اينٽي-اسپام روڪ.\nھن کي <strong>نہ</strong> ڀريو!",
        "pageinfo-title": "\"$1\" لاءِ معلومات",
index d657b61..edc79a2 100644 (file)
        "view-foreign": "Vedi innantu $1",
        "edit": "Mudifigga",
        "create": "Cria",
+       "create-local": "Aggiugnì deschrizioni lucari",
        "delete": "Canzella",
        "undelete_short": "Ricùpara {{PLURAL:$1|una ribisioni|$1 ribisioni}}",
        "protect": "Brocca",
        "userinvalidconfigtitle": "'''Attinzioni:''' Nò isisthi nisciun aipettu gràficu \"$1\". Amminta chi li pàgini pa li .css e .js passunari àni lu primu caràtteri di lu tìturu minori, cumenti {{ns:user}}:Foo/vector.css e nò {{ns:user}}:Foo/Vector.css.",
        "updated": "(Aggiornaddu)",
        "note": "'''NOTA:'''",
-       "previewnote": "'''Attinzioni: chistha è soru un'antiprimma. Li mudifigghi a la pagina NÒ so ancora isthaddi saivvaddi!'''",
+       "previewnote": "'''Attinzioni: chistha è soru un'antiprimma. Li mudìfigghi a la pàgina NÒ so ancora isthaddi saivvaddi!'''",
+       "continue-editing": "Andà a la casella di modìfica",
        "previewconflict": "L'antiprimma curripundi a lu testhu prisenti i' la casella di mudìfigga superiori e musthra la pàgina cumenti apparirà si s'à gana di incalchà abà '''Sàivva la pàgina'''.",
        "session_fail_preview": "'''Semmu dipiazuddi, nò è isthaddu pussìbiri sàivva la mudìfiggà parchí sò andaddi pessi i dati reratibi a la sissioni. Si lu probrema continua, prubà a iscì e effettuà una noba intradda.'''",
        "session_fail_preview_html": "'''Semmu dipiazuddi, no è isthaddu pussìbiri elaburà la mudìfigga parchì sò andaddi pessi li dati reratibi a la sissioni.'''\n\n''Parchì in {{SITENAME}} è cunsintiddu l'usu di l'HTML chena limitazioni, l'antiprimma no è visuarizzadda, pa sigguriddai contru l'attacchi JavaScript.''\n\n'''Si lu probrema prisisthi, pói prubà à iscì e turrà a intrà.'''",
        "cascadeprotectedwarning": "'''Attinzioni:''' Chistha pàgina è isthadda broccadda in modu chi soru l'utenti cun pribiréggi di amministhradori possiano mudìfiggarla. Lu chi avvini parchí la pàgina è incrusa {{PLURAL:$1|i la pàgina indicadda ..., ch'è isthadda prutiggidda|i li pàgini indicaddi ..., chi so isthaddi prutiggiddi}} chirriendi la prutizioni \"ricussiba\":",
        "titleprotectedwarning": "'''ATTINZIONI: Chistha pàgina è isthadda broccadda in modu chi soru zerthuni utenti possiano crialla.'''",
        "templatesused": "{{PLURAL:$1|Mudellu utirizaddu|Mudelli utirizaddi}} in chistha pàgina:",
-       "templatesusedpreview": "Mudelli utirizaddi in chisth'antiprimma:",
+       "templatesusedpreview": "{{PLURAL:$1|Mudellu utirizaddu|Mudelli utirizaddi}} in kistha pàgina:",
        "templatesusedsection": "Mudelli utirizaddi in chistha sezzioni:",
        "template-protected": "(prutiggiddu)",
        "template-semiprotected": "(mezu-prutiggiddu)",
        "permissionserrorstext-withaction": "Nò si diponi di li primmissi nezzessàri pa $2, pa {{PLURAL:$1|lu sighenti mutibu|li sighenti mutibi}}:",
        "recreate-moveddeleted-warn": "'''Attinzioni: s'è pa ricrià una pàgina già canzilladda in passadu.'''\n\nS'azzirthà chi sia avveru opporthunu continuà a mudìfiggà chistha pàgina. L'erencu di li reratibi canzilladduri vèni ripurthaddu inogghi pa cumudiddai:",
        "moveddeleted-notice": "No z'è più chista pàgina.\nThe deletion, protection, and move log for the page are provided below for reference.",
+       "content-model-wikitext": "wikitext",
        "undo-success": "Chistha mudìfigga pò assé annulladda. Verifiggà lu sighenti cuntrasthu prisintaddu pa s'azzirthà chi lu cuntinuddu curripundi a cantu disizaddu e dunca saivvà li mudìfigghi pa cumprità la procedura di annullamentu.",
        "undo-failure": "Impussìbiri annullà la mudìfigga a càusa d'un cuntrasthu cun mudìfigghi intermédi.",
        "undo-summary": "Annulladda la mudìfigga $1 di [[Special:Contributions/$2|$2]] ([[User talk:$2|Dischussioni]])",
        "lineno": "Riga $1:",
        "compareselectedversions": "Cunfronta li versioni sciubaraddi",
        "editundo": "annulla",
+       "diff-empty": "(Nisciuna diffarènzia)",
        "searchresults": "Risulthaddi di la zercha",
        "searchresults-title": "Risulthaddi di la zercha di \"$1\"",
        "titlematches": "Curripundènzi i lu tìturu di li pagini",
        "rightslog": "Diritti di li utenti",
        "rightslogtext": "Chisthu è lu rigisthru di lu mudìfigghi a li diritti assignaddi a l'utenti.",
        "action-edit": "mudìfiggà chistha pàgina",
+       "action-createaccount": "crià kistha registhrazioni",
        "nchanges": "$1 {{PLURAL:$1|mudìfigga|mudìfigghi}}",
        "enhancedrc-history": "cronologia",
        "recentchanges": "Ulthimi mudìfigghi",
        "filehist-datetime": "Data/Ora",
        "filehist-thumb": "Miniadduri",
        "filehist-thumbtext": "Miniadduri di la virsioni di li $1",
+       "filehist-nothumb": "Nisciuna miniaddura",
        "filehist-user": "Utenti",
        "filehist-dimensions": "Misuri",
        "filehist-filesize": "Misuri di lu file",
        "nolinkstoimage": "Nisciuna pàgina utirizeggia chistha immàgina.",
        "sharedupload": "Chisthu file prubeni da $1 e pó assé utirizaddu da althri prugetti.",
        "sharedupload-desc-here": "Chisthu file prubeni da $1 e pó assé utirizaddu da althri prugetti. La deschrizioni di la [$2 pàgina di deschrizioni] è indicadda in giossu.",
+       "filepage-nofile": "No esisthi nisciun ischedàriu cu' kisthu nommu.",
        "uploadnewversion-linktext": "Carrigga una nóba versioni di chistu file",
+       "upload-disallowed-here": "No poi sobbraschribì kisthu ischedàriu",
        "filerevert": "Turra che primma $1",
        "filerevert-legend": "Ricupara file",
        "filerevert-intro": "N'isthai pa ricuparà lu file '''[[Media:$1|$1]]''' a la [versioni $4 di lu $2, $3].",
        "allpagesprefix": "Musthra li pàgini ch'ischuminzani cun:",
        "allpagesbadtitle": "Lu tìturu indicaddu pa la pàgina nò è vàriddu o cunteni prefissi interlinga o interwiki. Pudia puru cuntinì unu o più caràtteri chi nò si pudiani usà i' li tìturi.",
        "allpages-bad-ns": "Lu namespace \"$1\" nò isisthi i' {{SITENAME}}.",
+       "allpages-hide-redirects": "Cuà rinvii",
        "categories": "Categuri",
        "categoriespagetext": "Erencu cumpretu di li categuri prisenti i'lu situ.\n[[Special:UnusedCategories|Unused categories]] are not shown here.\nAlso see [[Special:WantedCategories|wanted categories]].",
        "linksearch": "Cullegamenti estherni",
        "wlheader-enotif": "La nutìfica via postha erettrònica è attiba.",
        "wlheader-showupdated": "Li pàgini chi so isthaddi mudìfiggaddi daboi l'ulthima vìsita so evidenziaddi in '''grasseddu'''",
        "wlnote": "Inogghi {{PLURAL:$1|è erencadda la mudìfigga più rizzenti arriggadda|so erencaddi li '''$1''' mudìfigghi più rizzenti arriggaddi}} {{PLURAL:$2|i' la ulthima ora|i' li ulthimi '''$2''' ori}}.",
-       "wlshowlast": "Musthra li ulthimi $1 ori $2 dì",
+       "wlshowlast": "Musthra li ùlthimi $1 ori $2 dì",
        "watchlist-options": "Opzioni abbaidaddi ippiziari",
        "watching": "Aggiunta a l'abbaidaddi ippiziari...",
        "unwatching": "Eliminazioni da l'abbaidaddi ippiziari...",
        "undelete-show-file-submit": "Sì",
        "namespace": "Tipu di pàgina:",
        "invert": "invirthi la isciubaradda",
+       "namespace_association": "tipu di pàgina reratibu",
        "blanknamespace": "(Prinzipari)",
        "contributions": "{{GENDER:$1|Cuntributi utenti}}",
        "contributions-title": "Cuntributi di $1",
        "tooltip-feed-rss": "Feed RSS pa chistha pàgina",
        "tooltip-feed-atom": "Feed Atom pa chistha pàgina",
        "tooltip-t-contributions": "Listha di li cuntributi di {{GENDER:$1|chistu utenti}}",
-       "tooltip-t-emailuser": "Invia un'imbasciadda di postha erettrònica a chisth'utenti",
+       "tooltip-t-emailuser": "Invià un'imbasciadda di postha erettrònica a {{GENDER:$1|kisth'utenti}}",
        "tooltip-t-upload": "Carrigga file mùrthimediari",
        "tooltip-t-specialpages": "Listha di tutti li pàgini ippiziari",
        "tooltip-t-print": "Versioni sthampabiri di chistha pàgina",
        "simpleantispam-label": "Cumprobu cuntraspam\nNo <strong>not</strong> ischribì nudda drentu!",
        "pageinfo-header-basic": "Iffuimmaziòni basirari",
        "pageinfo-header-edits": "Cronologia",
+       "pageinfo-display-title": "Tìturu indicaddu",
+       "pageinfo-length": "Tàglia di la pàgina (in bytes)",
+       "pageinfo-language": "Linga di cuntinuddu di ra pàgina",
+       "pageinfo-content-model": "Mudellu di cuntinuddu di ra pàgina",
        "pageinfo-robot-index": "Primmissu",
+       "pageinfo-robot-noindex": "Migga primmissu",
+       "pageinfo-redirects-name": "Innùmaru di cullegamenti a kistha pàgina",
+       "pageinfo-subpages-name": "Innùmaru di sottupàgini di chistha pàgina",
        "pageinfo-firstuser": "Criadori di pàgini",
        "pageinfo-firsttime": "Data di criazioni di la pàgina",
+       "pageinfo-lasttime": "Data di l'ùlthima modìfica",
        "pageinfo-edits": "Innùmaru totari di modìfichi",
+       "pageinfo-authors": "Innùmaru tutari d'autori dibessi",
+       "pageinfo-recent-authors": "Ùlthimu innùmaru d'autori dibessi",
+       "pageinfo-magic-words": "{{PLURAL:$1|Paràura màgica|Paràuri màgichi}} ($1)",
+       "pageinfo-hidden-categories": "{{PLURAL:$1|categuria cuadda|categurì cuaddi}}",
        "pageinfo-toolboxlink": "Iffuimmaziòni pa la pàgina",
        "pageinfo-contentpage-yes": "Sì",
        "pageinfo-protect-cascading-yes": "Sì",
        "widthheightpage": "$1 × $2, $3 {{PLURAL:$3|pàgina|pàgini}}",
        "file-info": "Misuri: $1, tipu MIME: $2",
        "file-info-size": "$1 × $2 punti, misuri: $3, tipu MIME: $4",
+       "file-info-size-pages": "$1 × $2 punti, misuri di lu file: $3, tipu MIME: $4, $5 {{PLURAL:$5|pàgina|pàgini}}",
        "file-nohires": "Nò so dipunìbiri versioni a risoruzioni maggiori.",
        "svg-long-desc": "file in fuimmaddu SVG, misuri nominari $1 × $2 punti, misuri di lu file: $3",
        "show-big-image": "File d'orìgini",
        "show-big-image-preview": "Tàglia di kistha antiprimma: $1.",
+       "show-big-image-other": "{{PLURAL:$2|Althra difinizioni|Althri difinizioni}}: $1.",
        "show-big-image-size": "$1 × $2 punti",
        "newimages": "Galleria di li file nobi",
        "imagelisttext": "Inogghi una listha di '''$1''' {{PLURAL:$1|file|file}} ordhinaddi pa $2.",
        "imgmultipageprev": "← pàgina prizzidenti",
        "imgmultipagenext": "pàgina sighenti →",
        "imgmultigo": "Vai",
+       "imgmultigoto": "Vai a la pàgina $1",
        "ascending_abbrev": "crisc",
        "descending_abbrev": "miminan",
        "table_pager_next": "Pàgina sighenti",
        "version-other": "Althru",
        "version-software-version": "Versioni",
        "redirect-submit": "Vai",
+       "redirect-lookup": "Tzirchà:",
+       "redirect-user": "Pàgina utenti",
+       "redirect-page": "Pàgina",
        "redirect-revision": "Versioni di la pàgina",
+       "redirect-file": "Innòmu di l'ischedàriu",
        "fileduplicatesearch-filename": "Innòommu di lu file:",
        "fileduplicatesearch-submit": "Zercha",
        "specialpages": "Pagini ippiziari",
        "tag-filter": "[[Special:Tags|Tag]] filthru:",
        "tag-list-wrapper": "[[Special:Tags|{{PLURAL:$1|Tag|Tags}}]]: $2",
        "tags-active-yes": "Sì",
+       "tags-active-no": "Nò",
        "tags-edit": "mudifigga",
        "tags-hitcount": "$1 {{PLURAL:$1|mudìfigga|mudìfigghi}}",
        "htmlform-submit": "Invia",
        "htmlform-selectorother-other": "Althru",
        "htmlform-yes": "Sì",
        "logentry-delete-delete": "$1 {{GENDER:$2|à isthudaddu}} ra pàgina $3",
+       "revdelete-content-hid": "cuntinuddu cuaddu",
        "logentry-newusers-create": "La registhrazioni di l'utenti $1 è isthadda {{GENDER:$2|criadda}}",
        "logentry-upload-upload": "$1 {{GENDER:$2|à carriggaddu}} $3",
        "rightsnone": "(nisciunu)",
index 354bb70..f951e8a 100644 (file)
        "autoblockedtext": "Vaša IP adresa je automatski blokirana jer je korištena od strane drugog korisnika, a blokirao ju je $1.\nNaveden je slijedeći razlog:\n\n:<em>$2</em>\n\n* Početak blokade: $8\n* Kraj blokade: $6\n* Blokirani korisnik: $7\n\nMožete kontaktirati $1 ili nekog drugog iz grupe [[{{MediaWiki:Grouppage-sysop}}|administratora]] i zahtijevati da Vas deblokira.\n\nZapamtite da ne možete koristiti opciju \"{{int:emailuser}}\" ukoliko nije unesena validna e-mail adresa u [[Special:Preferences|Vašim postavkama]] te Vas ne spriječava ga je koristite.\n\nVaša trenutna IP adresa je $3, a ID blokade je $5.\nMolimo da navedete sve gore navedene detalje u zahtjevu za deblokadu.",
        "systemblockedtext": "MediaWiki je automatski blokirao Vaše korisničko ime ili IP-adresu.\nDat je sljedeći razlog:\n\n:<em>$2</em>\n\n* Početak bloka: $8\n* Istek bloka: $6\n* Blok je namijenjen za: $7\n\nVaša trenutna IP-adresa je $3.\nPrepišite sve gorenavedene pojedinosti ukoliko želite da vlasti pitaju za blok.",
        "blockednoreason": "razlog nije naveden",
-       "blockedtext-composite": "<strong>Vaše korisničko ime ili IP-adresa je blokirano.</strong>\n\nDat je sljedeći razlog:\n\n:<em>$2</em>.\n\n* Početak bloka: $8\n* Istek najdužeg bloka: $6\n\nVaša trenutna IP-adresa je $3.\nPrepišite sve gorenavedene pojedinosti ukoliko želite da vlasti pitaju za blok.",
+       "blockedtext-composite": "<strong>Vaše korisničko ime ili IP-adresa je blokirano.</strong>\n\nDat je sljedeći razlog:\n\n:<em>$2</em>.\n\n* Početak bloka: $8\n* Istek najdužeg bloka: $6\n\n* $5\n\nVaša trenutna IP-adresa je $3.\nPrepišite sve gorenavedene pojedinosti ukoliko želite da vlasti pitaju za blok.",
+       "blockedtext-composite-ids": "Relevatne naznake blokova: $1 (vaša IP adresa može ujedno biti i na crnoj listi)",
+       "blockedtext-composite-no-ids": "Vaša IP adresa stoji na više crnih popisa",
        "blockedtext-composite-reason": "Vaš račun i/ili IP adresa ima nekoliko blokova",
        "whitelistedittext": "Da bi ste uređivali stranice, morate se $1.",
        "confirmedittext": "Morate potvrditi Vašu e-mail adresu prije nego počnete mijenjati stranice.\nMolimo da postavite i verifikujete Vašu e-mail adresu putem Vaših [[Special:Preferences|korisničkih opcija]].",
        "right-editmyusercss": "Uredite svoje vlastite CSS datoteke",
        "right-editmyuserjson": "Uređivanje vlastitih JSON datoteka",
        "right-editmyuserjs": "Uredite vlastite korisničke JavaScript datoteke",
+       "right-editmyuserjsredirect": "Uređivanje vlastitih JavaScript datoteka koje su preusmjeravanja",
        "right-viewmywatchlist": "Pregled vlastitog popisa praćenih stranica",
        "right-editmywatchlist": "Uređivanje vlastitih praćenih. Obratite pažnju da će neke akcije dodati stranice čak bez ovog prava.",
        "right-viewmyprivateinfo": "Pregledanje vlastitih ličnih podataka (npr. adresa e-pošte, stvarno ime)",
        "action-editmyusercss": "uređivanje vlastitih CSS datoteka",
        "action-editmyuserjson": "uređivanje vlastitih JSON datoteka",
        "action-editmyuserjs": "uređivanje vlastitih JavaScript datoteka",
+       "action-editmyuserjsredirect": "uređivanje vlastitih JavaScript datoteka koje su preusmjeravanja",
        "action-viewsuppressed": "pregledaj izmjene skrivene od svih korisnika",
        "action-hideuser": "blokiranje korisničkog imena, i njegovo sakrivanje od javnosti",
        "action-ipblock-exempt": "zaobilaženje IP blokova, autoblokova i opsežnih blokova",
        "edit-error-short": "Greška: $1",
        "edit-error-long": "Greške:\n\n$1",
        "specialmute": "Iskl. obavještenja",
-       "specialmute-success": "Promjene su uspješno napravljene. Pogledajte sve isključene korisnike na [[Special:Preferences]].",
+       "specialmute-success": "Promjene su uspješno napravljene. Pogledajte sve isključene korisnike u [[Special:Preferences|Vašim podešavanjima]].",
        "specialmute-submit": "Potvrdi / Потврди",
        "specialmute-label-mute-email": "Isključi e-poštu od ovog korisnika",
-       "specialmute-header": "Izaberite postavke za obavještenja od {{BIDI:[[User:$1]]}}.",
+       "specialmute-header": "Izaberite postavke za isključavanje obavještenja od <b>{{BIDI:[[User:$1]]}}</b>.",
        "specialmute-error-invalid-user": "Nisam mogao naći korisničko ime.",
-       "specialmute-error-email-blacklist-disabled": "Isključavanje e-pošte od korisnika nije omogućeno.",
-       "specialmute-error-email-preferences": "Morat ćete potvrditi svoju e-poštu prije isključivanja obavijesti od drugih. To je učinjeno na stranici [[Special:Preferences]].",
-       "specialmute-email-footer": "[$1 Upravljanje postavkama e-pošte od {{BIDI:$2}}.]",
+       "specialmute-error-no-options": "Isključivanje obavještenja je nedostupno. Ovo može biti jer nemate potvrđenu e-poštu, ili pak jer je administrator onemogućio mogućnosti e-pošte i/ili onemogućio crnu listu na ovom wikiju.",
+       "specialmute-email-footer": "Za postavljanje postavki za korisnika {{BIDI:$2}}, idite na <$1>.",
        "specialmute-login-required": "Molimo Vas prijavite se da biste napravili promjene.",
+       "mute-preferences": "Preferencije za isključavanje",
        "revid": "izmjena $1",
        "pageid": "ID stranice $1",
        "interfaceadmin-info": "$1\n\nDozvole za uređivanje CSS/JS/JSON datoteka preko cijelog wikija nedavno su odvojene od prava <code>editinterface</code>. Ako ne razumijete zašto ste dobili ovu grešku, pogl. [[mw:MediaWiki_1.32/interface-admin]].",
        "passwordpolicies-policy-passwordnotinlargeblacklist": "Lozinka ne može biti na listi 100.000 najčešće korišćenih lozinki.",
        "passwordpolicies-policyflag-forcechange": "mora se promjeniti pri prijavi",
        "passwordpolicies-policyflag-suggestchangeonlogin": "predloži izmjenu pri prijavi",
+       "mycustomjsredirectprotected": "Nemate dopuštenje za uređivanje ove JavaScript stranice jer predstavlja preusmjeravanje i ne vodi do vašeg imenskog prostora.",
        "easydeflate-invaliddeflate": "Sadržaj nije ispravno pročišćen",
        "unprotected-js": "JavaScript ne može da se učita sa nezaštićenih stranica iz bezbednosnih razloga. Samo napravite JavaScript u imenskom prostoru MediaWiki: ili kao korisničku podstranicu",
        "userlogout-continue": "Ako se želite odjaviti, [$1 nastavite na odjavnoj strnaici]."
index a330658..0dc68bc 100644 (file)
@@ -40,7 +40,8 @@
                        "Fitoschido",
                        "Matěj Suchánek",
                        "Vlad5250",
-                       "Robert Važan"
+                       "Robert Važan",
+                       "Vegetator"
                ]
        },
        "tog-underline": "Podčiarkovať odkazy:",
        "diff-multi-manyusers": "({{PLURAL:$1|$1 medziľahlá revízia|$1 medziľahlé revízie|$1 medziľahlých revízií}} od viac ako {{PLURAL:$2|$2 používateľa|$2 používateľov}} {{PLURAL:$1|nie je zobrazená|nie sú zobrazené|nie je zobrazených}})",
        "difference-missing-revision": "{{PLURAL:$2|$2 revízia|$2 revízie|$2 revízií}} pre požadovaný rozdiel ($1) {{PLURAL:$2|neexistuje|neexistujú|neexistuje}}.\n\nPravdepodobne ste nasledovali zastaraný odkaz na rozdiel revízií, z ktorých niektorá bola medzičasom odstránená.\nPodrobnosti nájdete v [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} zázname zmazaní].",
        "searchresults": "Výsledky vyhľadávania",
+       "search-filter-title-prefix-reset": "Vybrať na všetkých stránkach",
        "searchresults-title": "Výsledky hľadania „$1“",
        "titlematches": "Vyhovujúce názvy stránok",
        "textmatches": "Zhody v textoch stránok",
index 576512e..ea6035c 100644 (file)
        "autoblockedtext": "Vaš IP-naslov je bil samodejno blokiran, saj je bil uporabljen s strani drugega uporabnika, ki ga je blokiral $1.\nRazlog za to je bil naslednji:\n\n:<em>$2</em>\n\n* Začetek blokade: $8\n* Konec blokade: $6\n* Blokirani uporabnik: $7\n\nKontaktirate lahko $1 ali katerega od drugih [[{{MediaWiki:Grouppage-sysop}}|administratorjev]], da razpravljate o blokadi.\n\nVedite, da lahko funkcijo »{{int:emailuser}}« uporabljate le, če ste v svoje [[Special:Preferences|uporabniške nastavitve]] vnesli veljaven e-poštni naslov, in vam njena uporaba ni bila preprečena.\n\nVaš trenutni IP-naslov je $3, ID blokiranja pa #$5. Prosimo, vključite ta ID v vsako zastavljeno vprašanje.",
        "systemblockedtext": "Vaše uporabniško ime ali IP-naslov je MediaWiki samodejno blokiral.\nPodani razlog je:\n\n:<em>$2</em>\n\n* Začetek blokade: $8\n* Potek blokade: $6\n* Blokirani uporabnik: $7\n\nVaš trenutni IP-naslov je $3.\nProsimo, da v svoje poizvedbe vključite vse zgornje podatke.",
        "blockednoreason": "razlog ni podan",
-       "blockedtext-composite": "<strong>Vaše uporabniško ime ali IP-naslov je bil blokiran.</strong>\n\nPodani razlog je:\n\n:<em>$2</em>\n\n* Začetek blokade: $8\n* Potek najdaljše blokade: $6\n\nVaš trenutni IP-naslov je $3.\nProsimo, da v svoje poizvedbe vključite vse zgornje podatke.",
+       "blockedtext-composite": "<strong>Vaše uporabniško ime ali IP-naslov je bil blokiran.</strong>\n\nPodani razlog je:\n\n:<em>$2</em>\n\n* Začetek blokade: $8\n* Potek najdaljše blokade: $6\n\n* $5\n\nVaš trenutni IP-naslov je $3.\nProsimo, da v svoje poizvedbe vključite vse zgornje podatke.",
+       "blockedtext-composite-ids": "Relevantni ID-ji blokad: $1 (vaš IP-naslov je tudi lahko na črnem seznamu)",
+       "blockedtext-composite-no-ids": "Vaš IP-naslov je na več črnih seznamih",
        "blockedtext-composite-reason": "Za vaš račun in/ali IP-naslov je nastavljenih več blokad.",
        "whitelistedittext": "Za urejanje strani se morate $1.",
        "confirmedittext": "Pred urejanjem strani morate potrditi svoj e-poštni naslov.\nProsimo, da ga z uporabo [[Special:Preferences|uporabniških nastavitev]] vpišete in potrdite.",
        "right-editmyusercss": "Urejanje svojih uporabniških datotek CSS",
        "right-editmyuserjson": "Urejanje svojih uporabniških datotek JSON",
        "right-editmyuserjs": "Urejanje svojih uporabniških datotek JavaScript",
+       "right-editmyuserjsredirect": "Urejanje svojih uporabniških datotek JavaScript, ki so preusmeritve",
        "right-viewmywatchlist": "Ogledovanje svojega spiska nadzorov",
        "right-editmywatchlist": "Urejanje vašega spiska nadzorov. Vedite, da bodo nekatera dejanja dodala strani nanj tudi brez te pravice.",
        "right-viewmyprivateinfo": "Ogled svojih zasebnih podatkov (npr. e-poštnega naslova, pravega imena)",
        "action-editmyusercss": "urejanje svojih uporabniških datotek CSS",
        "action-editmyuserjson": "urejanje svojih uporabniških datotek JSON",
        "action-editmyuserjs": "urejanje svojih uporabniških datotek JavaScript",
+       "action-editmyuserjsredirect": "urejanje svojih uporabniških datotek JavaScript, ki so preusmeritve,",
        "action-viewsuppressed": "ogled redakcij skritih pred vsemi uporabniki",
        "action-hideuser": "blokiranje uporabnika in skritje pred javnostjo",
        "action-ipblock-exempt": "izogib blokadam IP-naslova, samodejnim blokadam in blokadam območij",
        "specialmute-success": "Vaše nastavitve utišanja smo uspešno posodobili. Oglejte si vse utišane uporabnike v [[Special:Preferences|svojih nastavitvah]].",
        "specialmute-submit": "Potrdi",
        "specialmute-label-mute-email": "Utišaj e-pošto tega uporabnika",
-       "specialmute-header": "Prosimo, izberite svoje nastavitve utišanja za uporabnika {{BIDI:[[User:$1]]}}.",
+       "specialmute-header": "Prosimo, izberite svoje nastavitve utišanja za uporabnika <b>{{BIDI:[[User:$1|$1]]}}</b>.",
        "specialmute-error-invalid-user": "Navedenega uporabniškega imena ni bilo mogoče najti.",
-       "specialmute-error-email-blacklist-disabled": "Utišanje uporabnikov pred pošiljanjem e-pošte ni omogočeno.",
-       "specialmute-error-email-preferences": "Preden lahko utišate uporabnika morate potrditi svoj e-poštni naslov. To lahko storite na strani [[Special:Preferences]].",
+       "specialmute-error-no-options": "Funkcionalnosti utišanja niso na voljo. Možni razlogi so: niste potrdili svojega e-poštnega naslova ali pa je administrator wikija onemogočil funkcionalnosti e-pošte in/ali črni seznam e-pošte za ta wiki.",
        "specialmute-email-footer": "Za upravljanje e-poštnih nastavitev za uporabnika {{BIDI:$2}} obiščite <$1>.",
        "specialmute-login-required": "Prosimo, prijavite se, da spremenite svoje nastavitve utišanja.",
+       "mute-preferences": "Nastavitve utišanja",
        "revid": "redakcija $1",
        "pageid": "ID strani $1",
        "interfaceadmin-info": "$1\n\nDovoljenja za urejanje datotek CSS/JS/JSON spletišča smo nedavno ločili od dovoljenja <code>editinterface</code>. Če ne razumete, zakaj smo vam izpisali to napako, si oglejte [[mw:MediaWiki_1.32/interface-admin]].",
        "passwordpolicies-policy-passwordnotinlargeblacklist": "Geslo ne more biti na seznamu 100.000 najpogosteje uporabljenih gesel.",
        "passwordpolicies-policyflag-forcechange": "treba spremeniti ob prijavi",
        "passwordpolicies-policyflag-suggestchangeonlogin": "predlagaj zamenjavo ob prijavi",
+       "mycustomjsredirectprotected": "Nimate pravic za urejanje te strani z JavaScriptom, ker je preusmeritev in ne kaže v vaš uporabniški prostor.",
        "easydeflate-invaliddeflate": "Dana vsebina ni pravilno stisnjena",
        "unprotected-js": "Iz varnostnih razlogov JavaScripta ni možno naložiti z nezaščitenih strani. Prosimo, da JavaScript ustvarite samo v imenskem prostoru MediaWiki ali kot uporabniško podstran.",
        "userlogout-continue": "Se želite odjaviti?"
index fc0d936..7574f53 100644 (file)
                ]
        },
        "tog-underline": "Nënvizimi i lidhjes:",
-       "tog-hideminor": "Fshih redaktimet e vogla nga ndryshimet e fundit",
-       "tog-hidepatrolled": "Fshih redaktimet e kontrolluara nga ndryshimet e fundit",
+       "tog-hideminor": "Fshih redaktimet e vogla nga ndryshimet më të fundit",
+       "tog-hidepatrolled": "Fshih redaktimet e kontrolluara nga ndryshimet më të fundit",
        "tog-newpageshidepatrolled": "Fshih faqet e kontrolluara nga lista e faqeve të reja",
        "tog-hidecategorization": "Fshih kategorizimin e faqeve",
        "tog-extendwatchlist": "Zgjero listën e të gjitha faqeve të vëzhguara në mënyrë që t'i tregojë të gjitha ndryshimet, jo vetëm më të fundit.",
        "tog-usenewrc": "Grupo ndryshimet sipas faqes në ndryshimet më të fundit dhe listën e vëzhgimit (kërkon JavaScript)",
        "tog-numberheadings": "Numërim automatik i titujve",
-       "tog-editondblclick": "Redakto faqe në klikim të dyfishtë",
-       "tog-editsectiononrightclick": "Aktivizo redaktimin e seksioneve duke klikuar me të djathtën mbi titullin e seksionit",
-       "tog-watchcreations": "Shto faqet e krijuara dhe skedarët e ngarkuar nga unë në listën time të mbikqyrjes",
-       "tog-watchdefault": "Shto faqet dhe skedarët e redaktuar prej meje në listën time të mbikqyrjes",
-       "tog-watchmoves": "Shto faqet dhe skedarët e zhvendosur nga unë, në listën time të mbikqyrjes",
-       "tog-watchdeletion": "Shto faqet dhe skedarët e fshirë nga unë në listën time të mbikqyrjes",
-       "tog-watchuploads": "Shto skedarët e rinj të ngarkuar nga unë në listën time të mbikëqyrjes",
-       "tog-watchrollback": "Shto faqet ku unë kam kryer një rikthim tek lista ime mbikqyrëse",
+       "tog-editondblclick": "Redakto faqet me një shtypje të dyfishtë",
+       "tog-editsectiononrightclick": "Aktivizo redaktimin e pjesëve duke shtypur me të djathtën mbi titullin e pjesës",
+       "tog-watchcreations": "Shto faqet e krijuara nga unë dhe materialet multimedialë të ngarkuar nga unë në listën time të mbikqyrjes",
+       "tog-watchdefault": "Shto faqet dhe materialet multimedialë që redaktoj në listën time të mbikqyrjes",
+       "tog-watchmoves": "Shto faqet dhe materialet multimedialë që zhvendos në listën time të mbikqyrjes",
+       "tog-watchdeletion": "Shto faqet dhe materialet multimedialë që fshij në listën time të mbikqyrjes",
+       "tog-watchuploads": "Shto materialet multimedialë të rinj që ngarkoj në listën time të mbikëqyrjes",
+       "tog-watchrollback": "Shto faqet ku unë kam kryer një rikthim te lista ime mbikqyrëse",
        "tog-minordefault": "Shëno të gjitha redaktimet si të vogla automatikisht",
        "tog-previewontop": "Trego parapamjen para kutisë së redaktimit",
        "tog-previewonfirst": "Trego parapamjen në redaktimin e parë",
        "virus-scanfailed": "skanimi dështoi (code $1)",
        "virus-unknownscanner": "antivirus i pa njohur:",
        "logouttext": "'''Ju keni dalë jashtë.''' \n \nKini parasysh që disa faqe mund të shfaqen sikur të ishit i/e identifikuar derisa të fshini ''cache''-in e shfletuesit tuaj.",
+       "logging-out-notify": "Po dilni nga llogaria juaj. Ju lutemi, prisni.",
+       "logout-failed": "Nuk mund të dilni nga llogaria juaj aktualisht: $1",
        "cannotlogoutnow-title": "Nuk mund të çkyçeni tani",
        "cannotlogoutnow-text": "Çregjistrimi nuk është i mundur kur përdorni $1.",
        "welcomeuser": "Mirë se vini, $1!",
        "group-autoconfirmed": "Përdorues të vërtetuar automatikisht",
        "group-bot": "Robot",
        "group-sysop": "Administrues",
+       "group-interface-admin": "Administratorët e ndërfaqes",
        "group-bureaucrat": "Burokrat",
        "group-suppress": "Shtypësit",
        "group-all": "(të gjitha)",
        "grouppage-autoconfirmed": "{{ns:project}}:Përdorues të vërtetuar automatikisht",
        "grouppage-bot": "{{ns:project}}:Robotë",
        "grouppage-sysop": "{{ns:project}}:Administruesit",
+       "grouppage-interface-admin": "{{ns:project}}:Wikipedia:Administratorët e ndërfaqes",
        "grouppage-bureaucrat": "{{ns:project}}:Burokratë",
        "grouppage-suppress": "{{ns:project}}:Shtypur",
        "right-read": "Lexo faqe",
index db88999..78c695a 100644 (file)
        "filepageexists": "Страница с описом ове датотеке је већ направљена овде <strong>[[:$1]]</strong>, иако датотека не постоји.\nОпис који сте навели се неће појавити на страници с описом.\nДа би се ваш опис овде нашао, потребно је да га ручно измените.\n[[$1|thumb]]",
        "fileexists-extension": "Датотека са сличним називом већ постоји: [[$2|thumb]]\n* Назив датотеке коју шаљете: <strong>[[:$1]]</strong>\n* Назив постојеће датотеке: <strong>[[:$2]]</strong>\nДа ли желите да користите препознатљивије име?",
        "fileexists-thumbnail-yes": "Изгледа да је датотека слика умањене величине <em>(сличица)</em>.\n[[$1|thumb]]\nПроверите датотеку <strong>[[:$1]]</strong>.\nАко је проверена датотека иста слика првобитне величине, није потребно отпремати додатну.",
-       "file-thumbnail-no": "Име датотеке почиње са <strong>$1</strong>.\nИзгледа да се ради о слици умањене величине <em>(сличица)</em>.\nАко имате ову слику у пуној резолуцији, отпремите је, у противном, промените име датотеке.",
+       "file-thumbnail-no": "Име датотеке почиње са <strong>$1</strong>.\nИзгледа да се ради о слици умањене величине <em>(минијатура)</em>.\nАко имате ову слику у пуној резолуцији, отпремите је; у противном, промените име датотеке.",
        "fileexists-forbidden": "Датотека с овим називом већ постоји и не може се заменити.\nАко и даље желите да пошаљете датотеку, вратите се и изаберите други назив.\n[[File:$1|thumb|center|$1]]",
        "fileexists-shared-forbidden": "Датотека са овим именом већ постоји у заједничкој остави.\nАко још увек желите да отпремите датотеку, вратите се и користите ново име.\n[[File:$1|thumb|center|$1]]",
        "fileexists-no-change": "Датотека је дупликат тренутне верзије <strong>[[:$1]]</strong>.",
        "listfiles-userdoesnotexist": "Кориснички налог „$1“ није отворен.",
        "imgfile": "датотека",
        "listfiles": "Списак датотека",
-       "listfiles_thumb": "СлиÑ\87иÑ\86а",
+       "listfiles_thumb": "Ð\9cиниÑ\98аÑ\82Ñ\83Ñ\80а",
        "listfiles_date": "Датум",
        "listfiles_name": "Назив",
        "listfiles_user": "Корисник",
        "filehist-revert": "врати",
        "filehist-current": "тренутна",
        "filehist-datetime": "Датум/време",
-       "filehist-thumb": "СлиÑ\87иÑ\86а",
+       "filehist-thumb": "Ð\9cиниÑ\98аÑ\82Ñ\83Ñ\80а",
        "filehist-thumbtext": "Минијатура за верзију на дан $1",
        "filehist-nothumb": "Без сличице",
        "filehist-user": "Корисник",
index e4d84de..04e0b06 100644 (file)
        "sunday": "Йәкшәмпе",
        "monday": "Түшәмпе",
        "tuesday": "Сишәмпе",
-       "wednesday": "Царшампы",
+       "wednesday": "Цәршәмпе",
        "thursday": "Пәйшәмпе",
        "friday": "Йома",
        "saturday": "Шәмпе",
        "sun": "Йәк",
        "mon": "Түш",
        "tue": "Сиш",
-       "wed": "Цар",
+       "wed": "Цәр",
        "thu": "Пәй",
        "fri": "Йом",
        "sat": "Шәм",
        "viewsource": "Вики-текстны ҡарау",
        "viewsource-title": "$1 питнең паш текстын ҡарау",
        "viewsourcetext": "Сес пы питнеңке паш текстын ҡарап күцерә аласыс.",
-       "userlogin-yourname": "Ҡулланыуцыныңҡы исеме",
+       "userlogin-yourname": "Ошланыуцыныңҡы исеме",
        "userlogin-yourname-ph": "Исәп йасмағысныңҡы исемен кергесең",
        "userlogin-yourpassword": "Пароль",
        "userlogin-yourpassword-ph": "Үсегеснең парольны йасың",
        "image_tip": "Кергеселгән файл",
        "media_tip": "Файлға ссылка",
        "sig_tip": "Ҡул ҡуйыуығыс пелән уаҡыт",
-       "hr_tip": "Горизонталь цыйыҡ (кел ҡулланмаң)",
+       "hr_tip": "Горизонталь цыйыҡ (әлтән ошланмаң)",
        "summary": "Пашҡартыуларны аңнатыу:",
        "minoredit": "Кецкенә пашҡартыу",
        "watchthis": "Пы питне көсәткәле",
        "preview": "Алттан ҡарау",
        "showpreview": "Алттан ҡарап цығыу",
        "showdiff": "Кергеселгән пашҡартыулар",
-       "anoneditwarning": "<strong>Саҡлыҡ!</strong> Сес сайтта теркәлмәтегес. Әгәр тә сес төрлө төсәтеүләр ҡылсағыс, сеснеңке IP-адресығыс пашҡаларға күренеп торор. Әгәр тә Сес <strong>[$1 керсәгез]</strong> йә <strong>[$2 ҡулланыуцы йасманы пултырсағыс]</strong>, сеснең төсәтеүләр ҡулланыуцы йасмағысҡа пәйле пулыр, шалай уҡ пашҡа өстөннөкләр тыуыр.",
+       "anoneditwarning": "<strong>Саҡлыҡ!</strong> Сес сайтта теркәлмәтегес. Әгәр тә сес төрлө төсәтеүләр ҡылсағыс, сеснеңке IP-адресығыс пашҡаларға күренеп торор. Әгәр тә Сес <strong>[$1 керсәгез]</strong> йә <strong>[$2 ошланыуцы йасманы пултырсағыс]</strong>, сеснең төсәтеүләр ошланыуцы йасмағысҡа пәйле пулыр, шалай уҡ пашҡа өстөннөкләр тыуыр.",
        "blockedtext": "<strong>Сеснең исәп йасмағыс йә IP адресығыс тыйылған.</strong>\n* Тыйған администратор: $1.\nКүргәселгән сәбәп: <em>$2.</em>\n\n* Тыйыу пашланҡан уаҡыт: $8\n* Тыйыуның пөтөү уаҡыты: $6\n* Тыйыуның кәрәге: $7\n\nСес $1 йә пүтән [[{{MediaWiki:Grouppage-sysop}}|администраторға]] тыйыу турлы сурауларығысны йебәрә аласыз.\nОнотмаң: әгәр сес  үсегеснеңке ҡоролошоғоста электрон почта адресығысны пирмәгән пулсағыс ([[Special:Preferences|йә аны төрөс күргәсмәгән пулсағыс]]), администраторға ҡат йебәрә алмайсыс. Шалай уҡ тыйыу уаҡытны сес ҡат йебәрә алмаған пуласыс.\nСеснең IP адрес — $3, тыйыу идентификатор — #$5.\nҠатларта пы ҡәбәр-пелемнәрне күргәскәле онотмаң.",
        "loginreqlink": "кергәле",
        "newarticletext": "Сес ссылка пелән әле йасылмаған питкә күцтегес. Йаңа пит ҡылыр өцөн астытағы тәрәсәгә текст йасың (тулыраҡ өцөн [$1 пелешмәлек питне] ҡараң). Әгәр мынта йалғыш кереп киткән пулсағыс, браузерығысныңҡы  \"сыртҡа\" кнопкаға пасың.",
-       "anontalkpagetext": "----\n<em>Пы уйлап ҡарау пит исәп йасыуны ҡылтырмаған йә аны ҡулланмайтығын аноним ҡатнашыуцыныңҡы пите.</em> Ҡулланыуцыны таныу өцөн аныңҡы IP-адресы ҡулланылаты.\nӘгәр сес аноним ҡулланыуцы пулсағыс, сескә йебәрелмәгән ҡатлар алтым тисәгес (пер IP-адрес кән ҡулланыуцыларта пулғалы мөмкин), пашҡа мынтайын аңнашылмауцылыҡлар килеп цыҡмасын өцөн, [[Special:UserLogin|системаға керең]] йә [[Special:CreateAccount|теркәлең]].",
+       "anontalkpagetext": "----\n<em>Пы уйлап ҡарау пит исәп йасыуны ҡылтырмаған йә аны ошланмайтығын аноним ҡатнашыуцыныңҡы пите.</em> Ошланыуцыны таныу өцөн аныңҡы IP-адресы ошланылаты.\nӘгәр сес аноним ошланыуцы пулсағыс, сескә йебәрелмәгән ҡатлар алтым тисәгес (пер IP-адрес кән ошланыуцыларта пулғалы мөмкин), пашҡа мынтайын аңнашылмауцылыҡлар килеп цыҡмасын өцөн, [[Special:UserLogin|системаға керең]] йә [[Special:CreateAccount|теркәлең]].",
        "noarticletext": "Ҡәсерге уаҡытта пы питтә текст йуҡ. Сес [[Special:Search/{{PAGENAME}}|пы исем кергән пашҡа мәҡәләләрне]], <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} туры килгән йасмаларны] таба йә '''[{{fullurl:{{FULLPAGENAME}}|action=edit}} шантайын уҡ исемле йаңа питне ҡыла]'''</span> аласыс.",
        "noarticletext-nopermission": "Ҡәсерге уаҡытта пы питтә текст йуҡ. Сес пашҡа питләртә [[Special:Search/{{PAGENAME}}|пы исемне]] йә <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} журналтағы йасмаларны] эстәй аласыс. Сескә пит йасағалы рөҡсәт пирелмәгән.</span>",
        "userpage-userdoesnotexist-view": "«$1» исемле исәп йасма йуҡ.",
        "editing": "«$1» питне төсәткәле",
        "creating": "«$1» питне пултырыу",
        "editingsection": "«$1» питтә төсәтеү",
-       "templatesused": "Пы питтә ҡулланылған {{PLURAL:$1|1=ҡалып|ҡалыплар}}:",
-       "templatesusedpreview": "Алттан ҡарау режимта ҡулланылған {{PLURAL:$1|1=ҡалып|ҡалыплар}}:",
+       "templatesused": "Пы питтә ошланылған {{PLURAL:$1|1=ҡалып|ҡалыплар}}:",
+       "templatesusedpreview": "Алттан ҡарау режимта ошланылған {{PLURAL:$1|1=ҡалып|ҡалыплар}}:",
        "template-protected": "(саҡланҡан)",
        "template-semiprotected": "(өлөшө пелән саҡланҡан)",
        "hiddencategories": "Пы пит $1 {{PLURAL:$1|йәшерен төргөнкә|$1 йәшерен төргөннәргә}} керәте:",
        "compareselectedversions": "Сайланҡан аңышларны туры килтергәле",
        "editundo": "пулмайын иткәле",
        "diff-empty": "(айырмалар йуҡ)",
-       "diff-multi-sameuser": "(пы ҡулланыуцының {{PLURAL:$1|аралыҡ версия $1|аралыҡ версиялары $1}} күргәселмәгән)",
+       "diff-multi-sameuser": "(пы ошланыуцының {{PLURAL:$1|аралыҡ версия $1|аралыҡ версиялары $1}} күргәселмәгән)",
        "diff-multi-otherusers": "({{PLURAL:$2|ҡатнашыуцының|$2 ҡатнашыуцыларның}} {{PLURAL:$1|ара аңышы|$1 арадаш аңышлары}} күргәселмәгән)",
        "searchresults": "Эстәүнең йомҡаҡлары",
        "searchresults-title": "«$1»ны эстәгәле",
        "group-sysop": "Администраторлар",
        "grouppage-bot": "{{ns:project}}:Ботлар",
        "grouppage-sysop": "{{ns:project}}:Администраторлар",
-       "right-writeapi": "Йасыр өцөн API-ны ҡулланыу",
-       "newuserlogpage": "Йаңа ҡулланыуцыларны теркәү журналы",
+       "right-writeapi": "Йасыр өцөн API-ны ошланыу",
+       "newuserlogpage": "Йаңа ошланыуцыларны теркәү журналы",
        "rightslog": "Ҡатнашыуцының ҡаҡлары журналы",
        "action-edit": "пы питне төсәткәле",
        "action-createaccount": "Пы исәп йасманы ҡылыу",
        "rcshowhidebots": "ботларны $1",
        "rcshowhidebots-show": "Күргәскәле",
        "rcshowhidebots-hide": "Йәшергәле",
-       "rcshowhideliu": "$1 танылған ҡулланыуцылар",
+       "rcshowhideliu": "$1 танылған ошланыуцылар",
        "rcshowhideliu-show": "Күргәскәле",
        "rcshowhideliu-hide": "Йәшергәле",
-       "rcshowhideanons": "танылмаған ҡулланыуцылар $1",
+       "rcshowhideanons": "танылмаған ошланыуцылар $1",
        "rcshowhideanons-show": "Күргәскәле",
        "rcshowhideanons-hide": "Йәшергәле",
        "rcshowhidepatr": "$1 ҡараған төсәтеүләр",
        "filehist-user": "Ҡатнашыуцы",
        "filehist-dimensions": "Сурлығы",
        "filehist-comment": "Искәрмә",
-       "imagelinks": "Файлны ҡулланыу",
+       "imagelinks": "Файлны ошланыу",
        "linkstoimage": "Пы файлға {{PLURAL:$1|1=пит|$1 пит}} йебәрәте:",
        "linkstoimage-more": "Пы файлға $1-на пашҡа та  {{PLURAL:$1|пит}} ссылка ҡылатылар.\nТүмәнтәге күцермәлектә пы файлға $1 {{PLURAL:$1|ссылка}} ғына күргәселгән.\nШалай уҡ [[Special:WhatLinksHere/$2|тулы күцермәлекне]] ҡарап пулаты.",
        "nolinkstoimage": "Пы файлға йебәргән питләр йуҡ.",
        "linkstoimage-redirect": "$1 (файл йусыҡлау) $2",
-       "sharedupload-desc-here": "Пы файл $1-нан, ул пашҡа проектларта ҡулланыла алаты. Файл турлы [$2 сүрәтләү пите] тулыраҡ пелешмә түмәнтәрәк пирелгән.",
+       "sharedupload-desc-here": "Пы файл $1-нан, ул пашҡа проектларта ошланыла алаты. Файл туры [$2 сүрәтләү пите] тулыраҡ пелешмә түмәнтәрәк пирелгән.",
        "filepage-nofile": "Мынтайын исемле файл йуҡ.",
        "upload-disallowed-here": "Сес пы файлны йаңатан йастыра алмайсыс.",
        "randompage": "Уйланмаған мәҡәлә",
        "protectlogpage": "Саҡлау журнал",
        "protectedarticle": "[[$1]] питен йаҡлаған",
        "modifiedarticleprotection": "[[$1]]-ныңҡы питенең йаҡлау ҡаты пашҡартылты",
-       "protect-default": "Пөтөн ҡулланыуцыларға ацыҡ",
+       "protect-default": "Пөтөн ошланыуцыларға ацыҡ",
        "restriction-edit": "Төсәткәле",
        "restriction-move": "Йаңа исем ҡушыу",
        "namespace": "Исемнәрнең киңнеге:",
        "tooltip-t-whatlinkshere": "Пы питкә тапшырған пөтөн питләрнең күцермәлеге",
        "tooltip-t-recentchangeslinked": "Пы питтән тапшырылған питләрнең суңҡы пашҡартыулары",
        "tooltip-feed-atom": "Пы пит өцөн Atom-ҡа трансляция",
-       "tooltip-t-contributions": "{{GENDER:$1|Пы ҡулланыуцы ҡылған}} пашҡартыуларның күцермәлеге",
-       "tooltip-t-emailuser": "{{GENDER:$1|пы ҡулланыуцыға}} ҡат йебәргәле",
+       "tooltip-t-contributions": "{{GENDER:$1|Пы ошланыуцы ҡылған}} пашҡартыуларның күцермәлеге",
+       "tooltip-t-emailuser": "{{GENDER:$1|пы ошланыуцыға}} ҡат йебәргәле",
        "tooltip-t-upload": "Файлларны төйәгәле",
        "tooltip-t-specialpages": "Ҡесмәт питләрнең күцермәлеге",
        "tooltip-t-print": "Пы питнең пасма аңышы",
        "tooltip-t-permalink": "Пы питнең версиясына тапшырған келәң ссылка",
        "tooltip-ca-nstab-main": "Мәҡәләнеңке эцтәлеге",
-       "tooltip-ca-nstab-user": "Ҡулланыуцыныңҡы үсенең пите",
+       "tooltip-ca-nstab-user": "Ошланыуцыныңҡы үсенең пите",
        "tooltip-ca-nstab-special": "Пы ҡесмәт пит, аны төсәткәле пулмайты",
        "tooltip-ca-nstab-project": "Проектның пите",
        "tooltip-ca-nstab-image": "Файлның пите",
        "tooltip-ca-nstab-category": "Категорияның пите",
        "tooltip-minoredit": "Пы пашҡартыуны пайтаҡ түгел итеп пилгеләгәле",
        "tooltip-save": "Пашҡартыуларығысны ҡалтырғалы",
-       "tooltip-preview": "Питне алттан ҡарап цығыу; төсәтеүләрегесне ҡалтырыр алттан ҡулланың!",
+       "tooltip-preview": "Питне алттан ҡарап цығыу; төсәтеүләрегесне ҡалтырыр алттан ошланың!",
        "tooltip-diff": "Текстта эшләнкән үсегеснең пашҡартыуларығысны генә күргәскәле",
        "tooltip-compareselectedversions": "Пы питнең ике сайланҡан аңышылары арасынтағы айырманы ҡарағалы.",
        "tooltip-watch": "Пы питне көсәтеү күцермәлегемә өстәгәле",
index 5dd7c1b..918a8be 100644 (file)
        "autoblockedtext": "Din IP-adress har blockerats automatiskt eftersom den har använts av en annan användare som blockerats av $1.\nMotiveringen av blockeringen var:\n\n:''$2''\n\n* Blockeringen startade: $8\n* Blockeringen gäller till: $6\n* Blockeringen är avsedd för: $7\n\nDu kan kontakta $1 eller någon annan [[{{MediaWiki:Grouppage-sysop}}|administratör]] för att diskutera blockeringen.\n\nObservera att du inte kan använda dig av funktionen \"{{int:emailuser}}\" om du inte har registrerat en giltig e-postadress i [[Special:Preferences|dina inställningar]] eller om du har blivit blockerad från att skicka e-post.\n\nDin nuvarande IP-adress är $3, och blockerings-ID är #$5.\nVänligen ange informationen ovan i alla förfrågningar som du gör i ärendet.",
        "systemblockedtext": "Ditt användarnamn eller IP-adress h    ar blockerats automatiskt av MediaWiki.\n\nMotiveringen av blockeringen var:\n\n:<em>$2</em>\n\n* Blockeringen startade: $8\n* Blockeringen gäller till: $6\n* Blockeringen är avsedd för: $7\n\nDin nuvarande IP-adress är $3.\nVänligen ange informationen ovan i alla förfrågningar som du gör i ärendet.",
        "blockednoreason": "ingen motivering angavs",
-       "blockedtext-composite": "<strong>Ditt användarnamn eller din IP-adress har blockerats.</strong>\n\nMotiveringen till detta är:\n\n<em>$2</em>.\n\n* Blockeringen startade: $8\n* Den längsta blockeringen gäller till: $6\n\nDin nuvarande IP-adress är $3.\n\nVänligen ange all informationen ovan i förfrågningar som du gör i ärendet.",
+       "blockedtext-composite": "<strong>Ditt användarnamn eller din IP-adress har blockerats.</strong>\n\nMotiveringen till detta är:\n\n<em>$2</em>.\n\n* Blockeringen startade: $8\n* Den längsta blockeringen gäller till: $6\n\n* $5\n\nDin nuvarande IP-adress är $3.\n\nVänligen ange all informationen ovan i förfrågningar som du gör i ärendet.",
+       "blockedtext-composite-ids": "Relevanta blockerings-ID:n: $1 (din IP-adress kan också vara svartlistad)",
+       "blockedtext-composite-no-ids": "Din IP-adress finns i flera svartlistor",
        "blockedtext-composite-reason": "Det föreligger flera blockeringar mot ditt konto eller din IP-adress.",
        "whitelistedittext": "Vänligen $1 för att redigera sidor.",
        "confirmedittext": "Du måste bekräfta din e-postadress innan du kan redigera sidor. Var vänlig ställ in och validera din e-postadress genom dina [[Special:Preferences|användarinställningar]].",
        "right-editmyusercss": "Redigera din egen användares CSS-filer",
        "right-editmyuserjson": "Redigera dina egna JSON-filer",
        "right-editmyuserjs": "Redigera din egen användares JavaScript-filer",
+       "right-editmyuserjsredirect": "Redigera dina egna JavaScript-filer som är omdirigeringar",
        "right-viewmywatchlist": "Visa din egen bevakningslista",
        "right-editmywatchlist": "Redigera din egen bevakningslista. Observera att en del åtgärder kommer fortfarande lägga till sidor även utan denna rättighet.",
        "right-viewmyprivateinfo": "Visa dina egna privata data (t.ex. e-postadress, riktiga namn)",
        "action-editmyusercss": "redigera dina egna CSS-filer",
        "action-editmyuserjson": "redigera dina egna JSON-filer",
        "action-editmyuserjs": "redigera dina egna JavaScript-filer",
+       "action-editmyuserjsredirect": "redigera dina egna JavaScript-filer som är omdirigeringar",
        "action-viewsuppressed": "se sidversioner som dolts från alla användare",
        "action-hideuser": "blockera ett användarnamn och dölj det från allmänheten",
        "action-ipblock-exempt": "kringgå IP-blockeringar, autoblockeringar och IP-intervallsblockeringar",
        "specialmute-success": "Dina tystnadsinställningar har uppdateras. Se alla tystade användare i [[Special:Preferences|dina inställningarna]].",
        "specialmute-submit": "Bekräfta",
        "specialmute-label-mute-email": "Tysta e-post från denna användare",
-       "specialmute-header": "Välj dina tystnadsinställningar för {{BIDI:[[User:$1]]}}.",
+       "specialmute-header": "Välj dina tystnadsinställningar för användaren <b>{{BIDI:[[User:$1]]}}</b>.",
        "specialmute-error-invalid-user": "Det begärda användarnamnet kunde inte hittas.",
-       "specialmute-error-email-blacklist-disabled": "Att förhindra användare från att skicka e-post till dig har inte aktiverats.",
-       "specialmute-error-email-preferences": "Du måste bekräfta din e-postadress innan du kan tysta en användare. Du kan göra det i [[Special:Preferences|inställningarna]].",
-       "specialmute-email-footer": "För att hantera e-postinställningar för {{BIDI:$2}}, besök <$1>.",
+       "specialmute-error-no-options": "Tystnadsfunktioner är inte tillgängliga. Detta kan bero på att: du inte har bekräftat din e-postadress eller wikiadministratören har inaktiverat e-postfunktioner och/eller svartlistan för e-post på denna wiki.",
+       "specialmute-email-footer": "För att hantera e-postinställningar för användaren {{BIDI:$2}}, besök <$1>.",
        "specialmute-login-required": "Logga in för att ändra dina tystnadsinställningar.",
+       "mute-preferences": "Tystnadsinställningar",
        "revid": "sidversion $1",
        "pageid": "sid-ID $1",
        "interfaceadmin-info": "$1\n\nBehörigheter för att redigera CSS/JS/JSON-filer för hela webbplatsen separerades nyligen från rättigheten <code>editinterface</code>. Om du inte förstår varför du får detta felmeddelande, se [[mw:MediaWiki_1.32/interface-admin]].",
        "passwordpolicies-policy-passwordnotinlargeblacklist": "Lösenordet kan inte vara med i listan över de 100 000 vanligaste lösenorden.",
        "passwordpolicies-policyflag-forcechange": "måste ändras vid inloggning",
        "passwordpolicies-policyflag-suggestchangeonlogin": "föreslå ändring vid inloggning",
+       "mycustomjsredirectprotected": "Du har inte behörighet att redigera denna JavaScript-sida eftersom det är en omdirigering och leder inte någonstans inom din användarnamnrymd.",
        "easydeflate-invaliddeflate": "Innehåll som tillhandahålls är inte helt komprimerat",
        "unprotected-js": "Av säkerhetsskäl kan inte JavaScript läsas in från oskyddade sidor. Skapa endast JavaScript i namnrymden MediaWiki: eller som en användarundersida.",
        "userlogout-continue": "Vill du logga ut?"
index 99cfe94..cb1929a 100644 (file)
        "history": "పేజీ చరిత్ర",
        "history_short": "చరిత్ర",
        "history_small": "చరిత్ర",
-       "updatedmarker": "à°¨à±\87à°¨à±\81 à°\95à°¿à°\82à°¦à°\9fిసారి à°µà°\9aà±\8dà°\9aిన తరువాత జరిగిన మార్పులు",
+       "updatedmarker": "à°®à±\80à°°à±\81 à°\95à°¿à°\82à°¦à°\9fిసారి à°µà°\9aà±\8dà°\9aà°¿ à°µà±\86à°³à±\8dà°³ిన తరువాత జరిగిన మార్పులు",
        "printableversion": "అచ్చుతీయదగ్గ కూర్పు",
        "permalink": "శాశ్వత లంకె",
        "print": "ముద్రించు",
        "defaultmessagetext": "అప్రమేయ సందేశపు పాఠ్యం",
        "content-failed-to-parse": "$1 మోడల్ కొరకు $2 పాఠ్యాన్ని పార్స్ చెయ్యలేకపోయాం: $3",
        "invalid-content-data": "చెల్లని కంటెంటు డేటా",
-       "content-not-allowed-here": "[[:$2]] పేజీలో పాఠ్యం \"$1\" కి అనుమతి లేదు",
+       "content-not-allowed-here": "స్లాట్ \"$3\" లో [[:$2]] పేజీలో పాఠ్యం \"$1\" కి అనుమతి లేదు",
        "editwarning-warning": "ఈ పేజీని వదిలివెళ్ళడం వల్ల మీరు చేసిన మార్పులను కోల్పోయే అవకాశం ఉంది.\nమీరు లాగిన్ అయివుంటే, ఈ హెచ్చరికని మీ అభిరుచులలోని \"{{int:prefs-editing}}\"  విభాగంలో అచేతనం చేసుకోవచ్చు.",
        "editpage-notsupportedcontentformat-title": "పాఠ్యపు ఆకృతికి మద్దతు లేదు",
        "editpage-notsupportedcontentformat-text": "$2 పాఠ్యపు మోడల్, పాఠ్యపు ఆకృతి $1 కి మద్దతు ఇవ్వదు",
        "right-reupload-own": "తానే ఇదివరలో అప్‌లోడు చేసిన ఫైలును తిరగరాయి",
        "right-reupload-shared": "స్థానికంగా ఉమ్మడి మీడియా సొరుగులోని ఫైళ్ళను అధిక్రమించు",
        "right-upload_by_url": "URL అడ్రసునుండి ఫైలును అప్‌లోడు చెయ్యడం",
-       "right-purge": "పేజీకి సంబంధించిన సైటు కాషెను, నిర్ధారణ కోరకుండానే తొలగించు",
+       "right-purge": "పేజీకి సంబంధించిన సైటు కాషెను తొలగించు",
        "right-autoconfirmed": "ఐపీ ఆధారిత రేటు పరిమితులు ప్రభావం చూపవు",
        "right-bot": "ఆటోమాటిక్ ప్రాసెస్ లాగా భావించబడు",
        "right-nominornewtalk": "చర్చా పేజీల్లో చేసే చిన్న మార్పులకు కొత్తసందేశపు సూచన పంపకూడదు",
        "grant-delete": "పేజీలు, కూర్పులు, లాగ్ ఎంట్రీల తొలగింపు",
        "grant-editinterface": "MediaWiki పేరుబరిలోను, సైటువ్యాప్త/వాడుకరి JSON కూ దిద్దుబాట్లు చెయ్యడం",
        "grant-editmycssjs": "మీ వాడుకరి CSS/JSON/JavaScript దిద్దడం",
-       "grant-editmyoptions": "మీ అభిరుచుల దిద్దుబాటు",
+       "grant-editmyoptions": "మీ అభిరుచులను, JSON కాన్ఫిగరేషన్నూ మార్చుకోండి",
        "grant-editmywatchlist": "మీ వీక్షణజాబితా దిద్దుబాటు",
        "grant-editsiteconfig": "సైటువ్యాప్త/వాడుకరి CSS/JS దిద్దడం",
        "grant-editpage": "ఉనికిలో ఉన్న పేజీల దిద్దుబాటు",
        "rcfilters-savedqueries-already-saved": "ఈ వడపోతలను ఈసరికే భద్రపరచారు. కొత్త వడపోతను సృష్టించేందుకు సెట్టింగులను మార్చండి.",
        "rcfilters-restore-default-filters": "డిఫాల్టు వడపోతకాలను పునఃస్థాపించు",
        "rcfilters-clear-all-filters": "వడపోతకాలన్నింటినీ తుడిచెయ్యి",
-       "rcfilters-show-new-changes": "సరికొత్త మార్పులను చూడండి",
+       "rcfilters-show-new-changes": "$1 నుండి జరిగిన సరికొత్త మార్పులను చూడండి",
        "rcfilters-search-placeholder": "మార్పులను వడకట్టండి (మెనూను వాడండి లేదా వడపోత పేరు కోసం వెతకండి)",
        "rcfilters-invalid-filter": "తప్పు వడపోతకం",
        "rcfilters-empty-filter": "చేతనంగా ఉన్న వడపోతకాలేమీ లేవు. మార్పుచేర్పు లన్నిటినీ చూపించాం.",
index 7d9374b..b016fc5 100644 (file)
@@ -24,6 +24,7 @@
        "tog-hideminor": "Пӯшидани вироишоти ҷузъи дар тағйироти охирин",
        "tog-hidepatrolled": "Пинҳон кардани вироишҳои гаштхӯрда дар тағйироти охир",
        "tog-newpageshidepatrolled": "Пинҳони саҳифаҳои гаштхӯрда аз феҳристи саҳифаҳои нав",
+       "tog-hidecategorization": "Пинҳон кардани гурӯҳбандии саҳифаҳо",
        "tog-extendwatchlist": "Густариши феҳристи пайгириҳо барои нишон додани ҳамаи тағйирот, на танҳо аз ҳама охирин",
        "tog-usenewrc": "Гурӯҳбандии тағийрот бар пояи сафҳа дар тағийроти охир ва феҳристи пайгириҳо",
        "tog-numberheadings": "шуморагузори~и худкори инвонҳо",
@@ -41,9 +42,9 @@
        "tog-enotifminoredits": "Барои тағийроти ҷузъӣ дар сафҳаҳо ва парвандаҳо ҳам ба ман номае фиристода шавад",
        "tog-enotifrevealaddr": "Нишонаи почтаи электронии ман дар номаҳои иттилорасонӣ қайд шавад",
        "tog-shownumberswatching": "Нишон додани шумораи корбарони пайгир",
-       "tog-oldsig": "Имзои вуҷуддошта:",
+       "tog-oldsig": "Имзои вуҷуддоштаи шумо:",
        "tog-fancysig": "Имзоро ба сурати викиматн ба назар бигир (бе пайванди худкор)",
-       "tog-uselivepreview": "Истифода аз пешнамоиши зинда(озмоишӣ)",
+       "tog-uselivepreview": "Истифода аз пешнамоиши зинда",
        "tog-forceeditsummary": "Ҳангоме ки хулосаи вироиш нанавиштаам юа ман ислоҳ бидеҳ",
        "tog-watchlisthideown": "Пинҳон намудани вироишҳои ман дар феҳристи назарот",
        "tog-watchlisthidebots": "Пинҳон намудани вироишҳои бот дар феҳристи назарот",
        "october-gen": "октябри",
        "november-gen": "ноябри",
        "december-gen": "декабри",
-       "jan": "Ян",
+       "jan": "Янв",
        "feb": "Фев",
        "mar": "Мар",
        "apr": "Апр",
        "aug": "Авг",
        "sep": "Сент",
        "oct": "Окт",
-       "nov": "Нов",
+       "nov": "Ноя",
        "dec": "Дек",
        "january-date": "$1 январ",
        "february-date": "$1 феврал",
        "returnto": "Бозгашт ба $1.",
        "tagline": "Аз {{SITENAME}}",
        "help": "Роҳнамо",
+       "help-mediawiki": "Дар бораи Медиавики",
        "search": "Ҷустуҷӯ",
        "searchbutton": "Ҷустуҷӯ",
        "go": "Рав",
        "searcharticle": "Бирав",
        "history": "Таърих",
        "history_short": "Таърих",
+       "history_small": "таърих",
        "updatedmarker": "барӯзшуда аз рӯзи охирин ташрифам",
        "printableversion": "Нусхаи чопӣ",
        "permalink": "Пайванди доимӣ",
        "redirectedfrom": "(Тағйири масир аз $1)",
        "redirectpagesub": "Саҳифаи равонакунӣ",
        "redirectto": "Тағйири масир ба:",
-       "lastmodifiedat": "Ин саҳифа бори охир $2, $1 дигаргун карда шудааст.",
+       "lastmodifiedat": "Ин саҳифапо бори охир дар $1, $2 вироиш карда буданд.",
        "viewcount": "Ин саҳифа {{PLURAL:$1|бор|$1 бор}} дида шудааст.",
        "protectedpage": "Саҳифаи муҳофизатшуда",
        "jumpto": "Ҷаҳиш ба:",
        "copyright": "Муҳтаво таҳти иҷозатномаи $1 ва ё дигар дастрас аст.",
        "copyrightpage": "{{ns:project}}:Copyrights",
        "currentevents": "Рӯйдодҳои кунунӣ",
-       "currentevents-url": "Лоиҳа:Рӯйдодҳои кунунӣ",
+       "currentevents-url": "Project:Рӯйдодҳои кунунӣ",
        "disclaimers": "Такзибнома",
-       "disclaimerpage": "Википедия:Такзибномаи умумӣ",
+       "disclaimerpage": "Project:Такзибномаи умумӣ",
        "edithelp": "Роҳнамои вироиш",
+       "helppage-top-gethelp": "Кӯмак",
        "mainpage": "Саҳифаи аслӣ",
        "mainpage-description": "Саҳифаи аслӣ",
        "policy-url": "Project:Сиёсатҳо",
        "pagetitle-view-mainpage": "{{SITENAME}}",
        "retrievedfrom": "Баргирифта аз \"$1\"",
        "youhavenewmessages": "Шумо $1 ($2) доред.",
+       "newmessageslinkplural": "{{PLURAL:$1|паёми|паёмҳои}} нав",
        "youhavenewmessagesmulti": "Шумо номаҳои нав дар $1 доред.",
        "editsection": "вироиш",
        "editold": "вироиш",
        "hidetoc": "Пинҳон кардани",
        "collapsible-collapse": "Фурукаш",
        "collapsible-expand": "Густариш",
+       "confirmable-confirm": "Шумо {{GENDER:$1|боварӣ}} доред?",
+       "confirmable-yes": "Бале",
+       "confirmable-no": "Не",
        "thisisdeleted": "Намоиш ё эҳёи $1?",
        "viewdeleted": "Намоиши $1?",
        "restorelink": "{{PLURAL:$1|вироиши ҳазфшуда|$1 вироишоти ҳазфшудаҳо}}",
        "site-atom-feed": "Барои $1 Atom Хабархон",
        "page-rss-feed": "Барои \"$1\" RSS Хабархон",
        "page-atom-feed": "Барои \"$1\" Atom Хабархон",
+       "feed-atom": "Атом",
        "red-link-title": "$1 (саҳифа вуҷуд надорад)",
        "nstab-main": "Мақола",
        "nstab-user": "Саҳифаи корбар",
        "createacct-yourpasswordagain-ph": "Гузарвожаро бори дигар ворид кунед",
        "userlogin-remembermypassword": "Вурудшуда манро нигоҳ дор",
        "userlogin-signwithsecure": "Истифодаи пайвастшавии амн",
+       "cannotlogin-title": "Наметавонед дохил шавед",
        "yourdomainname": "Домейни Шумо",
        "password-change-forbidden": "Шумо гузарвожаро дар ин вики тағийр дода наметавонед.",
        "externaldberror": "Хатое дар иртибот бо пойгоҳи дода рух дода аст ё ин ки шумо иҷозат ба рӯзрасонии ҳисоби берунии худро надоред.",
        "loginlanguagelabel": "Забон: $1",
        "pt-login": "Вуруд",
        "pt-login-button": "Вуруд",
+       "pt-login-continue-button": "Идомаи вуруд",
        "pt-createaccount": "Эҷоди ҳисоб",
        "pt-userlogout": "Хуруҷ",
        "changepassword": "Иваз намудани калимаи убур",
        "retypenew": "Калимаи нави убурро такроран нависед:",
        "resetpass_submit": "Калимаи убурро танзим карда ба систем вуруд кунед",
        "changepassword-success": "Гузарвожаи шумо бо муваффақият тағйир дода шуд!",
+       "botpasswords-label-appid": "Номи бот:",
+       "botpasswords-label-create": "Эҷод",
+       "botpasswords-label-update": "Азнав бор кардан",
        "botpasswords-label-cancel": "Пӯшидан",
+       "botpasswords-label-delete": "Ҳазф намудан",
        "resetpass_forbidden": "Гузарвожаҳоро наметавон тағйир дод",
        "resetpass-no-info": "Барои дастрасии мустақим ба ин саҳифа шумо бояд ба систем ворид шуда бошед.",
        "resetpass-submit-loggedin": "Тағйири гузарвожа",
        "headline_tip": "Унвони сатҳи 2",
        "nowiki_sample": "Инҷо матни қолаббанди-нашударо дохил кунед",
        "nowiki_tip": "Рад кардани қолаббандии вики",
+       "image_sample": "Намуна.jpg",
        "image_tip": "Тасвири дохили матн",
+       "media_sample": "Намуна.ogg",
        "media_tip": "Пайванди парвандаи расона",
        "sig_tip": "Имзои Шумо бо мӯҳри сана",
        "hr_tip": "Хати уфуқӣ (сарфакорона истифода кунед)",
        "summary": "Хулоса:",
-       "subject": "Мавзӯъ/сарлавҳа:",
+       "subject": "Мавзӯъ:",
        "minoredit": "Ин вироиши хурд аст",
        "watchthis": "Назар кардани ин саҳифа",
        "savearticle": "Саҳифа захира шавад",
        "savechanges": "Захира кардан",
+       "publishpage": "Нашри саҳифа",
+       "publishchanges": "Нашри тағйирот",
+       "savearticle-start": "Захираи саҳифа...",
+       "savechanges-start": "Захираи тағйирот...",
+       "publishpage-start": "Нашри саҳифа...",
+       "publishchanges-start": "Нашри тағйирот...",
        "preview": "Пешнамоиш",
        "showpreview": "Пешнамоиш",
        "showdiff": "Намоиши тағйирот",
        "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 шумо қатъ шудааст, сабаб он аст, ки ин нишонаи IP аз тарафи корбаре истифода мешуд, ки дастрасии ӯ аз тарафи $1 қатъ гардонида шудааст.\nИллати зикршуда чунин аст:\n\n:<em>$2</em>\n\n* Шурӯъи қатъи дастрасӣ: $8\n* Поёни қатъи дастрасӣ: $6\n* Шахси басташуда: $7\n\nШумо метавонед бо $1 ё яке аз дигаре [[{{MediaWiki:Grouppage-sysop}}|мудирон]] тамос бигиред, то дар мавриди ин қатъи дастрасӣ сӯҳбат кунед.\n\nТаваҷҷӯҳ кунед, шумо аз \"фиристодани email ба ин корбар\" истифода бурда наметавонед, агар нишонаи почтаи электронӣ худро дар саҳифаи [[Special:Preferences|тарҷиҳоти корбарӣ]] фаъол карда набошед ва низ, имкони истифода аз ин вижагӣ барои шумо қатъ набошад.\n\nНишонаи IP кунунии шумо $3, ва нишонаи басташуда #$5 аст.\nЛутфан ин иттилоотро дар ҳар дархосте, ки мекунед, қайд намоед.",
        "blockednoreason": "далеле мушаххас нашудааст",
+       "blockedtext-composite": "<strong>Саҳифаи корбарӣ ё суроғаи IP-и шумо баста шуддааст.</strong>\n\nСабаб дар он аст:\n\n:<em>$2</em>.\n\n* Аввали бастан: $8\n* Охирин муддати дарозтарини бастан: $6\n\n* $5\n\nСурағаи IP-и кунунии шумо $3 мебошад.\nЛутфан деталҳои дар боло зикршударо дар саволҳои худ дохил намоед.",
+       "blockedtext-composite-no-ids": "Суроғаи IP-и шумо дар чандин рӯйхати сиёҳ мавҷуд аст.",
        "whitelistedittext": "Барои вироиши мақола бояд ба систем $1 шавед.",
        "confirmedittext": "Шумо бояд нишонаи почтаи электрониатонро пеш аз вироиш кардани саҳифаҳо, тасдиқ кунед. Лутфан ин корро тариқи [[Special:Preferences|тарҷиҳоти корбар]] сурат диҳед.",
        "nosuchsectiontitle": "Бахш пайдо нашуд",
        "edit-gone-missing": "Наметавон саҳифаро барӯз кард.\nБа назар мерасад, ки ҳазв шуда бошад.",
        "edit-conflict": "Бархурди вироиш.",
        "edit-no-change": "Вироиши шумо нодида гирифта шуд, зеро тағйире дар матн дода нашуда буд.",
+       "postedit-confirmation-created": "Саҳифа эҷод шуд.",
+       "postedit-confirmation-restored": "Саҳифа барқарор кард шуд.",
        "postedit-confirmation-saved": "Вироиши шумо захира шуд.",
+       "postedit-confirmation-published": "Вироиши шумо нашр шуд.",
        "edit-already-exists": "Саҳифаи нав эҷод нашуд.\nҚаблан ин саҳифа вуҷуд дорад.",
        "defaultmessagetext": "Матни пайёми пешфарз",
+       "slot-name-main": "Асосӣ",
        "content-model-wikitext": "вики-матн",
        "content-model-text": "матни содда",
        "content-model-javascript": "ҶаваСкрипт",
+       "content-json-empty-object": "Ашёи холӣ",
        "post-expand-template-inclusion-warning": "<strong>Огоҳӣ:</strong> Шаблони дар баргирифта хеле калон аст. Баъзе аз шаблонҳо дар бар гирифта намешавад.",
        "post-expand-template-inclusion-category": "Саҳифаҳое ки дар он ҳаҷми шаблон беш аз ҳад аст",
        "post-expand-template-argument-warning": "<strong>Огоҳӣ:</strong> Ин саҳифа ҳаддиақал як шаблоне дорад, ки хосияти ҳаҷм калони васеъшавӣ дорад.\nИн хосият аз байр гирифта шуд.",
        "histfirst": "кӯҳнатарин",
        "histlast": "навтарин",
        "historysize": "({{PLURAL:$1|1 байт|$1 байт}})",
-       "historyempty": "(холӣ)",
+       "historyempty": "холӣ",
        "history-feed-title": "Таърихи вироишҳо",
        "history-feed-description": "Таърихи вироишҳои ин саҳифа дар вики",
        "history-feed-item-nocomment": "$1 дар $2",
        "revertmerge": "Вогардонии идғом",
        "mergelogpagetext": "Дар зер феҳристи идғоми охирини таърихи як саҳифаро ба дигар саҳифаро мебинед.",
        "history-title": "Таърихчаи вироишҳои \"$1\"",
+       "difference-title": "Фарқият байни намунаҳои \"$1\"",
+       "difference-title-multipage": "Фарқият байни саҳифаҳои \"$1\" ва \"$2\"",
        "difference-multipage": "(Тафовут байни саҳифаҳо)",
        "lineno": "Сатри $1:",
        "compareselectedversions": "Нусхаҳои интихобшударо муқоиса кунед",
        "editundo": "ботил",
        "diff-empty": "(бе тафовут)",
        "searchresults": "Натиҷаҳои ҷустуҷӯ",
+       "search-filter-title-prefix-reset": "Кофтани тамоми саҳифаҳо",
        "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|натиҷа|натоиҷ}}",
        "search-interwiki-caption": "Лоиҳаҳои хоҳарӣ",
        "search-interwiki-default": "Натоиҷ аз $1:",
        "search-interwiki-more": "(бештар)",
+       "search-interwiki-more-results": "натиҷаи бештар",
        "search-relatedarticle": "Алоқаманд",
        "searchrelated": "алоқаманд",
        "searchall": "ҳама",
        "prefs-personal": "Додаҳои корбар",
        "prefs-rc": "Тағйироти охирин",
        "prefs-watchlist": "Феҳристи пайгириҳо",
+       "prefs-editwatchlist": "Вироиши феҳристи пайгириҳо",
        "prefs-watchlist-days": "Теъдоди рӯзҳое ки бояд дар феҳристи пайгириҳои намоиш дода шавад:",
        "prefs-watchlist-edits": "Теъдоди вироишҳои нишондода дар феҳристи пайгириҳои густаришёфта:",
        "prefs-misc": "Танзимоти ҳархела",
        "prefs-namespaces": "Фазоҳои ном",
        "default": "пешфарз",
        "prefs-files": "Файлҳо",
+       "prefs-custom-css": "CSS-и шахсӣ",
        "prefs-emailconfirm-label": "Тасдиқи почта:",
        "youremail": "Почтаи электронии Шумо:",
        "username": "{{GENDER:$1|Номи корбар}}:",
        "prefs-help-realname": "Номи ҳақиқӣ ихтиёрӣ ва агар шумо онро пешниҳод кунед онро ҳамчун муаллифи эҷодиётатон ёдоварӣ карда хоҳад шуд.",
        "prefs-help-email": "Нишонаи электронӣ ихтиёрист, аммо фиристодани гузарвожаи навро агар гузарвожаи худро фаромӯш кунед мумкин мегардад.",
        "prefs-help-email-required": "Нишони почтаи электрони лозим аст.",
+       "prefs-info": "Маълумоти асосӣ",
        "prefs-i18n": "Байналмиллаликунӣ",
        "prefs-signature": "Имзо",
+       "prefs-dateformat": "Намуди сана",
+       "prefs-timeoffset": "Замони ҷуброн",
+       "prefs-advancedediting": "Гузинаҳои умумӣ",
+       "prefs-developertools": "Абзорҳои барноманависӣ",
        "prefs-editor": "Вироишгар",
        "prefs-preview": "Пешнамоиш",
        "prefs-advancedrc": "Ихтиёроти пешрафта",
        "prefs-advancedwatchlist": "Ихтиёроти пешрафта",
        "prefs-displayrc": "Ихтиёроти намоиш",
        "prefs-displaywatchlist": "Ихтиёроти намоиш",
+       "prefs-changesrc": "Тағйирот нишон дода шудааст",
+       "prefs-changeswatchlist": "Тағйирот нишон дода шудааст",
+       "prefs-pageswatchlist": "Саҳифаҳои зери назар",
        "prefs-tokenwatchlist": "Рамз",
        "prefs-diffs": "Тафовут",
        "userrights": "Мудирияти ихтиёроти корбарӣ",
        "right-userrights": "Вироиши ҳамаи ихтиёроти корбарон",
        "right-userrights-interwiki": "Вироиши ихтиёроти корбарии корбарони дигар викиҳо",
        "right-siteadmin": "Бастн ва боз кардани пойгоҳи дода",
+       "grant-group-email": "фиристодани имайл",
+       "grant-createaccount": "Эҷоди ҳисобҳо",
+       "grant-createeditmovepage": "Эҷод, кучониш ва вироиши саҳифаҳо",
        "grant-rollback": "Вогардонидани тағйироти саҳифа",
+       "grant-basic": "Ҳуқуқҳот асосӣ",
        "newuserlogpage": "Гузориши эҷоди корбар",
        "newuserlogpagetext": "Ин гузориш аз номҳои корбарии тозасохташуда аст.",
        "rightslog": "Гузориши ихтиёроти корбар",
        "action-undelete": "барқарор кардани ин саҳифа",
        "action-rollback": "вогардонии зуди тағйирот",
        "action-sendemail": "фиристодани пайёмҳо",
+       "action-override-export-depth": "Нишон додан",
        "nchanges": "$1 {{PLURAL:$1|тағйир|тағйирот}}",
        "enhancedrc-history": "таърих",
        "recentchanges": "Тағйироти охирин",
        "recentchanges-label-unpatrolled": "Ин вироиш ҳанӯз гаштзанӣ нашудааст",
        "recentchanges-label-plusminus": "Ҳаҷми саҳифа ба андозаи ин миқдор байт тағйир ёфтааст",
        "recentchanges-legend-heading": "Ихтисораҳо:",
+       "recentchanges-submit": "Нишон додан",
+       "rcfilters-tag-remove": "'$1'ро ҳазф намудан",
+       "rcfilters-legend-heading": "<strong>Феҳристи ихтисорот:</strong>",
+       "rcfilters-other-review-tools": "Дигар асбобҳои сайр",
+       "rcfilters-activefilters-hide": "Пинҳон намудан",
+       "rcfilters-activefilters-show": "Нишон додан",
+       "rcfilters-days-title": "Рӯзҳои охир",
+       "rcfilters-hours-title": "Соатҳои охир",
+       "rcfilters-days-show-days": "$1 {{PLURAL:$1|рӯз}}",
+       "rcfilters-days-show-hours": "$1 {{PLURAL:$1|соат }}",
+       "rcfilters-savedqueries-rename": "Тағйири ном",
+       "rcfilters-savedqueries-setdefault": "Ба таври пешфарз мондан",
+       "rcfilters-savedqueries-remove": "Ҳазф намудан",
+       "rcfilters-savedqueries-new-name-label": "Ном",
        "rcfilters-savedqueries-cancel-label": "Лағв",
+       "rcfilters-filter-editsbyself-label": "Тағйироти шумо",
+       "rcfilters-filter-editsbyself-description": "Вироишоти шумо.",
+       "rcfilters-filter-editsbyother-label": "Тағйироти дигарон",
+       "rcfilters-filter-editsbyother-description": "Тамоми тағйирот ба ғайри тағйироти шумо",
+       "rcfilters-filter-user-experience-level-registered-label": "Сабтиномшуда",
+       "rcfilters-filter-user-experience-level-registered-description": "Вироишгарони сабтиномшуда",
+       "rcfilters-filter-user-experience-level-unregistered-label": "Сабтиномнашуда",
+       "rcfilters-filter-user-experience-level-unregistered-description": "Вироишгароне, ки сабтином накардаанд.",
+       "rcfilters-filter-user-experience-level-newcomer-label": "Навкорон",
+       "rcfilters-filter-user-experience-level-newcomer-description": "Вироишгарони сабтиномшудае, ки дар 4 рӯзи фаъолияташон 10 вироиш доранд.",
+       "rcfilters-filter-user-experience-level-learner-label": "Омӯзишгирандагон",
+       "rcfilters-filter-user-experience-level-learner-description": "Вироишгарони сабтиномшудае, ки дар байни Навкорон ва Корбарони Таҷрибадор қарор доранд.",
+       "rcfilters-filter-user-experience-level-experienced-label": "Корбарони таҷрибадор",
+       "rcfilters-filter-user-experience-level-experienced-description": "Вироишгарони сабтиномшудае, ки дар тӯли 30 рӯзи фаъолияташон беш аз 500 вироиш намудаанд.",
+       "rcfilters-filtergroup-automated": "Саҳмҳои автоматикӣ",
+       "rcfilters-filter-bots-label": "Бот",
+       "rcfilters-filter-bots-description": "Вироишоте, ки бо асбобҳои автоматикӣ карда шудаанд.",
+       "rcfilters-filter-humans-label": "Инсон (на бот)",
+       "rcfilters-filter-humans-description": "Вироишот аз тарафи вироишгар-инсон.",
+       "rcfilters-filtergroup-reviewstatus": "Вазъиятро баррасӣ намудан",
+       "rcfilters-filter-reviewstatus-unpatrolled-description": "Вироишот ба таври дасти ва ё худкор чун тафтишшуда ҳисоб шавад.",
+       "rcfilters-filter-reviewstatus-unpatrolled-label": "Баррасинашуда",
+       "rcfilters-filter-reviewstatus-manual-description": "Вироишоте, ки ба таври дастӣ баррасӣ шуданд.",
+       "rcfilters-filter-reviewstatus-manual-label": "Баррасӣ ба таври дастӣ",
+       "rcfilters-filter-reviewstatus-auto-description": "Вироишоти корбарони пешрафта, ки ба таври худкор чун баррасӣ шуда қайд мешавад.",
+       "rcfilters-filter-reviewstatus-auto-label": "Ба таври худкор баррасӣ шуда",
+       "rcfilters-filtergroup-significance": "Аҳамиятнокӣ",
+       "rcfilters-filter-minor-label": "Вироишоти начандон аҳамиятнок",
+       "rcfilters-filter-minor-description": "Нависандаро ба унвони ҷузъӣ ёдовар мекунад.",
+       "rcfilters-filter-major-label": "Вироишоти ғайриҷузъӣ",
+       "rcfilters-filter-major-description": "Вироишоте, ки ғайриҷузъиянд.",
+       "rcfilters-filtergroup-watchlist": "Феҳристи пайгириҳо",
+       "rcfilters-filter-watchlist-watched-label": "Дар феҳристи пайгириҳо",
+       "rcfilters-filter-watchlist-watched-description": "Тағйири саҳифаҳо дар феҳристи пайгириҳо.",
+       "rcfilters-filtergroup-changetype": "Намуди тағйирот",
+       "rcfilters-filter-pageedits-label": "Вироишоти саҳифа",
        "rcnotefrom": "Дар зер тағйиротҳои охирин аз <b>$2</b> (то <b>$1</b> нишон дода шудааст).",
        "rclistfrom": "Нишон додани тағйиротҳои нав сар карда аз $3 $2",
        "rcshowhideminor": "$1 вироишҳои хурд",
        "rcshowhidemine": "$1 вироишҳои ман",
        "rcshowhidemine-show": "Намоиш",
        "rcshowhidemine-hide": "Пинҳон кардани",
+       "rcshowhidecategorization-show": "Нишон додан",
+       "rcshowhidecategorization-hide": "Пинҳон намудан",
        "rclinks": "Нишон додани $1 тағйироти охирин дар $2 рӯзи охир",
        "diff": "фарқият",
        "hist": "таърих",
        "upload-file-error-text": "Ҳангоми талош барои эчоди як парвандаи муваққатӣ дар коргузор, як хатои дохилӣ рух дод. Лутфан бо мудири систем тамос бигиред.",
        "upload-misc-error": "Хатои номаълум дар боргузорӣ",
        "upload-misc-error-text": "Ҳангоми боргузорӣ, хатои номаълуме рух дод.  Лутфан итминнон ҳосил кунед, ки нишонаи URL мӯътабар ва қобили дастрасӣ аст, ва баъд дубора талош кунед. Агар мушкили пофишорӣ кунад, бо яке аз мудирони систем  тамос бигиред.",
+       "upload-dialog-title": "Фиристодани файл",
+       "upload-dialog-button-cancel": "Тамом кардан",
+       "upload-dialog-button-back": "Бозгашт",
+       "upload-dialog-button-done": "Карда шуд",
+       "upload-dialog-button-save": "Захира кардан",
+       "upload-dialog-button-upload": "Боркунӣ",
+       "upload-form-label-infoform-title": "Деталҳо",
+       "upload-form-label-infoform-name": "Ном",
+       "upload-form-label-infoform-description": "Тавзеҳот",
+       "upload-form-label-usage-title": "Истифодабарӣ",
+       "upload-form-label-usage-filename": "Номи файл",
+       "upload-form-label-own-work": "Ин кори ман аст",
        "upload-form-label-infoform-categories": "Гурӯҳҳо",
+       "upload-form-label-infoform-date": "Сана",
        "backend-fail-opentemp": "Парвандаи муваққатӣ боз нашуд.",
        "backend-fail-writetemp": "Ба парвандаи муваққатӣ сабт нашуд.",
        "backend-fail-closetemp": "Парвандаи муваққатиро пӯшида нашуд.",
        "license-nopreview": "(Пешнамоиш вуҷуд надорад)",
        "upload_source_url": "(як нишони интернетии мӯътабар ва оммавӣ)",
        "upload_source_file": " (парвандае дар компютери шумо)",
+       "listfiles-delete": "ҳазф",
        "listfiles-summary": "Ин саҳифаи вижа тамоми парвандаҳои боргузоришударо нишон медиҳад.\nБа таври пешфарз охирин парвандаҳои боргузоришуда дар болои феҳрист нишон дода шудаанд.\nЯк клик кардани рӯи унвони сутунҳо боиси тағйири тартиби намоиши парвандаҳо мешавад.",
        "listfiles_search_for": "Ҷустуҷӯи номи акс:",
        "imgfile": "парванда",
        "mostimages": "Аксҳое ки бештар аз ҳама бо онҳо пайванд шудааст",
        "mostrevisions": "Саҳифахое, ки аз ҳама бештар вироиш шудаанд",
        "prefixindex": "Ҳамаи саҳифаҳо бо пешванд",
+       "prefixindex-submit": "Намоиш",
        "shortpages": "Саҳифаҳои кӯтоҳ",
        "longpages": "Саҳифаҳои калон",
        "deadendpages": "Саҳифаҳои бемаъно",
        "deadendpagestext": "Саҳифаҳои зерин ба ҳеҷ дигар саҳифае дар {{SITENAME}} пайванд нестанд.",
        "protectedpages": "Саҳифаҳои ҳифзшуда",
+       "protectedpages-filters": "Филтрҳо:",
        "protectedpages-indef": "Фақат ҳифзшудаҳои номуайян",
        "protectedpages-noredirect": "Пинҳони саҳифаҳои равонакунӣ",
        "protectedpagesempty": "Дар ҳоли ҳозир ҳеҷ саҳифае муҳофизат нашудааст.",
        "listusers": "Рӯйхати корбарон",
        "usercreated": "{{GENDER:$3|Эҷодшуда}} дар таърихи $1 дар соати $2",
        "newpages": "Саҳифаҳои нав",
+       "newpages-submit": "Намоиш",
        "newpages-username": "Номи корбар:",
        "ancientpages": "Саҳифаҳои кӯҳнатарин",
        "move": "Кӯчонидан",
        "pager-newer-n": "{{PLURAL:$1|1-тои навтар|$1-тои навтар}}",
        "pager-older-n": "{{PLURAL:$1|1-тои кӯҳнатар|$1-тои кӯҳнатар}}",
        "suppress": "Назорат",
+       "apisandbox": "Регдони API",
+       "apisandbox-add-multi": "Илова кардан",
+       "apisandbox-results": "Натиҷаҳо",
        "booksources": "Манбаҳои китобҳо",
        "booksources-search-legend": "Ҷустуҷӯи сарчашмаҳои китоб",
        "booksources-search": "Ҷустуҷӯ",
        "specialloguserlabel": "Иҷрокунанда:",
        "speciallogtitlelabel": "Ҳадаф (унвон ё корбар):",
        "log": "Гузоришҳо",
+       "logeventslist-submit": "Намоиш",
        "all-logs-page": "Ҳамаи сабтҳои умумӣ",
        "alllogstext": "Намоиши ҳамаи гузоришҳои дастраси якҷояи дастраси {{SITENAME}}. Метавонед бо интихоби навъи гузориш, номи корбарӣ ва саҳифаҳои тағйирёфта, намоишро маҳдудтар созед.",
        "logempty": "Мавриди мутобиқ ба манзури шумо дар гузориш пайдо нашуд.",
        "log-title-wildcard": "Саҳифаҳоеро ҷустуҷӯ кунед, ки унвонашон бо ин матн оғоз мешаванд",
+       "checkbox-all": "Ҳама",
        "allpages": "Ҳамаи саҳифаҳо",
        "nextpage": "Саҳифаи навбатӣ ($1)",
        "prevpage": "Саҳифаи пешина ($1)",
        "unwatchthispage": "Тавқифи пайгирии ин саҳифа",
        "notanarticle": "Мақола нест",
        "notvisiblerev": "Нусха ҳазф шуд",
-       "watchlist-details": "{{PLURAL:$1|$1 саҳифа|$1 саҳифаҳо}} дар феҳристи пайгириҳои шумо, бидуни ҳисоби саҳифаҳои баҳс.",
+       "watchlist-details": "{{PLURAL:$1|$1 саҳифа}} дар феҳристи назароти шумо (бо саҳафоти баҳс).",
        "wlheader-enotif": "Иттилоорасонии тариқи почтаи электронӣ (E-mail) фаъол шудааст.",
        "wlheader-showupdated": "Саҳифаҳое, ки пас аз охирин сар заданатон ба онҳо тағйир кардаанд '''пурранг''' нишон дода шудаанд",
        "wlnote": "Дар зер {{PLURAL:$1|охирин тағйир|'''$1''' охирин тағйирот}} дар $2 соати охир {{PLURAL:омадааст|омадаанд}}.",
        "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|нусха|нусха}} аз $2",
        "tooltip-pt-userpage": "Саҳифаи корбарии шумо",
        "tooltip-pt-anonuserpage": "Саҳифаи корбари IP, ки бо он шумо вироиш мекунед",
-       "tooltip-pt-mytalk": "Саҳифаи баҳси шумо",
+       "tooltip-pt-mytalk": "Саҳифаи баҳси {{GENDER:|Шумо}}",
        "tooltip-pt-anontalk": "Баҳси пиромуни вироишҳо аз ин нишонаи IP",
-       "tooltip-pt-preferences": "Тарҷиҳоти ман",
+       "tooltip-pt-preferences": "Тарҷиҳот {{GENDER:|Шумо}}",
        "tooltip-pt-watchlist": "Рӯйхати саҳифаҳое, ки тағйиротҳояшонро Шумо назорат мекунед",
-       "tooltip-pt-mycontris": "Феҳристи ҳиссагузориҳои шумо",
+       "tooltip-pt-mycontris": "Феҳристи ҳиссагузориҳои {{GENDER:|Шумо}}",
        "tooltip-pt-login": "Тавсия мешавад ки ба система ворид шавед, лекин маҷбурӣ нест.",
        "tooltip-pt-logout": "Хуруҷ аз систем",
        "tooltip-ca-talk": "Баҳси матни таркибии ин саҳифа",
-       "tooltip-ca-edit": "ШÑ\83мо Ð¸Ð½ Ñ\81аҳиÑ\84аÑ\80о Ð²Ð¸Ñ\80оиÑ\88 ÐºÐ°Ñ\80да Ð¼ÐµÑ\82авонед. Ð\9fеÑ\88 Ð°Ð· Ð·Ð°Ñ\85иÑ\80а ÐºÐ°Ñ\80дани Ñ\81аҳиÑ\84а Ð¿ÐµÑ\88намоиÑ\88Ñ\80о Ð¸Ñ\81Ñ\82иÑ\84ода Ð±Ð°Ñ\80ед.",
+       "tooltip-ca-edit": "Ð\92иÑ\80оиÑ\88и Ð¸Ð½ Ñ\81аҳиÑ\84а",
        "tooltip-ca-addsection": "Илова кардани бахши ҷадид",
        "tooltip-ca-viewsource": "Ин саҳифа ҳифз карда шудааст. Шумо танҳо таркиби онро дида метавонед.",
        "tooltip-ca-history": "Нусхаи охирини ин саҳифа.",
        "pageinfo-content-model": "Навъи таркибии саҳифа",
        "pageinfo-redirects-name": "Шумораи равонакуниҳо ба ин саҳифа",
        "pageinfo-redirects-value": "$1-то",
+       "pageinfo-hidden-categories": "Пинҳон {{PLURAL:$1|гурӯҳ|гурӯҳҳо}} ($1)",
        "pageinfo-toolboxlink": "Иттилооти саҳифа",
        "pageinfo-contentpage-yes": "Бале",
        "pageinfo-protect-cascading-yes": "Бале",
        "widthheightpage": "$1 × $2, $3 {{PLURAL:$3|саҳифа|саҳифаҳо}}",
        "file-info": "андозаи парванда: $1, навъи MIME: $2",
        "file-info-size": "$1 × $2 пиксел, ҳаҷми парванда: $3, навъи MIME: $4",
+       "file-info-size-pages": "$1 × $2 пиксел, андозаи файл: $3, навъи MIME: $4, $5 {{PLURAL:$5|саҳифа|саҳафот}}",
        "file-nohires": "Нусхаи ҳаҷман ва сифатан баландтар дастрас нест.",
        "svg-long-desc": "SVG парванда, исмӣ $1 × $2 пиксел, андозаи парванда: $3",
        "show-big-image": "Акси аслӣ",
        "watchlistedit-raw-done": "Феҳристи пайгириҳои шумо ба рӯз шуд.",
        "watchlistedit-raw-added": "{{PLURAL:$1|1 унвон|$1 унвонҳо}} ба феҳристи пайгириҳо изофа шуд:",
        "watchlistedit-raw-removed": "Унвон ҳазф {{PLURAL:$1|шуд|шуданд}}:",
+       "watchlisttools-clear": "Тоза кардани феҳристи назарот",
        "watchlisttools-view": "Намоиши тағйироти алоқаманди феҳристи пайгириҳо",
        "watchlisttools-edit": "Мушоҳида ва вироиши феҳристи пайгириҳо",
        "watchlisttools-raw": "Вироиши феҳристи хоми пайгириҳо",
        "version-version": "($1)",
        "version-license": "Иҷозатномаи МедиаВики",
        "version-ext-colheader-license": "Иҷозатнома",
+       "version-ext-colheader-description": "Тавзеҳот",
        "version-ext-colheader-credits": "Муаллифон",
        "version-poweredby-others": "дигарон",
        "version-software": "Нусхаи насбшуда",
        "version-software-product": "Маҳсул",
        "version-software-version": "Нусха",
+       "version-libraries-description": "Тавзеҳот",
        "redirect-page": "Рамзи саҳифа",
        "fileduplicatesearch": "Ҷустуҷӯ барои парвандаҳои такрорӣ",
        "fileduplicatesearch-summary": "Ҷустуҷӯ барои парвандаҳои такрорӣ бар асоси миқдори дар ҳам шудаи онҳо сурат мегирад.",
        "specialpages-group-developer": "Абзорҳои тавсиядиҳандагон",
        "blankpage": "Саҳифаи холӣ",
        "tag-filter": "Филтри [[Special:Tags|барчасбҳо]]:",
+       "tags-description-header": "Тавзеҳоти пурраи маънияш",
        "tags-active-header": "Фаъол?",
        "tags-active-yes": "Бале",
        "tags-edit": "вироиш",
        "htmlform-selectorother-other": "Дигар",
        "htmlform-no": "На",
        "htmlform-yes": "Бале",
+       "logentry-delete-restore": "$1 саҳифаро $3 ($4) {{GENDER:$2|барқарор намуд}}",
        "revdelete-restricted": "маҳдудиятҳо ба мудирон амалӣ шуданд",
        "revdelete-unrestricted": "маҳдудиятҳо аз мудирон бардошта шуданд",
        "rightsnone": "(ҳеҷ)",
        "feedback-message": "Пайём:",
        "feedback-subject": "Мавзӯъ:",
        "feedback-submit": "Ирсол",
-       "searchsuggest-search": "Ҷустуҷӯ",
+       "searchsuggest-search": "Ҷустуҷӯ дар {{SITENAME}}",
        "expandtemplates": "Бастдодани шаблонҳо",
        "expand_templates_intro": "Ин саҳифаи вижа матнеро дарёфт карда ва тамоми шаблонҳои ба кор рафта дар онро ба таври бозгаште баст медиҳад. Ҳамчунин тобеҳои таҷзеҳ\n<nowiki>{{</nowiki>#language:...}}, ва мутағйирҳое чун\n<nowiki>{{</nowiki>CURRENTDAY}}&mdash;ро ҳам баст медиҳад – дар воқеъ тақрибан ҳар чиро ки дохили ду акулот бошад.\nИн кор бо садо задани марҳилаи таҷзеҳи марбут дар худи МедиаВики сурат мегирад.",
        "expand_templates_title": "Унвони мавзӯъ, барои {{FULLPAGENAME}} ва ғайра.:",
        "special-characters-group-cyrillic": "Сириллик",
        "randomrootpage": "Саҳифаи решавии тасодуфӣ",
        "changecredentials-submit": "Тағйири ҳисоби корбарӣ",
-       "removecredentials-submit": "Хориҷи эътиборнома"
+       "removecredentials-submit": "Хориҷи эътиборнома",
+       "specialmute-header": "Лутфан танзимоти хомӯши худро барои корбар <b>{{BIDI:[[Корбар:$1|$1]]}}</b> интихоб кунед."
 }
index 6db295c..1a93bad 100644 (file)
        "autoblockedtext": "เลขที่อยู่ไอพีของคุณถูกบล็อกอัตโนมัติ เพราะเคยมีผู้ใช้อื่นใช้ ซึ่งถูกบล็อกโดย $1\nโดยให้เหตุผลว่า\n\n:<em>$2</em>\n\n* เริ่มการบล็อก: $8\n* สิ้นสุดการบล็อก: $6\n* ผู้ถูกบล็อกที่เจตนา: $7\n\nคุณสามารถติดต่อ $1 หรือ[[{{MediaWiki:Grouppage-sysop}}|ผู้ดูแลระบบ]]คนอื่นเพื่ออภิปรายการบล็อกนี้ \nคุณไม่สามารถใช้คุณลักษณะ \"{{int:emailuser}}\" จนกว่าจะระบุที่อยู่อีเมลที่ถูกต้องใน[[Special:Preferences|การตั้งค่าบัญชี]]ของคุณ และคุณมิได้ถูกห้ามใช้\nเลขที่อยู่ไอพีปัจจุบันของคุณคือ $3 และหมายเลขการบล็อกคือ #$5 \nโปรดรวมรายละเอียดข้างต้นทั้งหมดในการสอบถามใด ๆ",
        "systemblockedtext": "ชื่อผู้ใช้หรือที่อยู่ไอพีของคุณถูกบล็อกอัตโนมัติโดยมีเดียวิกิ\nเหตุผลสำหรับการบล็อกคือ:\n\n:<em>$2</em>\n\n* เริ่มการบล็อก: $8\n* สิ้นสุดการบล็อก: $6\n* ผู้ดำเนินการบล็อก: $7\n\nไอพีแอดเดรสปัจจุบันของคุณคือ $3\nโปรดแจ้งรายละเอียดทั้งหมดข้างต้น ถ้าคุณมีข้อสงสัยใด ๆ",
        "blockednoreason": "ไม่ได้ให้เหตุผล",
-       "blockedtext-composite": "<strong>",
        "whitelistedittext": "คุณต้อง$1เพื่อแก้ไขหน้า",
        "confirmedittext": "คุณต้องยืนยันที่อยู่อีเมลของคุณก่อนแก้ไขหน้า \nโปรดตั้งและตรวจสอบความสมเหตุสมผลของที่อยู่อีเมลของคุผ่าน[[Special:Preferences|การตั้งค่าผู้ใช้]]",
        "nosuchsectiontitle": "ไม่พบส่วน",
        "ipb-confirm": "ยืนยันการบล็อก",
        "ipb-sitewide": "ทั้งเว็บไซต์",
        "ipb-partial": "บางส่วน",
+       "ipb-partial-help": "ระบุหน้าหรือเนมสเปซ",
        "ipb-pages-label": "หน้า",
+       "ipb-namespaces-label": "เนมสเปซ",
        "badipaddress": "เลขที่อยู่ไอพีไม่ถูกต้อง",
        "blockipsuccesssub": "บล็อกสำเร็จ",
        "blockipsuccesstext": "บล็อก [[Special:Contributions/$1|$1]] แล้ว<br />\nดู[[Special:BlockList|รายการบล็อก]]เพื่อทบทวนการบล็อก",
        "blocklist-userblocks": "ซ่อนการบล็อกบัญชี",
        "blocklist-tempblocks": "ซ่อนการบล็อกชั่วคราว",
        "blocklist-addressblocks": "ซ่อนการบล็อกไอพีเดียว",
+       "blocklist-type": "ประเภท:",
+       "blocklist-type-opt-all": "ทั้งหมด",
+       "blocklist-type-opt-sitewide": "ทั้งเว็บไซต์",
+       "blocklist-type-opt-partial": "บางส่วน",
        "blocklist-rangeblocks": "ซ่อนการบล็อกช่วง",
        "blocklist-timestamp": "วัน-เวลา",
        "blocklist-target": "เป้าหมาย",
        "blocklist-editing-page": "หน้า",
        "blocklist-editing-ns": "เนมสเปซ",
        "ipblocklist-empty": "รายการบล็อกว่าง",
-       "ipblocklist-no-results": "à¹\80ลà¸\82à¸\97ีà¹\88อยูà¹\88à¹\84อà¸\9eีหรือà¸\8aืà¹\88อà¸\9cูà¹\89à¹\83à¸\8aà¹\89à¸\97ีà¹\88à¸\82อà¹\84มà¹\88à¸\96ูà¸\81à¸\9aลà¹\87อà¸\81",
+       "ipblocklist-no-results": "à¹\84มà¹\88à¸\9eà¸\9aà¹\80ลà¸\82à¸\97ีà¹\88อยูà¹\88à¹\84อà¸\9eีหรือà¸\8aืà¹\88อà¸\9cูà¹\89à¹\83à¸\8aà¹\89à¸\97ีà¹\88à¸\82อà¸\95รà¸\87",
        "blocklink": "บล็อก",
        "unblocklink": "ปลดบล็อก",
        "change-blocklink": "เปลี่ยนการบล็อก",
+       "empty-username": "(ไม่มีชื่อผู้ใช้)",
        "contribslink": "มีส่วนร่วม",
        "emaillink": "ส่งอีเมล",
        "autoblocker": "ถูกบล็อกอัตโนมัติเนื่องจาก \"[[User:$1|$1]]\" ใช้เลขที่อยู่ไอพีของคุณเมื่อเร็ว ๆ นี้\nเหตุผลที่ให้แก่การบล็อก $1 คือ: \"$2\"",
        "confirm-unwatch-top": "ลบหน้านี้ออกจากรายการเฝ้าดูของคุณ",
        "confirm-rollback-button": "ตกลง",
        "confirm-rollback-top": "ย้อนการแก้ไขหน้านี้หรือไม่",
+       "confirm-rollback-bottom": "ปฏิบัติการนี้จะย้อนการเปลี่ยนแปลงหน้านี้ที่เลือกรวดเดียวทันที",
        "confirm-mcrrestore-title": "กู้คืนรุ่นแก้ไข",
        "confirm-mcrundo-title": "ทำกลับการเปลี่ยนแปลง",
        "mcrundofailed": "ทำกลับล้มเหลว",
        "mediastatistics": "สถิติสื่อ",
        "mediastatistics-summary": "สถิติเกี่ยวกับประเภทไฟล์ที่อัปโหลด ซึ่งรวมเฉพาะรุ่นล่าสุดของไฟล์นั้น \nไม่รวมไฟล์รุ่นเก่าหรือที่ถูกลบแล้ว",
        "mediastatistics-nbytes": "{{PLURAL:$1|$1 ไบต์}} ($2; $3%)",
+       "mediastatistics-bytespertype": "ขนาดไฟล์ทั้งหมดสำหรับส่วนนี้: {{PLURAL:$1|$1 ไบต์}} ($2; $3%)",
+       "mediastatistics-allbytes": "ขนาดไฟล์ทั้งหมดของทุกไฟล์: {{PLURAL:$1|$1 ไบต์}} ($2)",
        "mediastatistics-table-count": "จำนวนไฟล์",
        "mediastatistics-table-totalbytes": "ขนาดรวม",
        "mediastatistics-header-unknown": "ไม่ทราบ",
        "mediastatistics-header-drawing": "ภาพวาดเส้น (ภาพเวกเตอร์)",
        "mediastatistics-header-audio": "เสียง",
        "mediastatistics-header-video": "วิดีทัศน์",
+       "mediastatistics-header-office": "สำนักงาน",
+       "mediastatistics-header-total": "ไฟล์ทั้งหมด",
        "json-error-depth": "ความลึกสแตกสูงสุดเกิน",
        "headline-anchor-title": "โยงมาส่วนนี้",
        "special-characters-group-latin": "ละติน",
        "passwordpolicies-policy-passwordcannotmatchblacklist": "ห้ามรหัสผ่านตรงกับรหัสผ่านที่ขึ้นบัญชีดำโดยเจาะจง",
        "passwordpolicies-policy-maximalpasswordlength": "รหัสผ่านจะต้องมีความยาวน้อยกว่า $1 อักขระ",
        "passwordpolicies-policy-passwordcannotbepopular": "ห้ามรหัสผ่านเป็น{{PLURAL:$1|รหัสผ่านยอดนิยม|ติดรายการ $1 รหัสผ่านยอดนิยม}}",
-       "userlogout-continue": "หาà¸\81à¸\84ุà¸\93à¸\95à¹\89อà¸\87à¸\81ารออà¸\81à¸\88าà¸\81ระà¸\9aà¸\9a à¹\82à¸\9bรà¸\94[$1 à¸\94ำà¹\80à¸\99ิà¸\99à¸\81ารà¸\95à¹\88อà¹\84à¸\9bยัà¸\87หà¸\99à¹\89าออà¸\81à¸\88าà¸\81ระà¸\9aà¸\9a]"
+       "userlogout-continue": "à¸\84ุà¸\93à¸\95à¹\89อà¸\87à¸\81ารออà¸\81à¸\88าà¸\81ระà¸\9aà¸\9aหรือà¹\84มà¹\88"
 }
index d47c030..74c4512 100644 (file)
@@ -6,15 +6,17 @@
                        "Tuzkozbir",
                        "Гусейн",
                        "아라",
-                       "Baskervill"
+                       "Baskervill",
+                       "Eldarado",
+                       "Patriot Kur"
                ]
        },
-       "tog-underline": "Линки жинтоно ријә быкәш:",
+       "tog-underline": "Linki jintono rijə bıkəş:",
        "tog-hideminor": "Охоминә дәгишонәдә гәдә дәгишон нишо мәдә.",
        "tog-hidepatrolled": "Нујә дәгишон сијоһијәдә дәвинә кардә быә дәгишон нишо мәкә.",
        "tog-newpageshidepatrolled": "Нијони огәтеј ноғо доә быә сәһифон бә тожә сәһифон сијоһиәдә",
        "tog-usenewrc": "Охоминә дәгишон сәһифәдә ијән ноғо доә сијоһијәдә дәгишон бә дәстон ҹо кардеј (гәрәке JavaScript)",
-       "tog-numberheadings": "Ð\90вÑ\82омаÑ\82ик Ð±Ð°Ñ\88лÑ\8bÒ\93он Ð½Ñ\83мÑ\80Ó\99лÓ\99миÑ\88 Ð±Ñ\8bкÓ\99",
+       "tog-numberheadings": "Avtomatik baÅ\9flıÄ\9fon nümrÉ\99\99nmiÅ\9f bıkÉ\99",
        "tog-watchcreations": "Зијод кардеј чымы офәјә быә сәһифон ијән фајлон бә ноғо доә сијоһи",
        "tog-watchdefault": "Зијод кардеј демы дәгиш кардә быә сәһифон ијән фајлон бә ноғо доә сијоһи",
        "tog-watchmoves": "Зијод кардеј фајлон ијән ном дәгиш кардә быә сәһифон бә ноғо доә сијоһи",
        "tog-watchlisthideown": "Чымы дәгишон ноғо доә сијһиәдә нијо кардеј",
        "tog-watchlisthidebots": "Нијо кардеј ботон дәгишон ноғо доә сијоһиәдә",
        "tog-watchlisthideminor": "Нијо кардеј гәдә дәгишон ноғо доә сијоһиәдә",
-       "underline-always": "Һежо",
-       "sunday": "Ишамбә",
-       "monday": "Дышанбә",
-       "tuesday": "Сешанбә",
-       "wednesday": "Чошанбә",
+       "underline-always": "hejo",
+       "underline-never": "Hiç vaxt",
+       "sunday": "İşambə",
+       "monday": "Dışambə",
+       "tuesday": "Seşambə",
+       "wednesday": "Çoşambə",
        "thursday": "Ҹымә шәв",
        "friday": "Әjнә",
        "saturday": "Шанбә",
-       "sun": "Иша",
-       "mon": "Дыш",
-       "tue": "Сеш",
-       "wed": "Чош",
+       "sun": "İşa",
+       "mon": "Dış",
+       "tue": "Seş",
+       "wed": "Çoş",
        "thu": "Ҹым",
        "fri": "Әјн",
        "sat": "Шан",
        "october-gen": "Октјабрә манги",
        "november-gen": "Нојабрә манги",
        "december-gen": "Декабрә манги",
-       "jan": "Јан",
-       "feb": "Фев",
-       "mar": "Мар",
-       "apr": "Апр",
-       "may": "Мај",
-       "jun": "Ијун",
-       "jul": "Ијул",
-       "aug": "Авг",
-       "sep": "Сен",
-       "oct": "Окт",
-       "nov": "Ној",
-       "dec": "Дек",
-       "pagecategories": "{{PLURAL:$1|Категоријә|Категоријон}}",
+       "jan": "Yan",
+       "feb": "Fev",
+       "mar": "Mar",
+       "apr": "Apr",
+       "may": "May",
+       "jun": "İyo",
+       "jul": "İyol",
+       "aug": "Avğ",
+       "sep": "Sen",
+       "oct": "Okt",
+       "nov": "Noy",
+       "dec": "Dek",
+       "january-date": "Yanvar $1",
+       "february-date": "Fevral $1",
+       "march-date": "Mart $1",
+       "april-date": "Aprel $1",
+       "may-date": "May $1",
+       "june-date": "İyon $1",
+       "july-date": "İyol $1",
+       "august-date": "Avğost $1",
+       "september-date": "Sentyəbr $1",
+       "october-date": "Oktyəbr $1",
+       "november-date": "Noyəbr $1",
+       "december-date": "Dekabr $1",
+       "pagecategories": "{{PLURAL:$1|Kətiqoriyə|Kətiqoriyon}}",
        "category_header": "Сәһифон бы категоријәдә \"$1\"",
        "subcategories": "Категоријон жинтон",
        "category-media-header": "Медијә бы категоријәдә \"$1\"",
        "newwindow": "(нујә пенҹәдә окардеј)",
        "cancel": "Ләғв кардеј",
        "moredotdotdot": "Веј...",
-       "mypage": "СÓ\99һиÑ\84Ó\99",
-       "mytalk": "Мызокирон",
+       "mypage": "\99hifÉ\99",
+       "mytalk": "Müzokirə",
        "anontalk": "Бо ын IP-унвони мызокирә",
        "navigation": "Navigasiyə",
        "and": "&#32;ијән",
        "faq": "РАП",
-       "actions": "Һәрәкәтон",
+       "actions": "Hərəkəton",
        "namespaces": "Номон мәконон",
-       "variants": "Вариантон",
+       "variants": "Varianton",
        "navigation-heading": "Naviqasiyə menü",
-       "errorpagetitle": "Сәһв",
+       "errorpagetitle": "Səhv",
        "returnto": "Бә сәһифә огәрдеј $1.",
        "tagline": "Материал че {{SITENAME}}",
-       "help": "Арајиш",
+       "help": "Koməq",
        "search": "Nəve",
-       "searchbutton": "Нәве",
+       "searchbutton": "Nəve",
        "go": "Давардеј",
        "searcharticle": "Давардеј",
        "history": "Сәһифә тарых",
-       "history_short": "Тарых",
+       "history_short": "tarix",
+       "history_small": "tarix",
        "printableversion": "Чап кардејро рәвојәт",
        "permalink": "Еғрорә сәбон",
        "print": "Чап",
        "delete": "Рәдд кардеј",
        "undelete_short": "Бәрпо кардеј $1 {{PLURAL:$1|дәгиши|дәгишон|}}",
        "viewdeleted_short": "Дијә карде {{PLURAL:$1|иглә рәдд кардә быә дәгиши|$1 рәдд кардә быә дәгишон}}",
-       "protect": "Мыдофијә кардеј",
+       "protect": "Mıdofiə karde",
        "protect_change": "дәгиш кардеј",
        "unprotect": "Мыдофијә дәгиш кардеј",
        "newpage": "Тожә сәһифә",
        "disclaimers": "Çı məsuliyyətiku imtina",
        "disclaimerpage": "Project:Дејни бә гиј ныгәтеј",
        "edithelp": "Арајиш бо редактә кардеј",
+       "helppage-top-gethelp": "Kuməq",
        "mainpage": "Sərlohə",
-       "mainpage-description": "Ó\98Ñ\81оÑ\81Ó\99 Ñ\81Ó\99һиÑ\84Ó\99",
+       "mainpage-description": "Æ\8fsos sÉ\99hifÉ\99",
        "policy-url": "Project:Ғајдон",
        "portal": "Ҹәмјәт",
        "portal-url": "Project:Ҹәмјәти портал",
        "hidetoc": "нијо кардеј",
        "collapsible-collapse": "Бурмә кардеј",
        "collapsible-expand": "Һовуж кардеј",
+       "confirmable-yes": "Bəle",
+       "confirmable-no": "Ne",
        "thisisdeleted": "Дијә кардеј јаанки бәрпо кардеј $1?",
        "viewdeleted": "Дијә кардеј $1?",
        "restorelink": "{{PLURAL:$1|иглә рәдд кардә быә дәгиши|$1 рәдд кардә быә дәгишон}}",
        "nstab-media": "Медијә сәһифә",
        "nstab-special": "Хысусијә сәһифә",
        "nstab-project": "Нахшә бәрәдә",
-       "nstab-image": "Фајл",
+       "nstab-image": "Fayl",
+       "nstab-mediawiki": "Mesoj",
        "nstab-template": "Ғәлиб",
+       "nstab-help": "Koməqə səhifə",
        "nstab-category": "Тиспир",
        "mainpage-nstab": "Sərlohə",
        "error": "Сәһв",
+       "databaseerror-error": "Səhv: $1",
        "readonly": "Бә база нывыште блок быә.",
        "missing-article": "База мәлумотон дыләдә бә ахтар кардә быә саһифон «$1» $2 барәдә мәлумот пәјдо карде ныбе.\nЖыго вәзијјәт бе бәзне бә вахтики, ым сәһифә че рәдд кардә быә сәһифә канә рәвојәте.\nГирәм ым жыго ни, жәгәдә шымә програм тәминатијәдә сәһв пәјдо кардәјоне.\nХаһиш кардәмон че сәһифә URL-и бә [[Special:ListUsers/sysop|администратори]] бывғандәнән.",
        "missingarticle-rev": "(рәвојәт#: $1)",
        "exception-nologin": "Ыштәни едаштәнијоне",
        "yourname": "Иштирокәкә ном:",
        "yourpassword": "Парол:",
+       "userlogin-yourpassword": "Pərol",
        "yourpasswordagain": "Пароли сәнибәтон гырдә карде:",
+       "yourdomainname": "Iştı domen:",
        "login": "Ыштәни едаштеј",
        "nav-login-createaccount": "Ыштәни едаштеј / ыштәни ғејд кардовнијеј",
        "logout": "Системәдә кој орохнијеј",
        "userlogout": "Системәдә кој орохнијеј",
        "notloggedin": "Ыштәни едаштәнијоне",
        "createaccount": "Нујә иштирокәкә ғејд кардеј",
+       "createacct-emailrequired": "E-poşt unvan",
        "createaccountmail": "бә е-номә",
+       "createacct-realname": "Həğiği nüm",
+       "createacct-reason": "Səbəb",
        "mailmypassword": "Нујә парол вығандеј бә Е-номә.",
        "loginlanguagelabel": "Зывон: $1",
        "pt-login": "Dəşi",
        "resetpass_header": "Иштирокәкә пароли дәгиш карде",
        "oldpassword": "Канә парол:",
        "newpassword": "Нујә парол:",
+       "botpasswords-label-cancel": "Ləğv",
+       "botpasswords-label-delete": "Təmiz karde",
        "resetpass_forbidden": "Парол әзыни дәгиш бе",
        "resetpass-submit-loggedin": "Пароли дәгиш кардеј",
        "resetpass-submit-cancel": "Ләғв кардеј",
        "passwordreset-username": "Иштирокәкә ном:",
+       "passwordreset-domain": "Domen:",
        "passwordreset-email": "Е-номә унвон:",
        "changeemail": "Е-номә унвони дәгиш кардеј",
        "changeemail-newemail": "Е-номә тожә унвон:",
        "sig_tip": "Шымә ғол ијән вахт",
        "hr_tip": "Уфуғијә ријә (рә-рә истифодә мәкән)",
        "summary": "Дәгишон тәсвир:",
-       "subject": "Мывзу/сәрловһә:",
+       "subject": "Мıvzu:",
        "minoredit": "Ым гадә дәгишије",
        "watchthis": "Ым сәһифә тәмшо кардеј",
        "savearticle": "Сәһифә огәтеј",
        "history-feed-item-nocomment": "$1 бә $2-дә",
        "rev-delundel": "нишо дој/нијо кардеј",
        "rev-showdeleted": "нишо дој",
-       "revdelete-show-file-submit": "Бәле",
+       "revdelete-show-file-submit": "Bəle",
        "revdelete-radio-set": "Бәле",
        "revdelete-radio-unset": "Не",
-       "revdelete-log": "Сәбәб:",
+       "revdelete-log": "Səbəb",
        "revdel-restore": "Винде дәрәҹә дәгиш карде",
        "pagehist": "Сәһифә тарых",
-       "revdelete-reasonotherlist": "Ҹо сәбәб",
-       "mergehistory-reason": "Сәбәб:",
+       "revdelete-reasonotherlist": "Co səbəb",
+       "mergehistory-reason": "Səbəb",
        "revertmerge": "Бахш кардеј",
        "history-title": "$1: Дәгишон тарых",
        "lineno": "Сәтыр $1:",
        "tooltip-search-fulltext": "Səhifon pəydo kardey de ın mətni",
        "tooltip-p-logo": "Dəvardey bə əsosə səhifə",
        "tooltip-n-mainpage": "Дәвардеј бә әсосә сәһифә",
-       "tooltip-n-mainpage-description": "Ð\94Ó\99ваÑ\80деÑ\98 Ð±Ó\99 Ó\99Ñ\81оÑ\81Ó\99 Ñ\81Ó\99һиÑ\84Ó\99",
+       "tooltip-n-mainpage-description": "\99vardey bÉ\99 É\99sos sÉ\99hifÉ\99",
        "tooltip-n-portal": "Naxşə barədə, çiç şımə bəzneyon ıyo kardey, iyən konco çiç heste",
        "tooltip-n-currentevents": "Есәтнә һодисон сијоһи",
        "tooltip-n-recentchanges": "Oxonə dəqişon siyohi",
index 2eb7bdb..c9db9bc 100644 (file)
        "autoblockedtext": "IP adresiniz otomatik olarak engellendi, çünkü $1 tarafından engellenmiş başka bir kullanıcı tarafından kullanılmaktaydı.\nBelirtilen sebep şudur:\n\n:<em>$2</em>\n\n* Engellemenin başlangıcı: $8\n* Engellemenin bitişi: $6\n* Bloke edilmesi istenen: $7\n\nEngelleme hakkında tartışmak için $1 ile veya diğer [[{{MediaWiki:Grouppage-sysop}}|hizmetlilerden]] biriyle irtibata geçebilirsiniz.\n\nNot, [[Special:Preferences|kullanıcı tercihlerinize]] geçerli bir e-posta adresi kaydetmediyseniz  \"{{int:emailuser}}\" özelliğinden faydalanamayabilirsiniz ve bu özelliği kullanmaktan engellenmediniz.\n\nŞu anki IP numaranız $3 ve engellenme ID'niz #$5.\nLütfen yapacağınız herhangi bir sorguda yukarıdaki bütün detayları bulundurun.",
        "systemblockedtext": "Kullanıcı adınız veya IP adresiniz MediaWiki tarafından otomatik olarak engellendi.\nSebebi:\n\n:<em>$2</em>\n\n* Engelin başlangıcı: $8\n* Engelin süresi: $6\n* Engellenmesi istenen: $7\n\nMevcut IP adresiniz $3.\nLütfen yukarıdaki tüm ayrıntıları, yaptığınız sorgularda belirtin.",
        "blockednoreason": "sebep verilmedi",
-       "blockedtext-composite": "<strong>Kullanıcı adınız veya IP adresiniz engellendi.</strong>\n\nSebebi:\n\n:<em>$2</em>.\n\n* Engel başlama tarihi: $8\n* Engelin süresi: $6\n\nGeçerli IP adresiniz $3.\nLütfen yukarıdaki tüm detayları yaptığınız tüm sorgulara dahil ediniz.",
+       "blockedtext-composite": "<strong>Kullanıcı adınız veya IP adresiniz engellendi.</strong>\n\nSebebi:\n\n:<em>$2</em>.\n\n* Engel başlama tarihi: $8\n* Engelin süresi: $6\n\n* $5\n\nGeçerli IP adresiniz $3.\nLütfen yukarıdaki tüm detayları yaptığınız tüm sorgulara dahil ediniz.",
        "blockedtext-composite-reason": "Hesabınızda ve/veya IP adresinizde birden fazla engel mevcut.",
        "whitelistedittext": "Değişiklik yapabilmek için $1.",
        "confirmedittext": "Sayfa değiştirmeden önce e-posta adresinizi onaylamalısınız. Lütfen [[Special:Preferences|tercihler]] kısmından e-postanızı ekleyin ve onaylayın.",
index ee83ec7..423c7a8 100644 (file)
                        "Fitoschido"
                ]
        },
-       "tog-underline": "Сылтамаларны сызымлау:",
-       "tog-hideminor": "Соңгы үзгәртүләр исемлегендә кече үзгәртүләр яшерелсен",
-       "tog-hidepatrolled": "ТикÑ\88еÑ\80елгÓ\99н Ò¯Ð·Ð³Ó\99Ñ\80Ñ\82үлÓ\99Ñ\80 Ñ\8fңа Ò¯Ð·Ð³Ó\99Ñ\80Ñ\82үлÓ\99Ñ\80 Ð¸Ñ\81емлегеннÓ\99н яшерелсен",
-       "tog-newpageshidepatrolled": "ТикÑ\88еÑ\80елгÓ\99н Ð±Ð¸Ñ\82лÓ\99Ñ\80 Ñ\8fңа Ð±Ð¸Ñ\82лÓ\99Ñ\80 Ð¸Ñ\81емлегеннÓ\99н яшерелсен",
-       "tog-hidecategorization": "Битләрне төркемләшү яшерелсен",
-       "tog-extendwatchlist": "Соңгыларын гына түгел, ә барлык үзгәртүләрне эченә алган, киңәйтелгән күзәтү исемлеге",
+       "tog-underline": "Сылтамаларны ассызымлау:",
+       "tog-hideminor": "Соңгы үзгәрешләрдә кече төзәтмәләр яшерелсен",
+       "tog-hidepatrolled": "СоңгÑ\8b Ò¯Ð·Ð³Ó\99Ñ\80еÑ\88лÓ\99Ñ\80дÓ\99 Ñ\82икÑ\88еÑ\80елгÓ\99н Ñ\82өзÓ\99Ñ\82мÓ\99лÓ\99Ñ\80 яшерелсен",
+       "tog-newpageshidepatrolled": "Яңа Ð±Ð¸Ñ\82лÓ\99Ñ\80 Ð¸Ñ\81емлегендÓ\99 Ñ\82икÑ\88еÑ\80елгÓ\99н Ð±Ð¸Ñ\82лÓ\99Ñ\80 яшерелсен",
+       "tog-hidecategorization": "Битләрнең төркемләшүе яшерелсен",
+       "tog-extendwatchlist": "Соңгыларын гына түгел, ә барлык үзгәрешләрне эченә алган, киңәйтелгән күзәтү исемлеге",
        "tog-usenewrc": "Соңгы үзгәртүләрдә һәм күзәтү исемлегендә үзгәрешләрне төркемләргә",
        "tog-numberheadings": "Атамалар автомат рәвештә номерлансын",
        "tog-editondblclick": "Битләргә ике чирттерү белән үзгәртү бите ачылсын",
        "tog-watchdeletion": "Мин бетергән битләр һәм файлларны күзәтү исемлегемгә өстәлсен",
        "tog-watchuploads": "Минем тарафтан йөкләнелгән файлларны күзәтү исемлегемә кертелсен",
        "tog-watchrollback": "Мин үткәрмәгән битләрне күзәтү исемлегемә өстәргә",
-       "tog-minordefault": "Барлык үзгәртүләрне килешү буенча кече дип билгеләнсен",
+       "tog-minordefault": "Барлык төзәтмәләрне килешү буенча кече дип билгеләнсен",
        "tog-previewontop": "Үзгәртү тәрәзәсеннән өстәрәк битне алдан карау өлкәсен күрсәтелсен",
        "tog-previewonfirst": "Үзгәртү битенә күчкәндә башта алдан карау бите күрсәтелсен",
        "tog-enotifwatchlistpages": "Күзәтү исемлегемдәге бит яки файл үзгәртелү турында электрон почтага хәбәр җибәрелсен",
        "tog-enotifusertalkpages": "Бәхәс битем үзгәртелү турында электрон почтага хәбәр җибәрелсен",
-       "tog-enotifminoredits": "Кече үзгәртүләр турында да электрон почтага хәбәр җибәрелсен",
+       "tog-enotifminoredits": "Кече төзәтмәләр турында да электрон почтага хәбәр җибәрелсен",
        "tog-enotifrevealaddr": "Хәбәрнамәдә минем почта адресым күрсәтелсен",
        "tog-shownumberswatching": "Битне күзәтү исемлекләренә өстәгән кулланучылар санын күрсәтелсен",
        "tog-oldsig": "Хәзерге имзагыз:",
        "tog-fancysig": "Имзаның шәхси вики-билгеләмәсе (автоматик сылтамасыз)",
        "tog-uselivepreview": "Битне яңартмыйча тиз карап алуны куллану",
-       "tog-forceeditsummary": "Үзгәртүләрне тасвирлау юлы тутырылмаган булса, кисәтү",
-       "tog-watchlisthideown": "Ð\9cинем Ò¯Ð·Ð³Ó\99Ñ\80Ñ\82үлÓ\99Ñ\80ем ÐºÒ¯Ð·Ó\99Ñ\82Ò¯ Ð¸Ñ\81емлегеннÓ\99н яшерелсен",
-       "tog-watchlisthidebots": "Ð\91оÑ\82 Ò¯Ð·Ð³Ó\99Ñ\80Ñ\82үлÓ\99Ñ\80е ÐºÒ¯Ð·Ó\99Ñ\82Ò¯ Ð¸Ñ\81емлегеннÓ\99н яшерелсен",
-       "tog-watchlisthideminor": "Кече үзгәртүләр күзәтү исемлегеннән яшерелсен",
-       "tog-watchlisthideliu": "Ð\90вÑ\82оÑ\80изаÑ\86иÑ\8fне Ñ\83зган ÐºÑ\83лланÑ\83Ñ\87Ñ\8bлаÑ\80нÑ\8bÒ£ Ò¯Ð·Ð³Ó\99Ñ\80Ñ\82үлÓ\99Ñ\80е ÐºÒ¯Ð·Ó\99Ñ\82Ò¯ Ð¸Ñ\81емлегеннÓ\99н яшерелсен",
+       "tog-forceeditsummary": "Төзәтмә аңлатмасы кыры буш булса, кисәтү",
+       "tog-watchlisthideown": "Ð\9aүзÓ\99Ñ\82Ò¯ Ð¸Ñ\81емлегемдÓ\99 Ð¼Ð¸Ð½ÐµÐ¼ Ñ\82өзÓ\99Ñ\82мÓ\99лÓ\99Ñ\80ем яшерелсен",
+       "tog-watchlisthidebots": "Ð\9aүзÓ\99Ñ\82Ò¯ Ð¸Ñ\81емлегемдÓ\99 Ð±Ð¾Ñ\82 Ñ\82өзÓ\99Ñ\82мÓ\99лÓ\99Ñ\80е яшерелсен",
+       "tog-watchlisthideminor": "Күзәтү исемлегемдә кече төзәтмәләр яшерелсен",
+       "tog-watchlisthideliu": "Ð\9aүзÓ\99Ñ\82Ò¯ Ð¸Ñ\81емлегемдÓ\99 ÐºÐµÑ\80гÓ\99н ÐºÑ\83лланÑ\83Ñ\87Ñ\8bлаÑ\80нÑ\8bÒ£ Ñ\82өзÓ\99Ñ\82мÓ\99лÓ\99Ñ\80е яшерелсен",
        "tog-watchlistreloadautomatically": "Фильтр алмашкан очракта күзәтү исемлеген автоматик рәвештә яңартырга (JavaScript кирәк)",
-       "tog-watchlisthideanons": "Ð\90ноним ÐºÑ\83лланÑ\83Ñ\87Ñ\8bлаÑ\80нÑ\8bÒ£ Ò¯Ð·Ð³Ó\99Ñ\80Ñ\82үлÓ\99Ñ\80е ÐºÒ¯Ð·Ó\99Ñ\82Ò¯ Ð¸Ñ\81емлегеннÓ\99н яшерелсен",
-       "tog-watchlisthidepatrolled": "ТикÑ\88еÑ\80елгÓ\99н Ò¯Ð·Ð³Ó\99Ñ\80Ñ\82үлÓ\99Ñ\80 ÐºÒ¯Ð·Ó\99Ñ\82Ò¯ Ð¸Ñ\81емлегеннÓ\99н яшерелсен",
+       "tog-watchlisthideanons": "Ð\9aүзÓ\99Ñ\82Ò¯ Ð¸Ñ\81емлегендÓ\99 Ð°Ð½Ð¾Ð½Ð¸Ð¼ ÐºÑ\83лланÑ\83Ñ\87Ñ\8bлаÑ\80нÑ\8bÒ£ Ñ\82өзÓ\99Ñ\82мÓ\99лÓ\99Ñ\80е яшерелсен",
+       "tog-watchlisthidepatrolled": "Ð\9aүзÓ\99Ñ\82Ò¯ Ð¸Ñ\81емлегемдÓ\99 Ñ\82икÑ\88еÑ\80елгÓ\99н Ñ\82өзÓ\99Ñ\82мÓ\99лÓ\99Ñ\80 яшерелсен",
        "tog-watchlisthidecategorization": "Битләрне төркемләшү яшерелсен",
        "tog-ccmeonemails": "Башка кулланучыларга җибәргән хатларымның копияләре миңа да җибәрелсен",
        "tog-diffonly": "Юрама чагыштыру астында бит эчтәлеге күрсәтелмәсен",
-       "tog-showhiddencats": "Яшерен төркемнәр күрсәтелсен",
+       "tog-showhiddencats": "Яшерен төркемнәр күрсәтергә",
        "tog-norollbackdiff": "Кире кайтару ясагач юрамалар аермасы күрсәтелмәсен",
        "tog-useeditwarning": "Битне сакламыйча киткәндә мине кисәтергә",
        "tog-prefershttps": "Системага кергәндә һәрвакыт саклаулы тоташу кулланылсын",
        "oct": "окт",
        "nov": "ноя",
        "dec": "дек",
-       "january-date": "$1 Ð\93ыйнвар",
-       "february-date": "$1 Февраль",
-       "march-date": "$1 Ð\9cарт",
-       "april-date": "$1 Ð\90прель",
-       "may-date": "$1 Ð\9cай",
-       "june-date": "$1 Ð\98юнь",
-       "july-date": "$1 Ð\98юль",
-       "august-date": "$1 Ð\90вгуст",
-       "september-date": "$1 Сентябрь",
-       "october-date": "$1 Ð\9eктябрь",
-       "november-date": "$1 Ð\9dоябрь",
+       "january-date": "$1 Ð³ыйнвар",
+       "february-date": "$1 февраль",
+       "march-date": "$1 Ð¼арт",
+       "april-date": "$1 Ð°прель",
+       "may-date": "$1 Ð¼ай",
+       "june-date": "$1 Ð¸юнь",
+       "july-date": "$1 Ð¸юль",
+       "august-date": "$1 Ð°вгуст",
+       "september-date": "$1 сентябрь",
+       "october-date": "$1 Ð¾ктябрь",
+       "november-date": "$1 Ð½оябрь",
        "december-date": "$1 декабрь",
        "period-am": "ТК",
        "period-pm": "ТС",
        "navigation": "Навигация",
        "and": "&#32;һәм",
        "faq": "ЕБС",
-       "actions": "Ð\93амÓ\99лләр",
+       "actions": "Ð¥Ó\99Ñ\80Ó\99кÓ\99Ñ\82ләр",
        "namespaces": "Исемнәр мәйданы",
        "variants": "Вариантлар",
        "navigation-heading": "Навигация",
        "returnto": "$1 битенә кайту.",
        "tagline": "{{SITENAME}} проектыннан",
        "help": "Ярдәм",
+       "help-mediawiki": "MediaWiki турында белешмә",
        "search": "Эзләү",
        "searchbutton": "Эзләү",
        "go": "Күчү",
        "history": "Битнең тарихы",
        "history_short": "Тарих",
        "history_small": "тарих",
-       "updatedmarker": "Ñ\81оңгÑ\8b ÐºÐµÑ\80үемнән соң яңартылган",
+       "updatedmarker": "Ñ\81оңгÑ\8b ÐºÐµÑ\80үегездән соң яңартылган",
        "printableversion": "Басма юрама",
        "permalink": "Даими сылтама",
        "print": "Бастыру",
        "create-local": "Локаль тасвирлама өстәү",
        "delete": "Бетерү",
        "undelete_short": "$1 {{PLURAL:$1|төзәтмәне|$1 төзәтмә}} торгызу",
-       "viewdeleted_short": "{{PLURAL:$1|1=1 бетерелгән үзгәртүне|$1 бетерелгән үзгәртүне}} карау\n{{PLURAL:$1|бетерелгән төзәтмәне|$1 бетерелгән төзәтмәне}} карау",
+       "viewdeleted_short": "Бетерелгән {{PLURAL:$1|1=төзәтмәне|$1 төзәтмәне}} карау",
        "protect": "Яклау",
        "protect_change": "үзгәртү",
        "unprotect": "Яклауны үзгәртү",
        "redirectedfrom": "($1 битеннән юнәлтелде)",
        "redirectpagesub": "Юнәлтү бите",
        "redirectto": "Шунда юнәлтелә:",
-       "lastmodifiedat": "Бу бит соңгы тапкыр $2 $1 үзгәртелә.",
+       "lastmodifiedat": "Бу бит соңгы тапкыр $1 көнендә $2 вакытында үзгәртелгән.",
        "viewcount": "Бу биткә $1 {{PLURAL:$1|бер тапкыр|$1 тапкыр}} мөрәҗәгать иттеләр.",
        "protectedpage": "Якланган бит",
        "jumpto": "Моңа күчү:",
        "youhavenewmessagesfromusers": "{{PLURAL:$4|Сезгә}} {{PLURAL:$3|$3 кулланучыдан}} $1 килде ($2).",
        "youhavenewmessagesmanyusers": "Сез бик күп кулланучыдан $1 алдыгыз ($2).",
        "newmessageslinkplural": "{{PLURAL:$1|яңа хәбәр|999=яңа хәбәрләр}}",
-       "newmessagesdifflinkplural": "соңгы {{PLURAL:$1|үзгәртү|үзгәртүләр}}",
+       "newmessagesdifflinkplural": "соңгы {{PLURAL:$1|үзгәреш|999=үзгәрешләр}}",
        "youhavenewmessagesmulti": "$1 эчендә яңа хат бар",
        "editsection": "үзгәртү",
        "editold": "үзгәртү",
        "viewsourceold": "чыганак кодны карау",
        "editlink": "үзгәртү",
        "viewsourcelink": "чыганак кодны карау",
-       "editsectionhint": "$1 бүлеген үзгәртү",
+       "editsectionhint": "«$1» бүлеген үзгәртергә",
        "toc": "Эчтәлек",
        "showtoc": "күрсәтү",
        "hidetoc": "яшерү",
        "error": "Хата",
        "databaseerror": "Мәгълүматлар базасында хата",
        "databaseerror-textcl": "Мәгълүмат базасында хата чыкты",
-       "databaseerror-query": "СоÑ\80аÑ\82Ñ\83: $1",
+       "databaseerror-query": "Сорау: $1",
        "databaseerror-function": "Функция: $1",
        "databaseerror-error": "Хата: $1",
        "laggedslavemode": "Игътибар: биттә соңгы яңартулар күрсәтелмәгән булырга мөмкин.",
        "readonly_lag": "Мәгълүматлар базасы, өстәмә сервер төп сервер белән синхронизацияләшкәнче, үзгәрүләрдән автомат рәвештә ябылды.",
        "internalerror": "Эчке хата",
        "internalerror_info": "Эчке хата: $1",
+       "internalerror-fatal-exception": "«$1» тибындагы котылгысыз чыгармалар",
        "filecopyerror": "«$2» файлына «$1» файлының копиясен ясап булмый.",
        "filerenameerror": "«$1» файлының исемен «$2» исеменә алыштырып булмый.",
        "filedeleteerror": "«$1» файлын бетереп булмый.",
        "badarticleerror": "Бу биттә мондый гамәл башкарып булмый.",
        "cannotdelete": "«$1» исемле битне яки файлны бетереп булмый. Аны бүтән кулланучы бетергән булырга мөмкин.",
        "cannotdelete-title": "«$1» битен бетереп булмый",
+       "delete-scheduled": "«$1» бите бетерү өчен планлаштырылган. \nСабыр булыгыз.",
        "delete-hook-aborted": "Үзгәртү махсус процедура тарафыннан кире кагыла.\nСәбәпләре китерелми.",
+       "no-null-revision": "«$1» бите өчен яңа нуленче юраманы ясап булмады",
        "badtitle": "Яраксыз исем",
        "badtitletext": "Битнең соралган исеме дөрес түгел, буш яисә телъара яки интервики исеме дөрес күрсәтелмәгән. Исемдә тыелган символлар кулланылган булырга мөмкин.",
+       "title-invalid-characters": "Соралган битнең исемендә рөхсәт булмаган символлар бар: «$1».",
        "perfcached": "Бу мәгълүматлар кэштан алынган, аларда соңгы үзгәртүләр булмаска мөмкин. Кэшта иң күбе {{PLURAL:$1|язма|$1 язмалар}}  саклана.",
        "perfcachedts": "Бу мәгълүматлар кэштан алынган, ул соңгы тапкыр $1 яңартылды. Кэшта иң күбе {{PLURAL:$4|язма}} саклана",
        "querypage-no-updates": "Хәзер бу битне яңартып булмый. Монда күрсәтелгән мәгълүматлар кабул ителмәячәк.",
        "viewsource-title": "$1 битенең чыганагын карау",
        "actionthrottled": "Тизлек киметелгән",
        "actionthrottledtext": "Спамга каршы көрәш өчен, аз вакыт эчендә бу гамәлне еш куллану тыелган һәм СЕз бирелгән вакытны бетергәнсез инде. Зинһар, соңарак кабатлагыз.",
-       "protectedpagetext": "Ð\91Ñ\83 Ð±Ð¸Ñ\82 Ò¯Ð·Ð³Ó\99Ñ\80Ñ\82үлÓ\99Ñ\80дÓ\99н Ò»Ó\99м Ð±Ð°Ñ\88ка Ñ\82Ó©Ñ\80ле Ð³Ð°Ð¼Ó\99ллÓ\99Ñ\80дÓ\99н Ñ\8fкланган.",
+       "protectedpagetext": "Бу бит үзгәртүдән һәм башка төрле гамәлләрдән якланган.",
        "viewsourcetext": "Сез бу битнең башлангыч текстын карый һәм күчерә аласыз.",
        "viewyourtext": "Сез <strong>үз төзәтмәләрегезне</strong> бу сәхифәдә карый һәм чыгарылма текстны күчермәли аласыз.",
        "protectedinterface": "Бу биттә программа тәэминатының интерфейс хәбәрләре бар. Вандализмга каршы көрәш сәбәпле, бу битне үзгәртү тыела. Әлеге хәбәрнең тәрҗемәсен өстәү яки үзгәртү өчен, зинһар өчен, MediaWiki [https://translatewiki.net/ translatewiki.net] тәрҗемәләү сайтын кулланыгыз.",
        "editinginterface": "<strong>Игътибар:</strong> Сез программа тәэминатының интерфейс тексты булган битне үзгәртәсез. Бу башка кулланучыларга да тәэсир итәчәк.",
        "translateinterface": "Бу хәбәрнең текстын үзгәртү өчен яки өстәмәләр кертү өчен MediaWiki җирләштерү сайтын кулланыгыз [https://translatewiki.net/ translatewiki.net].",
-       "cascadeprotected": "Ð\91Ñ\83 Ð±Ð¸Ñ\82 Ò¯Ð·Ð³Ó\99Ñ\80Ñ\82үлÓ\99Ñ\80дÓ\99н Ñ\81акланган, Ñ\87өнки Ñ\83л ÐºÐ°Ñ\81кадлÑ\8b Ñ\81аклаÑ\83 ÐºÐ°Ð±Ñ\83л Ð¸Ñ\82елгÓ\99н {{PLURAL:$1|1=биÑ\82кÓ\99|биÑ\82лÓ\99Ñ\80гÓ\99}} Ó©Ñ\81Ñ\82Ó\99лгÓ\99н:\n$2",
+       "cascadeprotected": "Бу бит үзгәртүдән сакланган, чөнки ул каскадлы саклау кабул ителгән {{PLURAL:$1|1=биткә|битләргә}} өстәлгән:\n$2",
        "namespaceprotected": "'''$1''' исем киңлегендәге битләрне үзгәртү өчен сезнең рөхсәтегез юк.",
        "customcssprotected": "Сез бу CSS-сәхифәне үзгәртә алмыйсыз, чөнки монда башка кулланучының шәхси көйләнмәләре саклана",
        "customjsprotected": "Сез бу JavaScript-сәхифәне үзгәртә алмыйсыз, чөнк монда башка кулланучының шәхси көйләнмәләре саклана",
        "botpasswords-bad-appid": "Атамасы «$1» булган бот исеме ярамый.",
        "botpasswords-created-title": "Бот серсүзе булдырылды",
        "resetpass_forbidden": "Серсүз үзгәртелә алмый",
+       "resetpass_forbidden-reason": "Серсүзләрне үзгәртергә мөмкин түгел: $1",
        "resetpass-no-info": "Бу битне карау өчен сез системага үз хисап язмагыз ярдәмендә керергә тиеш.",
        "resetpass-submit-loggedin": "Серсүзне үзгәртү",
        "resetpass-submit-cancel": "Кире кагу",
        "image_tip": "Куелган файл",
        "media_sample": "Мисал.ogg",
        "media_tip": "Файлга сылтама",
-       "sig_tip": "Имза һәм вакыт",
+       "sig_tip": "Имзагыз вакыт белән",
        "hr_tip": "Горизонталь сызык (еш кулланмагыз)",
-       "summary": "Үзгәртүләр тасвирламасы:",
+       "summary": "Кыскача аңлатма:",
        "subject": "Тема:",
-       "minoredit": "Бу кече үзгәртү",
+       "minoredit": "Бу кече төзәтмә",
        "watchthis": "Бу битне күзәтү",
        "savearticle": "Битне саклау",
-       "savechanges": "Үзгәртүләрне саклау",
+       "savechanges": "Үзгәрешләрне саклау",
        "publishpage": "Бит ясау",
        "publishchanges": "Битне бастыру",
        "savearticle-start": "Битне саклау...",
-       "savechanges-start": "Үзгәртүләрне саклау...",
+       "savechanges-start": "Үзгәрешләрне саклау…",
        "publishpage-start": "Битне бастыру...",
        "publishchanges-start": "Төзәтмәләрне бастыру...",
        "preview": "Алдан карау",
        "showpreview": "Алдан карау",
-       "showdiff": "Кертелгән үзгәртүләр",
+       "showdiff": "Кертелгән үзгәрешләр",
        "anoneditwarning": "<strong>Игътибар!</strong> Сез сайтта теркәлмәдегез. Әгәрдә сез нинди дә булсә төзәтмәләр яисә үзгәртүләр кертсәгез, сезнең IP-адрес башка кулланучыларга да билгеле булачак. Сайтка <strong>[$1 керсәгез]</strong> яисә <strong>[$2 кулланучы язмасын төзесәгез]</strong>, сез керткән үзгәртүләр сезнең кулланучы язмагызга бәйләнгән булачак, шулай ук башка мөмкинлекләр дә туачак.",
        "anonpreviewwarning": "''Сез системада теркәлмәдегез.Сезнең тарафтан эшләнгән барлык үзгәртүләр дә сезнең IP-юлламагызны саклауга китерә.''",
-       "missingsummary": "'''Искәртү.''' Сез үзгәртүгә кыскача тасвирлау язмадыгыз. Сез «Битне саклау» төймәсенә тагын бер тапкыр бассагыз, үзгәртүләр тасвирламасыз сакланачак.",
-       "missingcommenttext": "Коммент язуыгыз сорала.",
+       "missingsummary": "<strong>Искәртмә.</strong> Сез төзәтмәнең кыскача аңлатмасы бирмәдегез. \nӘгәр «$1» төймәсенә кабат бассагыз, төзәтмәгез аңлатмасыз сакланачак.",
+       "missingcommenttext": "Комментарий языгызчы.",
        "missingcommentheader": "<strong>Искәртү:</strong> Сез шәрехнең темасын күрсәтмәгәнсез.\n«$1» төймәсенә кабат бассагыз, үзгәртүләр темасыз язылачак.",
        "summary-preview": "Төзәтмәләрне карап чыгу:",
        "subject-preview": "Башисемне алдан карау:",
-       "blockedtitle": "Ð\9aÑ\83лланÑ\83Ñ\87Ñ\8b Ñ\82Ñ\8bелдÑ\8b",
+       "blockedtitle": "Ð\9aÑ\83лланÑ\83Ñ\87Ñ\8b Ñ\82Ñ\8bелган",
        "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Исегездә тотыгыз: әгәр сез теркәлмәгән һәм электрон почта адресыгызны [[Special:Preferences|көйләнмәләрдә]] дәлилләмәгән булсагыз, сез бирелгән «{{int:emailuser}}» мөмкинчелекне куллана алмаячаксыз. Шулай ук тыю вакытында сезнең хат җибәрү мөмкинлегегезне чикләгән булырга да мөмкиннәр.\nСезнең IP адресыгыз — $3, тыю таныклыгы — $5.\nЗинһар, хатларда бу мәгълүматны күрсәтергә онытмагыз.",
        "autoblockedtext": "Сезнең IP адресыгыз, аның тыелган кулланучы тарафыннан кулланылуы сәбәпле, автомат рәвештә тыелды.\nУл кулланучыны тыючы идарәче: $1. Күрсәтелгән сәбәп:\n\n:<em>$2</em>\n\n* Тыю башланган вакыт: $8\n* Тыю ахыры: $6\n* Тыелулар саны: $7\n\nСез $1 яки башка [[{{MediaWiki:Grouppage-sysop}}|идарәчегә]] тыю буенча сорауларыгызны җибәрә аласыз.\n\nИсегездә тотыгыз: әгәр сез [[Special:Preferences|көйләнмәләрдә]] электрон почта адресыгызны  күрсәтмәгән яки дәлилләмәгән булсагыз, шулай ук  сез блокта булсагыз хат җибәреп булмаячак һәм  сез \"{{int:emailuser}}\" мөмкинлеген куллана алмаячаксыз.\n\nСезнең IP адрес — $3, тыю идентификаторы — #$5.\nХатларда бу мәгълүматны күрсәтергә онытмагыз.",
        "blockednoreason": "сәбәп күрсәтелмәгән",
        "accmailtext": "[[User talk:$1|$1]] кулланучысы өчен төзелгән серсүз $2 адресына җибәрелде.\n\nАвторизация узгач, үз хисап язмагызда сез ''[[Special:ChangePassword|серсүзегезне үзгәртә аласыз]]''.",
        "newarticle": "(Яңа)",
        "newarticletext": "Сез әлегә язылмаган биткә кердегез.\nЯңа бит ясау өчен астагы тәрәзәдә мәкалә текстын җыегыз ([$1 ярдәм битен] карый аласыз).\nӘгәр сез бу биткә ялгышлык белән эләккән булсагыз, браузерыгызның '''артка''' төймәсенә басыгыз.",
-       "anontalkpagetext": "----\n<em>Бу бәхәс бите системада теркәлмәгән яисә үз исеме белән кермәгән кулланучыныкы.</em>\nАны тану өчен без санлы IP адресын файдаланырга мәҗбүрбез.\nӘлеге адрес башка аноним кулланучылар тарафыннан да кулланылырга мөмкин.\nӘгәр сез аноним кулланучы һәм сезгә юлланмаган хәбәрләр алдым дип саныйсыз икән (бер IP адресы күп кулланучы өчен булырга мөмкин), башка мондый аңлашылмаучанлыклар килеп чыкмасын өчен [[Special:UserLogin|системага керегез]] яисә [[Special:CreateAccount|теркәлегез]].",
+       "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}}|бу исем кергән башка мәкаләләрне]] башка битләрдә,\nяисә <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} көндәлекләрдәге язмаларны] таба аласыз.</span> Сезнең бу битне ясарга хакыгыз юк.",
        "userpage-userdoesnotexist": "«<nowiki>$1</nowiki>» исемле хисап язмасы юк. Сез чынлап та бу битне ясарга яисә үзгәртергә телисезме?",
        "log-fulllog": "Көндәлекне тулысынча карау",
        "edit-hook-aborted": "Үзгәртү махсус процедура тарафыннан кире кагыла.\nСәбәпләре китерелми.",
        "edit-gone-missing": "Битне яңартып булмый.\nУл бетерелгән булырга мөмкин.",
-       "edit-conflict": "Үзгәртүләр конфликты.",
+       "edit-conflict": "Үзгәртү конфликты.",
        "edit-no-change": "Текстта үзгәешләр ясалмау сәбәпле, сезнең үзгәртү кире кагыла.",
        "postedit-confirmation-created": "Бит төзелде",
        "postedit-confirmation-saved": "Төзәтмәгез сакланды.",
        "edit-already-exists": "Яңа бит төзеп булмый.\nУл инде бар.",
        "editwarning-warning": "Башка биткә күчү вакытында бу мәкаләгә керткән үзгәрешләр югалырга мөмкин.\nӘгәрдә сез теркәлгән булсагыз, бу искәрмәне сез көйләнмәләрегезнең «{{int:prefs-editing}}» бүлегендә үзгәртә аласыз.",
+       "slot-name-main": "Төп",
        "content-model-wikitext": "викитекст",
        "content-model-text": "гади текст",
        "content-model-javascript": "JavaScript",
        "expansion-depth-exceeded-category": "Ачыклык тирәнлеге зур булган битләр",
        "expansion-depth-exceeded-warning": "Биттә кертем чиге артып киткән",
        "undo-success": "Үзгәртүдән баш тартып була.\nЮрамалараны чагыштыруны карагыз һәм, үзгәртүләр Сез теләгәнчә булса, битне саклагыз.",
-       "undo-failure": "Аралыктагы үзгәртүләр туры килмәү сәбәпле, үзгәртүдән баш тартып булмый.",
-       "undo-norev": "Үзгәртү юк яисә ул бетерелгән, шуңа аннан баш тартып булмый.",
+       "undo-failure": "Аралыктагы үзгәрешләр туры килмәү сәбәпле, төзәтмәне кире кагып булмый.",
+       "undo-norev": "Төзәтмәне кире кагып булмый, чөнки аны барлыкта юк яки ул бетерелгән.",
        "undo-summary": "[[Special:Contributions/$2|$2]] кулланучысының ([[User talk:$2|бәхәс]]) $1 үзгәртүеннән баш тарту",
        "cantcreateaccount-text": "Бу IP адресыннан (<b>$1</b>) хисап язмалары төзү тыела. Тыючы: [[User:$3|$3]].\n\n$3 күрсәткән сәбәп: ''$2''",
        "viewpagelogs": "Бу битнең көндәлекләрен карау",
-       "nohistory": "Ð\91Ñ\83 Ð±Ð¸Ñ\82нең Ò¯Ð·Ð³Ó\99Ñ\80Ñ\82үлÓ\99Ñ\80 тарихы юк.",
+       "nohistory": "Ð\91Ñ\83 Ð±Ð¸Ñ\82нең Ò¯Ð·Ð³Ó\99Ñ\80Ñ\82үе тарихы юк.",
        "currentrev": "Хәзерге юрама",
        "currentrev-asof": "Хәзерге юрама, $1",
        "revisionasof": "$1 юрамасы",
        "revision-info": "$1 юрамасы; {{GENDER:$6|$2}}$7",
        "previousrevision": "← Алдагы юрама",
-       "nextrevision": "ЧиÑ\80аÑ\82Ñ\82агÑ\8b юрама →",
+       "nextrevision": "Ð\9aилÓ\99Ñ\81е юрама →",
        "currentrevisionlink": "Хәзерге юрама",
        "cur": "хәзерге",
        "next": "киләсе",
        "page_first": "беренче",
        "page_last": "соңгы",
        "histlegend": "Аңлатмалар: '''({{int:cur}})''' = хәзерге юрамадан аерымлыклар, '''({{int:last}})''' = баягы юрамадан аерымлыклар, '''{{int:minoreditletter}}''' = кече үзгәртүләр.",
-       "history-fieldset-title": "Үзгәртүләрне эзләү",
+       "history-fieldset-title": "Төзәтмәләрне сөзү",
        "history-show-deleted": "Бары тик бетерелгән төзәтмәләр",
        "histfirst": "иң иске",
        "histlast": "иң яңа",
        "historysize": "($1 {{PLURAL:$1|байт}})",
-       "historyempty": "(буш)",
-       "history-feed-title": "Үзгәртүләр тарихы",
-       "history-feed-description": "Бу битнең викидагы үзгәртүләр тарихы",
+       "historyempty": "буш",
+       "history-feed-title": "Үзгәртү тарихы",
+       "history-feed-description": "Бу битнең викидагы үзгәртү тарихы",
        "history-feed-item-nocomment": "$1, $2",
        "history-feed-empty": "Соратылган бит юк.\nУл бетерелгән яисә бүтән урынга күчерелгән (башка исем алган) булырга мөмкин.\n[[Special:Search|Эзләтеп]] карагыз.",
-       "rev-deleted-comment": "(үзгәртүләрнең тасвиры бетерелгән)",
+       "rev-deleted-comment": "(төзәтмә аңлатмасы бетерелгән)",
        "rev-deleted-user": "(автор исеме бетерелгән)",
        "rev-deleted-event": "(язма бетерелгән)",
        "rev-deleted-user-contribs": "[кулланучының исеме яки  IP-юлламасы бетерелгән  — үзгәртү кертем битеннән яшерелгән]",
        "rev-deleted-text-view": "Битнең бу юрамасы '''бетерелгән'''.\nСез аны карый аласыз. [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} Бетерүләр көндәлегендә] аңлатмалар бирелгән булырга мөмкин.",
        "rev-suppressed-text-view": "Битнең бу юрамасы '''яшерелгән'''.\nСез аны карый аласыз. [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} Яшерүләр көндәлегендә] аңлатмалар бирелгән булырга мөмкин.",
        "rev-deleted-no-diff": "Сез юрамалар арасындагы аермаларны карый алмыйсыз. Сәбәбе: кайсыдыр юрама '''бетерелгән'''.\n[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} Бетерүләр көндәлегендә] тулырак мәгълүмат табып була.",
-       "rev-suppressed-no-diff": "Сез юрамалар  арасындагы үзгәртүләрне карый алмыйсыз, чөнки аларның берсе '''бетерелгән'''.",
+       "rev-suppressed-no-diff": "Сез юрамалар аермасын карый алмыйсыз, чөнки аларның берсе <strong>бетерелгән</strong>.",
        "rev-deleted-unhide-diff": "Битнең кайсыдыр юрамасы '''бетерелгән'''.\n[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} Бетерүләр көндәлегендә] тулырак мәгълүмат табып була.\nТеләгегез булса сез  [$1 бирелгән юраманы карый аласыз]",
        "rev-suppressed-unhide-diff": "Битнең кайсыдыр юрамасы '''яшерелгән'''.\n[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} Яшерүләр көндәлегендә] тулырак мәгълүмат табып була.\nТеләгегез булса сез  [$1 яшерелгән юраманы карый аласыз]",
        "rev-deleted-diff-view": "Бу юрамалар чагыштыруының бер юрамасы '''бетерелгән'''.\nСез  чагыштыруны карый аласыз, [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} бетерүләр көндәлегендә] тулырак мәгълүмат бирелгән булырга мөмкин.",
        "revdelete-hide-text": "Үзгәртү тексты",
        "revdelete-hide-image": "Файл эчендәгеләрне качыр",
        "revdelete-hide-name": "Гамәлне һәм көйләүне яшерү",
-       "revdelete-hide-comment": "Үзгәртүләр тасвирламасы",
+       "revdelete-hide-comment": "Үзгәрешләр аңлатмасы",
        "revdelete-hide-user": "Кулланучы исеме/IP-адрес",
        "revdelete-hide-restricted": "Мәгълүматлар идарәчеләрдән дә яшерелсен",
        "revdelete-radio-same": "(үзгәртмәү)",
        "revdelete-edit-reasonlist": "Сәбәпләр исемлеген үзгәртү",
        "revdelete-offender": "Әлеге юрамалы битнең авторы:",
        "suppressionlog": "Яшерү көндәлеге",
-       "mergehistory": "Үзгәртүләр тарихын берләштерү",
+       "mergehistory": "Үзгәрешләр тарихын берләштерү",
        "mergehistory-box": "Ике битнең үзгәртүләр тарихын берләштерү:",
        "mergehistory-from": "Чыганак:",
        "mergehistory-into": "Төп бит:",
        "compareselectedversions": "Сайланган юрамаларны чагыштыру",
        "showhideselectedversions": "Сайланган юрамаларны күрсәтү/яшерү",
        "editundo": "үткәрмәү",
-       "diff-empty": "(аермалар юк)",
+       "diff-empty": "(аермасы юк)",
        "diff-multi-sameuser": "(шул ук кулланучының {{PLURAL:$1|бер арадаш юрамасы|$1 арадаш юрамасы}} күрсәтелмәгән)",
        "diff-multi-otherusers": "({{PLURAL:$2|Башка бер кулланучының|$2 кулланучының}} {{PLURAL:$1|бер арадаш юрамасы|$1 арадаш юрамасы}} күрсәтелмәгән)",
        "diff-multi-manyusers": "($2 күбрәк {{PLURAL:$2|кулланучының|кулланучының}} {{PLURAL:$1|Бер арадаш юрамасы|$1 арадаш юрамасы}} күрсәтелмәгән)",
        "prefs-labs": "Сынаулы мөмкинчелекләр",
        "prefs-user-pages": "Кулланучы битләре",
        "prefs-personal": "Шәхси мәгълүмат",
-       "prefs-rc": "Соңгы төзәтмәләр",
+       "prefs-rc": "Соңгы үзгәрешләр",
        "prefs-watchlist": "Күзәтү исемлеге",
        "prefs-editwatchlist": "Күзәтү исемлеген үзгәртү",
        "prefs-editwatchlist-label": "Күзәтү исемлеге язмаларын үзгәртү:",
        "prefs-editwatchlist-clear": "Күзәтү исемлеген чистарту",
        "prefs-watchlist-days": "Күзәтү исемлегендә күрсәтелгән көннәр саны:",
        "prefs-watchlist-days-max": "Иң күбе $1 {{PLURAL:$1|1=көн|көн}}",
-       "prefs-watchlist-edits": "Күзәтү исемлегендә күрсәтелүче төзәтмәләрнең максималь саны:",
+       "prefs-watchlist-edits": "Күзәтү исемлегендә күрсәтү өчен үзгәрешләрнең иң зур саны:",
        "prefs-watchlist-edits-max": "Иң күбе: 1000",
        "prefs-watchlist-token": "Күзәтү исемлеге токены:",
        "prefs-watchlist-managetokens": "Токеннар беләр идарә итү",
        "action-sendemail": "электрон хат җибәрү",
        "nchanges": "$1 {{PLURAL:$1|үзгәртү}}",
        "enhancedrc-history": "тарих",
-       "recentchanges": "Соңгы үзгәртүләр",
+       "recentchanges": "Соңгы үзгәрешләр",
        "recentchanges-legend": "Соңгы үзгәртүләр көйләүләре",
        "recentchanges-summary": "Төрле битләрдә эшләнгән соңгы үзгәртүләр исемлеге.",
        "recentchanges-noresult": "Сайланган чорда күрсәтелгән шартларга туры килүче төзәтмәләр юк.",
        "recentchanges-feed-description": "Бу агымда соңгы үзгәртүләрне күзәтү.",
-       "recentchanges-label-newpage": "Бу үзгәртү белән яңа бит төзелгән",
-       "recentchanges-label-minor": "Бу кече үзгәртү",
-       "recentchanges-label-bot": "Бу үзгәртү бот белән эшләнгән",
-       "recentchanges-label-unpatrolled": "Үзгәртүне әлегә тикшермәгәннәр",
+       "recentchanges-label-newpage": "Бу төзәтмә белән яңа бит төзелгән",
+       "recentchanges-label-minor": "Бу кече төзәтмә",
+       "recentchanges-label-bot": "Бу төзәтмә бот белән эшләнгән",
+       "recentchanges-label-unpatrolled": "Бу тәзәтмә тикшерелмәгән әле",
        "recentchanges-label-plusminus": "Битнең зурлыгы шуның кадәрле байтка үзгәрде",
        "recentchanges-legend-heading": "<strong>Аңлатма:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (шулай ук [[Special:NewPages|яңа битләр исемлеген]] карагыз)",
        "rcfilters-savedqueries-cancel-label": "Баш тарту",
        "rcfilters-savedqueries-add-new-title": "Хәзерге фильтр көйләнмәләрен саклау",
        "rcfilters-clear-all-filters": "Барлык филтерләрне чистарту",
-       "rcfilters-search-placeholder": "Фильтрланы соңгы үзгәртү (карау яисә кертүне башлау)",
+       "rcfilters-search-placeholder": "Үзгәрешләрне сөзү (меню кулланыгыз яки сөзгеч аты буенча эзлигез)",
        "rcfilters-invalid-filter": "Яраксыз фильтр",
        "rcfilters-filterlist-title": "Фильтрлар",
        "rcfilters-filterlist-feedbacklink": "Әлеге фильтрлау кораллары турында турында фикер калдырыгыз",
        "rcfilters-watchlist-markseen-button": "Бар үзгәртүләрне каралган дип билгеләргә",
        "rcfilters-watchlist-edit-watchlist-button": "Күзәтү исемлегегезне үзгәртү",
        "rcfilters-watchlist-showupdated": "Сезнең соңгы төзәтмәләрдән соң үзгәргән битләр <strong>калын</strong> һәм тулы маркер белән күрсәтелгән",
-       "rcfilters-preference-label": "«Соңгы үзгәртүләр» битенең яңа юрамасын яшерү",
+       "rcfilters-preference-label": "JavaScript тан башка интерфейсын куллану",
        "rcnotefrom": "Астарак <strong>$3, $4</strong> өчен {{PLURAL:$5|үзгәртүләр күрсәтелгән}} (<strong>$1</strong> артык түгел).",
        "rclistfrom": "$3 $2 башлап яңа үзгәртүләрне күрсәт",
-       "rcshowhideminor": "кече үзгәртүләрне $1",
+       "rcshowhideminor": "кече төзәтмәләрне $1",
        "rcshowhideminor-show": "Күрсәтү",
-       "rcshowhideminor-hide": "Яшер",
+       "rcshowhideminor-hide": "Яшерү",
        "rcshowhidebots": "ботларны $1",
-       "rcshowhidebots-show": "Күрсәт",
-       "rcshowhidebots-hide": "Яшер",
+       "rcshowhidebots-show": "Күрсәтү",
+       "rcshowhidebots-hide": "Яшерү",
        "rcshowhideliu": "теркәлгән кулланучыларны $1",
        "rcshowhideliu-show": "Күрсәт",
-       "rcshowhideliu-hide": "Яшер",
+       "rcshowhideliu-hide": "Яшерү",
        "rcshowhideanons": "кермәгән кулланучыларны $1",
        "rcshowhideanons-show": "Күрсәтү",
-       "rcshowhideanons-hide": "Яшер",
-       "rcshowhidepatr": "тикшерелгән үзгәртүләрне $1",
-       "rcshowhidepatr-show": "Ð\9aүрсәтү",
-       "rcshowhidepatr-hide": "яшер",
-       "rcshowhidemine": "минем үзгәртүләремне $1",
+       "rcshowhideanons-hide": "Яшерү",
+       "rcshowhidepatr": "Тикшерелгән төзәтмәләрне $1",
+       "rcshowhidepatr-show": "күрсәтү",
+       "rcshowhidepatr-hide": "яшерү",
+       "rcshowhidemine": "минем төзәтмәләремне $1",
        "rcshowhidemine-show": "Күрсәтү",
-       "rcshowhidemine-hide": "Яшер",
+       "rcshowhidemine-hide": "Яшерү",
        "rcshowhidecategorization": "битләрне төркемләүне $1",
        "rcshowhidecategorization-show": "Күрсәт",
        "rcshowhidecategorization-hide": "Яшер",
        "rc-old-title": "башта «$1» буларак ясала",
        "recentchangeslinked": "Бәйләнешле үзгәртүләр",
        "recentchangeslinked-feed": "Бәйләнешле үзгәртүләр",
-       "recentchangeslinked-toolbox": "Бәйләнешле үзгәртүләр",
+       "recentchangeslinked-toolbox": "Бәйләнешле үзгәрешләр",
        "recentchangeslinked-title": "\"$1\" битенә бәйләнешле үзгәртүләр",
        "recentchangeslinked-summary": "Бу битттән яисә бу биткә сылтаган битләрдәге үзгәртмәле карау өчен битнең исемен кертегез. (Билгеле бер төркемгә караган битләрне карау өчен {{ns:category}}:Төркем исемен языгыз).[[Special:Watchlist|Күзәтү исемлегегезгә]] керә торган битләр '''калын''' итеп күрсәтелгән.",
        "recentchangeslinked-page": "Битнең исеме:",
        "recentchangeslinked-to": "Моның урынына бу биткә бәйле булган битләрдәге үзгәртүләрне күрсәтү",
-       "upload": "Файл йөкләү",
+       "upload": "Файл төяү",
        "uploadbtn": "Файлны йөкләү",
        "reuploaddesc": "Файлны йөкләүгә кире кату",
        "upload-tryagain": "Яңартылган файлны җибәрү",
        "magiclink-tracking-pmid": "Тылсымлы PMID сылтамаларын кулланучы битләр",
        "magiclink-tracking-isbn": "Тылсымлы ISBN сылтамаларын кулланучы битләр",
        "specialloguserlabel": "Башкаручы:",
-       "speciallogtitlelabel": "Ð\9cакÑ\81аÑ\82 (аÑ\82ама Ñ\8fиÑ\81Ó\99 {{ns:user}}:кулланучы исеме):",
+       "speciallogtitlelabel": "Ð\9cакÑ\81аÑ\82 (аÑ\82ама Ñ\8fки {{ns:user}}:кулланучы исеме):",
        "log": "Көндәлекләр",
        "logeventslist-submit": "Күрсәт",
        "all-logs-page": "Барлык көндәлекләр",
        "allpagessubmit": "Башкару",
        "allpagesprefix": "Алкушымчалы битләрне күрсәтү:",
        "allpages-bad-ns": "{{SITENAME}} проектында «$1» исемнәр мәйданы юк.",
-       "allpages-hide-redirects": "Юнәлтүләрне яшер",
+       "allpages-hide-redirects": "Юнәлтүләрне яшерү",
        "cachedspecial-refresh-now": "Соңгы юраманы карау.",
        "categories": "Төркемнәр",
        "categories-submit": "Күрсәт",
        "delete-confirm": "«$1» бетерү",
        "delete-legend": "Бетерү",
        "historywarning": "<strong>Игътибар:</strong> Сез бетерергә теләгән биттә үзгәртү тарихы бар, ул $1 {{PLURAL:$1|юрамадан тора}}:",
-       "historyaction-submit": "Ð\9aÒ¯Ñ\80Ñ\81Ó\99Ñ\82",
+       "historyaction-submit": "ЮÑ\80амалаÑ\80 ÐºÒ¯Ñ\80Ñ\81Ó\99Ñ\82Ò¯",
        "confirmdeletetext": "Сез бу битнең (яки рәсемнең) тулысынча бетерелүен сорадыгыз.\nЗинһар, моны чыннан да эшләргә теләгәнегезне, моның нәтиҗәләрен аңлаганыгызны һәм [[{{MediaWiki:Policy-url}}]] бүлегендәге кагыйдәләр буенча эшләгәнегезне раслагыз.",
        "actioncomplete": "Гамәл башкарган",
        "actionfailed": "Эш башкарылмаган",
        "deletereasonotherlist": "Башка сәбәп",
        "deletereason-dropdown": "* Бетерүнең сәбәпләре\n** спам\n** вандаллык\n** автор хокукларын бозу\n** автор соравы буенча\n** эшсез күчермә",
        "delete-edit-reasonlist": "Сәбәпләр исемлеген үзгәртү",
+       "rollback-confirmation-no": "Кире алу",
        "rollbacklink": "кире кайтару",
        "rollbacklinkcount": "$1 {{PLURAL:$1|төзәтмәне}} кире кагу",
        "editcomment": "Үзгәртүләр тасвирламасы: <em>$1</em>.",
        "mycontris": "Кертем",
        "anoncontribs": "Кертем",
        "contribsub2": "Кертем {{GENDER:$3|$1}} ($2)",
-       "nocontribs": "Ð\9aÒ¯Ñ\80Ñ\81Ñ\88Ñ\82елгÓ\99н Ñ\88аÑ\80Ñ\82лаÑ\80га Ò\97авап Ð±Ð¸Ñ\80гÓ\99н Ò¯Ð·Ð³Ó\99Ñ\80еÑ\88лÓ\99Ñ\80 Ñ\82аÒ\97Ñ\8bлмадÑ\8b.",
+       "nocontribs": "Ð\91Ñ\83 Ñ\88аÑ\80Ñ\82лаÑ\80га Ñ\82Ñ\83Ñ\80Ñ\8b ÐºÐ¸Ð»Ð³Ó\99н Ò¯Ð·Ð³Ó\99Ñ\80еÑ\88лÓ\99Ñ\80 Ñ\82абÑ\8bлмаган.",
        "uctop": "хәзерге",
        "month": "Айдан башлап (һәм элегрәк):",
        "year": "Елдан башлап (һәм элегрәк):",
        "ipbother": "Башка вакыт:",
        "ipboptions": "2 сәгать:2 hours,1 көн:1 day,3 көн:3 days,1 атна:1 week,2 атна:2 weeks,1 ай:1 month,3ай:3 months,6 ай:6 months,1 ел:1 year,чикләүсез:infinite",
        "ipb-confirm": "Тыюны раслау",
+       "ipb-pages-label": "Битләр",
        "badipaddress": "Ялгыш IP адресы",
        "blockipsuccesssub": "Тыю башкарылган",
        "ipb-unblock-addr": "$1 кулланучысын тыюдан азат итү",
        "ipb-unblock": "Кулланучы яки IP адресы тыюдан азат итү",
        "ipb-blocklist-duration-left": "$1 калды",
        "block-expiry": "Бетә:",
+       "block-prevent-edit": "Үзгәртү",
+       "block-reason": "Сәбәп:",
+       "block-target": "IP адресы яки кулланучы исеме",
        "unblockip": "Кулланучыны тыюдан азат итү",
        "ipusubmit": "Бу тыюны туктату",
        "blocklist": "Тыелган кулланучылар",
+       "autoblocklist-submit": "Эзләү",
+       "autoblocklist-legend": "Автотыелу исемлеге",
        "ipblocklist": "Тыелган кулланучылар",
        "blocklist-timestamp": "Дата/вакыт",
        "blocklist-target": "Максат",
        "ipblocklist-submit": "Эзләү",
        "ipblocklist-localblock": "Локаль тыюлык",
        "ipblocklist-otherblocks": "Башка {{PLURAL:$1|1=тыю|тыюлар}}",
-       "infiniteblock": "билгеле бер вакытсыз",
+       "infiniteblock": "чикләнмәгән",
        "expiringblock": "$1 $2 тәмамлана",
        "anononlyblock": "анонимнар гына",
        "noautoblockblock": "автотыю ябык",
        "createaccountblock": "хисап язмасы теркәү тыелган",
        "emailblock": "хат җибәрү тыелган",
+       "blocklist-editing": "үзгәртү",
        "blocklink": "тыю",
        "unblocklink": "тыюдан азат итү",
        "change-blocklink": "тыюны үзгәртү",
        "tooltip-pt-preferences": "{{GENDER:|Көйләнмәләрегез}}",
        "tooltip-pt-watchlist": "Сез күзәтелгән төзәтмәле битләр исемлеге",
        "tooltip-pt-mycontris": "{{GENDER:|Сезнең}} кертемегез",
-       "tooltip-pt-login": "Сез хисап язмасы төзи алыр идегез, әмма бу мәҗбүри түгел.",
+       "tooltip-pt-login": "Сез керү алыр идегез, әмма бу мәҗбүри түгел.",
        "tooltip-pt-logout": "Чыгу",
        "tooltip-pt-createaccount": "Сезгә аккаунт ясарга һәм системага керергә киңәш итәбез, әмма бу мәҗбүри түгел.",
        "tooltip-ca-talk": "Битнең эчтәлеге турында бәхәс",
        "tooltip-ca-edit": "Бу битне үзгәртү",
        "tooltip-ca-addsection": "Яңа бүлек башлау",
        "tooltip-ca-viewsource": "Бу бит үзгәртүдән якланган. Сез аның чыганак текстын гына карый аласыз.",
-       "tooltip-ca-history": "Битнең төзәтмәләр исемлеге",
+       "tooltip-ca-history": "Битнең төзәтмәләре исемлеге",
        "tooltip-ca-protect": "Бу битне яклау",
-       "tooltip-ca-delete": "Бу битне бетерү",
+       "tooltip-ca-delete": "Бу битне бетерергә",
        "tooltip-ca-move": "Бу битне күчерү",
        "tooltip-ca-watch": "Бу битне сезнең күзәтү исемлегезгә өстәү",
        "tooltip-ca-unwatch": "Бу битне сезнең күзәтү исемлегездә бетерү",
        "tooltip-search": "{{SITENAME}} эчендә эзләү",
-       "tooltip-search-go": "Нәкъ шундый исеме белән биткә күчәрү",
+       "tooltip-search-go": "Нәкъ шундый исеме белән биткә күчү",
        "tooltip-search-fulltext": "Бу текст белән битләрне табу",
        "tooltip-p-logo": "Баш биткә күчү",
        "tooltip-n-mainpage": "Баш биткә күчү",
        "tooltip-n-mainpage-description": "Баш биткә күчү",
-       "tooltip-n-portal": "Ð\9fÑ\80оекÑ\82 Ñ\82Ñ\83Ñ\80Ñ\8bнда, Ñ\81ез Ð½Ó\99Ñ\80Ñ\81Ó\99 Ð¸Ñ\82Ó\99 Ð°Ð»Ð°Ñ\81Ñ\8bз Ò»Ó\99м Ð½Ó\99Ñ\80Ñ\81Ó\99 ÐºÐ°Ð¹Ð´Ð° Ð±Ñ\83ла Ð´Ð¸Ð¿ Ñ\82Ñ\83Ñ\80Ñ\8bнда.",
-       "tooltip-n-currentevents": "Ð\90гÑ\8bмдагÑ\8b Ð²Ð°ÐºÑ\8bйгалаÑ\80 Ñ\82Ñ\83Ñ\80Ñ\8bнда Ð¼Ó\99гÑ\8aлүмаÑ\82нÑ\8b Ñ\82абÑ\83",
-       "tooltip-n-recentchanges": "Соңгы үзгәртүләр исемлеге",
+       "tooltip-n-portal": "Ð\91Ñ\83 Ð¿Ñ\80оекÑ\82 Ñ\82Ñ\83Ñ\80Ñ\8bнда, Ð¼Ð¾Ð½Ð´Ð° Ð½Ó\99Ñ\80Ñ\81Ó\99 Ð¸Ñ\82Ó\99 Ð°Ð»Ð°Ñ\81Ñ\8bз Ò»Ó\99м ÐºÐ°Ð¹Ð´Ð° Ð½Ó\99Ñ\80Ñ\81Ó\99деÑ\80 Ñ\82аба Ð°Ð»Ð°Ñ\81Ñ\8bз",
+       "tooltip-n-currentevents": "Ð¥Ó\99зеÑ\80ге Ð²Ð°ÐºÑ\8bйгалаÑ\80 Ñ\82Ñ\83Ñ\80Ñ\8bнда Ð¼Ó\99гÑ\8aлүмаÑ\82нÑ\8b Ñ\82абаÑ\80га",
+       "tooltip-n-recentchanges": "Соңгы үзгәрешләр исемлеге",
        "tooltip-n-randompage": "Очраклы битне карау",
-       "tooltip-n-help": "«{{SITENAME}}» проектының белешмәлек",
+       "tooltip-n-help": "Белешмә алу өчен урын",
        "tooltip-t-whatlinkshere": "Бирегә сылтаган барлык битләрнең исемлеге",
-       "tooltip-t-recentchangeslinked": "Бу биттән сылтаган битләрдә ахыргы үзгәртүләр",
+       "tooltip-t-recentchangeslinked": "Бу биттән сылтаулаган битләрдә соңгы үзгәрешләр",
        "tooltip-feed-rss": "Бу бит өчен RSS трансляциясе",
        "tooltip-feed-atom": "Бу бит өчен Atom трансляциясе",
        "tooltip-t-contributions": "{{GENDER:$1|Бу кулланучының}} кертем исемлеге",
        "tooltip-t-emailuser": "{{GENDER:$1|Бу кулланучыга}} хат җибәрү",
-       "tooltip-t-upload": "Файлларны йөкләү",
+       "tooltip-t-upload": "Файллар төяү",
        "tooltip-t-specialpages": "Барлык махсус битләр исемлеге",
        "tooltip-t-print": "Бу битнең басма юрамасы",
        "tooltip-t-permalink": "Битнең бу юрамасына даими сылтама",
        "tooltip-ca-nstab-template": "Үрнәк бите",
        "tooltip-ca-nstab-help": "Ярдәм битен карау",
        "tooltip-ca-nstab-category": "Төркем битен карау",
-       "tooltip-minoredit": "Бу үзгәртүне кече дип билгелү",
+       "tooltip-minoredit": "Бу төзәтмәне кече дип билгеләү",
        "tooltip-save": "Үзгәртүләрегезне саклау",
        "tooltip-preview": "Алдан карау, саклау алдыннан үзгәртүләрегезнең карап чыгыгыз!",
        "tooltip-diff": "Сезнең үзгәртүләрегезне күрсәтү.",
        "simpleantispam-label": "Анти-спам тикшерә.\nМоны <strong>ТУТЫРМАГЫЗ!</strong>",
        "pageinfo-title": "«$1» буенча мәгълүмат",
        "pageinfo-header-basic": "Төп мәгълүмат",
-       "pageinfo-header-edits": "Үзгәртүләр тарихы",
+       "pageinfo-header-edits": "Үзгәртү тарихы",
        "pageinfo-header-restrictions": "Битне яклау",
        "pageinfo-header-properties": "Битнең үзенчәлекләре",
        "pageinfo-display-title": "Күренмә башлык",
        "pageinfo-redirects-name": "Бу биткә юнәлтүләр саны",
        "pageinfo-subpages-name": "Бу битнең асбитләре",
        "pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|юнәлтү}}; $3 {{PLURAL:$3|гади}})",
-       "pageinfo-firstuser": "Битне төзүче",
+       "pageinfo-firstuser": "Бит төзүче",
        "pageinfo-firsttime": "Битне төзү датасы",
-       "pageinfo-lastuser": "Соңгы мөхәррирләүче",
-       "pageinfo-lasttime": "Соңгы үзгәртү датасы",
-       "pageinfo-edits": "Ð\93омÑ\83ми Ñ\82өзÓ\99Ñ\82үлÓ\99Ñ\80 саны",
-       "pageinfo-authors": "Ð\93омÑ\83ми Ð°Ð²Ñ\82оÑ\80лаÑ\80 саны",
-       "pageinfo-recent-edits": "Соңгы вакытта үзгәртүләр ($1 эчендә)",
-       "pageinfo-recent-authors": "Ð\9aабаÑ\82ланмаÑ\81 авторлар саны",
-       "pageinfo-magic-words": "{{PLURAL:$1|1=Тылсымлы сүз|Тылсымлы сүзләр}} ($1)",
-       "pageinfo-hidden-categories": "{{PLURAL:$1|1=Яшерен төркем|Яшерен төркемнәр}} ($1)",
+       "pageinfo-lastuser": "Соңгы үзгәртүче",
+       "pageinfo-lasttime": "Соңгы төзәтмә вакыты",
+       "pageinfo-edits": "ТөзÓ\99Ñ\82мÓ\99лÓ\99Ñ\80нең Ñ\82Ñ\83лаем саны",
+       "pageinfo-authors": "ТеÑ\80ле Ð°Ð²Ñ\82оÑ\80лаÑ\80нÑ\8bÒ£ Ñ\82Ñ\83лаем саны",
+       "pageinfo-recent-edits": "Соңгы вакытта төзәтмәләр саны ($1 эчендә)",
+       "pageinfo-recent-authors": "СоңгÑ\8b Ð²Ð°ÐºÑ\8bÑ\82Ñ\82а Ð°ÐµÑ\80Ñ\8bм авторлар саны",
+       "pageinfo-magic-words": "Тылсымлы {{PLURAL:$1|сүз|сүзләр}} ($1)",
+       "pageinfo-hidden-categories": "Яшерен {{PLURAL:$1|төркем|төркемнәр}} ($1)",
        "pageinfo-templates": "{{PLURAL:$1|1=Калып|Калыплар}} ($1)",
        "pageinfo-toolboxlink": "Бит турында мәгълүмат",
        "pageinfo-redirectsto": "Юнәлтү",
        "filedeleteerror-short": "Файлны бетерү хатасы: $1",
        "filedeleteerror-long": "Файлны бетерү вакытында хаталар чыкты:\n\n$1",
        "filedelete-missing": "«$1» исемле файлны бетерергә мөмкин түгел, чөнки ул юк.",
-       "previousdiff": "← Алдагы үзгәртү",
-       "nextdiff": "ЧиÑ\80аÑ\82Ñ\82агÑ\8b Ò¯Ð·Ð³Ó\99Ñ\80Ñ\82Ò¯ →",
+       "previousdiff": "← Алдагы төзәтмә",
+       "nextdiff": "Ð\9aилÓ\99Ñ\81е Ñ\82өзÓ\99Ñ\82мÓ\99 →",
        "imagemaxsize": "Рәсемнең зурлыгына чикләүләр:<br />''(тасвирлау бите өчен)''",
        "thumbsize": "Рәсемнең кечерәйтелгән юрамасы өчен:",
        "widthheight": "$1 × $2",
        "autosumm-new": "Яңа бит: «$1»",
        "watchlistedit-raw-titles": "Язмалар:",
        "watchlistedit-clear-titles": "Башлык:",
-       "watchlisttools-clear": "Күзәтү исемлеген чистарту",
+       "watchlisttools-clear": "Күзәтү исемлеген бушату",
        "watchlisttools-view": "Соңгы үзгәртүләрне күрсәтү",
-       "watchlisttools-edit": "Күзәтү исемлегене карау һәм үзгәртү",
+       "watchlisttools-edit": "Күзәтү исемлеген карау һәм үзгәртү",
        "watchlisttools-raw": "Текст сыман үзгәртү",
        "hijri-calendar-m1": "Мөхәррәм",
        "hijri-calendar-m7": "Раҗәб",
        "tags-delete": "бетерү",
        "tags-activate": "активлаштыру",
        "tags-deactivate": "сүндерү",
-       "tags-hitcount": "$1 {{PLURAL:$1|үзгәртү}}",
+       "tags-hitcount": "$1 {{PLURAL:$1|үзгәреш}}",
        "tags-create-submit": "Төзү",
        "tags-deactivate-submit": "Өзергә",
        "comparepages": "Битләрне чагыштыру",
        "special-characters-group-khmer": "Кһмер",
        "special-characters-group-canadianaboriginal": "Канада иҗек язуы",
        "mw-widgets-abandonedit": "Сез чыннан да үзгәртүләрне сакламыйча карау режимына чыгарга телисезме?",
-       "mw-widgets-abandonedit-discard": "Үзгәртүләрне кире кагу",
+       "mw-widgets-abandonedit-discard": "Үзгәрешне кире кагу",
        "mw-widgets-abandonedit-keep": "Үзгәртүне дәвам итү",
        "mw-widgets-abandonedit-title": "Сез ризамы?",
        "mw-widgets-dateinput-no-date": "Дата сайланмаган",
index 9c6550d..75d6b2e 100644 (file)
        "changepassword": "Чажыт сөстү өскертири",
        "resetpass_text": "<!-- Маңаа сөзүглелди немерелээри -->",
        "resetpass_header": "Чажыт сөстү катап чогаадып кылыры",
-       "oldpassword": "Эгри чажыт сөзүңер:",
+       "oldpassword": "Эрги уруң (чажыт сөс):",
        "newpassword": "Чаа чажыт сөзүңер:",
        "retypenew": "Чажыт сөзүңерни катап бижиңер:",
        "resetpass_submit": "Чажыт сөстү чоогадып кылыр база кирер.",
        "page_first": "бирги",
        "page_last": "сөөлгү",
        "histlegend": "Версиялар шилиири: деңнээр дээн арыныңар версияларын имнеңеш, бээр базыптыңар '''{{int:compare-submit}}'''.<br />\nТайылбыр: '''({{int:cur}})''' — амгы версиядан ылгавыр; '''({{int:last}})''' — эрткен версиядан ылгавыр;  '''{{int:minoreditletter}}''' — биче өскерилгелер.",
-       "history-fieldset-title": "Ð\9aаÑ\80алааÑ\80Ñ\8b Ñ\82өөгүзү",
+       "history-fieldset-title": "ЭдилгелеÑ\80ни Ñ\88Ò¯Ò¯Ñ\80",
        "history-show-deleted": "Чүгле казыттынган",
        "histfirst": "Эң эрги",
        "histlast": "Эң чаа",
        "unusedcategories": "Ажыглаваан бөлүктер",
        "unusedimages": "Ажыглаваан файлдар",
        "wantedcategories": "Күзээринге бөлүктер",
-       "wantedpages": "Күзээрүнге арыннар",
+       "wantedpages": "Күзээн арыннар",
        "mostlinked": "Эң холбаалар арыннар",
        "mostlinkedcategories": "Эң холбаалар бөлүктер",
        "mostlinkedtemplates": "Эң холбаалар майыктар",
        "duration-years": "$1 {{PLURAL:$1|чыл|чыл}}",
        "duration-decades": "$1 {{PLURAL:$1|1=он хонук|он хонук}}",
        "duration-centuries": "$1 {{PLURAL:$1|1=чүс чыл|чүс чыл}}",
-       "mw-widgets-abandonedit-title": "Бүзүрелдиг-дир бе?"
+       "mw-widgets-abandonedit-title": "Бүзүрелдиг-дир бе?",
+       "mw-widgets-dateinput-no-date": "Ай-хүн шилитинмээн",
+       "date-range-to": "Ай-хүнге чедир:"
 }
index f9eeb8e..7e49ece 100644 (file)
        "autoblockedtext": "Ваша IP-адреса автоматично заблокована у зв'язку з тим, що вона раніше використовувалася кимось із користувачів, якого заблокував $1.\nПричина блокування блокування:\n\n:<em>$2</em>\n\n* Початок блокування: $8\n* Закінчення блокування: $6\n* Блокування виконав: $7\n\nВи можете надіслати листа користувачеві $1 або будь-якому іншому [[{{MediaWiki:Grouppage-sysop}}|адміністратору]], щоб обговорити блокування.\n\nЗверніть увагу, що ви не зможете скористатися функцією \"{{int:emailuser}}\", так як не маєте дійсної електронної пошти, зареєстрованої в [[Special:Preferences|особистих налаштуваннях]], а також якщо вам було заборонено надсилати листи при блокуванні.\n\nВаша поточна IP-адреса — $3, ідентифікатор блокування — #$5. Будь ласка, зазначайте ці дані у своїх запитах.",
        "systemblockedtext": "Ваше ім'я користувача або IP-адресу було автоматично заблоковано MediaWiki.\nВказана причина:\n\n:<em>$2</em>\n\n* Початок блокування: $8\n* Закінчення блокування: $6\n* Ціль блокування: $7\n\nВаша поточна IP-адреса — $3.\nБудь ласка, додайте всі вказані подробиці до будь-яких запитів, які Ви будете робити.",
        "blockednoreason": "не вказано причини",
-       "blockedtext-composite": "<strong>Ваше ім'я користувача або IP-адресу було заблоковано.</strong>\n\nВказана причина:\n\n:<em>$2</em>.\n\n* Початок блокування: $8\n* Закінчення найдовшого блокування: $6\n\nВаша поточна IP-адреса — $3.\nБудь ласка, додайте всі вказані подробиці до будь-яких запитів, які Ви будете робити.",
+       "blockedtext-composite": "<strong>Ваше ім'я користувача або IP-адресу було заблоковано.</strong>\n\nВказана причина:\n\n:<em>$2</em>.\n\n* Початок блокування: $8\n* Закінчення найдовшого блокування: $6\n\n* $5\n\nВаша поточна IP-адреса — $3.\nБудь ласка, додайте всі вказані подробиці до будь-яких запитів, які Ви будете робити.",
        "blockedtext-composite-reason": "Встановлено кілька блокувань для Вашого облікового запису та/або IP-адреси",
        "whitelistedittext": "Ви повинні $1, щоб редагувати сторінки.",
        "confirmedittext": "Ви повинні підтвердити вашу адресу електронної пошти перед редагуванням сторінок.\nБудь-ласка вкажіть і підтвердіть вашу електронну адресу на [[Special:Preferences|сторінці налаштувань]].",
index cb80d47..c4ffa03 100644 (file)
        "privacypage": "Project:اصولِ اخفائے راز",
        "badaccess": "نقص اجازت",
        "badaccess-group0": "آپ متمنی عمل کا اجراء کرنے کے مُجاز نہیں۔",
-       "badaccess-groups": "آپ کا درخواست‌کردہ عمل {{PLURAL:$2|گروہ|گروہوں میں سے ایک}}: $1 کے صارفین تک محدود ہے.",
+       "badaccess-groups": "آپ کا درخواست کردہ اقدام {{PLURAL:$2|اس حلقۂ صارف|ان حلقۂ ہائے صارف میں سے کسی ایک}} تک محدود ہے: $1۔",
        "versionrequired": "میڈیا ویکی کا $1 نسخہ لازمی چاہئیے.",
        "versionrequiredtext": "اِس صفحہ کو استعمال کرنے کیلئے میڈیاویکی کا $1 نسخہ چاہئیے.\n\n\nدیکھئے [[خاص:نسخہ|صفحۂ نسخہ]]",
        "ok": "ٹھیک ہے",
index 1b0da39..f98efd4 100644 (file)
        "createacct-benefit-heading": "{{SITENAME}}係由你同其他人貢獻。",
        "createacct-benefit-body1": "{{PLURAL:$1|次編輯|次編輯}}",
        "createacct-benefit-body2": "{{PLURAL:$1|版|版}}",
-       "createacct-benefit-body3": "最近{{PLURAL:$1|貢獻者|貢獻者}}",
+       "createacct-benefit-body3": "位最近{{PLURAL:$1|貢獻者}}",
        "badretype": "你入嘅密碼前後不一。",
        "usernameinprogress": "呢個名嘅戶口已經開緊。\n請等等。",
        "userexists": "你入嘅用戶名已經有人用咗。\n唔該揀過個名啦。",
index be09343..257c0b9 100644 (file)
                        "Viztor",
                        "Ps2049",
                        "Suchichi02",
-                       "神樂坂秀吉"
+                       "神樂坂秀吉",
+                       "WQL"
                ]
        },
        "tog-underline": "链接下划线:",
        "autoblockedtext": "您的IP地址因曾被一位被$1封禁的用户使用而被自动封禁。封禁原因:\n\n:<em>$2</em>\n\n* 开始时间:$8\n* 到期时间:$6\n* 目标用户:$7\n\n您可以联系$1或其他[[{{MediaWiki:Grouppage-sysop}}|管理员]]申诉该封禁。\n\n请注意,只有当您已在[[Special:Preferences|系统设置]]确认了电子邮件地址且未被禁止使用“{{int:emailuser}}”功能时,才能发送电子邮件联系管理员。\n\n您当前的IP地址为$3,该封禁ID为#$5。请在您做出的任何查询中包含所有上述详情。",
        "systemblockedtext": "您的用户名或IP地址已被MediaWiki自动封禁。封禁原因:\n\n:<em>$2</em>\n\n* 开始时间:$8\n* 到期时间:$6\n* 目标用户:$7\n\n您当前的IP地址是$3。请在您做出的任何查询中包含所有上述详情。",
        "blockednoreason": "未给出原因",
-       "blockedtext-composite": "您的用户名或IP地址已被封禁。封禁原因:\n\n:<em>$2</em>\n\n* 开始时间:$8\n* 到期时间:$6\n\n您当前的IP地址是$3。请在您做出的任何查询中包含所有上述详情。",
+       "blockedtext-composite": "您的用户名或IP地址已被封禁。封禁原因:\n\n:<em>$2</em>\n\n* 开始时间:$8\n* 到期时间:$6\n\n* $5\n\n您当前的IP地址是$3。请在您做出的任何查询中包含所有上述详情。",
        "blockedtext-composite-reason": "有多个封禁目标为您的账户和/或IP地址",
        "whitelistedittext": "请$1以编辑页面。",
        "confirmedittext": "您必须确认您的电子邮件地址才能编辑页面。请通过[[Special:Preferences|系统设置]]设置并确认您的电子邮件地址。",
        "removedwatchtext": "“[[:$1]]”及其讨论页已从您的[[Special:Watchlist|监视列表]]中移除。",
        "removedwatchtext-talk": "“[[:$1]]”及其相关联页面已从您的[[Special:Watchlist|监视列表]]中移除。",
        "removedwatchtext-short": "页面“$1”已从您的监视列表移除。",
-       "watch": "关注",
+       "watch": "监视",
        "watchthispage": "监视本页",
        "unwatch": "取消监视",
        "unwatchthispage": "停止监视",
        "edit-error-short": "错误:$1",
        "edit-error-long": "错误:\n\n$1",
        "specialmute": "屏蔽",
+       "specialmute-success": "您的提及设置已经被更新。请在[[Special:参数设置|您的参数设置]]中查看所有被提及的用户。",
        "specialmute-submit": "确认",
        "specialmute-label-mute-email": "屏蔽该用户的邮件",
        "specialmute-error-invalid-user": "未找到您请求的用户名。",
+       "specialmute-login-required": "请登录以更改您的沉默用户提醒设置。",
        "revid": "修订版本$1",
        "pageid": "页面ID$1",
        "interfaceadmin-info": "$1\n\n编辑全站CSS/JS/JSON文件的权限刚刚从<code>editinterface</code>权限中拆分。如果您不知道为何收到此错误,请参见[[mw:MediaWiki_1.32/interface-admin]]。",
index 1506e55..90e6bac 100644 (file)
                        "Luuva",
                        "Davidzdh",
                        "WQL",
-                       "Tang891228"
+                       "Tang891228",
+                       "Winston Sung"
                ]
        },
        "tog-underline": "底線標示連結:",
        "autoblockedtext": "因先前的另一位使用者被 $1 封鎖,您的 IP 位址已被自動封鎖。\n原因是:\n\n:<em>$2</em>\n\n* 封鎖開始時間:$8\n* 封鎖結束時間:$6\n* 相關封鎖對象:$7\n\n您可以聯絡 $1 或其他的 [[{{MediaWiki:Grouppage-sysop}}|管理員]] 討論封鎖的相關問題。\n若您已在 [[Special:Preferences|偏好設定]] 中設定了一個有效的電子郵件地址,且尚未被封鎖郵件功能,則您可透過 \"{{int:emailuser}}\" 的功能來聯絡相關管理員。\n您目前的 IP 位址是 $3,此次封鎖的 ID 為 #$5。\n請您在詢問時附註以上詳細資料。",
        "systemblockedtext": "您的使用者名稱或 IP 位址已被 MediaWiki 自動封鎖,原因如下:\n\n:<em>$2</em>\n\n* 封鎖開始時間:$8\n* 封鎖結束時間:$6\n* 被封鎖的使用者:$7\n\n您目前的 IP 位址為 $3。\n請在做詢問時附上以上資訊。",
        "blockednoreason": "未說明原因",
-       "blockedtext-composite": "<strong>您的使用者名稱或 IP 位址已被封鎖。</strong>\n\n原因如下:\n\n:<em>$2</em>\n\n* 封鎖開始時間:$8\n* 最長的封鎖結束時間:$6\n\n您目前的 IP 位址為 $3。\n請在做詢問時附上以上資訊。",
+       "blockedtext-composite": "<strong>您的使用者名稱或 IP 位址已被封鎖。</strong>\n\n原因如下:\n\n:<em>$2</em>\n\n* 封鎖開始時間:$8\n* 最長的封鎖結束時間:$6\n\n* $5\n\n您目前的 IP 位址為 $3。\n請在做詢問時附上以上資訊。",
        "blockedtext-composite-reason": "有多個封鎖目標為您的帳號和/或IP位址",
        "whitelistedittext": "請先 $1 才可編輯頁面。",
        "confirmedittext": "在編輯此頁之前您必須確認您的電子郵件地址。\n請透過 [[Special:Preferences|偏好設定]] 設定並驗證您的電子郵件地址。",
        "accmailtitle": "密碼已寄出",
        "accmailtext": "[[User talk:$1|$1]] 的隨機密碼已經寄送至 $2,可登入後至 <em>[[Special:ChangePassword|變更密碼]] 頁面更改</em>。",
        "newarticle": "(新)",
-       "newarticletext": "您正連結至一頁不存在頁面。要建立該頁面,請在下方的編輯方塊中輸入內容(詳情請參考[$1 使用說明頁面])。如果您是不小心來到此頁面,請點選瀏覽器的<strong>返回</strong>按鈕。",
+       "newarticletext": "您正連結至一頁不存在頁面。要建立該頁面,請在下方的編輯方塊中輸入內容(詳情請參考[$1 說明頁面])。如果您是不小心來到此頁面,請點選瀏覽器的<strong>返回</strong>按鈕。",
        "anontalkpagetext": "----\n<em>此討論頁面是給尚未建立帳號的匿名使用者使用</em>\n因此我們必須使用 IP 位址來辨識對方,但相同的 IP 位址可能是由許多不同的使用者所共用。\n如果您是匿名使用者並且覺得評論的內容與您無關,請[[Special:CreateAccount|建立新帳號]]或[[Special:UserLogin|登入]]避免與其他匿名使用者混淆。",
        "noarticletext": "此頁面目前沒有內容,您可以在其它頁面中[[Special:Search/{{PAGENAME}}|搜尋此頁面標題]]、<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} 搜尋相關日誌]或[{{fullurl:{{FULLPAGENAME}}|action=edit}} 建立此頁面]</span>。",
        "noarticletext-nopermission": "此頁面目前沒有內容,\n您可以在其它頁面中 [[Special:Search/{{PAGENAME}}|搜尋此頁面標題]],或 <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} 搜尋相關日誌]</span>,但您沒有權限建立此頁面。",
        "revdelete-hide-comment": "編輯摘要",
        "revdelete-hide-user": "編輯者的使用者名稱/IP 位址",
        "revdelete-hide-restricted": "禁止顯示資料給管理者及其他使用者",
-       "revdelete-radio-same": "(不變更)",
+       "revdelete-radio-same": "(不變更)",
        "revdelete-radio-set": "隱藏",
        "revdelete-radio-unset": "顯示",
        "revdelete-suppress": "禁止向管理者及其他使用者顯示資料",
        "listgrouprights-key": "說明:\n* <span class=\"listgrouprights-granted\">已授予的權限</span>\n* <span class=\"listgrouprights-revoked\">已撤銷的權限</span>",
        "listgrouprights-group": "群組",
        "listgrouprights-rights": "權限",
-       "listgrouprights-helppage": "Help:Group rights",
+       "listgrouprights-helppage": "Help:使用者群組權限",
        "listgrouprights-members": "(成員清單)",
        "listgrouprights-addgroup": "加入{{PLURAL:$2|群組}}:$1",
        "listgrouprights-removegroup": "移除{{PLURAL:$2|群組|群組}}:$1",
        "restrictionsfield-help": "一個 IP 位址或 CIDR 範圍一行,要開啟所有範圍可使用:<pre>0.0.0.0/0\n::/0</pre>",
        "edit-error-short": "錯誤:$1",
        "edit-error-long": "錯誤:\n\n$1",
+       "specialmute": "遮蓋",
+       "specialmute-success": "您的遮蓋偏好設定已更新。可在[[Special:Preferences|您的偏好設定]]查看所有遮蓋掉的使用者。",
        "specialmute-submit": "確認",
+       "specialmute-label-mute-email": "遮蓋來自此使用者的郵件",
+       "specialmute-header": "請選擇您對於<b>{{BIDI:[[User:$1]]}}</b>的遮蓋偏好設定。",
        "specialmute-error-invalid-user": "無法找到請求的使用者名稱。",
+       "specialmute-email-footer": "要管理{{BIDI:$2}}的電子郵件偏好設定,請查看<$1>。",
+       "specialmute-login-required": "請登入以變更您的遮蓋偏好設定。",
        "revid": "修訂 $1",
        "pageid": "頁面 ID $1",
        "interfaceadmin-info": "$1\n\n編輯全站 CSS/JS/JSON 檔案的權限,近期已從 <code>editinterface</code> 權限裡拆分。若您不清楚為何會收到此錯誤,請查看 [[mw:MediaWiki_1.32/interface-admin]]。",
index f3d4f97..06295d7 100644 (file)
@@ -48,22 +48,27 @@ $specialPageAliases = [
        'ApiHelp'                   => [ 'עזרת_API' ],
        'ApiSandbox'                => [ 'ארגז_חול_של_API' ],
        'Ancientpages'              => [ 'דפים_מוזנחים' ],
+       'AutoblockList'             => [ 'חסימות_אוטומטיות', 'רשימת_חסימות_אוטומטיות' ],
        'Badtitle'                  => [ 'כותרת_שגויה' ],
        'Blankpage'                 => [ 'דף_ריק' ],
        'Block'                     => [ 'חסימה', 'חסימת_כתובת', 'חסימת_משתמש' ],
        'Booksources'               => [ 'משאבי_ספרות', 'משאבי_ספרות_חיצוניים' ],
+       'BotPasswords'              => [ 'סיסמאות_בוט' ],
        'BrokenRedirects'           => [ 'הפניות_לא_תקינות', 'הפניות_שבורות' ],
        'Categories'                => [ 'קטגוריות', 'רשימת_קטגוריות' ],
+       'ChangeContentModel'        => [ 'שינוי_מודל_התוכן' ],
+       'ChangeCredentials'         => [ 'שינוי_נתוני_ההזדהות' ],
        'ChangeEmail'               => [ 'שינוי_דואר_אלקטרוני', 'שינוי_דוא"ל' ],
        'ChangePassword'            => [ 'שינוי_סיסמה' ],
        'ComparePages'              => [ 'השוואת_דפים' ],
        'Confirmemail'              => [ 'אימות_כתובת_דואר' ],
        'Contributions'             => [ 'תרומות', 'תרומות_המשתמש' ],
-       'CreateAccount'             => [ 'הרשמה_לחשבון' ],
+       'CreateAccount'             => [ 'הרשמה_לחשבון', 'יצירת_חשבון' ],
        'Deadendpages'              => [ 'דפים_ללא_קישורים' ],
        'DeletedContributions'      => [ 'תרומות_מחוקות' ],
        'Diff'                      => [ 'הבדלים', 'הבדל' ],
        'DoubleRedirects'           => [ 'הפניות_כפולות' ],
+       'EditTags'                  => [ 'עריכת_תגיות' ],
        'EditWatchlist'             => [ 'עריכת_רשימת_המעקב' ],
        'Emailuser'                 => [ 'שליחת_דואר_למשתמש' ],
        'ExpandTemplates'           => [ 'פריסת_תבניות' ],
@@ -71,15 +76,18 @@ $specialPageAliases = [
        'Fewestrevisions'           => [ 'הגרסאות_המעטות_ביותר', 'הדפים_בעלי_מספר_העריכות_הנמוך_ביותר' ],
        'FileDuplicateSearch'       => [ 'חיפוש_קבצים_כפולים' ],
        'Filepath'                  => [ 'נתיב_לקובץ' ],
+       'GoToInterwiki'             => [ 'מעבר_לאתר_אחר' ],
        'Import'                    => [ 'ייבוא', 'ייבוא_דפים' ],
        'Invalidateemail'           => [ 'ביטול_דואר' ],
        'JavaScriptTest'            => [ 'בדיקת_JavaScript' ],
        'BlockList'                 => [ 'רשימת_חסומים', 'רשימת_משתמשים_חסומים', 'משתמשים_חסומים' ],
        'LinkSearch'                => [ 'חיפוש_קישורים_חיצוניים' ],
+       'LinkAccounts'              => [ 'קישור_חשבונות' ],
        'Listadmins'                => [ 'רשימת_מפעילים' ],
        'Listbots'                  => [ 'רשימת_בוטים' ],
        'Listfiles'                 => [ 'רשימת_קבצים', 'רשימת_תמונות', 'קבצים', 'תמונות' ],
        'Listgrouprights'           => [ 'רשימת_הרשאות_לקבוצה' ],
+       'Listgrants'                => [ 'רשימת_זיכיונות', 'זיכיונות' ],
        'Listredirects'             => [ 'רשימת_הפניות', 'הפניות' ],
        'ListDuplicatedFiles'       => [ 'רשימת_קבצים_כפולים' ],
        'Listusers'                 => [ 'רשימת_משתמשים', 'משתמשים' ],
@@ -106,7 +114,9 @@ $specialPageAliases = [
        'Newimages'                 => [ 'קבצים_חדשים', 'תמונות_חדשות', 'גלריית_קבצים_חדשים', 'גלריית_תמונות_חדשות' ],
        'Newpages'                  => [ 'דפים_חדשים' ],
        'PagesWithProp'             => [ 'דפים_עם_מאפיינים', 'דפים_לפי_מאפיינים' ],
+       'PageData'                  => [ 'מידע_על_הדף' ],
        'PageLanguage'              => [ 'שפת_הדף' ],
+       'PasswordPolicies'          => [ 'מדיניות_הסיסמאות' ],
        'PasswordReset'             => [ 'איפוס_סיסמה' ],
        'PermanentLink'             => [ 'קישור_קבוע' ],
        'Preferences'               => [ 'העדפות', 'ההעדפות_שלי' ],
@@ -116,9 +126,11 @@ $specialPageAliases = [
        'Randompage'                => [ 'אקראי', 'דף_אקראי' ],
        'RandomInCategory'          => [ 'דף_אקראי_בקטגוריה' ],
        'Randomredirect'            => [ 'הפניה_אקראית' ],
+       'Randomrootpage'            => [ 'דף_בסיס_אקראי' ],
        'Recentchanges'             => [ 'שינויים_אחרונים' ],
        'Recentchangeslinked'       => [ 'שינויים_בדפים_המקושרים' ],
        'Redirect'                  => [ 'הפניה' ],
+       'RemoveCredentials'         => [ 'הסרת_נתוני_ההזדהות' ],
        'ResetTokens'               => [ 'איפוס_אסימונים' ],
        'Revisiondelete'            => [ 'מחיקת_ושחזור_גרסאות' ],
        'RunJobs'                   => [ 'הרצת_משימות' ],
@@ -134,6 +146,7 @@ $specialPageAliases = [
        'Uncategorizedpages'        => [ 'דפים_חסרי_קטגוריה' ],
        'Uncategorizedtemplates'    => [ 'תבניות_חסרות_קטגוריות' ],
        'Undelete'                  => [ 'צפייה_בדפים_מחוקים' ],
+       'UnlinkAccounts'            => [ 'ביטול_הקישור_בין_חשבונות' ],
        'Unlockdb'                  => [ 'שחרור_בסיס_הנתונים' ],
        'Unusedcategories'          => [ 'קטגוריות_שאינן_בשימוש' ],
        'Unusedimages'              => [ 'קבצים_שאינם_בשימוש', 'תמונות_שאינן_בשימוש' ],
index e1ea247..4cc52a4 100644 (file)
@@ -21,6 +21,8 @@
  * @ingroup Maintenance
  */
 
+use MediaWiki\Storage\RevisionRecord;
+
 require_once __DIR__ . '/Maintenance.php';
 
 /**
@@ -67,9 +69,9 @@ class CleanupSpam extends Maintenance {
                        // Clean up spam on all wikis
                        $this->output( "Finding spam on " . count( $wgLocalDatabases ) . " wikis\n" );
                        $found = false;
-                       foreach ( $wgLocalDatabases as $wikiID ) {
+                       foreach ( $wgLocalDatabases as $wikiId ) {
                                /** @var Database $dbr */
-                               $dbr = $this->getDB( DB_REPLICA, [], $wikiID );
+                               $dbr = $this->getDB( DB_REPLICA, [], $wikiId );
 
                                foreach ( $protConds as $conds ) {
                                        $count = $dbr->selectField(
@@ -82,9 +84,9 @@ class CleanupSpam extends Maintenance {
                                                $found = true;
                                                $cmd = wfShellWikiCmd(
                                                        "$IP/maintenance/cleanupSpam.php",
-                                                       [ '--wiki', $wikiID, $spec ]
+                                                       [ '--wiki', $wikiId, $spec ]
                                                );
-                                               passthru( "$cmd | sed 's/^/$wikiID:  /'" );
+                                               passthru( "$cmd | sed 's/^/$wikiId:  /'" );
                                        }
                                }
                        }
@@ -136,8 +138,8 @@ class CleanupSpam extends Maintenance {
                $rev = Revision::newFromTitle( $title );
                $currentRevId = $rev->getId();
 
-               while ( $rev && ( $rev->isDeleted( Revision::DELETED_TEXT )
-                       || LinkFilter::matchEntry( $rev->getContent( Revision::RAW ), $domain, $protocol ) )
+               while ( $rev && ( $rev->isDeleted( RevisionRecord::DELETED_TEXT )
+                       || LinkFilter::matchEntry( $rev->getContent( RevisionRecord::RAW ), $domain, $protocol ) )
                ) {
                        $rev = $rev->getPrevious();
                }
@@ -152,7 +154,7 @@ class CleanupSpam extends Maintenance {
                        $page = WikiPage::factory( $title );
                        if ( $rev ) {
                                // Revert to this revision
-                               $content = $rev->getContent( Revision::RAW );
+                               $content = $rev->getContent( RevisionRecord::RAW );
 
                                $this->output( "reverting\n" );
                                $page->doEditContent(
index 8579f0f..45c66ae 100644 (file)
@@ -44,10 +44,10 @@ class ClearInterwikiCache extends Maintenance {
                        $prefixes[] = $row->iw_prefix;
                }
 
-               foreach ( $wgLocalDatabases as $db ) {
-                       $this->output( "$db..." );
+               foreach ( $wgLocalDatabases as $wikiId ) {
+                       $this->output( "$wikiId..." );
                        foreach ( $prefixes as $prefix ) {
-                               $wgMemc->delete( "$db:interwiki:$prefix" );
+                               $wgMemc->delete( "$wikiId:interwiki:$prefix" );
                        }
                        $this->output( "done\n" );
                }
index dc70e9c..0e96142 100644 (file)
@@ -57,8 +57,9 @@ class CopyJobQueue extends Maintenance {
                        ? JobQueueGroup::singleton()->getQueueTypes()
                        : [ $this->getOption( 'type' ) ];
 
+               $dbDomain = WikiMap::getCurrentWikiDbDomain()->getId();
                foreach ( $types as $type ) {
-                       $baseConfig = [ 'type' => $type, 'wiki' => wfWikiID() ];
+                       $baseConfig = [ 'type' => $type, 'domain' => $dbDomain ];
                        $src = JobQueue::factory( $baseConfig + $wgJobQueueMigrationConfig[$srcKey] );
                        $dst = JobQueue::factory( $baseConfig + $wgJobQueueMigrationConfig[$dstKey] );
 
diff --git a/maintenance/dictionary/mediawiki.dic b/maintenance/dictionary/mediawiki.dic
deleted file mode 100644 (file)
index aa9cb2e..0000000
+++ /dev/null
@@ -1,4655 +0,0 @@
-&add
-&amp
-&bar
-&img
-&sim
-&url
-&wap
-ABNF
-API
-Aacute
-Aborted
-Abuse
-Account
-Accum
-Acirc
-Action
-Activity
-Agrave
-All
-Allocations
-Ancientpages
-Anim
-Api
-Apitestsysop
-Apitestuser
-Aring
-Article
-As
-Atilde
-Auml
-Autopromote
-BACKCOMPAT
-Backlinks
-Blacklist
-Block
-Blocked
-Blocks
-Bodytext
-Broken
-COMPUTERNAME
-CRLF
-CURLOPT
-Campaign
-Capture
-Categories
-Category
-Ccedil
-Central
-Changes
-Check
-Click
-Client
-Clientfor
-Colorer
-Compare
-Config
-Console
-Continue
-Contribs
-Contributions
-Conversiontable
-Coordinates
-Create
-Creation
-Cview
-DDLMODE
-DWIM
-DWIMD
-Daily
-Dbkeyform
-Deadendpages
-Debugtext
-Delete
-Deletedrevs
-Denied
-Dfile
-Double
-Duplicate
-EAGAIN
-EBML
-ECMA
-EDITFILTERMERGED
-EINPROGRESS
-EINTR
-EOCDR
-ETAG
-Eacute
-Ecirc
-Edit
-Editor
-Education
-Egrave
-Elig
-Email
-Empty
-End
-English
-Enlist
-Euml
-Eval
-Events
-Exists
-Expand
-Expression
-Ext
-External
-Extracts
-Extraneous
-FFFD
-FOLLOWLOCATION
-Failure
-Featured
-Feed
-Feedback
-Feedbackv
-Feeds
-Fewestrevisions
-Ffile
-File
-Filearchive
-Filedelete
-Files
-Filter
-Filters
-Flag
-Flagged
-GI
-GRAPHEME
-Gadget
-Gadgets
-Geo
-Get
-Global
-Groups
-HEA
-HTM
-Hardblock
-Help
-Helpful
-ID
-IPTC
-IWBacklinks
-IWLinks
-Iacute
-Icirc
-Igrave
-Illegal
-Image
-Images
-Implict
-Import
-Info
-Invalidateemail
-Isarticle
-Item
-Iuml
-LOCALISATIONCACHE
-Lang
-Lastmod
-Links
-Linktags
-List
-Listredirects
-Living
-Log
-Login
-Logout
-Logs
-Lonelypages
-Longpages
-Love
-Ltitle
-MSVC
-Mark
-Match
-Matrix
-Members
-Mesg
-Messages
-Metatags
-Mobile
-Mostcategories
-Mostimages
-Mostinterwikis
-Mostlinked
-Mostlinkedcategories
-Mostlinkedtemplates
-Mostrevisions
-Move
-Mssql
-Mwstore
-Myuploads
-NEWPAGE
-NOTIC
-Name
-Need
-No
-Noscript
-Not
-Notalk
-Notice
-Notification
-Ntilde
-Oacute
-Ocirc
-Ograve
-Oldreviewedpages
-Open
-Options
-Oslash
-Otilde
-Ouml
-PAGEEDITDATE
-PAGEEDITOR
-PAGEEDITTIME
-PAGEINTRO
-PAGEMINOREDIT
-PAGESUMMARY
-PARSEHUGE
-PARSERFIRSTCALLINIT
-PHPTAL
-PMID
-Page
-Pages
-Param
-Parse
-Parsers
-Pass
-Passpass
-Patrol
-People
-Plugin
-Possible
-Program
-Props
-Protect
-Protected
-Protectexpiry
-Protectother
-Protectreason
-Protectreasonother
-Purge
-Query
-Queued
-Random
-Rapid
-Ratings
-Raw
-Recent
-Redirects
-Redis
-Referer
-Refresh
-Regexlike
-Replacer
-Reset
-Resursive
-Revert
-Review
-Revisions
-Rollback
-Rsd
-SEGSIZE
-STDERR
-SYSDBA
-Scaron
-Scribunto
-Search
-Section
-Set
-Shortpages
-Site
-Siteinfo
-Solr
-Stabilize
-Stash
-Stats
-Status
-Success
-Syntax
-TMPDIR
-TOOLBOXEND
-TRANSLIT
-Tagging
-Tags
-Template
-Templates
-Textform
-Tfile
-Throttled
-Timestamp
-Title
-Titles
-Token
-Tokens
-Tracking
-Transcode
-Triage
-UNWATCHURL
-Uacute
-Ucirc
-Ugrave
-Unblock
-Uncategorizedcategories
-Uncategorizedimages
-Uncategorizedpages
-Uncategorizedtemplates
-Undelete
-Unusedcategories
-Unusedimages
-Unusedtemplates
-Unwatchedpages
-Upload
-Urlform
-Usage
-User
-Usercreate
-Userdir
-Userlang
-Userrights
-Users
-Useruser
-Ustart
-Uuml
-Value
-Video
-View
-Visual
-WATCHINGUSERNAME
-WEBPVP
-Wantedcategories
-Wantedfiles
-Wantedpages
-Wantedtemplates
-Warning
-Watch
-Watchingusers
-Watchlist
-Wiki
-Wikibase
-Withoutinterwiki
-Wrong
-XX
-Xml
-YYYY
-YYYYMMDDHHMMSS
-Yacute
-Yuml
-\
-a
-aa
-aacute
-abbrv
-abcdefghijklmnopqrstuvwxyz
-abf
-aboutpage
-aboutsite
-abusefilter
-abusefiltercheckmatch
-abusefilterchecksyntax
-abusefilterevalexpression
-abusefilters
-abusefilterunblockautopromote
-abuselog
-abusive
-ac
-acad
-accel
-acceptbilling
-acceptlang
-accessdenied
-accesskey
-accesskeycache
-accesskeys
-accessors
-acchits
-account
-accountcreator
-accum
-acirc
-aclimit
-acprefix
-action
-actioncomplete
-actionhidden
-actions
-actiontext
-actionthrottled
-actionthrottledtext
-actiontoken
-activeusers
-activity
-acuxvalidate
-add
-addablegroups
-addbegin
-addedline
-addedwatchtext
-addergroup
-addergroups
-addin
-adding
-additional
-addr
-address
-addresses
-addsection
-addstudent
-admin
-administrator
-adnum
-adrelid
-adsrc
-advancedediting
-advancedrc
-advancedrendering
-advancedsearchoptions
-advancedwatchlist
-aelig
-af
-afl
-aft
-afttest
-afvf
-age
-aggregators
-agrave
-ahandler
-ahttp
-ai
-aifc
-aiff
-aiprop
-airtel
-aisort
-al
-alefsym
-algo
-algos
-all
-all's
-allcategories
-alldata
-alle
-allexamples
-allfileusages
-allhidden
-allimages
-allimit
-alllinks
-alllogstext
-allmessages
-allmonths
-allowedctypes
-allowedonly
-allowemail
-allowsduplicates
-allowusertalk
-allpages
-allpagesbadtitle
-allpagesprefix
-allpagesredirect
-allpagessubmit
-allpartners
-allredirects
-allrev
-alltitles
-alltransclusions
-allusers
-aloption
-alprefix
-alreadyblocked
-alreadydone
-alreadyexists
-alreadyrolled
-alunique
-am
-analyticsconfig
-anchor
-anchorclose
-anchorencode
-and
-andconvert
-andreescu
-andtitle
-anon
-anoneditwarning
-anonnotice
-anononly
-anonpreviewwarning
-anontalk
-anontalkpagetext
-anontoken
-anonuserpage
-anonymous
-anti
-antispoof
-antivirus
-anymap
-ap
-apcond
-apdir
-api
-api's
-apibase
-apihelp
-apihighlimits
-apis
-aplimit
-apnamespace
-apng
-apos
-appendnotsupported
-appendtext
-apprefix
-approve
-aprops
-aqbt
-aqct
-archivename
-aren
-args
-argsarams
-aring
-arnfjörð
-article
-articleexists
-articlefeedbackv
-articleid
-articlelink
-articlepage
-articlepath
-articles
-aryeh
-asc
-ascending
-asctime
-asdf
-aspx
-assert
-asymp
-async
-at
-atend
-atext
-atid
-atilde
-atime
-atlimit
-atoi
-atom
-atprefix
-atthasdef
-attibs
-attibute
-attlen
-attname
-attnum
-attrdef
-attrelid
-attrib
-attribs
-attributename
-attrs
-atttypid
-atunique
-au
-auml
-authplugins
-autoaccount
-autobiography
-autoblock
-autoblocked
-autoblockedtext
-autoblocker
-autoblockid
-autoblocking
-autoblockip
-autoblocks
-autocad
-autocomment
-autocomments
-autocomplete
-autoconfirm
-autoconfirmed
-autocreate
-autocreated
-autocreation
-autodetection
-autoflag
-autofocus
-autogen
-autogenerated
-autohide
-autoload
-autoloader
-autoloaders
-autoloading
-automagically
-automatic
-autonym
-autopatrol
-autoplay
-autopromote
-autopromoted
-autopromotion
-autoreview
-autoreviewer
-autoreviewrestore
-autosumm
-autosummaries
-autosummary
-axto
-azərbaycanca
-backends
-backlink
-backlinks
-backlinksubtitle
-backported
-backslashed
-backtraces
-bad
-badaccess
-badarticleerror
-badcontinue
-baddiff
-bademail
-badfilename
-badformat
-badgenerator
-badhookmsg
-badinterwiki
-badip
-badipaddress
-badkey
-badmd
-badmime
-badminpassword
-badminuser
-badnamespace
-badoption
-badparams
-badport
-badretype
-badrevids
-badsig
-badsiglength
-badsyntax
-badtag
-badtimestamp
-badtitle
-badtitletext
-badtoken
-badtype
-badupload
-baduser
-badversion
-balancer
-balancers
-banjar
-barebone
-barstein
-base
-basefont
-basename
-basepagename
-basepagenamee
-basetimestamp
-bashkir
-bashpid
-bcancel
-bceffd
-bcmath
-bcompress
-bcpio
-bdop
-bdquo
-becampus
-beinstructor
-belarusian
-beonline
-bereviewer
-berror
-bestq
-besttype
-bg
-bgcolor
-bgzip
-bidi
-bigdelete
-bingbot
-binhex
-bitdepth
-bitfield
-bitfields
-bitmask
-bjarmason
-bk
-bkey
-bkinvalidparammix
-bkmissingparam
-bkusers
-bl
-blanking
-blanknamespace
-blankpage
-blegh
-bleh
-blinvalidparammix
-blksize
-blmissingparam
-block
-blockable
-blocked
-blockedasrange
-blockedby
-blockedbyid
-blockedemailuser
-blockedexpiry
-blockedfrommail
-blockednoreason
-blockedreason
-blockedtext
-blockedtitle
-blockemail
-blockexpiry
-blockid
-blockinfo
-blockip
-blocklink
-blocklogentry
-blocklogpage
-blocklogtext
-blockme
-blockquote
-blockreason
-blocks
-blocktoken
-bloggs
-blogs
-blogspot
-bltitle
-bluelink
-bluelinks
-bmwschema
-bmysql
-bname
-bodycontent
-bogo
-boldening
-bolding
-booksources
-bool
-boolean
-bordercolor
-borderhack
-bot
-botedit
-boteditletter
-bots
-bottom
-bottomscripts
-bpassword
-bpatch
-bpchar
-bport
-bprefix
-broeck
-brokenlibxml
-brokenredirects
-brokenredirectstext
-browsearchive
-brvbar
-bserver
-bservers
-bssl
-btestpassword
-btestuser
-btype
-bucket
-bucketcount
-bugfix
-bugfixes
-buglist
-bugzilla
-buildpath
-buildpathentry
-bulgakov
-bulkdelcourses
-bulkdelorgs
-bureaucrat
-buser
-by
-byemail
-byid
-bytea
-bytesleft
-bytesread
-bytevalue
-cacheable
-cached
-cachedcount
-cachedsidebar
-cachedspecial
-cachedtimestamp
-calimit
-callargs
-campaign
-campus
-cancelto
-cannotdelete
-cannotundelete
-canonicalised
-canonicalization
-canonicalize
-canonicalizes
-canonicalizing
-canremember
-canreset
-cansecurelogin
-cantblock
-cantcreate
-cantdelete
-cantedit
-cantexecute
-canthide
-cantimport
-cantmove
-cantmovefile
-cantopenfile
-cantoverwrite
-cantrollback
-cantsend
-cantunblock
-cantundelete
-capitalizeallnouns
-captchaid
-captchas
-captchaword
-carriersnoips
-cascade
-cascadeable
-cascadeon
-cascadeprotected
-cascadeprotectedwarning
-cascading
-cascadinglevels
-cascadingness
-categories
-categories's
-categorieshtml
-category
-categoryfinder
-categoryinfo
-categorylinks
-categorymembers
-categorypage
-categoryviewer
-catids
-catlinks
-catmsg
-catpage
-catrope
-cattitles
-ccedil
-ccme
-ccmeonemails
-cdab
-cdel
-cdlink
-cedil
-ceebc
-cellpadding
-cellspacing
-cellulant
-central
-centralauth
-centralnotice
-centralnoticeallocations
-centralnoticelogs
-centralnoticequerycampaign
-cgroup
-cgroups
-change
-change's
-changeablegroups
-changed
-changedby
-changedorcreated
-changeemail
-changelog
-changeslist
-changing
-characters
-chardiff
-charoff
-chars
-checkfreq
-checkmatrix
-checkstatus
-checkuser
-checkuserlog
-chgrp
-childs
-chillu
-chmoding
-choicesstring
-chrs
-chunk
-chunked
-chunking
-ci
-cidr
-cidrtoobroad
-circ
-citeseer
-ckers
-ckey
-cl
-clamav
-clamscan
-classname
-clcategorie
-cldir
-cldr
-clear
-clearable
-clearyourcache
-clfrom
-clickjacking
-clicktracking
-clientfor
-clientpool
-cllimit
-clober
-closed
-clto
-cm
-cminvalidparammix
-cmmissingparam
-cmnamespace
-cmtitle
-co
-code
-codemap
-codepoint
-codestr
-coi
-colgroup
-collapsable
-collectionsaveascommunitypage
-collectionsaveasuserpage
-colname
-colonseparator
-colorer
-colspan
-commafy
-commafying
-comment
-commentedit
-commenthidden
-comments
-commitdiff
-commoncssjs
-compactpro
-compare
-compat
-complete
-cond
-condcomment
-condeferrable
-condeferred
-conds
-config
-confirmdeletetext
-confirmed
-confirmedittext
-confirmemail
-confirmrecreate
-conflimit
-confstr
-conkey
-conname
-conrelid
-console
-content
-contentformat
-contenthandler
-contentlanguage
-contentless
-contentmodel
-contenttoobig
-continue
-contribs
-contribslink
-conttitle
-contype
-conv
-converttitles
-convmv
-cookieprefix
-cooltalk
-coord
-coordinates
-copyrightico
-copyrightpage
-copyrightwarning
-copyuploadbaddomain
-copyuploaddisabled
-copyvio
-copywarn
-cors
-couldn
-counter
-countmsg
-country
-course
-courseid
-cpio
-cprefs
-cprotected
-crarr
-crashbug
-create
-createaccount
-createonly
-createpage
-createtalk
-creationsort
-creativecommons
-creditspage
-crocker
-cryptrand
-csize
-csrf
-css
-cssclass
-csslinks
-cta
-ctime
-ctor
-ctype
-cu
-cul
-curation
-curdiff
-curid
-curlink
-curren
-currentarticle
-currentbrowser
-currentday
-currentdayname
-currentdow
-currenthour
-currentmonth
-currentmonthabbrev
-currentmonthname
-currentmonthnamegen
-currentrev
-currentrevisionlink
-currenttime
-currenttimestamp
-currentversion
-currentweek
-currentyear
-customcssprotected
-customised
-customjsprotected
-cut
-cyber
-cygwin
-cyrl
-d'oh
-dadedad
-dairiki
-danga
-danielc
-darr
-datalen
-datapath
-dataset
-datasets
-datasize
-datatable
-datatype
-datedefault
-dateformat
-dateheader
-dateopts
-daysago
-dbcnt
-dbconnect
-dberrortext
-dbg
-dbgfm
-dbkey
-dbkeys
-dbks
-dbname
-dbrepllag
-dbsettings
-dbtype
-dbversion
-ddjvu
-de
-deadend
-deadendpagestext
-deadenpages
-dealies
-debughtml
-decline
-declined
-decls
-decr
-decrease
-default
-defaultcontentmodel
-defaultmessagetext
-defaultmissing
-defaultns
-defaultoptions
-defaultsort
-defaultval
-deferr
-definite
-deflimit
-defs
-deja
-delete
-deleteall
-deletecomment
-deleteconfirm
-deleted
-deletedhistory
-deletedline
-deletedonly
-deletedrevision
-deletedrevs
-deletedtext
-deletedwhileediting
-deleteeducation
-deleteglobalaccount
-deletelogentry
-deleteone
-deleteotherreason
-deletepage
-deletereason
-deletereasonotherlist
-deleterevision
-deleteset
-deletethispage
-deletetoken
-deletion
-deletionlog
-delim
-dellogpage
-dellogpagetext
-delundel
-deprecated
-deps
-depth
-dequeue
-dequeued
-dequeueing
-dequeues
-derivatives
-desc
-descending
-description
-descriptionmsg
-descriptionmsgparams
-descriptionurl
-deserialization
-deserialize
-dest
-detail
-details
-devangari
-devel
-df
-dflt
-dflts
-dhtml
-diams
-didn
-diff
-diff's
-diffchange
-diffhist
-difflink
-diffonly
-difftext
-diffto
-difftocontent
-difftotext
-dim
-dimensions
-dir
-direction
-directionmark
-directorycreateerror
-directorynotreadableerror
-directoryreadonlyerror
-dirmark
-dirname
-disabled
-disabledtranscode
-disablemail
-disablepp
-disclaimerpage
-diskussion
-displayname
-displayrc
-displaysearchoptions
-displaytitle
-displaytitles
-displaywatchlist
-distclean
-distro
-djava
-djob
-djvu
-djvudump
-djvulibre
-djvutoxml
-djvutxt
-djvuxml
-djvuzone
-dkjsagfjsgashfajsh
-dlen
-dltk
-dmoz
-dnsbl
-dnsblacklist
-dnumber
-docm
-docroot
-doctype
-doctypes
-docx
-dodiff
-doesn
-domain
-domainnames
-domainpart
-domainparts
-domas
-doms
-dont
-dotdotcount
-dotm
-dotsc
-dotsi
-dotsm
-dotso
-dotwise
-dotx
-doubleclick
-doublequote
-doxygen
-dpos
-dr
-dropdown
-dump
-dumpfm
-dupfunc
-dupl
-duplicatefiles
-duplicatesoffile
-dvips
-dwfx
-dwhitelist
-e
-eacute
-earth
-eauth
-ecirc
-ecmascript
-edit
-editbutton
-editconflict
-editconflicts
-editcount
-editfont
-editform
-edithelp
-edithelppage
-edithelpurl
-editingcomment
-editinginterface
-editingold
-editingsection
-editinterface
-editintro
-edititis
-editlink
-editmyoptions
-editmyprivateinfo
-editmyusercss
-editmyuserjs
-editmywatchlist
-editnotice
-editnotsupported
-editondblclick
-editor
-editownusertalk
-editpage
-editprotected
-editreasons
-editredlink
-editrestriction
-edits
-editsection
-editsectionhint
-editsectiononrightclick
-editsemiprotected
-editsonly
-editthispage
-edittime
-edittoken
-edittools
-editurl
-editusercss
-edituserjs
-edoe
-egrave
-ei
-eich
-eiinvalidparammix
-eimissingparam
-eititle
-el
-elapsedreal
-elastica
-elemname
-elems
-elink
-eltitle
-email
-emailable
-emailaddress
-emailauthenticated
-emailauthentication
-emailauthenticationclass
-emailcapture
-emailconfirm
-emailconfirmed
-emailconfirmlink
-emaildisabled
-emailling
-emaillink
-emailnotauthenticated
-emailtoken
-emailuser
-embeddedin
-empty
-emptyfile
-emptynewsection
-emptypage
-emsenhuber
-emsp
-en
-enabled
-enabledonly
-enableparser
-encapsed
-enctype
-end
-endcode
-endcond
-endian
-endid
-endl
-endsortkey
-endsortkeyprefix
-endtime
-endverbatim
-enhancedchanges
-enlist
-enotif
-enotifminoredits
-enotifrevealaddr
-enotifusertalkpages
-enotifwatchlistpages
-enqueueing
-enroll
-ensp
-entirewatchlist
-entityid
-envcmd
-enwiki
-eocdr
-ep
-eparticle
-epcampus
-epcoordinator
-epinstructor
-eponline
-erevoke
-errno
-error
-errorbox
-errormessage
-errorpagetitle
-errors
-errorstr
-errortext
-errorunknown
-errstr
-es
-escapenoentities
-escapeshellarg
-esearch
-español
-española
-etag
-eu
-euml
-event
-eventid
-ex
-exampleextension
-examples
-excludegroup
-excludepage
-excludeuser
-executables
-exempt
-exiftool
-existingwiki
-exists
-exiv
-expandtab
-expandtemplates
-expandurl
-experiment
-expertise
-expiry
-expiryarray
-explainconflict
-export
-exportnowrap
-exportxml
-expression
-exptime
-extauth
-extendwatchlist
-extensionname
-extensions
-extensiontags
-external
-externaldberror
-externaldiff
-externaledit
-externaleditor
-externalimages
-externallinks
-externalstore
-extet
-extiw
-extlink
-extlinks
-extracts
-extradata
-extrafields
-extralanglink
-extraq
-extratags
-exturlusage
-extuser
-exxaammppllee
-fa
-facto
-failback
-failover
-failsafe
-fallbacks
-false
-falsy
-fancysig
-fastcgi
-faux
-favicon
-fclose
-fdef
-fdff
-feature
-featured
-featuredfeed
-feed
-feed's
-feedback
-feedbackid
-feedcontributions
-feedformat
-feeditems
-feedlink
-feedlinks
-feedurl
-feedwatchlist
-feff
-female
-fetchfileerror
-fffe
-ffff
-fffff
-ffffff
-fieldname
-fieldset
-fieldsets
-file
-filearchive
-filebackend
-filecache
-filecopyerror
-filedelete
-filedeleteerror
-fileexists
-fileextensions
-filehidden
-filehist
-filehistory
-fileinfo
-filejournal
-filekey
-filelinks
-filemissing
-filemover
-filemtime
-filename
-filenames
-filenotfound
-filepage
-filepath
-filerenameerror
-filerepo
-filerepoinfo
-filerevert
-filerevisions
-files
-filesize
-filesort
-filesorts
-filesystem's
-filesystems
-filetoc
-filetoobig
-filetype
-filetypemismatch
-fileversions
-filter
-filterbots
-filteriw
-filterlanglinks
-filterlocal
-filterredir
-filterwatched
-findnext
-finfo
-firefox
-firstname
-firstrev
-firsttime
-fishbowl
-fixme
-fixup
-flac
-flag
-flagconfig
-flagged
-flags
-flagtype
-flatlist
-flds
-float
-flrevs
-fmttime
-fname
-fnof
-foldmarker
-foldmethod
-followpolicy
-footericon
-footericons
-footerlinks
-fopen
-for
-forall
-forbidden
-forcearticlepath
-forcebot
-forceditsummary
-forceeditsummary
-forcelinkupdate
-forcerecursivelinkupdate
-forcetoc
-forcontent
-formaction
-format
-formatmodules
-formatted
-formatters
-formatting
-formedness
-formenctype
-formnovalidate
-formtype
-forupdate
-found
-founder
-fr
-frac
-frameborder
-frameless
-framesets
-frasl
-fread
-freedomdefined
-freeform
-freenode
-frickin
-from
-fromdb
-fromdbmaster
-fromid
-fromrev
-fromrevid
-fromtitle
-frontends
-fseek
-fsockopen
-fsync
-ftp
-fullhistory
-fullpagename
-fullpagenamee
-fulluri
-fullurl
-funcname
-functionhooks
-functionname
-futuresplash
-fvalue
-ga
-gack
-gadgetcategories
-gadgets
-gaid
-gaifilterredir
-gaifrom
-gallerybox
-gallerycaption
-gallerytext
-gapdir
-gapfilterredir
-gapfrom
-gaplimit
-gapnamespace
-gapprefix
-garber
-gblblock
-gblock
-gblrights
-gc
-gcldir
-gcllimit
-gender
-general
-generatexml
-generator
-geocoordinate
-geodata
-geosearch
-gerrit
-geshi
-getcookie
-getenv
-getheader
-getimagesize
-getlink
-getmac
-getmarkashelpfulitem
-getmypid
-getrusage
-gettimeofday
-gettingstarted
-gettoken
-getuid
-gfdl
-ggp
-ghostscript
-gimpbaseenums
-git
-gitblit
-gitdir
-github
-global
-globalauth
-globalblock
-globalblocks
-globalgroupmembership
-globalgrouppermissions
-globalgroups
-globalsettings
-globalunblock
-globalusage
-globaluserinfo
-globe
-gmail
-gmdate
-goodtitle
-googlebot
-gopher
-graymap
-grayscale
-greant
-greymap
-group
-groupcounts
-groupless
-groupmember
-grouppage
-groupperms
-groupprms
-groups
-growinglink
-grxml
-gs
-gtar
-gu
-guesstimezone
-gui
-guid
-gunblock
-guser
-gwicke
-gzcompress
-gzdeflate
-gzencode
-gzhandler
-gzip
-gzipped
-gzipping
-hacky
-hansm
-hant
-hardblocks
-hardcode
-hardcoding
-harr
-hash
-hashar
-hashcheckfailed
-hashsearchdisabled
-hashtable
-hashtables
-hasmatch
-hasmsg
-hasn
-hasrelated
-headelement
-headerpos
-headhtml
-headitems
-headlinks
-headscripts
-height
-hellip
-help
-helpful
-helppage
-helptext
-helpurl
-helpurls
-helpwindow
-hexdump
-hexstring
-hidden
-hiddencat
-hiddencategories
-hiddencats
-hide
-hideanons
-hidebots
-hidediff
-hideliu
-hideminor
-hidemyself
-hidename
-hidepatrolled
-hideredirects
-hiderevision
-hideuser
-highlimit
-highmax
-highuse
-hilfe
-hiphop
-histfirst
-histlast
-historyempty
-historysubmit
-historywarning
-hit
-hitcount
-hits
-hlist
-hmac
-hobby
-homelink
-hookaborted
-horohoe
-hostnames
-hours
-hphp
-hplist
-hpos
-hreflang
-hslots
-htaccess
-htcp
-html
-htmlelements
-htmlescaped
-htmlform
-htmlish
-htmllist
-htmlnest
-htmlpair
-htmlpairs
-htmlsingle
-htmlsingleallowed
-htmlsingleonly
-htmlspecialchars
-htmltidy
-http
-httpaccept
-httpbl
-https
-i
-ia
-iabn
-iacute
-icirc
-icononly
-iconv
-icubench
-icutest
-id
-idanduser
-ids
-ie's
-ieinternals
-ietf
-iexcl
-ifconfig
-iframe
-igbinary
-iges
-ignorewarnings
-igrave
-ii
-iicontinue
-iiprop
-iiurlparam
-iiurlwidth
-iker
-ilfrom
-ilto
-im
-image
-imagecolorallocate
-imagegetsize
-imageinfo
-imageinvalidfilename
-imagelimits
-imagelinks
-imagemagick
-imagemaxsize
-imagenocrossnamespace
-imagepage
-imagerepository
-imagerotate
-images
-imagesize
-imagetype
-imagetypemismatch
-imageusage
-imagewhitelistenabled
-imagick
-imgmultigo
-imgmultigoto
-imgmultipagenext
-imgmultipageprev
-imgs
-imgserv
-immobilenamespace
-implicitgroups
-import
-importbadinterwiki
-importcantopen
-importlogpage
-importlogpagetext
-importnofile
-importtoken
-importupload
-importuploaderrorpartial
-importuploaderrorsize
-importuploaderrortemp
-in
-iname
-inbound
-includable
-include
-includecomments
-includelocal
-includeonly
-includexmlnamespace
-incr
-increase
-indefinite
-index
-indexfield
-indexpageids
-indexpolicy
-indstr
-infin
-infinite
-infiniteblock
-info
-infoaction
-infobox
-infoline
-infomsg
-ingroups
-injectjs
-inkscape
-inlanguagecode
-inlined
-inno
-inputneeded
-insb
-inser
-instantcommons
-institution
-instructor
-int
-integer
-integeroutofrange
-intentionallyblankpage
-interlang
-interlangs
-interlanguage
-internal
-internaledit
-internalerror
-interwiki
-interwikimap
-interwikipage
-interwikis
-interwikisearchinfo
-interwikisource
-intnull
-intoken
-intra
-intro
-intrw
-ints
-intval
-invalid
-invalidaction
-invalidations
-invalidcategory
-invaliddomain
-invalidemail
-invalidemailaddress
-invalidexpiry
-invalidip
-invalidlang
-invalidlevel
-invalidmode
-invalidoldimage
-invalidpage
-invalidpageid
-invalidparameter
-invalidparammix
-invalidpath
-invalidrange
-invalidsection
-invalidsessiondata
-invalidsha
-invalidspecialpage
-invalidtags
-invalidtime
-invalidtitle
-invalidtoken
-invaliduser
-invalue
-iorm
-ip
-ipbblocked
-ipblock
-ipblocks
-ipbnounblockself
-ipchain
-ipedits
-iphash
-ipinrange
-ipset
-ipsets
-ipusers
-iquest
-irc
-ircs
-isam
-isapi
-isbot
-isconnected
-iscur
-isin
-isip
-islocal
-ismap
-isminor
-ismodsince
-ismulti
-isnew
-isroot
-isself
-isset
-istainted
-istalk
-iswatch
-it
-item
-itemid
-itemprop
-itemref
-itemscope
-itemtype
-iter
-iu
-iuinvalidparammix
-iumissingparam
-iuml
-iw
-iwbacklinks
-iwbl
-iwlfrom
-iwlinks
-iwlprefix
-iwltitle
-iwprefix
-iwtitle
-iwurl
-ized
-javascript
-javascripttest
-jbartsh
-jconds
-jdk's
-jhtml
-jimbo
-joaat
-jobqueue
-jointype
-jorsch
-journaling
-jpeg
-jpegtran
-jslint
-jsmimetype
-jsminplus
-json
-jsonconfig
-jsonfm
-jsparse
-jstext
-jsvarurl
-justthis
-kabardian
-kangxi
-kashubia
-kattouw
-kblength
-kernowek
-key
-keygen
-keylen
-keyname
-keynames
-keytype
-khash
-kikongo
-kludgy
-knownnamespace
-konqueror
-kpos
-kuza
-labarga
-labelmsg
-laggedslavemode
-laggy
-lang
-langbacklinks
-langcode
-langcodes
-langconversion
-langlinks
-langname
-langprop
-langs
-language
-languagelinks
-languages
-languageselection
-languageshtml
-laquo
-large
-larr
-last
-lastdiff
-lastdot
-lastedit
-lasteditor
-lastedittime
-lastfile
-lastlink
-lastmod
-lastmodifiedat
-lastname
-lastrevid
-lastvisited
-latgalian
-laxström
-lbase
-lbl
-lcattrib
-lceil
-lcomments
-lcount
-lcrocker
-ldquo
-le
-len
-length
-leprop
-lesque
-lettercase
-level
-lfloor
-lg
-lgname
-lgpassword
-lgpl
-lgtoken
-lguserid
-lgusername
-libcurl
-libel
-libgimpbase
-libketama
-libmemcached
-libre
-libtidy
-ligabue
-lighttpd
-limit
-limitable
-line
-linenumber
-linestart
-link
-linkarr
-linkcolour
-linkprefix
-linkprefixcharset
-linkpurge
-links
-linkstoimage
-linktbl
-linktext
-linktodiffs
-linktrail
-linktype
-linkupdate
-list
-listable
-listadmins
-listbots
-listfiles
-listgrouprights
-listinfo
-listingcontinuesabbrev
-listoutput
-listresult
-lists
-listtags
-listuser
-listusers
-listusersfrom
-livepreview
-ll
-llfrom
-lllang
-lltitle
-lnumber
-local
-localday
-localdayname
-localdow
-locale
-localhour
-localinterwiki
-localmonth
-localmonthabbrev
-localmonthname
-localmonthnamegen
-localname
-localonly
-localsettings
-localtimezone
-localweek
-localyear
-lock
-lockandhid
-lockdb
-lockdir
-locked
-lockmanager
-log
-logaction
-logentry
-logevent
-logevents
-logextract
-loggedin
-logid
-login
-loginerror
-loginfo
-loginlanguagelinks
-loginlink
-loginout
-loginprompt
-loginreqlink
-loginreqpagetext
-loginreqtitle
-logins
-logitem
-loglink
-loglist
-logname
-logonly
-logopath
-logourl
-logout
-logpage
-logtext
-logtitle
-logtype
-longpage
-longpageerror
-lookie
-lookups
-loopback
-lossless
-lossy
-lowast
-lowercaps
-lowercased
-lowlimit
-lsaquo
-lsquo
-ltags
-ltitle
-ltrimmed
-lurl
-lysator
-macr
-magicarr
-magicfile
-magick
-magicword
-magicwordkey
-magicwords
-magnus
-mahaction
-mailerror
-mailmypassword
-mailnologin
-mailparts
-mailpassword
-mailtext
-mailto
-mainmodule
-mainpage
-maint
-maintainership
-makesafe
-male
-malloc
-manske
-manualthumb
-mark
-markashelpful
-markaspatrolledlink
-markaspatrolledtext
-markbot
-markbotedits
-markedaspatrollederror
-markpatrolled
-masse
-match
-matchcount
-mathml
-mathtt
-matrixes
-matroska
-max
-maxage
-maxdim
-maxlag
-maxlength
-maxlifetime
-maxqueue
-maxresults
-maxsize
-maxuploadsize
-maxwidth
-mazeland
-mbresponse
-mbstring
-mccmnc
-mckey
-mcklmqw
-mcrypt
-mcvalue
-md
-mdash
-mdot
-medialink
-mediaqueries
-mediatype
-mediawarning
-mediawiki
-mediawiki's
-mediawikipage
-megapixels
-member
-memberingroups
-members
-memc
-memcache
-memcached
-memlimit
-memoryp
-memsw
-merge
-mergeable
-merged
-mergehistory
-mergelog
-mergelogpagetext
-message
-messagekey
-messagename
-messagepattern
-messages
-messagetype
-meta
-metacharacters
-metachars
-metadata
-metadataversion
-metafile
-mhash
-mhtml
-micrblogging
-microdata
-microsyntaxes
-microtime
-middot
-migurski
-millitime
-mime
-mimer
-mimesearchdisabled
-mimetype
-min
-minangkabau
-minh
-minification
-minified
-minifier
-minifies
-minify
-minifying
-minimal
-minor
-minordefault
-minoredit
-minoreditletter
-minsize
-misconfigured
-misermode
-mismatch
-misresolved
-missing
-missingcommentheader
-missingcommenttext
-missingdata
-missingparam
-missingpermission
-missingresult
-missingrev
-missingsummary
-missingtext
-missingtitle
-missinguser
-mituzas
-mixedapproval
-mkdir
-mms
-mobile
-mobileformat
-mobileview
-modified
-modifiedarticleprotection
-modify
-modsecurity
-modsince
-module
-moduledisabled
-modulename
-modules
-monitor
-monobook
-monospace
-monospaced
-month
-monthsall
-moodbar
-moredotdotdot
-morelinkstoimage
-morethan
-mouseup
-move
-movedarticleprotection
-moveddeleted
-movedto
-movefile
-movelogpage
-movelogpagetext
-movenologintext
-movenotallowed
-movenotallowedfile
-moveonly
-moveoverredirect
-movepage
-moves
-movestable
-movesubpages
-movetalk
-movethispage
-movetoken
-mozilla
-mpeg
-mpegurl
-mpga
-mplink
-mptitle
-msdn
-msdownload
-msec
-msexcel
-msgid
-msgkey
-msgs
-msgsize
-msgsmall
-msgtext
-msie
-msmetafile
-msnbot
-mssql
-msvideo
-msword
-mtime
-mtype
-mullane
-multi
-multiactions
-multibyte
-multicast
-multipage
-multipageimage
-multipageimagenavbox
-multipart
-multiselect
-multisource
-multithreaded
-multival
-multivalue
-multpages
-munge
-musso
-mustbeloggedin
-mustbeposted
-mutator
-mutators
-muxers
-mwdumper
-mwfile
-mwstore
-mwsuggest
-mwuser
-mxircecho
-mycontributions
-mycontris
-myext
-myextension
-myisam
-mykey
-mypage
-mypreferences
-mysqldump
-mytalk
-mytext
-mywatchlist
-möller
-nabla
-name
-namehidden
-nameinlowercase
-namelookup
-namemsg
-names
-namespace
-namespacealiases
-namespacebanner
-namespacee
-namespacenotice
-namespacenumber
-namespaceoptions
-namespaceprotected
-namespaces
-namespacesall
-namespaceselector
-namespacing
-nassert
-nbase
-nbsp
-nbytes
-nchanges
-ncount
-ndash
-nearmatch
-nedersaksies
-nedersaksisch
-needreblock
-needservers
-needtoken
-netcdf
-netware
-never
-new
-newaddr
-newarticletext
-newarticletextanon
-newer
-newerthanrevid
-newgroups
-newheader
-newid
-newimages
-newlen
-newmessagesdifflinkplural
-newmessageslinkplural
-newname
-newnames
-newnamespace
-newpage
-newpageletter
-newpages
-newpageshidepatrolled
-newparams
-newpass
-newpassword
-newpos
-newquery
-newrevid
-news
-newsectionheaderdefaultlevel
-newsectionlink
-newsectionsummary
-newset
-newsfeed
-newsize
-newtalk
-newtalks
-newtalkseparator
-newtext
-newtimestamp
-newtitle
-newuser
-newuserlogpage
-newuserlogpagetext
-newusers
-newwidth
-newwindow
-nextdiff
-nextid
-nextlink
-nextn
-nextpage
-nextredirect
-nextrevision
-nextval
-nfkc
-nfkd
-nginx
-nheight
-niklas
-nlink
-nlinks
-nmime
-nnnn
-nntp
-no
-noanimatethumb
-noanontoken
-noapiwrite
-noarchivename
-noarticle
-noarticletext
-noarticletextanon
-noautopatrol
-noblock
-nobots
-nobucket
-nobuffer
-nochange
-nochanges
-noclasses
-nocode
-nocomment
-nocomplete
-nocontent
-nocontentconvert
-nocontinue
-noconvertlink
-nocookiesfornew
-nocopyright
-nocourseid
-nocreate
-nocreatetext
-nocredits
-nocta
-nodata
-nodatabase
-nodb
-nodefault
-nodeid
-nodeleteablefile
-nodeletion
-nodelist
-nodename
-nodirection
-nodotdot
-noedit
-noeditsection
-noemail
-noemailprefs
-noemailtitle
-noeventid
-noexec
-noexpertise
-noexpression
-nofeed
-nofeedbackid
-nofile
-nofilekey
-nofilename
-nofilter
-noflagtype
-noflip
-nofollow
-nofound
-nogallery
-nogomatch
-nogroup
-noheader
-noheadings
-nohires
-noids
-noimage
-noimageredirect
-noimages
-noinclude
-noindex
-noindexing
-nointerwikipage
-nointerwikiuserrights
-noitem
-nojs
-nolabel
-nolang
-nolicense
-nolimit
-nolink
-nolinkstoimage
-nologging
-nologin
-nomahaction
-nominornewtalk
-nomodule
-non
-noname
-nonamespacenumber
-nonascii
-noncascading
-nondefaults
-none
-nonewsectionlink
-nonexistent
-nonfile
-nonfilenamespace
-nonincludable
-noninfringement
-noninitial
-nonlocal
-nonote
-nonredirects
-nonsense
-nonunicodebrowser
-noobjective
-noofexpiries
-noofprotections
-noop
-nooptions
-nooverride
-nopaction
-nopage
-nopageid
-nopagetext
-nopagetitle
-noparser
-nopathinfo
-nopermission
-noport
-noprefix
-noproject
-noprop
-noprotections
-noquestion
-noradius
-noratelimit
-norating
-norcid
-noread
-noreason
-noredir
-noredirect
-norequest
-norestrictiontypes
-noresult
-noreturnto
-norev
-norevid
-noreviewed
-normalizedtitle
-norole
-norollbackdiff
-noscale
-noschema
-noscript
-nosearch
-nosectiontitle
-nosession
-noshade
-noskipnotif
-noslash
-nosniff
-nosort
-nosortdirection
-nosource
-nospecialpagetext
-nost
-nosubaction
-nosubject
-nosubpage
-nosubpages
-nosuccess
-nosuchaction
-nosuchactiontext
-nosuchdatabase
-nosuchlogid
-nosuchpageid
-nosuchrcid
-nosuchrevid
-nosuchsection
-nosuchsectiontext
-nosuchsectiontitle
-nosuchspecialpage
-nosuchuser
-nosuchusershort
-nosummary
-notacceptable
-notag
-notaglist
-notalk
-notallowed
-notanarticle
-notarget
-notcached
-notdeleted
-note
-notempdir
-notemplate
-notext
-nothumb
-notif
-notificationtimestamp
-notificationtimestamps
-notin
-notitle
-notitleconvert
-notloggedin
-notminor
-noto
-notoc
-notoggle
-notoken
-notpatrollable
-notransform
-notreviewable
-notrustworthy
-notspecialpage
-notsuspended
-notvisiblerev
-notwatched
-notwikitext
-notype
-noudp
-noupdates
-nouploadmodule
-nouser
-nouserid
-nousername
-nouserspecified
-novalues
-noview
-nowatchlist
-nowellwritten
-nowiki
-nowlocal
-nowserver
-nparsing
-ns
-nsassociated
-nsfrom
-nsinvert
-nslinks
-nslist
-nsname
-nsnum
-nspname
-nsselect
-nstab
-nsub
-ntfs
-ntilde
-ntitle
-nuke
-null
-nullable
-numauthors
-number
-numberheadings
-numberingroup
-numberof
-numberofactiveusers
-numberofadmins
-numberofarticles
-numberofedits
-numberoffiles
-numberofpages
-numberofusers
-numberofwatchingusers
-numedits
-numentries
-numericized
-numgroups
-numtalkauthors
-numtalkedits
-numwatchers
-nwidth
-oacute
-objectcache
-objective
-ocirc
-ocount
-oelig
-of
-officedocument
-offset
-offsite
-ofname
-ogevents
-ogghandler
-ograve
-old
-oldaddr
-oldcountable
-older
-olderror
-oldfile
-oldgroups
-oldid
-oldimage
-oldlen
-oldnamespace
-oldquery
-oldrev
-oldrevid
-oldreviewedpages
-oldshared
-oldsig
-oldsize
-oldtext
-oldtitle
-oldtitlemsg
-oline
-oname
-onerror
-onkeyup
-online
-onload
-onlyauthor
-onlyinclude
-onlypst
-onlyquery
-onsubmit
-onthisday
-ontop
-onuser
-openbasedir
-opendoc
-opendocument
-opensearch
-opensearchdescription
-openssl's
-openxml
-openxmlformats
-operamini
-oplus
-oppositedm
-optgroup
-optgroups
-optionname
-options
-optionstoken
-optionvalue
-optstack
-or
-ordertype
-ordf
-ordm
-org
-orghttp
-origcategory
-ortime
-oslash
-other
-otherlanguages
-otherlist
-otheroption
-otherreason
-othertime
-otilde
-otimes
-otitle
-ouml
-outparam
-outputter
-outputtype
-outreachwiki
-over
-overridable
-override
-overwrite
-overwroteimage
-own
-owner
-paction
-page
-pagecannotexist
-pagecategories
-pagecategorieslink
-pageclass
-pagecontent
-pagecount
-pagecss
-pagedeleted
-pagedlinks
-pageid
-pageids
-pageimages
-pageinfo
-pagelink
-pagelinks
-pagemerge
-pagename
-pagenamee
-pagenames
-pagenum
-pageoffset
-pagepropnames
-pageprops
-pagerestrictions
-pages
-pageselector
-pageset
-pagesetmodule
-pagesincategory
-pagesinnamespace
-pageswithprop
-pagetextmsg
-pagetitle
-pagetools
-pagetriage
-pagetriageaction
-pagetriagelist
-pagetriagestats
-pagetriagetagging
-pagetriagetemplate
-pageurl
-pageview
-pango
-param
-parameters
-paraminfo
-paramlist
-paramname
-params
-paren
-parens
-parentid
-parenttree
-parms
-parse
-parsedcomment
-parseddescription
-parsedsummary
-parseerror
-parseinline
-parsemag
-parser
-parsercache
-parserfuncs
-parserfunctions
-parserhook
-parserrender
-parsetree
-parsevalue
-parsoid
-partialupload
-partname
-pass's
-passthru
-password
-passwordfor
-passwordreset
-passwordtooshort
-paste
-pastexpiry
-pathchar
-pathinfo
-pathname
-patrol
-patroldisabled
-patrolled
-patrollink
-patrolmarks
-patroltoken
-pattern
-pcache
-pcntl
-pcomment
-pdbk
-pdf's
-pendingdelta
-perc
-perfcached
-perfcachedts
-perm
-perma
-permalink
-permdenied
-permil
-permissiondenied
-permissionerror
-permissionserrors
-permissionserrorstext
-permissiontype
-perp
-perrow
-pgsql
-photoshop
-php
-php's
-phpfm
-phps
-phpsapi
-phpunit
-phpversion
-phpwiki
-phrasewise
-phtml
-pi
-pipermail
-pixmap
-pkey
-pkuk
-pl
-plain
-plainlink
-plainlinks
-plaintext
-plfrom
-plink
-pllimit
-plns
-plpgsql
-pltitle
-pltitles
-plusminus
-plusmn
-pname
-png'd
-pnmtojpeg
-pnmtopng
-pointsize
-poolcounter
-popts
-portlet
-portlets
-posplus
-possible
-postcomment
-postgre
-postsep
-potd
-potm
-potx
-poweredby
-poweredbyico
-powersearch
-pp
-ppam
-ppsm
-ppsx
-pptm
-pptx
-precaching
-precompiled
-preemptively
-preferences
-preferencestoken
-prefill
-prefilled
-prefix
-prefixindex
-prefixsearch
-prefixsearchdisabled
-prefs
-prefsection
-prefsnologintext2
-prefcontrol
-preload
-preloads
-preloadtitle
-prepending
-prependtext
-preprocess
-preprocessing
-preprocessors
-presentationml
-presep
-pretransfer
-prevchar
-prevdiff
-previd
-previewconflict
-previewhead
-previewheader
-previewnote
-previewonfirst
-previewontop
-previewtext
-previousrevision
-prevlink
-prevn
-prexpiry
-prfiltercascade
-prfx
-primary
-printableversion
-printfooter
-printurl
-privacypage
-private
-privs
-prlevel
-probabalistically
-probs
-proc
-processings
-procs
-prodromou
-profession
-profileinfo
-programmatically
-project
-projectpage
-promotion
-prop
-properties
-property
-propname
-props
-prot
-protect
-protectcomment
-protectedarticle
-protectedinterface
-protectednamespace
-protectedpage
-protectedpages
-protectedpagetext
-protectedpagewarning
-protectedtitle
-protectedtitles
-protection
-protections
-protectlevel
-protectlogpage
-protectlogtext
-protectthispage
-protecttoken
-proto
-protocol
-protocols
-protorel
-protos
-proxied
-proxyblocker
-proxyblockreason
-proxyunbannable
-prtype
-psir
-pst
-psttext
-psychedelix
-pt
-ptext
-ptool
-pubdate
-publicsuffix
-publishfailed
-punycode
-purge
-purged
-qabardjajəbza
-qbar
-qbsettings
-qlow
-qmoicj
-qp
-quasit
-query
-querycache
-querycachetwo
-querycur
-querydiff
-querykey
-querymodule
-querymodules
-querypage
-querypages
-querystring
-querytype
-question
-queuefull
-quickbar
-quicksorts
-quicktemplate
-quicktime
-qunit
-quux
-qvalues
-rabdiff
-radic
-radius
-raii
-raimond
-random
-randompage
-randomredirect
-randstr
-range
-rangeblock
-rangeblocks
-rangedisabled
-rangeend
-rangestart
-raquo
-rarr
-rarticle
-rasterizations
-rasterize
-rasterized
-rasterizer
-ratelimited
-ratelimits
-rating
-ratings
-raw
-rawfm
-rawrow
-rbspan
-rc
-rcdays
-rceil
-rcfeed
-rcid
-rcids
-rclimit
-rcoptions
-rcpatroldisabled
-rctitle
-rctoken
-rdev
-rdfa
-rdfrom
-rdftype
-rdquo
-read
-readable
-readapidenied
-readarray
-reader
-readline
-readonlyreason
-readonlytext
-readonlywarning
-readrequired
-readrights
-realaudio
-realllly
-realname
-realpath
-reason
-reasonlist
-reasonstr
-reblock
-rebuildtextindex
-recache
-recached
-recaching
-recalc
-recentchange
-recentchanges
-recentchangescount
-recentchangesdays
-recentchangeslinked
-recentchangestext
-recenteditcount
-recentedits
-recip
-recips
-recreate
-recurse
-recurses
-redir
-redirect
-redirectable
-redirectcreated
-redirectedfrom
-redirections
-redirector
-redirectpagesub
-redirectparams
-redirects
-redirectsnippet
-redirectstofile
-redirecttitle
-redirectto
-redirid
-redirlinks
-redirs
-redis
-redlink
-redlinks
-redocument
-redux
-reedyboy
-reenables
-reencode
-reference
-refetch
-refresheducation
-refreshlinks
-regexes
-regexlike
-region
-registered
-registration
-registrationdate
-reimport
-reindexation
-reindexed
-releasenotes
-relevance
-relevant
-relicense
-relimit
-relkind
-relname
-relnamespace
-remarticle
-remembermypassword
-removablegroups
-removal
-remove
-removed
-removedwatchtext
-removetags
-remreviewer
-remstudent
-renameuser
-renaming
-renderable
-renderesibanner
-renderwarning
-renormalized
-repeating
-repl
-replaceafter
-replacer
-replacers
-replag
-replyto
-reporttime
-repos
-request
-requested
-requestid
-requeue
-required
-rerender
-rerendered
-rescnt
-researcher
-resends
-reset
-resetkinds
-resetlink
-resetpass
-resized
-resolutioninfo
-resolutionunit
-resolve
-resolved
-resourceloader
-responsecode
-restore
-restorelink
-restoreprefs
-restricted
-result
-resultset
-resultsperpage
-retrievedfrom
-returnto
-returntoquery
-retval
-reupload
-revalidate
-revalidation
-revdel
-revdelete
-revdelete'd
-revdelundel
-revert
-reverting
-revertpage
-reverts
-revid
-revids
-review
-reviewactivity
-reviewed
-reviewer
-reviewing
-revision
-revisionasof
-revisionday
-revisiondelete
-revisionid
-revisionmonth
-revisions
-revisiontext
-revisiontimestamp
-revisionuser
-revisionyear
-revlink
-revwrongpage
-rfloor
-rgba
-richtext
-rights
-rightscode
-rightsinfo
-rightslog
-rightslogtext
-rked
-rmdir
-rn
-rnlimit
-robotstxt
-roff
-role
-rollback
-rollbacker
-rollbacklink
-rollbacklinkcount
-rollbacktoken
-rootpage
-rootuserpages
-rowcount
-rown
-rownum
-rowsarr
-rowset
-rowspan
-rowspans
-rsaquo
-rsargs
-rsd
-rsdf
-rsquo
-rss
-rsvg
-ruleset
-rulesets
-rusyn
-rv
-rvcontinue
-rvdiffto
-rvlimit
-rvparse
-rvprop
-rvstart
-rvstartid
-rvtoken
-sabino
-safemode
-safesubst
-sais
-sameorigin
-samp
-sansserif
-save
-savearticle
-savedprefs
-saveprefs
-saveusergroups
-sawfish
-sbin
-sbquo
-scaler
-scalers
-scaron
-score
-screensize
-scribunto
-scriptable
-scriptbuilder
-scriptpath
-scrolltop
-sdot
-search
-search's
-searchaction
-searcharticle
-searchboxes
-searchbutton
-searcheverything
-searchform
-searchindex
-searchinfo
-searchlimit
-searchmenu
-searchnamespaces
-searchoptions
-searchresulttext
-searchstring
-searchtitle
-secondary
-section
-sectionanchor
-sectionedit
-sectioneditnotsupported
-sectionformat
-sectionnumber
-sectionprop
-sections
-sectionsnippet
-sectionsnotsupported
-sectiontitle
-securelogin
-seiten
-selectandother
-selectorother
-self
-selflink
-selfmove
-semiglobal
-semiprotected
-semiprotectedlevels
-semiprotectedpagewarning
-sendemail
-sendmail
-sentences
-serialize
-servedby
-servername
-servertime
-serverurl
-sess
-session
-sessionfailure
-sessionid
-sessionkey
-setchange
-setcookie
-setemail
-setext
-setglobalaccountstatus
-setnewtype
-setnotificationtimestamp
-setopt
-setrename
-setrlimit
-setstatus
-sha
-shar
-sharding
-shared
-shareddescriptionfollows
-sharedfile
-sharedrepo
-sharedupload
-shellscript
-shiftwidth
-shockwave
-short
-shorturl
-shouldn
-shouting
-show
-showalldb
-showbots
-showdeleted
-showdiff
-showdifflinks
-showfilename
-showhiddencats
-showhideminor
-showhooks
-showingresults
-showinitializer
-showjumplinks
-showlinkedto
-showme
-showmeta
-shownavigation
-shownumberswatching
-showpreview
-showredirs
-showreviewed
-showsizediff
-showtoc
-showunreviewed
-shtml
-si
-siebrand
-sighhhh
-sigkill
-sigmaf
-signup
-sigsegv
-sigterm
-sii
-siit
-siiurlwidth
-simplesearch
-singlegroup
-singularthey
-sinumberingroup
-siprop
-site
-siteadmin
-sitecsspreview
-sitedir
-siteinfo
-sitejspreview
-sitemap
-sitemaps
-sitematrix
-sitename
-sitenotice
-siteprop
-sitesearch
-sitestats
-sitestatsupdate
-siteuser
-sitewide
-size
-sizediff
-sizediffdisabled
-sizes
-skey
-skinclass
-skinkey
-skinname
-skinnameclass
-skins
-skipcache
-skipcaptcha
-skipnotif
-skname
-sktemplate
-slideshow
-sm
-smaxage
-smil
-smpp
-sms's
-smscontent
-smslogs
-smtp
-snippet
-sodipodi
-softredirect
-softtabstop
-solaris
-somecontent
-somefeed
-someuser
-sorani
-sorbs
-sorbsreason
-sort
-sortdirection
-sortkey
-sortkeyprefix
-sortkeys
-source
-soxred
-spam
-spamdetected
-spamprotected
-spamprotectionmatch
-spamprotectiontext
-spamprotectiontitle
-spcontent
-special
-specialpage
-specialpagealiases
-specialpageattributes
-specialpagegroup
-specialpages
-specialprotected
-speedtip
-speedy
-speex
-spekking
-spellcheck
-spezial
-spoofable
-spreadsheetml
-sprefs
-sprintf
-sprotected
-sql's
-sqlite
-sqltotal
-sr
-srchres
-srcset
-srgs
-srprop
-srwhat
-stabilize
-stable
-stablesettings
-stansvik
-starcode
-start
-startid
-startime
-startsortkey
-startsortkeyprefix
-starttime
-starttimestamp
-starttransfer
-stash
-stashfailed
-stashimageinfo
-state
-staticredirect
-statistics
-statline
-status
-statuskey
-stdclass
-stdout
-steward
-stopwords
-storedversion
-strcasecmp
-strcmp
-strftime
-string
-stripos
-stripslashes
-strlen
-strpos
-strrpos
-strtime
-strtok
-strtolower
-strtotime
-strtr
-struct
-strval
-stubthreshold
-student
-studies
-stuffit
-stxt
-stylename
-stylepath
-styleversion
-subaction
-subarray
-subcat
-subcats
-subclassing
-subcond
-subconds
-subdir
-subdomain
-subdomains
-sube
-subelement
-subelements
-subfunction
-subfunctions
-subimages
-subitem
-subitems
-subject
-subjectid
-subjectids
-subjectpagename
-subjectpagenamee
-subjectspace
-subjectspacee
-subkey
-subkeys
-sublevels
-submatch
-submodule
-submodule's
-submodules
-subnet
-subpage
-subpagename
-subpagenamee
-subpages
-subpagestr
-subparents
-subprocesses
-subsql
-substr
-succ
-success
-successbox
-suckage
-suggest
-suggestion
-suhosin
-suhosin's
-summ
-summary
-summarymissed
-summaryrequired
-supe
-superdomain
-superglobals
-superset
-suppress
-suppressed
-suppressedredirect
-suppressionlog
-suppressionlogtext
-suppressredirect
-suppressrevision
-svgs
-svn
-svnroot
-sybase
-symlinked
-syms
-sysinfo
-sysop
-system
-systemnachrichten
-szdiff
-szlig
-szymon
-t
-tabindex
-tablealign
-tablecell
-tablename
-tablesorter
-tablestack
-tabletags
-tabletype
-tabstop
-tag
-tagfilter
-tagline
-taglist
-tags
-tagset
-tagstack
-tahoma
-tailorings
-talk
-talkable
-talkfrom
-talkid
-talkids
-talkmove
-talkmoveoverredirect
-talkpage
-talkpageheader
-talkpagelinktext
-talkpagename
-talkpagenamee
-talkpagetext
-talkspace
-talkspacee
-talkto
-tarask
-taraškievica
-target
-tb
-tbase
-tbody
-tboverride
-tcount
-tcsh
-tddate
-tdtime
-teardown
-telnet
-temp
-tempdir
-template
-templatelinks
-templatepage
-templates
-templatesused
-templatesusedpreview
-templatesusedsection
-tempname
-tempout
-test
-testclean
-testdata
-testmailuser
-teston
-testpass
-testrunner
-testswarm
-testuser
-testutf
-texi
-texinfo
-text
-textarea
-textareas
-textares
-textbox
-textboxsize
-texthidden
-textid
-textlink
-textmissing
-textoverride
-textsf
-textsize
-textvector
-texvc
-tfoot
-tful
-tg
-that'll
-thead
-thelink
-theora
-thetasym
-thinsp
-thisisdeleted
-thispage
-thumbborder
-thumbcaption
-thumberror
-thumbheight
-thumbhtml
-thumbimage
-thumbinner
-thumblimits
-thumbmime
-thumbnail
-thumbnailing
-thumbnailsize
-thumbname
-thumbsize
-thumbtext
-thumburl
-thumbwidth
-timeago
-timeanddate
-timecond
-timecorrection
-timeframe
-timekey
-timeoffset
-timep
-timespans
-timestamp
-timestamps
-timestamptz
-timezonelegend
-timezoneregion
-timezoneuseoffset
-timezoneuseserverdefault
-tino
-title
-titleblacklist
-titleconversion
-titleexists
-titlemsg
-titleprefixeddbkey
-titleprotected
-titleprotectedwarning
-titles
-titlesnippet
-titletext
-titlevector
-tl
-tllimit
-tltemplates
-tmpfile
-to
-toclevel
-tocline
-tocnumber
-tocsection
-toctext
-toctitle
-tofragment
-toggle
-toid
-token
-tokenname
-tokens
-tolang
-tongminh
-toobig
-toofewexpiries
-toohigh
-toolarray
-toolbarparent
-toolboxend
-toolboxlink
-toolong
-toolow
-tooltiponly
-tooshort
-top
-toparse
-topbar
-toplevel
-toplinks
-topojson
-toponly
-torev
-torevid
-tornevall
-torunblocked
-totalcnt
-totalcount
-totalhits
-totalmemory
-totaltime
-totitle
-touched
-tplarg
-transcludable
-transclude
-transcluded
-transcluding
-transclusion
-transclusions
-transcode
-transcodekey
-transcoder
-transcodereset
-transcodestatus
-transcoding
-translatewiki
-transstat
-transwiki
-troff
-true
-truespeed
-truncatedtext
-trustworthy
-truteq
-truthy
-tsearch
-tsquery
-tuple
-tweakblogs
-tweakers
-txt
-txtfm
-type
-typemustmatch
-typeof
-typname
-tzstring
-uacute
-uarr
-uc
-ucfirst
-ucirc
-udpprofile
-ufffd
-ugrave
-ui
-uids
-uint
-ulimit
-ulink
-ulinks
-uname
-unanchored
-unapprove
-unary
-unattached
-unauthenticate
-unavailable
-unblock
-unblocklogentry
-unblockself
-unblocktoken
-unbuffered
-uncacheable
-uncached
-uncategorized
-unclosable
-uncompress
-undel
-undelete
-undeleted
-undeletion
-undismissable
-undismissible
-undo
-undoafter
-undofailure
-undorev
-unescape
-unescaped
-unfeature
-unfeatured
-unflag
-ungrouped
-unhelpful
-unhidden
-unhide
-unidata
-unidecode
-unindent
-unindexed
-uniq
-unique
-universaleditbutton
-unixtime
-unknown
-unknownerror
-unknownnamespace
-unlock
-unlockdb
-unlogged
-unmakesafe
-unmark
-unmerge
-unmodified
-unpadded
-unpatrolled
-unpatrolledletter
-unprefixed
-unprintables
-unprotect
-unprotectedarticle
-unprotection
-unprotectthispage
-unreadcount
-unredacted
-unrequest
-unrequested
-unresolve
-unresolved
-unreviewed
-unreviewedpages
-unsanitized
-unseed
-unserialization
-unserialize
-unserialized
-unserializes
-unserializing
-unsetting
-unstub
-unstubbed
-unstubbing
-unstubs
-unsupportednamespace
-unsupportedrepo
-untaint
-untracked
-untrustworthiness
-unused
-unusual
-unversioned
-unviewable
-unviewed
-unwatch
-unwatched
-unwatchedpages
-unwatching
-unwatchthispage
-unwikified
-unwritable
-upconvert
-updateddate
-updatedtime
-updatelog
-upgradedoc
-upgrader
-upload
-upload's
-uploaddisabled
-uploadedimage
-uploadjava
-uploadlogpage
-uploadlogpagetext
-uploadnewversion
-uploadnologintext
-uploadpage
-uploadscripted
-uploadsource
-uploadstash
-uploadvirus
-uploadwarning
-uppercased
-upsih
-urandom
-url
-url's
-urlaction
-urldecode
-urldecoded
-urlencode
-urlencoded
-urlheight
-urlparam
-urlparm
-urlpath
-urlvar
-urlwidth
-ursh
-us
-usedomain
-useemail
-uselang
-uselivepreview
-usemod
-usenewrc
-user
-useragent
-useragents
-userblock
-usercan
-usercontribs
-usercreate
-usercreated
-usercss
-usercsspreview
-usercssyoucanpreview
-userdailycontribs
-userdir
-userdoesnotexist
-usereditcount
-useredits
-useremail
-userexists
-usergroup
-usergroups
-userhidden
-userid
-userinfo
-userinvalidcssjstitle
-userips
-userjs
-userjsprev
-userjspreview
-userjsyoucanpreview
-userlang
-userlangattributes
-userlink
-userlinks
-userlogin
-userloginlink
-userloginprompt
-userlogout
-usermaildisabled
-usermessage
-username
-usernameless
-usernames
-userpage
-userpages
-userpageurl
-userprefix
-userrights
-userrightstoken
-users
-usersbody
-userspace
-usertalk
-usertalklink
-usertext
-usertoollinks
-useskin
-useto
-usort
-usrmonth
-ussd
-ussdcontent
-ustar
-ustoken
-utfnormal
-uuml
-validate
-validationbuilder
-valign
-vals
-value
-values
-vandal
-vandalism
-variables
-variant
-variantarticlepath
-varlang
-varname
-vars
-varval
-vasiliev
-vasilvv
-vbase
-vbscript
-vcount
-vcsize
-venema's
-verbosify
-version
-versioning
-versionlink
-versionlog
-versionrequired
-versionrequiredtext
-very
-vhost
-vi
-vibber
-videoinfo
-view
-viewcount
-viewdeleted
-viewhelppage
-viewmyprivateinfo
-viewmywatchlist
-viewport
-viewprevnext
-viewsource
-viewsourcelink
-viewsourcetext
-viewvc
-viewyourtext
-visible
-visualeditor
-viurlwidth
-voff
-vofp
-voicexml
-vorbis
-vpad
-vrml
-vslow
-vumi
-vvcv
-vxml
-wais
-wait
-wakeup
-walltime
-warmup
-warning
-wasdeleted
-wasn
-watch
-watchcreations
-watchdefault
-watchdeletion
-watched
-watchlist
-watchlistdays
-watchlisthideanons
-watchlisthidebots
-watchlisthideliu
-watchlisthideminor
-watchlisthideown
-watchlisthidepatrolled
-watchlistraw
-watchlists
-watchlisttoken
-watchmoves
-watchthis
-watchthispage
-watchtoken
-watchuser
-wb
-wbmp
-wbxml
-wddx
-wddxfm
-weblog
-weblogs
-webm
-webp
-webrequest
-webserver
-weeks
-weierp
-weight
-wellwritten
-werdna
-wget
-what
-whatlinkshere
-whatwg
-wheely
-whether
-whitelist
-whitelisted
-whitelistedittext
-whitelisting
-whois
-wicke
-width
-widthx
-wierkosz
-wietse
-wiki
-wiki'd
-wiki's
-wikia
-wikiadmin
-wikibase
-wikibits
-wikibooks
-wikidb
-wikifarm
-wikiid
-wikilink
-wikilinks
-wikilove
-wikiloveimagelog
-wikimedia
-wikimediacommons
-wikimediafoundation
-wikinews
-wikipage
-wikipedia
-wikipedian
-wikipedias
-wikiquote
-wikis
-wikisource
-wikisyntax
-wikitable
-wikitables
-wikitech
-wikitext
-wikiuser
-wikiversity
-wikivoyage
-wiktionary
-wincache
-wininet
-withaccess
-withaction
-witheditsonly
-withlanglinks
-withoutlanglinks
-wl
-wlallrev
-wldir
-wlend
-wlexcludeuser
-wllimit
-wlowner
-wlprop
-wltoken
-wmf's
-wml
-wmlc
-wmls
-wmlsc
-wmlscript
-wmlscriptc
-wordcount
-wordprocessingml
-wordwg
-workalike
-worldwind
-wouldn
-wr
-writeapi
-writeapidenied
-writedisabled
-writerequired
-writerights
-wrongpassword
-x
-xanalytics
-xbitmap
-xcancel
-xdebug
-xdiff
-xdomain
-xdomains
-xff
-xhtmldefaultnamespace
-xhtmlnamespaces
-xiff
-xlam
-xlsb
-xlsm
-xlsx
-xltm
-xltx
-xml
-xmldoublequote
-xmlfm
-xmlimport
-xmlmeta
-xmlns
-xmlselect
-xor
-xpinstall
-xpixmap
-xpsdocument
-xtended
-xwindowdump
-xxxx
-xxxxx
-yacute
-yaml
-yamlfm
-yandex
-year
-yes
-youhavenewmessages
-youhavenewmessagesfromusers
-youhavenewmessagesmanyusers
-youhavenewmessagesmulti
-yourdiff
-yourdomainname
-youremail
-yourgender
-yourinternal
-yourlanguage
-yourname
-yournick
-yourpassword
-yourrealname
-yourtext
-yourvariant
-yourwiki
-yuml
-yyyymmddhhiiss
-zcmd
-zerobar
-zerobutton
-zerodontask
-zeroinfo
-zeronet
-zfile
-zhdaemon
-zhengzhu
-zhtable
-zijdel
-zlang
-zlib
-zoffset
-zrma
-zwnj
-ænglisc
-ævar
-świerkosz
index cb4eddf..d3d76ac 100644 (file)
@@ -21,6 +21,8 @@
  * @ingroup Maintenance
  */
 
+use MediaWiki\Revision\RevisionRecord;
+
 require_once __DIR__ . '/Maintenance.php';
 
 /**
@@ -79,7 +81,7 @@ class FixDefaultJsonContentPages extends LoggedUpdateMaintenance {
                $title = Title::makeTitle( $row->page_namespace, $row->page_title );
                $this->output( "Processing {$title} ({$row->page_id})...\n" );
                $rev = Revision::newFromTitle( $title );
-               $content = $rev->getContent( Revision::RAW );
+               $content = $rev->getContent( RevisionRecord::RAW );
                $dbw = $this->getDB( DB_MASTER );
                if ( $content instanceof JsonContent ) {
                        if ( $content->isValid() ) {
index 05dd0d0..aef45bf 100644 (file)
@@ -188,18 +188,20 @@ class GenerateSitemap extends Maintenance {
                        $this->fatalError( "Can not create directory $fspath." );
                }
 
+               $dbDomain = WikiMap::getCurrentWikiDbDomain()->getId();
                $this->fspath = realpath( $fspath ) . DIRECTORY_SEPARATOR;
                $this->urlpath = $this->getOption( 'urlpath', "" );
                if ( $this->urlpath !== "" && substr( $this->urlpath, -1 ) !== '/' ) {
                        $this->urlpath .= '/';
                }
-               $this->identifier = $this->getOption( 'identifier', wfWikiID() );
+               $this->identifier = $this->getOption( 'identifier', $dbDomain );
                $this->compress = $this->getOption( 'compress', 'yes' ) !== 'no';
                $this->skipRedirects = $this->hasOption( 'skip-redirects' );
                $this->dbr = $this->getDB( DB_REPLICA );
                $this->generateNamespaces();
                $this->timestamp = wfTimestamp( TS_ISO_8601, wfTimestampNow() );
-               $this->findex = fopen( "{$this->fspath}sitemap-index-{$this->identifier}.xml", 'wb' );
+               $encIdentifier = rawurlencode( $this->identifier );
+               $this->findex = fopen( "{$this->fspath}sitemap-index-{$encIdentifier}.xml", 'wb' );
                $this->main();
        }
 
index 2e8cf77..ca67c83 100644 (file)
@@ -23,6 +23,8 @@
  * @ingroup Maintenance
  */
 
+use MediaWiki\Storage\RevisionRecord;
+
 require_once __DIR__ . '/Maintenance.php';
 
 /**
@@ -51,8 +53,8 @@ class GetTextMaint extends Maintenance {
                        $this->fatalError( "Page $titleText does not exist.\n" );
                }
                $content = $rev->getContent( $this->hasOption( 'show-private' )
-                       ? Revision::RAW
-                       : Revision::FOR_PUBLIC );
+                       ? RevisionRecord::RAW
+                       : RevisionRecord::FOR_PUBLIC );
 
                if ( $content === false ) {
                        $titleText = $title->getPrefixedText();
index c6738bc..f9b3951 100644 (file)
@@ -759,6 +759,7 @@ TEXT
        function openSpawn() {
                global $IP;
 
+               $wiki = WikiMap::getWikiIdFromDbDomain( WikiMap::getCurrentWikiDbDomain() );
                if ( count( $this->php ) == 2 ) {
                        $mwscriptpath = $this->php[1];
                } else {
@@ -771,14 +772,14 @@ TEXT
                                                $this->php[0],
                                                $mwscriptpath,
                                                "fetchText.php",
-                                               '--wiki', wfWikiID() ] ) );
+                                               '--wiki', $wiki ] ) );
                } else {
                        $cmd = implode( " ",
                                array_map( [ Shell::class, 'escape' ],
                                        [
                                                $this->php[0],
                                                "$IP/maintenance/fetchText.php",
-                                               '--wiki', wfWikiID() ] ) );
+                                               '--wiki', $wiki ] ) );
                }
                $spec = [
                        0 => [ "pipe", "r" ],
index 513edf3..9548d6b 100644 (file)
@@ -37,6 +37,7 @@ class McTest extends Maintenance {
                        . " memcached server and shows a report" );
                $this->addOption( 'i', 'Number of iterations', false, true );
                $this->addOption( 'cache', 'Use servers from this $wgObjectCaches store', false, true );
+               $this->addOption( 'driver', 'Either "php" or "pecl"', false, true );
                $this->addArg( 'server[:port]', 'Memcached server to test, with optional port', false );
        }
 
@@ -66,41 +67,177 @@ class McTest extends Maintenance {
                # find out the longest server string to nicely align output later on
                $maxSrvLen = $servers ? max( array_map( 'strlen', $servers ) ) : 0;
 
+               $type = $this->getOption( 'driver', 'php' );
+               if ( $type === 'php' ) {
+                       $class = MemcachedPhpBagOStuff::class;
+               } elseif ( $type === 'pecl' ) {
+                       $class = MemcachedPeclBagOStuff::class;
+               } else {
+                       $this->fatalError( "Invalid driver type '$type'" );
+               }
+
                foreach ( $servers as $server ) {
-                       $this->output(
-                               str_pad( $server, $maxSrvLen ),
-                               $server # output channel
-                       );
+                       $this->output( str_pad( $server, $maxSrvLen ) . "\n" );
 
-                       $mcc = new MemcachedClient( [
-                               'persistant' => true,
+                       /** @var BagOStuff $mcc */
+                       $mcc = new $class( [
+                               'servers' => [ $server ],
+                               'persistent' => true,
                                'timeout' => $wgMemCachedTimeout
                        ] );
-                       $mcc->set_servers( [ $server ] );
-                       $set = 0;
-                       $incr = 0;
-                       $get = 0;
-                       $time_start = microtime( true );
-                       for ( $i = 1; $i <= $iterations; $i++ ) {
-                               if ( $mcc->set( "test$i", $i ) ) {
-                                       $set++;
-                               }
+
+                       $this->benchmarkSingleKeyOps( $mcc, $iterations );
+                       $this->benchmarkMultiKeyOpsImmediateBlocking( $mcc, $iterations );
+                       $this->benchmarkMultiKeyOpsDeferredBlocking( $mcc, $iterations );
+               }
+       }
+
+       /**
+        * @param BagOStuff $mcc
+        * @param int $iterations
+        */
+       private function benchmarkSingleKeyOps( $mcc, $iterations ) {
+               $add = 0;
+               $set = 0;
+               $incr = 0;
+               $get = 0;
+               $delete = 0;
+
+               $keys = [];
+               for ( $i = 1; $i <= $iterations; $i++ ) {
+                       $keys[] = "test$i";
+               }
+
+               // Clear out any old values
+               $mcc->deleteMulti( $keys );
+
+               $time_start = microtime( true );
+               foreach ( $keys as $key ) {
+                       if ( $mcc->add( $key, $i ) ) {
+                               $add++;
                        }
-                       for ( $i = 1; $i <= $iterations; $i++ ) {
-                               if ( !is_null( $mcc->incr( "test$i", $i ) ) ) {
-                                       $incr++;
-                               }
+               }
+               $addMs = intval( 1e3 * ( microtime( true ) - $time_start ) );
+
+               $time_start = microtime( true );
+               foreach ( $keys as $key ) {
+                       if ( $mcc->set( $key, $i ) ) {
+                               $set++;
+                       }
+               }
+               $setMs = intval( 1e3 * ( microtime( true ) - $time_start ) );
+
+               $time_start = microtime( true );
+               foreach ( $keys as $key ) {
+                       if ( !is_null( $mcc->incr( $key, $i ) ) ) {
+                               $incr++;
                        }
-                       for ( $i = 1; $i <= $iterations; $i++ ) {
-                               $value = $mcc->get( "test$i" );
-                               if ( $value == $i * 2 ) {
-                                       $get++;
-                               }
+               }
+               $incrMs = intval( 1e3 * ( microtime( true ) - $time_start ) );
+
+               $time_start = microtime( true );
+               foreach ( $keys as $key ) {
+                       $value = $mcc->get( $key );
+                       if ( $value == $i * 2 ) {
+                               $get++;
                        }
-                       $exectime = microtime( true ) - $time_start;
+               }
+               $getMs = intval( 1e3 * ( microtime( true ) - $time_start ) );
 
-                       $this->output( " set: $set   incr: $incr   get: $get time: $exectime", $server );
+               $time_start = microtime( true );
+               foreach ( $keys as $key ) {
+                       if ( $mcc->delete( $key ) ) {
+                               $delete++;
+                       }
                }
+               $delMs = intval( 1e3 * ( microtime( true ) - $time_start ) );
+
+               $this->output(
+                       " add: $add/$iterations {$addMs}ms   " .
+                       "set: $set/$iterations {$setMs}ms   " .
+                       "incr: $incr/$iterations {$incrMs}ms   " .
+                       "get: $get/$iterations ({$getMs}ms)   " .
+                       "delete: $delete/$iterations ({$delMs}ms)\n"
+               );
+       }
+
+       /**
+        * @param BagOStuff $mcc
+        * @param int $iterations
+        */
+       private function benchmarkMultiKeyOpsImmediateBlocking( $mcc, $iterations ) {
+               $keysByValue = [];
+               for ( $i = 1; $i <= $iterations; $i++ ) {
+                       $keysByValue["test$i"] = 'S' . str_pad( $i, 2048 );
+               }
+               $keyList = array_keys( $keysByValue );
+
+               $time_start = microtime( true );
+               $mSetOk = $mcc->setMulti( $keysByValue ) ? 'S' : 'F';
+               $mSetMs = intval( 1e3 * ( microtime( true ) - $time_start ) );
+
+               $time_start = microtime( true );
+               $found = $mcc->getMulti( $keyList );
+               $mGetMs = intval( 1e3 * ( microtime( true ) - $time_start ) );
+               $mGetOk = 0;
+               foreach ( $found as $key => $value ) {
+                       $mGetOk += ( $value === $keysByValue[$key] );
+               }
+
+               $time_start = microtime( true );
+               $mChangeTTLOk = $mcc->changeTTLMulti( $keyList, 3600 ) ? 'S' : 'F';
+               $mChangeTTTMs = intval( 1e3 * ( microtime( true ) - $time_start ) );
+
+               $time_start = microtime( true );
+               $mDelOk = $mcc->deleteMulti( $keyList ) ? 'S' : 'F';
+               $mDelMs = intval( 1e3 * ( microtime( true ) - $time_start ) );
+
+               $this->output(
+                       " setMulti (IB): $mSetOk {$mSetMs}ms   " .
+                       "getMulti (IB): $mGetOk/$iterations {$mGetMs}ms   " .
+                       "changeTTLMulti (IB): $mChangeTTLOk {$mChangeTTTMs}ms   " .
+                       "deleteMulti (IB): $mDelOk {$mDelMs}ms\n"
+               );
+       }
+
+       /**
+        * @param BagOStuff $mcc
+        * @param int $iterations
+        */
+       private function benchmarkMultiKeyOpsDeferredBlocking( $mcc, $iterations ) {
+               $flags = $mcc::WRITE_BACKGROUND;
+               $keysByValue = [];
+               for ( $i = 1; $i <= $iterations; $i++ ) {
+                       $keysByValue["test$i"] = 'A' . str_pad( $i, 2048 );
+               }
+               $keyList = array_keys( $keysByValue );
+
+               $time_start = microtime( true );
+               $mSetOk = $mcc->setMulti( $keysByValue, 0, $flags ) ? 'S' : 'F';
+               $mSetMs = intval( 1e3 * ( microtime( true ) - $time_start ) );
+
+               $time_start = microtime( true );
+               $found = $mcc->getMulti( $keyList );
+               $mGetMs = intval( 1e3 * ( microtime( true ) - $time_start ) );
+               $mGetOk = 0;
+               foreach ( $found as $key => $value ) {
+                       $mGetOk += ( $value === $keysByValue[$key] );
+               }
+
+               $time_start = microtime( true );
+               $mChangeTTLOk = $mcc->changeTTLMulti( $keyList, 3600, $flags ) ? 'S' : 'F';
+               $mChangeTTTMs = intval( 1e3 * ( microtime( true ) - $time_start ) );
+
+               $time_start = microtime( true );
+               $mDelOk = $mcc->deleteMulti( $keyList, $flags ) ? 'S' : 'F';
+               $mDelMs = intval( 1e3 * ( microtime( true ) - $time_start ) );
+
+               $this->output(
+                       " setMulti (DB): $mSetOk {$mSetMs}ms   " .
+                       "getMulti (DB): $mGetOk/$iterations {$mGetMs}ms   " .
+                       "changeTTLMulti (DB): $mChangeTTLOk {$mChangeTTTMs}ms   " .
+                       "deleteMulti (DB): $mDelOk {$mDelMs}ms\n"
+               );
        }
 }
 
index 333b8b9..5024395 100644 (file)
@@ -28,6 +28,7 @@ require_once __DIR__ . '/Maintenance.php';
 
 use MediaWiki\Linker\LinkTarget;
 use MediaWiki\MediaWikiServices;
+use MediaWiki\Storage\RevisionRecord;
 use Wikimedia\Rdbms\IResultWrapper;
 use Wikimedia\Rdbms\IMaintainableDatabase;
 
@@ -558,8 +559,12 @@ class NamespaceDupes extends Maintenance {
         * @return bool
         */
        private function canMerge( $id, LinkTarget $linkTarget, &$logStatus ) {
-               $latestDest = Revision::newFromTitle( $linkTarget, 0, Revision::READ_LATEST );
-               $latestSource = Revision::newFromPageId( $id, 0, Revision::READ_LATEST );
+               $latestDest = Revision::newFromTitle(
+                       $linkTarget, 0, RevisionRecord::READ_LATEST
+               );
+               $latestSource = Revision::newFromPageId(
+                       $id, 0, RevisionRecord::READ_LATEST
+               );
                if ( $latestSource->getTimestamp() > $latestDest->getTimestamp() ) {
                        $logStatus = 'cannot merge since source is later';
                        return false;
index dcb89d1..e48b6ab 100644 (file)
@@ -21,6 +21,7 @@
  * @ingroup Maintenance
  */
 
+use MediaWiki\Storage\RevisionRecord;
 use Wikimedia\Rdbms\IDatabase;
 
 require_once __DIR__ . '/Maintenance.php';
@@ -144,7 +145,7 @@ class PopulateRevisionLength extends LoggedUpdateMaintenance {
                        ? Revision::newFromArchiveRow( $row )
                        : new Revision( $row );
 
-               $content = $rev->getContent( Revision::RAW );
+               $content = $rev->getContent( RevisionRecord::RAW );
                if ( !$content ) {
                        # This should not happen, but sometimes does (T22757)
                        $id = $row->$idCol;
index a62e019..b9e084e 100644 (file)
@@ -26,6 +26,7 @@
  */
 
 use MediaWiki\MediaWikiServices;
+use MediaWiki\Storage\RevisionRecord;
 
 require_once __DIR__ . '/dumpIterator.php';
 
@@ -81,7 +82,7 @@ class PreprocessDump extends DumpIterator {
         * @param Revision $rev
         */
        public function processRevision( $rev ) {
-               $content = $rev->getContent( Revision::RAW );
+               $content = $rev->getContent( RevisionRecord::RAW );
 
                if ( $content->getModel() !== CONTENT_MODEL_WIKITEXT ) {
                        return;
index 8306243..3f48abb 100644 (file)
@@ -22,6 +22,7 @@
  */
 
 use MediaWiki\MediaWikiServices;
+use MediaWiki\Storage\RevisionRecord;
 use Wikimedia\Rdbms\IDatabase;
 
 require_once __DIR__ . '/Maintenance.php';
@@ -231,7 +232,7 @@ class RefreshLinks extends Maintenance {
                }
 
                $rt = null;
-               $content = $page->getContent( Revision::RAW );
+               $content = $page->getContent( RevisionRecord::RAW );
                if ( $content !== null ) {
                        $rt = $content->getUltimateRedirectTarget();
                }
index c2fa687..d8a8808 100644 (file)
@@ -22,6 +22,7 @@
  */
 
 use MediaWiki\MediaWikiServices;
+use MediaWiki\Revision\RevisionRecord;
 use MediaWiki\Shell\Shell;
 
 if ( !defined( 'MEDIAWIKI' ) ) {
@@ -523,7 +524,7 @@ class CheckStorage {
 
        function importRevision( &$revision, &$importer ) {
                $id = $revision->getID();
-               $content = $revision->getContent( Revision::RAW );
+               $content = $revision->getContent( RevisionRecord::RAW );
                $id = $id ?: '';
 
                if ( $content === null ) {
index 8a8f4d8..6fd53cc 100644 (file)
@@ -218,6 +218,8 @@ class RecompressTracked {
         * writing are all slow.
         */
        function startReplicaProcs() {
+               $wiki = WikiMap::getWikiIdFromDbDomain( WikiMap::getCurrentWikiDbDomain() );
+
                $cmd = 'php ' . Shell::escape( __FILE__ );
                foreach ( self::$cmdLineOptionMap as $cmdOption => $classOption ) {
                        if ( $cmdOption == 'replica-id' ) {
@@ -229,7 +231,7 @@ class RecompressTracked {
                        }
                }
                $cmd .= ' --child' .
-                       ' --wiki ' . Shell::escape( wfWikiID() ) .
+                       ' --wiki ' . Shell::escape( $wiki ) .
                        ' ' . Shell::escape( ...$this->destClusters );
 
                $this->replicaPipes = $this->replicaProcs = [];
index f759c13..5f7f9d5 100644 (file)
@@ -45,7 +45,6 @@ class UserDupes {
        private $outputCallback;
 
        /**
-        * UserDupes constructor.
         * @param IMaintainableDatabase &$database
         * @param callback $outputCallback
         */
index 4c9dcb4..98f1c24 100644 (file)
@@ -107,16 +107,14 @@ The new option is NOT validated.' );
 
                                $userValue = $user->getOption( $option );
                                if ( $userValue <> $defaultOptions[$option] ) {
-                                       // phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged
-                                       @$ret[$option][$userValue]++;
+                                       $ret[$option][$userValue] = ( $ret[$option][$userValue] ?? 0 ) + 1;
                                }
                        } else {
 
                                foreach ( $defaultOptions as $name => $defaultValue ) {
                                        $userValue = $user->getOption( $name );
                                        if ( $userValue != $defaultValue ) {
-                                               // phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged
-                                               @$ret[$name][$userValue]++;
+                                               $ret[$option][$userValue] = ( $ret[$option][$userValue] ?? 0 ) + 1;
                                        }
                                }
                        }
index 671369a..8683eed 100644 (file)
@@ -21,6 +21,8 @@
  * @ingroup Maintenance
  */
 
+use MediaWiki\Revision\RevisionRecord;
+
 require_once __DIR__ . '/Maintenance.php';
 
 /**
@@ -43,7 +45,7 @@ class ViewCLI extends Maintenance {
 
                $page = WikiPage::factory( $title );
 
-               $content = $page->getContent( Revision::RAW );
+               $content = $page->getContent( RevisionRecord::RAW );
                if ( !$content ) {
                        $this->fatalError( "Page has no content" );
                }
index 6298086..0c2df6b 100644 (file)
@@ -1526,7 +1526,9 @@ return [
                'remoteBasePath' => "$wgResourceBasePath/resources/src/mediawiki.jqueryMsg",
                'packageFiles' => [
                        'mediawiki.jqueryMsg.js',
-                       [ 'name' => 'parserDefaults.json', 'callback' => function ( ResourceLoaderContext $context ) {
+                       [ 'name' => 'parserDefaults.json', 'callback' => function (
+                               ResourceLoaderContext $context, Config $config
+                       ) {
                                $tagData = Sanitizer::getRecognizedTagData();
                                $allowedHtmlElements = array_merge(
                                        array_keys( $tagData['htmlpairs'] ),
@@ -1537,7 +1539,7 @@ return [
                                );
 
                                $magicWords = [
-                                       'SITENAME' => $context->getConfig()->get( 'Sitename' ),
+                                       'SITENAME' => $config->get( 'Sitename' ),
                                ];
                                Hooks::run( 'ResourceLoaderJqueryMsgModuleMagicWords', [ $context, &$magicWords ] );
 
@@ -1966,6 +1968,8 @@ return [
                'lessMessages' => [
                        'parentheses-start',
                        'parentheses-end',
+                       'brackets-start',
+                       'brackets-end',
                        'pipe-separator'
                ],
                'skinStyles' => [
index 5d18fdf..09998da 100644 (file)
@@ -249,8 +249,8 @@ oojs-router:
 
 ooui:
   type: tar
-  src: https://registry.npmjs.org/oojs-ui/-/oojs-ui-0.33.3.tgz
-  integrity: sha384-eM78ktDU9DG7WIjxnAHWUsPa9VHCaltqLya4afg0C10gd+c5c5q9NJSnNdFgy76J
+  src: https://registry.npmjs.org/oojs-ui/-/oojs-ui-0.33.4.tgz
+  integrity: sha384-ZqQ9VxkRqt444Xthv89HNZB1PyM1SmNz+7gnC2HfaXUtBh+coJdXv7JxlaBjAouq
 
   dest:
     # Main stuff
index 60ef70c..c913a1d 100644 (file)
@@ -1,4 +1,11 @@
 # OOUI Release History
+## v0.33.4 / 2019-07-22
+### Styles
+* Frameless buttons should feature hover and active states (Volker E.)
+* Revert "WikimediaUI theme: Apply primary flag to ButtonWidget (frameless)" (Volker E.)
+* icons: Add 'bellOutline' and 'userAvatarOutline' and amend 'search' (Volker E.)
+
+
 ## v0.33.3 / 2019-07-16
 ### Styles
 * MessageWidget: Apply `bold` only to inline message types (Volker E.)
index b7f3f10..2a1984d 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOUI v0.33.3
+ * OOUI v0.33.4
  * https://www.mediawiki.org/wiki/OOUI
  *
  * Copyright 2011–2019 OOUI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2019-07-16T21:33:36Z
+ * Date: 2019-07-23T03:23:32Z
  */
 ( function ( OO ) {
 
index 5fe630e..e664153 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOUI v0.33.3
+ * OOUI v0.33.4
  * https://www.mediawiki.org/wiki/OOUI
  *
  * Copyright 2011–2019 OOUI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2019-07-16T21:33:43Z
+ * Date: 2019-07-23T03:23:40Z
  */
 .oo-ui-element-hidden {
   display: none !important;
 .oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button:focus > .oo-ui-labelElement-label {
   color: #000;
 }
+.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button:hover {
+  background-color: #fafafa;
+  color: #000;
+}
+.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button:active {
+  background-color: #ddd;
+  color: #000;
+}
 .oo-ui-buttonElement-frameless.oo-ui-labelElement:first-child,
 .oo-ui-buttonElement-frameless.oo-ui-iconElement:first-child {
   margin-left: -0.3125em;
index ccbda55..2b45f4e 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOUI v0.33.3
+ * OOUI v0.33.4
  * https://www.mediawiki.org/wiki/OOUI
  *
  * Copyright 2011–2019 OOUI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2019-07-16T21:33:43Z
+ * Date: 2019-07-23T03:23:40Z
  */
 .oo-ui-element-hidden {
   display: none !important;
   color: #222;
 }
 .oo-ui-buttonElement-frameless.oo-ui-widget-enabled > .oo-ui-buttonElement-button:hover {
+  background-color: #f8f9fa;
+  color: #000;
+}
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled > .oo-ui-buttonElement-button:active {
+  background-color: #eaecf0;
   color: #444;
 }
 .oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-iconElement > .oo-ui-buttonElement-button:focus,
   color: #b32424;
   box-shadow: none;
 }
-.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-progressive > .oo-ui-buttonElement-button {
-  color: #fff;
-  background-color: #36c;
-  border-color: #36c;
-}
-.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-progressive > .oo-ui-buttonElement-button:hover {
-  background-color: #447ff5;
-  border-color: #447ff5;
-}
-.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-progressive > .oo-ui-buttonElement-button:active,
-.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-progressive > .oo-ui-buttonElement-button:active:focus,
-.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-progressive.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button,
-.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-progressive.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
-.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-progressive.oo-ui-popupToolGroup-active > .oo-ui-buttonElement-button {
-  color: #fff;
-  background-color: #2a4b8d;
-  border-color: #2a4b8d;
-  box-shadow: none;
-}
-.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-progressive > .oo-ui-buttonElement-button:focus {
-  border-color: #36c;
-  box-shadow: inset 0 0 0 1px #36c, inset 0 0 0 2px #fff;
-}
-.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button {
-  color: #fff;
-  background-color: #d33;
-  border-color: #d33;
-}
-.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button:hover {
-  background-color: #ff4242;
-  border-color: #ff4242;
-}
-.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button:active,
-.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button:active:focus,
-.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-destructive.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button,
-.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-destructive.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
-.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-destructive.oo-ui-popupToolGroup-active > .oo-ui-buttonElement-button {
-  color: #fff;
-  background-color: #b32424;
-  border-color: #b32424;
-  box-shadow: none;
-}
-.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button:focus {
-  border-color: #d33;
-  box-shadow: inset 0 0 0 1px #d33, inset 0 0 0 2px #fff;
-}
 .oo-ui-buttonElement-frameless.oo-ui-widget-enabled[class*='oo-ui-flaggedElement'] > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon,
 .oo-ui-buttonElement-frameless.oo-ui-widget-enabled[class*='oo-ui-flaggedElement'] > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
   opacity: 1;
   padding-top: 1.42857143em;
   padding-right: 0;
 }
+.oo-ui-fieldLayout .oo-ui-fieldLayout-help .oo-ui-buttonElement-button:hover,
+.oo-ui-fieldLayout .oo-ui-fieldLayout-help .oo-ui-buttonElement-button:active {
+  background-color: transparent;
+}
 .oo-ui-fieldLayout.oo-ui-fieldLayout-align-top > .oo-ui-fieldLayout-body > .oo-ui-inline-help {
   margin-top: 0.28571429em;
 }
@@ -788,6 +751,10 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   padding-top: 1.42857143em;
   padding-right: 0;
 }
+.oo-ui-fieldsetLayout .oo-ui-fieldsetLayout-help .oo-ui-buttonElement-button:hover,
+.oo-ui-fieldsetLayout .oo-ui-fieldsetLayout-help .oo-ui-buttonElement-button:active {
+  background-color: transparent;
+}
 
 .oo-ui-formLayout + .oo-ui-fieldsetLayout,
 .oo-ui-formLayout + .oo-ui-formLayout {
index 213540f..a0bc401 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOUI v0.33.3
+ * OOUI v0.33.4
  * https://www.mediawiki.org/wiki/OOUI
  *
  * Copyright 2011–2019 OOUI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2019-07-16T21:33:36Z
+ * Date: 2019-07-23T03:23:32Z
  */
 ( function ( OO ) {
 
index d1db776..7b84493 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOUI v0.33.3
+ * OOUI v0.33.4
  * https://www.mediawiki.org/wiki/OOUI
  *
  * Copyright 2011–2019 OOUI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2019-07-16T21:33:43Z
+ * Date: 2019-07-23T03:23:40Z
  */
 .oo-ui-tool > .oo-ui-tool-link > .oo-ui-tool-checkIcon {
   display: none;
index cf0245d..63a3784 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOUI v0.33.3
+ * OOUI v0.33.4
  * https://www.mediawiki.org/wiki/OOUI
  *
  * Copyright 2011–2019 OOUI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2019-07-16T21:33:43Z
+ * Date: 2019-07-23T03:23:40Z
  */
 .oo-ui-tool {
   -webkit-box-sizing: border-box;
index d2a22ff..02b796d 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOUI v0.33.3
+ * OOUI v0.33.4
  * https://www.mediawiki.org/wiki/OOUI
  *
  * Copyright 2011–2019 OOUI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2019-07-16T21:33:36Z
+ * Date: 2019-07-23T03:23:32Z
  */
 ( function ( OO ) {
 
index e9845f3..eefee7b 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOUI v0.33.3
+ * OOUI v0.33.4
  * https://www.mediawiki.org/wiki/OOUI
  *
  * Copyright 2011–2019 OOUI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2019-07-16T21:33:43Z
+ * Date: 2019-07-23T03:23:40Z
  */
 .oo-ui-draggableElement-handle:not( .oo-ui-draggableElement-undraggable ).oo-ui-widget {
   cursor: move;
index 8305107..fb59c44 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOUI v0.33.3
+ * OOUI v0.33.4
  * https://www.mediawiki.org/wiki/OOUI
  *
  * Copyright 2011–2019 OOUI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2019-07-16T21:33:43Z
+ * Date: 2019-07-23T03:23:40Z
  */
 .oo-ui-draggableElement-handle:not( .oo-ui-draggableElement-undraggable ).oo-ui-widget {
   cursor: move;
index 722f6dd..1f5ca65 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOUI v0.33.3
+ * OOUI v0.33.4
  * https://www.mediawiki.org/wiki/OOUI
  *
  * Copyright 2011–2019 OOUI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2019-07-16T21:33:36Z
+ * Date: 2019-07-23T03:23:32Z
  */
 ( function ( OO ) {
 
index 56f7ea4..7a67cce 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOUI v0.33.3
+ * OOUI v0.33.4
  * https://www.mediawiki.org/wiki/OOUI
  *
  * Copyright 2011–2019 OOUI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2019-07-16T21:33:36Z
+ * Date: 2019-07-23T03:23:32Z
  */
 ( function ( OO ) {
 
index b54b053..f0c4b64 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOUI v0.33.3
+ * OOUI v0.33.4
  * https://www.mediawiki.org/wiki/OOUI
  *
  * Copyright 2011–2019 OOUI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2019-07-16T21:33:43Z
+ * Date: 2019-07-23T03:23:40Z
  */
 
 .oo-ui-window {
index a80f293..617599d 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOUI v0.33.3
+ * OOUI v0.33.4
  * https://www.mediawiki.org/wiki/OOUI
  *
  * Copyright 2011–2019 OOUI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2019-07-16T21:33:43Z
+ * Date: 2019-07-23T03:23:40Z
  */
 
 .oo-ui-window {
index de7e45d..d6f9989 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOUI v0.33.3
+ * OOUI v0.33.4
  * https://www.mediawiki.org/wiki/OOUI
  *
  * Copyright 2011–2019 OOUI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2019-07-16T21:33:36Z
+ * Date: 2019-07-23T03:23:32Z
  */
 ( function ( OO ) {
 
index 8e440cb..c8111a2 100644 (file)
@@ -8,6 +8,9 @@
                "bell": {
                        "file": "../wikimediaui/images/icons/bell.svg"
                },
+               "bellOutline": {
+                       "file": "../wikimediaui/images/icons/bellOutline.svg"
+               },
                "error": {
                        "file": "../wikimediaui/images/icons/error.svg"
                },
index 89b38b5..e13bb1d 100644 (file)
@@ -8,6 +8,9 @@
                "userAvatar": {
                        "file": "../wikimediaui/images/icons/userAvatar.svg"
                },
+               "userAvatarOutline": {
+                       "file": "../wikimediaui/images/icons/userAvatarOutline.svg"
+               },
                "userTalk": {
                        "file": {
                                "ltr": "../wikimediaui/images/icons/userTalk-ltr.svg",
index 2b315c8..627c6ef 100644 (file)
@@ -34,6 +34,9 @@
                "bell": {
                        "file": "images/icons/bell.svg"
                },
+               "bellOutline": {
+                       "file": "images/icons/bellOutline.svg"
+               },
                "error": {
                        "file": "images/icons/error.svg",
                        "variants": [
index 0e4fe16..7266d34 100644 (file)
@@ -31,6 +31,9 @@
                "userAvatar": {
                        "file": "images/icons/userAvatar.svg"
                },
+               "userAvatarOutline": {
+                       "file": "images/icons/userAvatarOutline.svg"
+               },
                "userTalk": {
                        "file": {
                                "ltr": "images/icons/userTalk-ltr.svg",
diff --git a/resources/lib/ooui/themes/wikimediaui/images/icons/bellOutline-invert.png b/resources/lib/ooui/themes/wikimediaui/images/icons/bellOutline-invert.png
new file mode 100644 (file)
index 0000000..65a31fb
Binary files /dev/null and b/resources/lib/ooui/themes/wikimediaui/images/icons/bellOutline-invert.png differ
diff --git a/resources/lib/ooui/themes/wikimediaui/images/icons/bellOutline-invert.svg b/resources/lib/ooui/themes/wikimediaui/images/icons/bellOutline-invert.svg
new file mode 100644 (file)
index 0000000..b1b7c8a
--- /dev/null
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"><title>bell</title><path fill="#fff" fill-rule="evenodd" d="M11.5 2.19C14.09 2.86 16 5.2 16 8v6l2 2v1H2v-1l2-2V8c0-2.8 1.91-5.14 4.5-5.81V1.5C8.5.67 9.17 0 10 0s1.5.67 1.5 1.5v.69zM10 4C7.79 4 6 5.79 6 8v7h8V8c0-2.21-1.79-4-4-4zM8 18h4c0 1.1-.9 2-2 2s-2-.9-2-2z"/></svg>
\ No newline at end of file
diff --git a/resources/lib/ooui/themes/wikimediaui/images/icons/bellOutline-progressive.png b/resources/lib/ooui/themes/wikimediaui/images/icons/bellOutline-progressive.png
new file mode 100644 (file)
index 0000000..984c582
Binary files /dev/null and b/resources/lib/ooui/themes/wikimediaui/images/icons/bellOutline-progressive.png differ
diff --git a/resources/lib/ooui/themes/wikimediaui/images/icons/bellOutline-progressive.svg b/resources/lib/ooui/themes/wikimediaui/images/icons/bellOutline-progressive.svg
new file mode 100644 (file)
index 0000000..4525006
--- /dev/null
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"><title>bell</title><path fill="#36c" fill-rule="evenodd" d="M11.5 2.19C14.09 2.86 16 5.2 16 8v6l2 2v1H2v-1l2-2V8c0-2.8 1.91-5.14 4.5-5.81V1.5C8.5.67 9.17 0 10 0s1.5.67 1.5 1.5v.69zM10 4C7.79 4 6 5.79 6 8v7h8V8c0-2.21-1.79-4-4-4zM8 18h4c0 1.1-.9 2-2 2s-2-.9-2-2z"/></svg>
\ No newline at end of file
diff --git a/resources/lib/ooui/themes/wikimediaui/images/icons/bellOutline.png b/resources/lib/ooui/themes/wikimediaui/images/icons/bellOutline.png
new file mode 100644 (file)
index 0000000..c5ac8fb
Binary files /dev/null and b/resources/lib/ooui/themes/wikimediaui/images/icons/bellOutline.png differ
diff --git a/resources/lib/ooui/themes/wikimediaui/images/icons/bellOutline.svg b/resources/lib/ooui/themes/wikimediaui/images/icons/bellOutline.svg
new file mode 100644 (file)
index 0000000..3d6a721
--- /dev/null
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"><title>bell</title><path fill-rule="evenodd" d="M11.5 2.19C14.09 2.86 16 5.2 16 8v6l2 2v1H2v-1l2-2V8c0-2.8 1.91-5.14 4.5-5.81V1.5C8.5.67 9.17 0 10 0s1.5.67 1.5 1.5v.69zM10 4C7.79 4 6 5.79 6 8v7h8V8c0-2.21-1.79-4-4-4zM8 18h4c0 1.1-.9 2-2 2s-2-.9-2-2z"/></svg>
\ No newline at end of file
index 91dc0c4..75a663c 100644 (file)
Binary files a/resources/lib/ooui/themes/wikimediaui/images/icons/search-invert.png and b/resources/lib/ooui/themes/wikimediaui/images/icons/search-invert.png differ
index 16c3438..f736c95 100644 (file)
@@ -1 +1 @@
-<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"><title>search</title><path fill="#fff" d="M19 17l-5.15-5.15a7 7 0 1 0-2 2L17 19zM3.5 8A4.5 4.5 0 1 1 8 12.5 4.5 4.5 0 0 1 3.5 8z"/></svg>
\ No newline at end of file
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"><title>search</title><path fill="#fff" d="M7.5 13c3.04 0 5.5-2.46 5.5-5.5S10.54 2 7.5 2 2 4.46 2 7.5 4.46 13 7.5 13zm4.55.46A7.432 7.432 0 0 1 7.5 15C3.36 15 0 11.64 0 7.5S3.36 0 7.5 0C11.64 0 15 3.36 15 7.5c0 1.71-.57 3.29-1.54 4.55l6.49 6.49-1.41 1.41-6.49-6.49z"/></svg>
\ No newline at end of file
index e410eca..5644489 100644 (file)
Binary files a/resources/lib/ooui/themes/wikimediaui/images/icons/search-progressive.png and b/resources/lib/ooui/themes/wikimediaui/images/icons/search-progressive.png differ
index 789999d..4c5ed6f 100644 (file)
@@ -1 +1 @@
-<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"><title>search</title><path fill="#36c" d="M19 17l-5.15-5.15a7 7 0 1 0-2 2L17 19zM3.5 8A4.5 4.5 0 1 1 8 12.5 4.5 4.5 0 0 1 3.5 8z"/></svg>
\ No newline at end of file
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"><title>search</title><path fill="#36c" d="M7.5 13c3.04 0 5.5-2.46 5.5-5.5S10.54 2 7.5 2 2 4.46 2 7.5 4.46 13 7.5 13zm4.55.46A7.432 7.432 0 0 1 7.5 15C3.36 15 0 11.64 0 7.5S3.36 0 7.5 0C11.64 0 15 3.36 15 7.5c0 1.71-.57 3.29-1.54 4.55l6.49 6.49-1.41 1.41-6.49-6.49z"/></svg>
\ No newline at end of file
index fe88ca2..e633273 100644 (file)
Binary files a/resources/lib/ooui/themes/wikimediaui/images/icons/search.png and b/resources/lib/ooui/themes/wikimediaui/images/icons/search.png differ
index 293f53f..b304da6 100644 (file)
@@ -1 +1 @@
-<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"><title>search</title><path d="M19 17l-5.15-5.15a7 7 0 1 0-2 2L17 19zM3.5 8A4.5 4.5 0 1 1 8 12.5 4.5 4.5 0 0 1 3.5 8z"/></svg>
\ No newline at end of file
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"><title>search</title><path d="M7.5 13c3.04 0 5.5-2.46 5.5-5.5S10.54 2 7.5 2 2 4.46 2 7.5 4.46 13 7.5 13zm4.55.46A7.432 7.432 0 0 1 7.5 15C3.36 15 0 11.64 0 7.5S3.36 0 7.5 0C11.64 0 15 3.36 15 7.5c0 1.71-.57 3.29-1.54 4.55l6.49 6.49-1.41 1.41-6.49-6.49z"/></svg>
\ No newline at end of file
diff --git a/resources/lib/ooui/themes/wikimediaui/images/icons/userAvatarOutline-invert.png b/resources/lib/ooui/themes/wikimediaui/images/icons/userAvatarOutline-invert.png
new file mode 100644 (file)
index 0000000..b5689de
Binary files /dev/null and b/resources/lib/ooui/themes/wikimediaui/images/icons/userAvatarOutline-invert.png differ
diff --git a/resources/lib/ooui/themes/wikimediaui/images/icons/userAvatarOutline-invert.svg b/resources/lib/ooui/themes/wikimediaui/images/icons/userAvatarOutline-invert.svg
new file mode 100644 (file)
index 0000000..3db6aca
--- /dev/null
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="utf-8"?><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"><title>user avatar</title><path fill="#fff" d="M10 8c1.7 0 3.06-1.35 3.06-3S11.7 2 10 2 6.94 3.35 6.94 5 8.3 8 10 8zm0 2c-2.8 0-5.06-2.24-5.06-5S7.2 0 10 0s5.06 2.24 5.06 5-2.26 5-5.06 5zm-7 8h14v-1.33c0-1.75-2.31-3.56-7-3.56s-7 1.81-7 3.56V18zm7-6.89c6.66 0 9 3.33 9 5.56V20H1v-3.33c0-2.23 2.34-5.56 9-5.56z"/></svg>
\ No newline at end of file
diff --git a/resources/lib/ooui/themes/wikimediaui/images/icons/userAvatarOutline-progressive.png b/resources/lib/ooui/themes/wikimediaui/images/icons/userAvatarOutline-progressive.png
new file mode 100644 (file)
index 0000000..5bb95db
Binary files /dev/null and b/resources/lib/ooui/themes/wikimediaui/images/icons/userAvatarOutline-progressive.png differ
diff --git a/resources/lib/ooui/themes/wikimediaui/images/icons/userAvatarOutline-progressive.svg b/resources/lib/ooui/themes/wikimediaui/images/icons/userAvatarOutline-progressive.svg
new file mode 100644 (file)
index 0000000..c14e3e7
--- /dev/null
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="utf-8"?><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"><title>user avatar</title><path fill="#36c" d="M10 8c1.7 0 3.06-1.35 3.06-3S11.7 2 10 2 6.94 3.35 6.94 5 8.3 8 10 8zm0 2c-2.8 0-5.06-2.24-5.06-5S7.2 0 10 0s5.06 2.24 5.06 5-2.26 5-5.06 5zm-7 8h14v-1.33c0-1.75-2.31-3.56-7-3.56s-7 1.81-7 3.56V18zm7-6.89c6.66 0 9 3.33 9 5.56V20H1v-3.33c0-2.23 2.34-5.56 9-5.56z"/></svg>
\ No newline at end of file
diff --git a/resources/lib/ooui/themes/wikimediaui/images/icons/userAvatarOutline.png b/resources/lib/ooui/themes/wikimediaui/images/icons/userAvatarOutline.png
new file mode 100644 (file)
index 0000000..cd9b4fe
Binary files /dev/null and b/resources/lib/ooui/themes/wikimediaui/images/icons/userAvatarOutline.png differ
diff --git a/resources/lib/ooui/themes/wikimediaui/images/icons/userAvatarOutline.svg b/resources/lib/ooui/themes/wikimediaui/images/icons/userAvatarOutline.svg
new file mode 100644 (file)
index 0000000..1f0d41d
--- /dev/null
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="utf-8"?><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"><title>user avatar</title><path d="M10 8c1.7 0 3.06-1.35 3.06-3S11.7 2 10 2 6.94 3.35 6.94 5 8.3 8 10 8zm0 2c-2.8 0-5.06-2.24-5.06-5S7.2 0 10 0s5.06 2.24 5.06 5-2.26 5-5.06 5zm-7 8h14v-1.33c0-1.75-2.31-3.56-7-3.56s-7 1.81-7 3.56V18zm7-6.89c6.66 0 9 3.33 9 5.56V20H1v-3.33c0-2.23 2.34-5.56 9-5.56z"/></svg>
\ No newline at end of file
index a0e9f15..59eca6b 100644 (file)
@@ -8,6 +8,16 @@
        content: '. .';
 }
 
+.mw-rollback-link {
+       &:before {
+               content: '@{msg-brackets-start}';
+       }
+
+       &:after {
+               content: '@{msg-brackets-end}';
+       }
+}
+
 /* stylelint-disable-next-line selector-class-pattern */
 .comment--without-parentheses,
 .mw-changeslist-links,
        > span:not( :first-child ):before {
                content: '@{msg-pipe-separator}';
        }
+
+       // In pages like history, do not add additional brackets where not needed
+       .mw-rollback-link:before,
+       .mw-rollback-link:after {
+               content: '';
+       }
 }
index 43a333c..5f7746b 100644 (file)
@@ -36,7 +36,8 @@ abstract class MediaWikiUnitTestCase extends TestCase {
        protected function setUp() {
                parent::setUp();
                $reflection = new ReflectionClass( $this );
-               if ( strpos( $reflection->getFilename(), '/unit/' ) === false ) {
+               $dirSeparator = DIRECTORY_SEPARATOR;
+               if ( strpos( $reflection->getFilename(), "${dirSeparator}unit${dirSeparator}" ) === false ) {
                        $this->fail( 'This unit test needs to be in "tests/phpunit/unit" !' );
                }
                $this->unitGlobals = $GLOBALS;
index f555812..4a0857f 100644 (file)
@@ -1,12 +1,12 @@
 == MediaWiki PHPUnit Tests ==
 
-The unit tests for MediaWiki are implemented using the PHPUnit testing
+The unit and integration tests for MediaWiki are implemented using the PHPUnit testing
 framework and require PHPUnit to run.
 
 
 === WARNING ===
 
-Some of the unit tests are DESTRUCTIVE and WILL ALTER YOUR WIKI'S CONTENTS.
+Some of the integration tests are DESTRUCTIVE and WILL ALTER YOUR WIKI'S CONTENTS.
 
 DO NOT RUN THESE TESTS ON A PRODUCTION SYSTEM OR ON ANY SYSTEM WHERE YOU NEED
 TO RETAIN YOUR DATA.
diff --git a/tests/phpunit/TODO b/tests/phpunit/TODO
deleted file mode 100644 (file)
index cd9b9e2..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-== Things To Do ==
-
-* Most of the tests are named poorly;
-  naming should describe a use case in story-like language,
-  not simply identify the unit under test.
-  An example would be the difference between "testCalculate"
-  and "testAddingIntegersTogetherWorks".
-
-* Many of the tests make multiple assertions, and are thus not unitary tests.
-  By using data-providers and more use-case oriented test selection
-  nearly all of these cases can be easily resolved.
-
-* Some of the test files are either incorrectly named or in the wrong folder.
-  Tests should be organized in a mirrored structure to the source they are testing,
-  and named the same, with the exception of the word "Test" at the end.
-
-* Shared set-up code or base classes are present,
-  but usually named improperly or appear to be poorly factored.
-  Support code should share as much of the same naming  as the code it's supporting,
-  and test and test-case depenencies should be considered to resolve other shared needs.
index 1210a50..660734e 100644 (file)
@@ -716,6 +716,7 @@ class GlobalTest extends MediaWikiTestCase {
         */
        public function testWfGlobalCacheKey() {
                $cache = ObjectCache::getLocalClusterInstance();
+               $this->hideDeprecated( 'wfGlobalCacheKey' );
                $this->assertEquals(
                        $cache->makeGlobalKey( 'foo', 123, 'bar' ),
                        wfGlobalCacheKey( 'foo', 123, 'bar' )
index 5b015b3..8a98217 100644 (file)
@@ -3,21 +3,25 @@
 namespace MediaWiki\Tests\Permissions;
 
 use Action;
+use ContentHandler;
 use FauxRequest;
-use MediaWiki\Session\SessionId;
-use MediaWiki\Session\TestUtils;
-use MediaWikiLangTestCase;
-use RequestContext;
-use stdClass;
-use Title;
-use User;
 use MediaWiki\Block\DatabaseBlock;
 use MediaWiki\Block\Restriction\NamespaceRestriction;
 use MediaWiki\Block\Restriction\PageRestriction;
 use MediaWiki\Block\SystemBlock;
+use MediaWiki\Linker\LinkTarget;
 use MediaWiki\MediaWikiServices;
 use MediaWiki\Permissions\PermissionManager;
+use MediaWiki\Revision\MutableRevisionRecord;
+use MediaWiki\Revision\RevisionLookup;
 use Wikimedia\ScopedCallback;
+use MediaWiki\Session\SessionId;
+use MediaWiki\Session\TestUtils;
+use MediaWikiLangTestCase;
+use RequestContext;
+use stdClass;
+use Title;
+use User;
 use Wikimedia\TestingAccessWrapper;
 
 /**
@@ -698,6 +702,64 @@ class PermissionManagerTest extends MediaWikiLangTestCase {
                );
        }
 
+       public function testJsConfigRedirectEditPermissions() {
+               $revision = null;
+               $user = $this->getTestUser()->getUser();
+               $otherUser = $this->getTestUser( 'sysop' )->getUser();
+               $localJsTitle = Title::newFromText( 'User:' . $user->getName() . '/foo.js' );
+               $otherLocalJsTitle = Title::newFromText( 'User:' . $user->getName() . '/foo2.js' );
+               $nonlocalJsTitle = Title::newFromText( 'User:' . $otherUser->getName() . '/foo.js' );
+
+               $services = MediaWikiServices::getInstance();
+               $revisionLookup = $this->getMockBuilder( RevisionLookup::class )
+                       ->setMethods( [ 'getRevisionByTitle' ] )
+                       ->getMockForAbstractClass();
+               $revisionLookup->method( 'getRevisionByTitle' )
+                       ->willReturnCallback( function ( LinkTarget $page ) use (
+                               $services, &$revision, $localJsTitle
+                       ) {
+                               if ( $localJsTitle->equals( Title::newFromLinkTarget( $page ) ) ) {
+                                       return $revision;
+                               } else {
+                                       return $services->getRevisionLookup()->getRevisionByTitle( $page );
+                               }
+                       } );
+               $permissionManager = new PermissionManager(
+                       $services->getSpecialPageFactory(),
+                       $revisionLookup,
+                       [],
+                       [],
+                       false,
+                       false,
+                       [],
+                       [],
+                       [],
+                       MediaWikiServices::getInstance()->getNamespaceInfo()
+               );
+               $this->setService( 'PermissionManager', $permissionManager );
+
+               $permissionManager->overrideUserRightsForTesting( $user, [ 'edit', 'editmyuserjs' ] );
+
+               $revision = $this->getJavascriptRevision( $localJsTitle, $user, '/* script */' );
+               $errors = $permissionManager->getPermissionErrors( 'edit', $user, $localJsTitle );
+               $this->assertSame( [], $errors );
+
+               $revision = $this->getJavascriptRedirectRevision( $localJsTitle, $otherLocalJsTitle, $user );
+               $errors = $permissionManager->getPermissionErrors( 'edit', $user, $localJsTitle );
+               $this->assertSame( [], $errors );
+
+               $revision = $this->getJavascriptRedirectRevision( $localJsTitle, $nonlocalJsTitle, $user );
+               $errors = $permissionManager->getPermissionErrors( 'edit', $user, $localJsTitle );
+               $this->assertSame( [ [ 'mycustomjsredirectprotected', 'edit' ] ], $errors );
+
+               $permissionManager->overrideUserRightsForTesting( $user,
+                       [ 'edit', 'editmyuserjs', 'editmyuserjsredirect' ] );
+
+               $revision = $this->getJavascriptRedirectRevision( $localJsTitle, $nonlocalJsTitle, $user );
+               $errors = $permissionManager->getPermissionErrors( 'edit', $user, $localJsTitle );
+               $this->assertSame( [], $errors );
+       }
+
        /**
         * @todo This test method should be split up into separate test methods and
         * data providers
@@ -1683,4 +1745,35 @@ class PermissionManagerTest extends MediaWikiLangTestCase {
                $this->assertFalse( $permissionManager->userHasRight( $this->user, 'move' ) );
        }
 
+       /**
+        * Create a RevisionRecord with a single Javascript main slot.
+        * @param Title $title
+        * @param User $user
+        * @param string $text
+        * @return MutableRevisionRecord
+        */
+       private function getJavascriptRevision( Title $title, User $user, $text ) {
+               $content = ContentHandler::makeContent( $text, $title, CONTENT_MODEL_JAVASCRIPT );
+               $revision = new MutableRevisionRecord( $title );
+               $revision->setContent( 'main', $content );
+               return $revision;
+       }
+
+       /**
+        * Create a RevisionRecord with a single Javascript redirect main slot.
+        * @param Title $title
+        * @param Title $redirectTargetTitle
+        * @param User $user
+        * @return MutableRevisionRecord
+        */
+       private function getJavascriptRedirectRevision(
+               Title $title, Title $redirectTargetTitle, User $user
+       ) {
+               $content = ContentHandler::getForModelID( CONTENT_MODEL_JAVASCRIPT )
+                       ->makeRedirectContent( $redirectTargetTitle );
+               $revision = new MutableRevisionRecord( $title );
+               $revision->setContent( 'main', $content );
+               return $revision;
+       }
+
 }
index 2d141e6..83e8d85 100644 (file)
@@ -1468,7 +1468,7 @@ abstract class RevisionDbTestBase extends MediaWikiTestCase {
                        $rev->getPage(),
                        $rev->getId()
                );
-               $cache->delete( $key, WANObjectCache::HOLDOFF_NONE );
+               $cache->delete( $key, WANObjectCache::HOLDOFF_TTL_NONE );
                $this->assertFalse( $cache->get( $key ) );
 
                ++$now;
diff --git a/tests/phpunit/includes/api/ApiCSPReportTest.php b/tests/phpunit/includes/api/ApiCSPReportTest.php
new file mode 100644 (file)
index 0000000..b3e0543
--- /dev/null
@@ -0,0 +1,120 @@
+<?php
+
+/**
+ * @group API
+ * @group medium
+ * @covers ApiCSPReport
+ */
+class ApiCSPReportTest extends MediaWikiIntegrationTestCase {
+
+       public function setUp() {
+               parent::setUp();
+               $this->setMwGlobals( [
+                       'CSPFalsePositiveUrls' => [],
+               ] );
+       }
+
+       public function testInternalReportonly() {
+               $params = [
+                       'reportonly' => '1',
+                       'source' => 'internal',
+               ];
+               $cspReport = [
+                       'document-uri' => 'https://doc.test/path',
+                       'referrer' => 'https://referrer.test/path',
+                       'violated-directive' => 'connet-src',
+                       'disposition' => 'report',
+                       'blocked-uri' => 'https://blocked.test/path?query',
+                       'line-number' => 4,
+                       'column-number' => 2,
+                       'source-file' => 'https://source.test/path?query',
+               ];
+
+               $log = $this->doExecute( $params, $cspReport );
+
+               $this->assertEquals(
+                       [
+                               [
+                                       '[report-only] Received CSP report: ' .
+                                               '<https://blocked.test> blocked from being loaded on <https://doc.test/path>:4',
+                                       [
+                                               'method' => 'ApiCSPReport::execute',
+                                               'user_id' => 'logged-out',
+                                               'user-agent' => 'Test/0.0',
+                                               'source' => 'internal'
+                                       ]
+                               ],
+                       ],
+                       $log,
+                       'logged messages'
+               );
+       }
+
+       public function testFalsePositiveOriginMatch() {
+               $params = [
+                       'reportonly' => '1',
+                       'source' => 'internal',
+               ];
+               $cspReport = [
+                       'document-uri' => 'https://doc.test/path',
+                       'referrer' => 'https://referrer.test/path',
+                       'violated-directive' => 'connet-src',
+                       'disposition' => 'report',
+                       'blocked-uri' => 'https://blocked.test/path/file?query',
+                       'line-number' => 4,
+                       'column-number' => 2,
+                       'source-file' => 'https://source.test/path/file?query',
+               ];
+
+               $this->setMwGlobals( [
+                       'wgCSPFalsePositiveUrls' => [
+                               'https://blocked.test/path/' => true,
+                       ],
+               ] );
+               $log = $this->doExecute( $params, $cspReport );
+
+               $this->assertSame(
+                       [],
+                       $log,
+                       'logged messages'
+               );
+       }
+
+       private function doExecute( array $params, array $cspReport ) {
+               $log = [];
+               $logger = $this->createMock( Psr\Log\AbstractLogger::class );
+               $logger->method( 'warning' )->will( $this->returnCallback(
+                       function ( $msg, $ctx ) use ( &$log ) {
+                               unset( $ctx['csp-report'] );
+                               $log[] = [ $msg, $ctx ];
+                       }
+               ) );
+               $this->setLogger( 'csp-report-only', $logger );
+
+               $postBody = json_encode( [ 'csp-report' => $cspReport ] );
+               $req = $this->getMockBuilder( FauxRequest::class )
+                       ->setMethods( [ 'getRawInput' ] )
+                       ->setConstructorArgs( [ $params, /* $wasPosted */ true ] )
+                       ->getMock();
+               $req->method( 'getRawInput' )->willReturn( $postBody );
+               $req->setHeaders( [
+                       'Content-Type' => 'application/csp-report',
+                       'User-Agent' => 'Test/0.0'
+               ] );
+
+               $api = $this->getMockBuilder( ApiCSPReport::class )
+                       ->disableOriginalConstructor()
+                       ->setMethods( [ 'getParameter', 'getRequest', 'getResult' ] )
+                       ->getMock();
+               $api->method( 'getParameter' )->will( $this->returnCallback(
+                       function ( $key ) use ( $req ) {
+                               return $req->getRawVal( $key );
+                       }
+               ) );
+               $api->method( 'getRequest' )->willReturn( $req );
+               $api->method( 'getResult' )->willReturn( new ApiResult( false ) );
+
+               $api->execute();
+               return $log;
+       }
+}
index 708ebc5..93c5345 100644 (file)
@@ -54,7 +54,7 @@ class ApiQuerySearchTest extends ApiTestCase {
                        'one wiki response' => [
                                [ 'utwiki' => [ 'Qwerty' ] ],
                                [
-                                       SearchResultSet::SECONDARY_RESULTS => [
+                                       ISearchResultSet::SECONDARY_RESULTS => [
                                                'utwiki' => new MockSearchResultSet( [
                                                        $this->mockResultClosure(
                                                                'Qwerty',
index 6d831f6..4f875ce 100644 (file)
@@ -336,15 +336,6 @@ 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' => $userName ] );
-               $req->password = 'FooBar';
-               $this->assertEquals(
-                       AuthenticationResponse::newPass( $userName ),
-                       $provider->beginPrimaryAuthentication( $reqs )
-               );
-
                $this->config->set( 'PasswordSalt', true );
                $password = md5( "$id-" . md5( 'FooBar' ) );
                $dbw->update( 'user', [ 'user_password' => $password ], [ 'user_name' => $userName ] );
index fe3bb88..f42777c 100644 (file)
@@ -2,9 +2,11 @@
 
 use MediaWiki\Block\BlockManager;
 use MediaWiki\Block\DatabaseBlock;
+use MediaWiki\Block\CompositeBlock;
 use MediaWiki\Block\SystemBlock;
 use MediaWiki\Config\ServiceOptions;
 use MediaWiki\MediaWikiServices;
+use Wikimedia\TestingAccessWrapper;
 
 /**
  * @group Blocking
@@ -63,26 +65,23 @@ class BlockManagerTest extends MediaWikiTestCase {
         * @covers ::shouldApplyCookieBlock
         */
        public function testGetBlockFromCookieValue( $options, $expected ) {
-               $blockManager = $this->getBlockManager( [
-                       'wgCookieSetOnAutoblock' => true,
-                       'wgCookieSetOnIpBlock' => true,
-               ] );
+               $blockManager = TestingAccessWrapper::newFromObject(
+                       $this->getBlockManager( [
+                               'wgCookieSetOnAutoblock' => true,
+                               'wgCookieSetOnIpBlock' => true,
+                       ] )
+               );
 
                $block = new DatabaseBlock( array_merge( [
-                       'address' => $options[ 'target' ] ?: $this->user,
+                       'address' => $options['target'] ?: $this->user,
                        'by' => $this->sysopId,
-               ], $options[ 'blockOptions' ] ) );
+               ], $options['blockOptions'] ) );
                $block->insert();
 
-               $class = new ReflectionClass( BlockManager::class );
-               $method = $class->getMethod( 'getBlockFromCookieValue' );
-               $method->setAccessible( true );
-
-               $user = $options[ 'loggedIn' ] ? $this->user : new User();
+               $user = $options['loggedIn'] ? $this->user : new User();
                $user->getRequest()->setCookie( 'BlockID', $block->getCookieValue() );
 
-               $this->assertSame( $expected, (bool)$method->invoke(
-                       $blockManager,
+               $this->assertSame( $expected, (bool)$blockManager->getBlockFromCookieValue(
                        $user,
                        $user->getRequest()
                ) );
@@ -142,16 +141,14 @@ class BlockManagerTest extends MediaWikiTestCase {
         * @covers ::isLocallyBlockedProxy
         */
        public function testIsLocallyBlockedProxy( $proxyList, $expected ) {
-               $class = new ReflectionClass( BlockManager::class );
-               $method = $class->getMethod( 'isLocallyBlockedProxy' );
-               $method->setAccessible( true );
-
-               $blockManager = $this->getBlockManager( [
-                       'wgProxyList' => $proxyList
-               ] );
+               $blockManager = TestingAccessWrapper::newFromObject(
+                       $this->getBlockManager( [
+                               'wgProxyList' => $proxyList
+                       ] )
+               );
 
                $ip = '1.2.3.4';
-               $this->assertSame( $expected, $method->invoke( $blockManager, $ip ) );
+               $this->assertSame( $expected, $blockManager->isLocallyBlockedProxy( $ip ) );
        }
 
        public static function provideIsLocallyBlockedProxy() {
@@ -163,29 +160,6 @@ class BlockManagerTest extends MediaWikiTestCase {
                ];
        }
 
-       /**
-        * @covers ::isLocallyBlockedProxy
-        */
-       public function testIsLocallyBlockedProxyDeprecated() {
-               $proxy = '1.2.3.4';
-
-               $this->hideDeprecated(
-                       'IP addresses in the keys of $wgProxyList (found the following IP ' .
-                       'addresses in keys: ' . $proxy . ', please move them to values)'
-               );
-
-               $class = new ReflectionClass( BlockManager::class );
-               $method = $class->getMethod( 'isLocallyBlockedProxy' );
-               $method->setAccessible( true );
-
-               $blockManager = $this->getBlockManager( [
-                       'wgProxyList' => [ $proxy => 'test' ]
-               ] );
-
-               $ip = '1.2.3.4';
-               $this->assertSame( true, $method->invoke( $blockManager, $ip ) );
-       }
-
        /**
         * @dataProvider provideIsDnsBlacklisted
         * @covers ::isDnsBlacklisted
@@ -202,9 +176,7 @@ class BlockManagerTest extends MediaWikiTestCase {
                        ->setConstructorArgs( $this->getBlockManagerConstructorArgs( $blockManagerConfig ) )
                        ->setMethods( [ 'checkHost' ] )
                        ->getMock();
-
-               $blockManager->expects( $this->any() )
-                       ->method( 'checkHost' )
+               $blockManager->method( 'checkHost' )
                        ->will( $this->returnValueMap( [ [
                                $options['dnsblQuery'],
                                $options['dnsblResponse'],
@@ -306,89 +278,406 @@ class BlockManagerTest extends MediaWikiTestCase {
        public function testGetUniqueBlocks() {
                $blockId = 100;
 
-               $class = new ReflectionClass( BlockManager::class );
-               $method = $class->getMethod( 'getUniqueBlocks' );
-               $method->setAccessible( true );
-
-               $blockManager = $this->getBlockManager( [] );
+               $blockManager = TestingAccessWrapper::newFromObject( $this->getBlockManager( [] ) );
 
                $block = $this->getMockBuilder( DatabaseBlock::class )
                        ->setMethods( [ 'getId' ] )
                        ->getMock();
-               $block->expects( $this->any() )
-                       ->method( 'getId' )
+               $block->method( 'getId' )
                        ->willReturn( $blockId );
 
                $autoblock = $this->getMockBuilder( DatabaseBlock::class )
                        ->setMethods( [ 'getParentBlockId', 'getType' ] )
                        ->getMock();
-               $autoblock->expects( $this->any() )
-                       ->method( 'getParentBlockId' )
+               $autoblock->method( 'getParentBlockId' )
                        ->willReturn( $blockId );
-               $autoblock->expects( $this->any() )
-                       ->method( 'getType' )
+               $autoblock->method( 'getType' )
                        ->willReturn( DatabaseBlock::TYPE_AUTO );
 
                $blocks = [ $block, $block, $autoblock, new SystemBlock() ];
 
-               $this->assertSame( 2, count( $method->invoke( $blockManager, $blocks ) ) );
+               $this->assertSame( 2, count( $blockManager->getUniqueBlocks( $blocks ) ) );
        }
 
        /**
-        * @covers ::trackBlockWithCookie
         * @dataProvider provideTrackBlockWithCookie
-        * @param bool $expectCookieSet
-        * @param bool $hasCookie
-        * @param bool $isBlocked
+        * @covers ::trackBlockWithCookie
         */
-       public function testTrackBlockWithCookie( $expectCookieSet, $hasCookie, $isBlocked ) {
-               $blockID = 123;
+       public function testTrackBlockWithCookie( $options, $expectedVal ) {
                $this->setMwGlobals( 'wgCookiePrefix', '' );
 
                $request = new FauxRequest();
-               if ( $hasCookie ) {
+               if ( $options['cookieSet'] ) {
                        $request->setCookie( 'BlockID', 'the value does not matter' );
                }
 
-               if ( $isBlocked ) {
-                       $block = $this->getMockBuilder( DatabaseBlock::class )
-                               ->setMethods( [ 'getType', 'getId' ] )
-                               ->getMock();
-                       $block->method( 'getType' )
-                               ->willReturn( DatabaseBlock::TYPE_IP );
-                       $block->method( 'getId' )
-                               ->willReturn( $blockID );
-               } else {
-                       $block = null;
-               }
-
                $user = $this->getMockBuilder( User::class )
                        ->setMethods( [ 'getBlock', 'getRequest' ] )
                        ->getMock();
                $user->method( 'getBlock' )
-                       ->willReturn( $block );
+                       ->willReturn( $options['block'] );
                $user->method( 'getRequest' )
                        ->willReturn( $request );
-               /** @var User $user */
 
                // Although the block cookie is set via DeferredUpdates, in command line mode updates are
                // processed immediately
-               $blockManager = $this->getBlockManager( [] );
+               $blockManager = $this->getBlockManager( [
+                       'wgSecretKey' => '',
+                       'wgCookieSetOnIpBlock' => true,
+               ] );
                $blockManager->trackBlockWithCookie( $user );
 
                /** @var FauxResponse $response */
                $response = $request->response();
-               $this->assertCount( $expectCookieSet ? 1 : 0, $response->getCookies() );
-               $this->assertEquals( $expectCookieSet ? $blockID : null, $response->getCookie( 'BlockID' ) );
+               $this->assertCount( $expectedVal ? 1 : 0, $response->getCookies() );
+               $this->assertEquals( $expectedVal ?: null, $response->getCookie( 'BlockID' ) );
        }
 
        public function provideTrackBlockWithCookie() {
+               $blockId = 123;
+               return [
+                       'Block cookie is already set; there is a trackable block' => [
+                               [
+                                       'cookieSet' => true,
+                                       'block' => $this->getTrackableBlock( $blockId ),
+                               ],
+                               null,
+                       ],
+                       'Block cookie is already set; there is no block' => [
+                               [
+                                       'cookieSet' => true,
+                                       'block' => null,
+                               ],
+                               null,
+                       ],
+                       'Block cookie is not yet set; there is no block' => [
+                               [
+                                       'cookieSet' => false,
+                                       'block' => null,
+                               ],
+                               null,
+                       ],
+                       'Block cookie is not yet set; there is a trackable block' => [
+                               [
+                                       'cookieSet' => false,
+                                       'block' => $this->getTrackableBlock( $blockId ),
+                               ],
+                               $blockId,
+                       ],
+                       'Block cookie is not yet set; there is a composite block with a trackable block' => [
+                               [
+                                       'cookieSet' => false,
+                                       'block' => new CompositeBlock( [
+                                               'originalBlocks' => [
+                                                       new SystemBlock(),
+                                                       $this->getTrackableBlock( $blockId ),
+                                               ]
+                                       ] ),
+                               ],
+                               $blockId,
+                       ],
+                       'Block cookie is not yet set; there is a composite block but no trackable block' => [
+                               [
+                                       'cookieSet' => false,
+                                       'block' => new CompositeBlock( [
+                                               'originalBlocks' => [
+                                                       new SystemBlock(),
+                                                       new SystemBlock(),
+                                               ]
+                                       ] ),
+                               ],
+                               null,
+                       ],
+               ];
+       }
+
+       private function getTrackableBlock( $blockId ) {
+               $block = $this->getMockBuilder( DatabaseBlock::class )
+                       ->setMethods( [ 'getType', 'getId' ] )
+                       ->getMock();
+               $block->method( 'getType' )
+                       ->willReturn( DatabaseBlock::TYPE_IP );
+               $block->method( 'getId' )
+                       ->willReturn( $blockId );
+               return $block;
+       }
+
+       /**
+        * @dataProvider provideSetBlockCookie
+        * @covers ::setBlockCookie
+        */
+       public function testSetBlockCookie( $expiryDelta, $expectedExpiryDelta ) {
+               $this->setMwGlobals( [
+                       'wgCookiePrefix' => '',
+               ] );
+
+               $request = new FauxRequest();
+               $response = $request->response();
+
+               $blockManager = $this->getBlockManager( [
+                       'wgSecretKey' => '',
+                       'wgCookieSetOnIpBlock' => true,
+               ] );
+
+               $now = wfTimestamp();
+
+               $block = new DatabaseBlock( [
+                       'expiry' => $expiryDelta === '' ? '' : $now + $expiryDelta
+               ] );
+               $blockManager->setBlockCookie( $block, $response );
+               $cookies = $response->getCookies();
+
+               $this->assertEquals(
+                       $now + $expectedExpiryDelta,
+                       $cookies['BlockID']['expire'],
+                       '',
+                       60 // Allow actual to be up to 60 seconds later than expected
+               );
+       }
+
+       public static function provideSetBlockCookie() {
+               // Maximum length of a block cookie, defined in BlockManager::setBlockCookie
+               $maxExpiryDelta = ( 24 * 60 * 60 );
+
+               $longExpiryDelta = ( 48 * 60 * 60 );
+               $shortExpiryDelta = ( 12 * 60 * 60 );
+
                return [
-                       // $expectCookieSet, $hasCookie, $isBlocked
-                       [ false, false, false ],
-                       [ false, true, false ],
-                       [ true, false, true ],
-                       [ false, true, true ],
+                       'Block has indefinite expiry' => [
+                               '',
+                               $maxExpiryDelta,
+                       ],
+                       'Block expiry is later than maximum cookie block expiry' => [
+                               $longExpiryDelta,
+                               $maxExpiryDelta,
+                       ],
+                       'Block expiry is sooner than maximum cookie block expiry' => [
+                               $shortExpiryDelta,
+                               $shortExpiryDelta,
+                       ],
                ];
        }
+
+       /**
+        * @covers ::shouldTrackBlockWithCookie
+        */
+       public function testShouldTrackBlockWithCookieSystemBlock() {
+               $blockManager = TestingAccessWrapper::newFromObject( $this->getBlockManager( [] ) );
+               $this->assertFalse( $blockManager->shouldTrackBlockWithCookie(
+                       new SystemBlock(),
+                       true
+               ) );
+       }
+
+       /**
+        * @dataProvider provideShouldTrackBlockWithCookie
+        * @covers ::shouldTrackBlockWithCookie
+        */
+       public function testShouldTrackBlockWithCookie( $options, $expected ) {
+               $block = $this->getMockBuilder( DatabaseBlock::class )
+                       ->setMethods( [ 'getType', 'isAutoblocking' ] )
+                       ->getMock();
+               $block->method( 'getType' )
+                       ->willReturn( $options['type'] );
+               if ( isset( $options['autoblocking'] ) ) {
+                       $block->method( 'isAutoblocking' )
+                               ->willReturn( $options['autoblocking'] );
+               }
+
+               $blockManager = TestingAccessWrapper::newFromObject(
+                       $this->getBlockManager( $options['blockManagerConfig'] )
+               );
+
+               $this->assertSame(
+                       $expected,
+                       $blockManager->shouldTrackBlockWithCookie( $block, $options['isAnon'] )
+               );
+       }
+
+       public static function provideShouldTrackBlockWithCookie() {
+               return [
+                       'IP block, anonymous user, IP block cookies enabled' => [
+                               [
+                                       'type' => DatabaseBlock::TYPE_IP,
+                                       'isAnon' => true,
+                                       'blockManagerConfig' => [ 'wgCookieSetOnIpBlock' => true ],
+                               ],
+                               true
+                       ],
+                       'IP range block, anonymous user, IP block cookies enabled' => [
+                               [
+                                       'type' => DatabaseBlock::TYPE_RANGE,
+                                       'isAnon' => true,
+                                       'blockManagerConfig' => [ 'wgCookieSetOnIpBlock' => true ],
+                               ],
+                               true
+                       ],
+                       'IP block, anonymous user, IP block cookies disabled' => [
+                               [
+                                       'type' => DatabaseBlock::TYPE_IP,
+                                       'isAnon' => true,
+                                       'blockManagerConfig' => [ 'wgCookieSetOnIpBlock' => false ],
+                               ],
+                               false
+                       ],
+                       'IP block, logged in user, IP block cookies enabled' => [
+                               [
+                                       'type' => DatabaseBlock::TYPE_IP,
+                                       'isAnon' => false,
+                                       'blockManagerConfig' => [ 'wgCookieSetOnIpBlock' => true ],
+                               ],
+                               false
+                       ],
+                       'User block, anonymous, autoblock cookies enabled, block is autoblocking' => [
+                               [
+                                       'type' => DatabaseBlock::TYPE_USER,
+                                       'isAnon' => true,
+                                       'blockManagerConfig' => [ 'wgCookieSetOnAutoblock' => true ],
+                                       'autoblocking' => true,
+                               ],
+                               false
+                       ],
+                       'User block, logged in, autoblock cookies enabled, block is autoblocking' => [
+                               [
+                                       'type' => DatabaseBlock::TYPE_USER,
+                                       'isAnon' => false,
+                                       'blockManagerConfig' => [ 'wgCookieSetOnAutoblock' => true ],
+                                       'autoblocking' => true,
+                               ],
+                               true
+                       ],
+                       'User block, logged in, autoblock cookies disabled, block is autoblocking' => [
+                               [
+                                       'type' => DatabaseBlock::TYPE_USER,
+                                       'isAnon' => false,
+                                       'blockManagerConfig' => [ 'wgCookieSetOnAutoblock' => false ],
+                                       'autoblocking' => true,
+                               ],
+                               false
+                       ],
+                       'User block, logged in, autoblock cookies enabled, block is not autoblocking' => [
+                               [
+                                       'type' => DatabaseBlock::TYPE_USER,
+                                       'isAnon' => false,
+                                       'blockManagerConfig' => [ 'wgCookieSetOnAutoblock' => true ],
+                                       'autoblocking' => false,
+                               ],
+                               false
+                       ],
+                       'Block type is autoblock' => [
+                               [
+                                       'type' => DatabaseBlock::TYPE_AUTO,
+                                       'isAnon' => true,
+                                       'blockManagerConfig' => [],
+                               ],
+                               false
+                       ]
+               ];
+       }
+
+       /**
+        * @covers ::clearBlockCookie
+        */
+       public function testClearBlockCookie() {
+               $this->setMwGlobals( [
+                       'wgCookiePrefix' => '',
+               ] );
+
+               $request = new FauxRequest();
+               $response = $request->response();
+               $response->setCookie( 'BlockID', '100' );
+               $this->assertSame( '100', $response->getCookie( 'BlockID' ) );
+
+               BlockManager::clearBlockCookie( $response );
+               $this->assertSame( '', $response->getCookie( 'BlockID' ) );
+       }
+
+       /**
+        * @dataProvider provideGetIdFromCookieValue
+        * @covers ::getIdFromCookieValue
+        */
+       public function testGetIdFromCookieValue( $options, $expected ) {
+               $blockManager = $this->getBlockManager( [
+                       'wgSecretKey' => $options['secretKey']
+               ] );
+               $this->assertEquals(
+                       $expected,
+                       $blockManager->getIdFromCookieValue( $options['cookieValue'] )
+               );
+       }
+
+       public static function provideGetIdFromCookieValue() {
+               $blockId = 100;
+               $secretKey = '123';
+               $hmac = MWCryptHash::hmac( $blockId, $secretKey, false );
+               return [
+                       'No secret key is set' => [
+                               [
+                                       'secretKey' => '',
+                                       'cookieValue' => $blockId,
+                                       'calculatedHmac' => MWCryptHash::hmac( $blockId, '', false ),
+                               ],
+                               $blockId,
+                       ],
+                       'Secret key is set and stored hmac is correct' => [
+                               [
+                                       'secretKey' => $secretKey,
+                                       'cookieValue' => $blockId . '!' . $hmac,
+                                       'calculatedHmac' => $hmac,
+                               ],
+                               $blockId,
+                       ],
+                       'Secret key is set and stored hmac is incorrect' => [
+                               [
+                                       'secretKey' => $secretKey,
+                                       'cookieValue' => $blockId . '!xyz',
+                                       'calculatedHmac' => $hmac,
+                               ],
+                               null,
+                       ],
+               ];
+       }
+
+       /**
+        * @dataProvider provideGetCookieValue
+        * @covers ::getCookieValue
+        */
+       public function testGetCookieValue( $options, $expected ) {
+               $blockManager = $this->getBlockManager( [
+                       'wgSecretKey' => $options['secretKey']
+               ] );
+
+               $block = $this->getMockBuilder( DatabaseBlock::class )
+                       ->setMethods( [ 'getId' ] )
+                       ->getMock();
+               $block->method( 'getId' )
+                       ->willReturn( $options['blockId'] );
+
+               $this->assertEquals(
+                       $expected,
+                       $blockManager->getCookieValue( $block )
+               );
+       }
+
+       public static function provideGetCookieValue() {
+               $blockId = 100;
+               return [
+                       'Secret key not set' => [
+                               [
+                                       'secretKey' => '',
+                                       'blockId' => $blockId,
+                                       'hmac' => MWCryptHash::hmac( $blockId, '', false ),
+                               ],
+                               $blockId,
+                       ],
+                       'Secret key set' => [
+                               [
+                                       'secretKey' => '123',
+                                       'blockId' => $blockId,
+                                       'hmac' => MWCryptHash::hmac( $blockId, '123', false ),
+                               ],
+                               $blockId . '!' . MWCryptHash::hmac( $blockId, '123', false ) ],
+               ];
+       }
+
 }
index 2fa662b..35dacac 100644 (file)
@@ -204,7 +204,7 @@ class MessageCacheTest extends MediaWikiLangTestCase {
                ];
        }
 
-       public function testNoDBAccess() {
+       public function testNoDBAccessContentLanguage() {
                global $wgContLanguageCode;
 
                $dbr = wfGetDB( DB_REPLICA );
@@ -218,7 +218,22 @@ class MessageCacheTest extends MediaWikiLangTestCase {
 
                $dbr->restoreFlags();
 
-               $this->assertEquals( 0, $dbr->trxLevel(), "No DB read queries" );
+               $this->assertEquals( 0, $dbr->trxLevel(), "No DB read queries (content language)" );
+       }
+
+       public function testNoDBAccessNonContentLanguage() {
+               $dbr = wfGetDB( DB_REPLICA );
+
+               MessageCache::singleton()->getMsgFromNamespace( 'allpages/nl', 'nl' );
+
+               $this->assertEquals( 0, $dbr->trxLevel() );
+               $dbr->setFlag( DBO_TRX, $dbr::REMEMBER_PRIOR ); // make queries trigger TRX
+
+               MessageCache::singleton()->getMsgFromNamespace( 'go/nl', 'nl' );
+
+               $dbr->restoreFlags();
+
+               $this->assertEquals( 0, $dbr->trxLevel(), "No DB read queries (non-content language)" );
        }
 
        /**
index da532b0..522af43 100644 (file)
@@ -6,6 +6,7 @@ use Wikimedia\TestingAccessWrapper;
 /**
  * @author Matthias Mullie <mmullie@wikimedia.org>
  * @group BagOStuff
+ * @covers BagOStuff
  */
 class BagOStuffTest extends MediaWikiTestCase {
        /** @var BagOStuff */
@@ -31,8 +32,8 @@ class BagOStuffTest extends MediaWikiTestCase {
        }
 
        /**
-        * @covers BagOStuff::makeGlobalKey
-        * @covers BagOStuff::makeKeyInternal
+        * @covers MediumSpecificBagOStuff::makeGlobalKey
+        * @covers MediumSpecificBagOStuff::makeKeyInternal
         */
        public function testMakeKey() {
                $cache = ObjectCache::newFromId( 'hash' );
@@ -65,8 +66,8 @@ class BagOStuffTest extends MediaWikiTestCase {
        }
 
        /**
-        * @covers BagOStuff::merge
-        * @covers BagOStuff::mergeViaCas
+        * @covers MediumSpecificBagOStuff::merge
+        * @covers MediumSpecificBagOStuff::mergeViaCas
         */
        public function testMerge() {
                $key = $this->cache->makeKey( self::TEST_KEY );
@@ -109,7 +110,7 @@ class BagOStuffTest extends MediaWikiTestCase {
        }
 
        /**
-        * @covers BagOStuff::changeTTL
+        * @covers MediumSpecificBagOStuff::changeTTL
         */
        public function testChangeTTL() {
                $key = $this->cache->makeKey( self::TEST_KEY );
@@ -130,7 +131,7 @@ class BagOStuffTest extends MediaWikiTestCase {
        }
 
        /**
-        * @covers BagOStuff::changeTTLMulti
+        * @covers MediumSpecificBagOStuff::changeTTLMulti
         */
        public function testChangeTTLMulti() {
                $key1 = $this->cache->makeKey( 'test-key1' );
@@ -183,7 +184,7 @@ class BagOStuffTest extends MediaWikiTestCase {
        }
 
        /**
-        * @covers BagOStuff::add
+        * @covers MediumSpecificBagOStuff::add
         */
        public function testAdd() {
                $key = $this->cache->makeKey( self::TEST_KEY );
@@ -193,7 +194,7 @@ class BagOStuffTest extends MediaWikiTestCase {
        }
 
        /**
-        * @covers BagOStuff::get
+        * @covers MediumSpecificBagOStuff::get
         */
        public function testGet() {
                $value = [ 'this' => 'is', 'a' => 'test' ];
@@ -204,9 +205,9 @@ class BagOStuffTest extends MediaWikiTestCase {
        }
 
        /**
-        * @covers BagOStuff::get
-        * @covers BagOStuff::set
-        * @covers BagOStuff::getWithSetCallback
+        * @covers MediumSpecificBagOStuff::get
+        * @covers MediumSpecificBagOStuff::set
+        * @covers MediumSpecificBagOStuff::getWithSetCallback
         */
        public function testGetWithSetCallback() {
                $key = $this->cache->makeKey( self::TEST_KEY );
@@ -223,7 +224,7 @@ class BagOStuffTest extends MediaWikiTestCase {
        }
 
        /**
-        * @covers BagOStuff::incr
+        * @covers MediumSpecificBagOStuff::incr
         */
        public function testIncr() {
                $key = $this->cache->makeKey( self::TEST_KEY );
@@ -235,7 +236,7 @@ class BagOStuffTest extends MediaWikiTestCase {
        }
 
        /**
-        * @covers BagOStuff::incrWithInit
+        * @covers MediumSpecificBagOStuff::incrWithInit
         */
        public function testIncrWithInit() {
                $key = $this->cache->makeKey( self::TEST_KEY );
@@ -247,7 +248,7 @@ class BagOStuffTest extends MediaWikiTestCase {
        }
 
        /**
-        * @covers BagOStuff::getMulti
+        * @covers MediumSpecificBagOStuff::getMulti
         */
        public function testGetMulti() {
                $value1 = [ 'this' => 'is', 'a' => 'test' ];
@@ -287,8 +288,8 @@ class BagOStuffTest extends MediaWikiTestCase {
        }
 
        /**
-        * @covers BagOStuff::setMulti
-        * @covers BagOStuff::deleteMulti
+        * @covers MediumSpecificBagOStuff::setMulti
+        * @covers MediumSpecificBagOStuff::deleteMulti
         */
        public function testSetDeleteMulti() {
                $map = [
@@ -319,10 +320,10 @@ class BagOStuffTest extends MediaWikiTestCase {
        }
 
        /**
-        * @covers BagOStuff::get
-        * @covers BagOStuff::getMulti
-        * @covers BagOStuff::merge
-        * @covers BagOStuff::delete
+        * @covers MediumSpecificBagOStuff::get
+        * @covers MediumSpecificBagOStuff::getMulti
+        * @covers MediumSpecificBagOStuff::merge
+        * @covers MediumSpecificBagOStuff::delete
         */
        public function testSetSegmentable() {
                $key = $this->cache->makeKey( self::TEST_KEY );
@@ -369,7 +370,7 @@ class BagOStuffTest extends MediaWikiTestCase {
        }
 
        /**
-        * @covers BagOStuff::getScopedLock
+        * @covers MediumSpecificBagOStuff::getScopedLock
         */
        public function testGetScopedLock() {
                $key = $this->cache->makeKey( self::TEST_KEY );
@@ -393,8 +394,8 @@ class BagOStuffTest extends MediaWikiTestCase {
        }
 
        /**
-        * @covers BagOStuff::__construct
-        * @covers BagOStuff::trackDuplicateKeys
+        * @covers MediumSpecificBagOStuff::__construct
+        * @covers MediumSpecificBagOStuff::trackDuplicateKeys
         */
        public function testReportDupes() {
                $logger = $this->createMock( Psr\Log\NullLogger::class );
@@ -418,8 +419,8 @@ class BagOStuffTest extends MediaWikiTestCase {
        }
 
        /**
-        * @covers BagOStuff::lock()
-        * @covers BagOStuff::unlock()
+        * @covers MediumSpecificBagOStuff::lock()
+        * @covers MediumSpecificBagOStuff::unlock()
         */
        public function testLocking() {
                $key = 'test';
index f953319..8c53873 100644 (file)
@@ -125,6 +125,12 @@ class CachedBagOStuffTest extends PHPUnit\Framework\TestCase {
         * @covers CachedBagOStuff::makeKey
         */
        public function testMakeKey() {
+               if ( defined( 'HHVM_VERSION' ) ) {
+                       // This works fine on HHVM (and verified by integration tests), but due to
+                       // a bug in HHVM's Reflection, PHPUnit 4 fails to create a mock (T228563)
+                       $this->markTestSkipped( 'HHVM Reflection buggy' );
+               }
+
                $backend = $this->getMockBuilder( HashBagOStuff::class )
                        ->setMethods( [ 'makeKey' ] )
                        ->getMock();
@@ -145,6 +151,10 @@ class CachedBagOStuffTest extends PHPUnit\Framework\TestCase {
         * @covers CachedBagOStuff::makeGlobalKey
         */
        public function testMakeGlobalKey() {
+               if ( defined( 'HHVM_VERSION' ) ) {
+                       $this->markTestSkipped( 'HHVM Reflection buggy' );
+               }
+
                $backend = $this->getMockBuilder( HashBagOStuff::class )
                        ->setMethods( [ 'makeGlobalKey' ] )
                        ->getMock();
index 9f88474..dc49a13 100644 (file)
@@ -107,6 +107,10 @@ class MultiWriteBagOStuffTest extends MediaWikiTestCase {
         * @covers MultiWriteBagOStuff::makeKey
         */
        public function testMakeKey() {
+               if ( defined( 'HHVM_VERSION' ) ) {
+                       $this->markTestSkipped( 'HHVM Reflection buggy' );
+               }
+
                $cache1 = $this->getMockBuilder( HashBagOStuff::class )
                        ->setMethods( [ 'makeKey' ] )->getMock();
                $cache1->expects( $this->once() )->method( 'makeKey' )
@@ -124,6 +128,10 @@ class MultiWriteBagOStuffTest extends MediaWikiTestCase {
         * @covers MultiWriteBagOStuff::makeGlobalKey
         */
        public function testMakeGlobalKey() {
+               if ( defined( 'HHVM_VERSION' ) ) {
+                       $this->markTestSkipped( 'HHVM Reflection buggy' );
+               }
+
                $cache1 = $this->getMockBuilder( HashBagOStuff::class )
                        ->setMethods( [ 'makeGlobalKey' ] )->getMock();
                $cache1->expects( $this->once() )->method( 'makeGlobalKey' )
index 890218c..9e4a5d7 100644 (file)
@@ -767,8 +767,8 @@ class WANObjectCacheTest extends PHPUnit\Framework\TestCase {
                $localBag = $this->getMockBuilder( HashBagOStuff::class )
                        ->setMethods( [ 'getMulti' ] )->getMock();
                $localBag->expects( $this->exactly( 1 ) )->method( 'getMulti' )->willReturn( [
-                       WANObjectCache::VALUE_KEY_PREFIX . 'k1' => 'val-id1',
-                       WANObjectCache::VALUE_KEY_PREFIX . 'k2' => 'val-id2'
+                       'WANCache:v:' . 'k1' => 'val-id1',
+                       'WANCache:v:' . 'k2' => 'val-id2'
                ] );
                $wanCache = new WANObjectCache( [ 'cache' => $localBag ] );
 
@@ -964,7 +964,7 @@ class WANObjectCacheTest extends PHPUnit\Framework\TestCase {
                $this->assertEquals( 1, $calls, 'Value was populated' );
 
                // Acquire the mutex to verify that getWithSetCallback uses lockTSE properly
-               $this->internalCache->add( $cache::MUTEX_KEY_PREFIX . $key, 1, 0 );
+               $this->internalCache->add( 'WANCache:m:' . $key, 1, 0 );
 
                $checkKeys = [ wfRandomString() ]; // new check keys => force misses
                $ret = $cache->getWithSetCallback( $key, 30, $func,
@@ -1026,7 +1026,7 @@ class WANObjectCacheTest extends PHPUnit\Framework\TestCase {
 
                $mockWallClock += 2; // low logical TTL expired
                // Acquire a lock to verify that getWithSetCallback uses lockTSE properly
-               $this->internalCache->add( $cache::MUTEX_KEY_PREFIX . $key, 1, 0 );
+               $this->internalCache->add( 'WANCache:m:' . $key, 1, 0 );
 
                $ret = $cache->getWithSetCallback( $key, 300, $func, [ 'lockTSE' => 5 ] );
                $this->assertEquals( $value, $ret );
@@ -1034,7 +1034,7 @@ class WANObjectCacheTest extends PHPUnit\Framework\TestCase {
 
                $mockWallClock += 301; // physical TTL expired
                // Acquire a lock to verify that getWithSetCallback uses lockTSE properly
-               $this->internalCache->add( $cache::MUTEX_KEY_PREFIX . $key, 1, 0 );
+               $this->internalCache->add( 'WANCache:m:' . $key, 1, 0 );
 
                $ret = $cache->getWithSetCallback( $key, 300, $func, [ 'lockTSE' => 5 ] );
                $this->assertEquals( $value, $ret );
@@ -1092,7 +1092,7 @@ class WANObjectCacheTest extends PHPUnit\Framework\TestCase {
                $mockWallClock += 0.2; // interim keys not brand new
 
                // Acquire a lock to verify that getWithSetCallback uses busyValue properly
-               $this->internalCache->add( $cache::MUTEX_KEY_PREFIX . $key, 1, 0 );
+               $this->internalCache->add( 'WANCache:m:' . $key, 1, 0 );
 
                $checkKeys = [ wfRandomString() ]; // new check keys => force misses
                $ret = $cache->getWithSetCallback( $key, 30, $func,
@@ -1111,14 +1111,14 @@ class WANObjectCacheTest extends PHPUnit\Framework\TestCase {
                $this->assertEquals( $busyValue, $ret, 'Callback was not used; used busy value' );
                $this->assertEquals( 2, $calls, 'Callback was not used; used busy value' );
 
-               $this->internalCache->delete( $cache::MUTEX_KEY_PREFIX . $key );
+               $this->internalCache->delete( 'WANCache:m:' . $key );
                $mockWallClock += 0.001; // cached values will be newer than tombstone
                $ret = $cache->getWithSetCallback( $key, 30, $func,
                        [ 'lockTSE' => 30, 'busyValue' => $busyValue, 'checkKeys' => $checkKeys ] );
                $this->assertEquals( $value, $ret, 'Callback was used; saved interim' );
                $this->assertEquals( 3, $calls, 'Callback was used; saved interim' );
 
-               $this->internalCache->add( $cache::MUTEX_KEY_PREFIX . $key, 1, 0 );
+               $this->internalCache->add( 'WANCache:m:' . $key, 1, 0 );
                $ret = $cache->getWithSetCallback( $key, 30, $func,
                        [ 'busyValue' => $busyValue, 'checkKeys' => $checkKeys ] );
                $this->assertEquals( $value, $ret, 'Callback was not used; used interim' );
@@ -1208,7 +1208,7 @@ class WANObjectCacheTest extends PHPUnit\Framework\TestCase {
                // Fake initial check key to be set in the past. Otherwise we'd have to sleep for
                // several seconds during the test to assert the behaviour.
                foreach ( [ $checkAll, $check1, $check2 ] as $checkKey ) {
-                       $cache->touchCheckKey( $checkKey, WANObjectCache::HOLDOFF_NONE );
+                       $cache->touchCheckKey( $checkKey, WANObjectCache::HOLDOFF_TTL_NONE );
                }
 
                $mockWallClock += 0.100;
@@ -1330,7 +1330,7 @@ class WANObjectCacheTest extends PHPUnit\Framework\TestCase {
                $this->assertLessThan( 0, $curTTL, "Deleted key is tombstoned and has current TTL < 0" );
 
                $this->cache->set( $key, $value );
-               $this->cache->delete( $key, WANObjectCache::HOLDOFF_NONE );
+               $this->cache->delete( $key, WANObjectCache::HOLDOFF_TTL_NONE );
 
                $curTTL = null;
                $v = $this->cache->get( $key, $curTTL );
@@ -1462,10 +1462,10 @@ class WANObjectCacheTest extends PHPUnit\Framework\TestCase {
                $v = $cache->getWithSetCallback( $key, 60, $func );
                $this->assertEquals( 3, $wasCalled, 'Value regenerated (got mutex)' ); // sets interim
                // Lock up the mutex so interim cache is used
-               $this->internalCache->add( $cache::MUTEX_KEY_PREFIX . $key, 1, 0 );
+               $this->internalCache->add( 'WANCache:m:' . $key, 1, 0 );
                $v = $cache->getWithSetCallback( $key, 60, $func );
                $this->assertEquals( 3, $wasCalled, 'Value interim cached (failed mutex)' );
-               $this->internalCache->delete( $cache::MUTEX_KEY_PREFIX . $key );
+               $this->internalCache->delete( 'WANCache:m:' . $key );
 
                $cache->useInterimHoldOffCaching( false );
 
@@ -1482,7 +1482,7 @@ class WANObjectCacheTest extends PHPUnit\Framework\TestCase {
                $v = $cache->getWithSetCallback( $key, 60, $func );
                $this->assertEquals( 4, $wasCalled, 'Value still regenerated (got mutex)' );
                // Lock up the mutex so interim cache is used
-               $this->internalCache->add( $cache::MUTEX_KEY_PREFIX . $key, 1, 0 );
+               $this->internalCache->add( 'WANCache:m:' . $key, 1, 0 );
                $v = $cache->getWithSetCallback( $key, 60, $func );
                $this->assertEquals( 5, $wasCalled, 'Value still regenerated (failed mutex)' );
        }
@@ -1548,16 +1548,16 @@ class WANObjectCacheTest extends PHPUnit\Framework\TestCase {
 
                // Two check keys are newer (given hold-off) than $key, another is older
                $this->internalCache->set(
-                       WANObjectCache::TIME_KEY_PREFIX . $tKey2,
-                       WANObjectCache::PURGE_VAL_PREFIX . ( $priorTime - 3 )
+                       'WANCache:t:' . $tKey2,
+                       'PURGED:' . ( $priorTime - 3 )
                );
                $this->internalCache->set(
-                       WANObjectCache::TIME_KEY_PREFIX . $tKey2,
-                       WANObjectCache::PURGE_VAL_PREFIX . ( $priorTime - 5 )
+                       'WANCache:t:' . $tKey2,
+                       'PURGED:' . ( $priorTime - 5 )
                );
                $this->internalCache->set(
-                       WANObjectCache::TIME_KEY_PREFIX . $tKey1,
-                       WANObjectCache::PURGE_VAL_PREFIX . ( $priorTime - 30 )
+                       'WANCache:t:' . $tKey1,
+                       'PURGED:' . ( $priorTime - 30 )
                );
                $this->cache->set( $key, $value, 30 );
 
@@ -1584,30 +1584,30 @@ class WANObjectCacheTest extends PHPUnit\Framework\TestCase {
                $badTime = microtime( true ) - 300;
 
                $this->internalCache->set(
-                       WANObjectCache::VALUE_KEY_PREFIX . $vKey1,
+                       'WANCache:v:' . $vKey1,
                        [
-                               WANObjectCache::FLD_FORMAT_VERSION => WANObjectCache::VERSION,
-                               WANObjectCache::FLD_VALUE => $value,
-                               WANObjectCache::FLD_TTL => 3600,
-                               WANObjectCache::FLD_TIME => $goodTime
+                               0 => 1,
+                               1 => $value,
+                               2 => 3600,
+                               3 => $goodTime
                        ]
                );
                $this->internalCache->set(
-                       WANObjectCache::VALUE_KEY_PREFIX . $vKey2,
+                       'WANCache:v:' . $vKey2,
                        [
-                               WANObjectCache::FLD_FORMAT_VERSION => WANObjectCache::VERSION,
-                               WANObjectCache::FLD_VALUE => $value,
-                               WANObjectCache::FLD_TTL => 3600,
-                               WANObjectCache::FLD_TIME => $badTime
+                               0 => 1,
+                               1 => $value,
+                               2 => 3600,
+                               3 => $badTime
                        ]
                );
                $this->internalCache->set(
-                       WANObjectCache::TIME_KEY_PREFIX . $tKey1,
-                       WANObjectCache::PURGE_VAL_PREFIX . $goodTime
+                       'WANCache:t:' . $tKey1,
+                       'PURGED:' . $goodTime
                );
                $this->internalCache->set(
-                       WANObjectCache::TIME_KEY_PREFIX . $tKey2,
-                       WANObjectCache::PURGE_VAL_PREFIX . $badTime
+                       'WANCache:t:' . $tKey2,
+                       'PURGED:' . $badTime
                );
 
                $this->assertEquals( $value, $this->cache->get( $vKey1 ) );
@@ -1632,10 +1632,10 @@ class WANObjectCacheTest extends PHPUnit\Framework\TestCase {
                        ->setMethods( [ 'get', 'changeTTL' ] )->getMock();
                $backend->expects( $this->once() )->method( 'get' )
                        ->willReturn( [
-                               WANObjectCache::FLD_FORMAT_VERSION => WANObjectCache::VERSION,
-                               WANObjectCache::FLD_VALUE => 'value',
-                               WANObjectCache::FLD_TTL => 3600,
-                               WANObjectCache::FLD_TIME => 300,
+                               0 => 1,
+                               1 => 'value',
+                               2 => 3600,
+                               3 => 300,
                        ] );
                $backend->expects( $this->once() )->method( 'changeTTL' )
                        ->willReturn( false );
@@ -1721,7 +1721,7 @@ class WANObjectCacheTest extends PHPUnit\Framework\TestCase {
                ] );
 
                $localBag->expects( $this->once() )->method( 'set' )
-                       ->with( "/*/mw-wan/" . $wanCache::VALUE_KEY_PREFIX . "test" );
+                       ->with( "/*/mw-wan/" . 'WANCache:v:' . "test" );
 
                $wanCache->delete( 'test' );
        }
@@ -1737,7 +1737,7 @@ class WANObjectCacheTest extends PHPUnit\Framework\TestCase {
                ] );
 
                $localBag->expects( $this->once() )->method( 'set' )
-                       ->with( "/*/mw-wan/" . $wanCache::TIME_KEY_PREFIX . "test" );
+                       ->with( "/*/mw-wan/" . 'WANCache:t:' . "test" );
 
                $wanCache->touchCheckKey( 'test' );
        }
@@ -1753,7 +1753,7 @@ class WANObjectCacheTest extends PHPUnit\Framework\TestCase {
                ] );
 
                $localBag->expects( $this->once() )->method( 'delete' )
-                       ->with( "/*/mw-wan/" . $wanCache::TIME_KEY_PREFIX . "test" );
+                       ->with( "/*/mw-wan/" . 'WANCache:t:' . "test" );
 
                $wanCache->resetCheckKey( 'test' );
        }
@@ -1865,6 +1865,10 @@ class WANObjectCacheTest extends PHPUnit\Framework\TestCase {
         * @covers WANObjectCache::makeKey
         */
        public function testMakeKey() {
+               if ( defined( 'HHVM_VERSION' ) ) {
+                       $this->markTestSkipped( 'HHVM Reflection buggy' );
+               }
+
                $backend = $this->getMockBuilder( HashBagOStuff::class )
                        ->setMethods( [ 'makeKey' ] )->getMock();
                $backend->expects( $this->once() )->method( 'makeKey' )
@@ -1881,6 +1885,10 @@ class WANObjectCacheTest extends PHPUnit\Framework\TestCase {
         * @covers WANObjectCache::makeGlobalKey
         */
        public function testMakeGlobalKey() {
+               if ( defined( 'HHVM_VERSION' ) ) {
+                       $this->markTestSkipped( 'HHVM Reflection buggy' );
+               }
+
                $backend = $this->getMockBuilder( HashBagOStuff::class )
                        ->setMethods( [ 'makeGlobalKey' ] )->getMock();
                $backend->expects( $this->once() )->method( 'makeGlobalKey' )
diff --git a/tests/phpunit/includes/resourceloader/ResourceLoaderFilePathTest.php b/tests/phpunit/includes/resourceloader/ResourceLoaderFilePathTest.php
deleted file mode 100644 (file)
index 292340b..0000000
+++ /dev/null
@@ -1,53 +0,0 @@
-<?php
-
-class ResourceLoaderFilePathTest extends PHPUnit\Framework\TestCase {
-       /**
-        * @covers ResourceLoaderFilePath::__construct
-        */
-       public function testConstructor() {
-               $resourceLoaderFilePath = new ResourceLoaderFilePath(
-                       'dummy/path', 'localBasePath', 'remoteBasePath'
-               );
-
-               $this->assertInstanceOf( ResourceLoaderFilePath::class, $resourceLoaderFilePath );
-       }
-
-       /**
-        * @covers ResourceLoaderFilePath::getLocalPath
-        */
-       public function testGetLocalPath() {
-               $resourceLoaderFilePath = new ResourceLoaderFilePath(
-                       'dummy/path', 'localBasePath', 'remoteBasePath'
-               );
-
-               $this->assertSame(
-                       'localBasePath/dummy/path', $resourceLoaderFilePath->getLocalPath()
-               );
-       }
-
-       /**
-        * @covers ResourceLoaderFilePath::getRemotePath
-        */
-       public function testGetRemotePath() {
-               $resourceLoaderFilePath = new ResourceLoaderFilePath(
-                       'dummy/path', 'localBasePath', 'remoteBasePath'
-               );
-
-               $this->assertSame(
-                       'remoteBasePath/dummy/path', $resourceLoaderFilePath->getRemotePath()
-               );
-       }
-
-       /**
-        * @covers ResourceLoaderFilePath::getPath
-        */
-       public function testGetPath() {
-               $resourceLoaderFilePath = new ResourceLoaderFilePath(
-                       'dummy/path', 'localBasePath', 'remoteBasePath'
-               );
-
-               $this->assertSame(
-                       'dummy/path', $resourceLoaderFilePath->getPath()
-               );
-       }
-}
index 2772b0d..d66e480 100644 (file)
@@ -38,7 +38,7 @@ class SearchEngineTest extends MediaWikiLangTestCase {
                        'wgCapitalLinks' => true,
                        'wgCapitalLinkOverrides' => [
                                NS_CATEGORY => false // for testCompletionSearchMustRespectCapitalLinkOverrides
-                       ]
+                       ],
                ] );
 
                $lb = LoadBalancerSingle::newFromConnection( $this->db );
@@ -64,7 +64,7 @@ class SearchEngineTest extends MediaWikiLangTestCase {
                        'wgCapitalLinks' => true,
                        'wgCapitalLinkOverrides' => [
                                NS_CATEGORY => false // for testCompletionSearchMustRespectCapitalLinkOverrides
-                       ]
+                       ],
                ] );
 
                $this->insertPage( 'Not_Main_Page', 'This is not a main page' );
@@ -283,7 +283,7 @@ class SearchEngineTest extends MediaWikiLangTestCase {
                        $mockField =
                                $this->getMockBuilder( SearchIndexFieldDefinition::class )->setConstructorArgs( [
                                        $name,
-                                       $type
+                                       $type,
                                ] )->getMock();
 
                        $mockField->expects( $this->any() )->method( 'getMapping' )->willReturn( [
@@ -346,8 +346,9 @@ class SearchEngineTest extends MediaWikiLangTestCase {
                $setAugmentor = $this->createMock( ResultSetAugmentor::class );
                $setAugmentor->expects( $this->once() )
                        ->method( 'augmentAll' )
-                       ->willReturnCallback( function ( SearchResultSet $resultSet ) {
+                       ->willReturnCallback( function ( ISearchResultSet $resultSet ) {
                                $data = [];
+                               /** @var SearchResult $result */
                                foreach ( $resultSet as $result ) {
                                        $id = $result->getTitle()->getArticleID();
                                        $data[$id] = "Result:$id:" . $result->getTitle()->getText();
@@ -405,7 +406,7 @@ class SearchEngineTest extends MediaWikiLangTestCase {
                                [
                                        'query' => 'foo',
                                ],
-                               false
+                               false,
                        ],
                        'empty' => [
                                [
@@ -445,34 +446,34 @@ class SearchEngineTest extends MediaWikiLangTestCase {
                                        'query' => 'all:test',
                                        'withAll' => false,
                                ],
-                               false
+                               false,
                        ],
                        'ns only' => [
                                [
                                        'query' => 'help:',
                                ],
-                               [ '', [ NS_HELP ] ]
+                               [ '', [ NS_HELP ] ],
                        ],
                        'all only' => [
                                [
                                        'query' => 'all:',
                                        'withAll' => true,
                                ],
-                               [ '', null ]
+                               [ '', null ],
                        ],
                        'all wins over namespace when first' => [
                                [
                                        'query' => 'all:help:test',
                                        'withAll' => true,
                                ],
-                               [ 'help:test', null ]
+                               [ 'help:test', null ],
                        ],
                        'ns wins over all when first' => [
                                [
                                        'query' => 'help:all:test',
                                        'withAll' => true,
                                ],
-                               [ 'all:test', [ NS_HELP ] ]
+                               [ 'all:test', [ NS_HELP ] ],
                        ],
                ];
        }
index f9e30f0..64148b0 100644 (file)
@@ -2,13 +2,17 @@
 
 namespace MediaWiki\Session;
 
+use CachedBagOStuff;
+use HashBagOStuff;
+use RequestContext;
+
 /**
  * BagOStuff with utility functions for MediaWiki\\Session\\* testing
  */
-class TestBagOStuff extends \CachedBagOStuff {
+class TestBagOStuff extends CachedBagOStuff {
 
        public function __construct() {
-               parent::__construct( new \HashBagOStuff );
+               parent::__construct( new HashBagOStuff );
        }
 
        /**
@@ -51,7 +55,7 @@ class TestBagOStuff extends \CachedBagOStuff {
         * @param array|mixed $blob Session metadata and data
         */
        public function setRawSession( $id, $blob ) {
-               $expiry = \RequestContext::getMain()->getConfig()->get( 'ObjectCacheSessionExpiry' );
+               $expiry = RequestContext::getMain()->getConfig()->get( 'ObjectCacheSessionExpiry' );
                $this->set( $this->makeKey( 'MWSession', $id ), $blob, $expiry );
        }
 
diff --git a/tests/phpunit/includes/specials/SpecialGoToInterwikiTest.php b/tests/phpunit/includes/specials/SpecialGoToInterwikiTest.php
new file mode 100644 (file)
index 0000000..05ec710
--- /dev/null
@@ -0,0 +1,81 @@
+<?php
+
+use MediaWiki\Interwiki\InterwikiLookupAdapter;
+use MediaWiki\MediaWikiServices;
+
+/**
+ * @covers SpecialGoToInterwiki
+ */
+class SpecialGoToInterwikiTest extends MediaWikiTestCase {
+
+       public function testExecute() {
+               $this->setService( 'InterwikiLookup', new InterwikiLookupAdapter(
+                       new HashSiteStore(), // won't be used
+                       [
+                               'local' => new Interwiki( 'local', 'https://local.example.com/$1',
+                                       'https://local.example.com/api.php', 'unittest_localwiki', 1 ),
+                               'nonlocal' => new Interwiki( 'nonlocal', 'https://nonlocal.example.com/$1',
+                                       'https://nonlocal.example.com/api.php', 'unittest_nonlocalwiki', 0 ),
+                       ]
+               ) );
+               MediaWikiServices::getInstance()->resetServiceForTesting( 'TitleFormatter' );
+               MediaWikiServices::getInstance()->resetServiceForTesting( 'TitleParser' );
+               MediaWikiServices::getInstance()->resetServiceForTesting( '_MediaWikiTitleCodec' );
+
+               // sanity check
+               $this->assertTrue( !Title::newFromText( 'Foo' )->isExternal() );
+               $this->assertTrue( Title::newFromText( 'local:Foo' )->isExternal() );
+               $this->assertTrue( Title::newFromText( 'nonlocal:Foo' )->isExternal() );
+               $this->assertTrue( Title::newFromText( 'local:Foo' )->isLocal() );
+               $this->assertTrue( !Title::newFromText( 'nonlocal:Foo' )->isLocal() );
+
+               $goToInterwiki = MediaWikiServices::getInstance()->getSpecialPageFactory()
+                       ->getPage( 'GoToInterwiki' );
+
+               RequestContext::resetMain();
+               $context = new DerivativeContext( RequestContext::getMain() );
+               $goToInterwiki->setContext( $context );
+               $goToInterwiki->execute( 'Foo' );
+               $this->assertSame( Title::newFromText( 'Foo' )->getFullURL(),
+                       $context->getOutput()->getRedirect() );
+
+               RequestContext::resetMain();
+               $context = new DerivativeContext( RequestContext::getMain() );
+               $goToInterwiki->setContext( $context );
+               $goToInterwiki->execute( 'local:Foo' );
+               $this->assertSame( Title::newFromText( 'local:Foo' )->getFullURL(),
+                       $context->getOutput()->getRedirect() );
+
+               RequestContext::resetMain();
+               $context = new DerivativeContext( RequestContext::getMain() );
+               $goToInterwiki->setContext( $context );
+               $goToInterwiki->execute( 'nonlocal:Foo' );
+               $this->assertSame( '', $context->getOutput()->getRedirect() );
+               $this->assertContains( Title::newFromText( 'nonlocal:Foo' )->getFullURL(),
+                       $context->getOutput()->getHTML() );
+
+               RequestContext::resetMain();
+               $context = new DerivativeContext( RequestContext::getMain() );
+               $goToInterwiki->setContext( $context );
+               $goToInterwiki->execute( 'force/Foo' );
+               $this->assertSame( Title::newFromText( 'Foo' )->getFullURL(),
+                       $context->getOutput()->getRedirect() );
+
+               RequestContext::resetMain();
+               $context = new DerivativeContext( RequestContext::getMain() );
+               $goToInterwiki->setContext( $context );
+               $goToInterwiki->execute( 'force/local:Foo' );
+               $this->assertSame( '', $context->getOutput()->getRedirect() );
+               $this->assertContains( Title::newFromText( 'local:Foo' )->getFullURL(),
+                       $context->getOutput()->getHTML() );
+
+               RequestContext::resetMain();
+               $context = new DerivativeContext( RequestContext::getMain() );
+               $goToInterwiki->setContext( $context );
+               $goToInterwiki->execute( 'force/nonlocal:Foo' );
+               $this->assertSame( '', $context->getOutput()->getRedirect() );
+               $this->assertContains( Title::newFromText( 'nonlocal:Foo' )->getFullURL(),
+                       $context->getOutput()->getHTML() );
+       }
+
+}
index e31357c..a57745b 100644 (file)
@@ -35,10 +35,15 @@ class SpecialMuteTest extends SpecialPageTestBase {
 
        /**
         * @covers SpecialMute::execute
-        * @expectedExceptionMessage Muting users from sending you emails is not enabled
+        * @expectedExceptionMessage Mute features are unavailable
         * @expectedException ErrorPageError
         */
        public function testEmailBlacklistNotEnabled() {
+               $this->setTemporaryHook(
+                       'SpecialMuteModifyFormFields',
+                       null
+               );
+
                $this->setMwGlobals( [
                        'wgEnableUserEmailBlacklist' => false
                ] );
@@ -72,7 +77,7 @@ class SpecialMuteTest extends SpecialPageTestBase {
                $loggedInUser->confirmEmail();
                $loggedInUser->saveSettings();
 
-               $fauxRequest = new FauxRequest( [ 'wpMuteEmail' => 1 ], true );
+               $fauxRequest = new FauxRequest( [ 'wpemail-blacklist' => true ], true );
                list( $html, ) = $this->executeSpecialPage(
                        $targetUser->getName(), $fauxRequest, 'qqx', $loggedInUser
                );
@@ -99,7 +104,7 @@ class SpecialMuteTest extends SpecialPageTestBase {
                $loggedInUser->confirmEmail();
                $loggedInUser->saveSettings();
 
-               $fauxRequest = new FauxRequest( [ 'wpMuteEmail' => false ], true );
+               $fauxRequest = new FauxRequest( [ 'wpemail-blacklist' => false ], true );
                list( $html, ) = $this->executeSpecialPage(
                        $targetUser->getName(), $fauxRequest, 'qqx', $loggedInUser
                );
index 4dd6c80..eeb4b00 100644 (file)
@@ -11,6 +11,27 @@ use MediaWiki\MediaWikiServices;
  */
 class SpecialSearchTest extends MediaWikiTestCase {
 
+       /**
+        * @covers SpecialSearch::load
+        * @covers SpecialSearch::showResults
+        */
+       public function testValidateSortOrder() {
+               $ctx = new RequestContext();
+               $ctx->setRequest( new FauxRequest( [
+                       'search' => 'foo',
+                       'fulltext' => 1,
+                       'sort' => 'invalid',
+               ] ) );
+               $sp = Title::makeTitle( NS_SPECIAL, 'Search' );
+               MediaWikiServices::getInstance()
+                       ->getSpecialPageFactory()
+                       ->executePath( $sp, $ctx );
+               $html = $ctx->getOutput()->getHTML();
+               $this->assertRegExp( '/class="warningbox"/', $html, 'must contain warnings' );
+               $this->assertRegExp( '/Sort order of invalid is unrecognized/',
+                       $html, 'must tell user sort order is invalid' );
+       }
+
        /**
         * @covers SpecialSearch::load
         * @dataProvider provideSearchOptionsTests
index bb72315..62e8e23 100644 (file)
@@ -1021,18 +1021,6 @@ class UserTest extends MediaWikiTestCase {
                        ]
                );
                $this->assertTrue( User::isLocallyBlockedProxy( $ip ) );
-
-               $this->hideDeprecated(
-                       'IP addresses in the keys of $wgProxyList (found the following IP ' .
-                       'addresses in keys: ' . $blockListEntry . ', please move them to values)'
-               );
-               $this->setMwGlobals(
-                       'wgProxyList',
-                       [
-                               $blockListEntry => 'test'
-                       ]
-               );
-               $this->assertTrue( User::isLocallyBlockedProxy( $ip ) );
        }
 
        /**
index 72db766..9616672 100644 (file)
@@ -86,6 +86,10 @@ class WatchedItemStoreUnitTest extends MediaWikiTestCase {
         * @return PHPUnit_Framework_MockObject_MockObject|HashBagOStuff
         */
        private function getMockCache() {
+               if ( defined( 'HHVM_VERSION' ) ) {
+                       $this->markTestSkipped( 'HHVM Reflection buggy' );
+               }
+
                $mock = $this->getMockBuilder( HashBagOStuff::class )
                        ->disableOriginalConstructor()
                        ->setMethods( [ 'get', 'set', 'delete', 'makeKey' ] )
index 7a78e52..54a362e 100644 (file)
@@ -6,6 +6,7 @@ use DumpBackup;
 use Exception;
 use MediaWiki\MediaWikiServices;
 use MediaWiki\Revision\RevisionRecord;
+use MediaWiki\Revision\SlotRecord;
 use MediaWikiTestCase;
 use MWException;
 use RequestContext;
@@ -28,13 +29,14 @@ class BackupDumperPageTest extends DumpTestCase {
 
        // We'll add several pages, revision and texts. The following variables hold the
        // corresponding ids.
-       private $pageId1, $pageId2, $pageId3, $pageId4;
-       private $pageTitle1, $pageTitle2, $pageTitle3, $pageTitle4;
+       private $pageId1, $pageId2, $pageId3, $pageId4, $pageId5;
+       private $pageTitle1, $pageTitle2, $pageTitle3, $pageTitle4, $pageTitle5;
        private $revId1_1, $textId1_1;
        private $revId2_1, $textId2_1, $revId2_2, $textId2_2;
        private $revId2_3, $textId2_3, $revId2_4, $textId2_4;
        private $revId3_1, $textId3_1, $revId3_2, $textId3_2;
        private $revId4_1, $textId4_1;
+       private $revId5_1, $textId5_1;
        private $namespace, $talk_namespace;
 
        /**
@@ -106,6 +108,15 @@ class BackupDumperPageTest extends DumpTestCase {
                                "Talk about BackupDumperTestP1 Text1",
                                "Talk BackupDumperTestP1 Summary1" );
                        $this->pageId4 = $page->getId();
+
+                       $this->pageTitle5 = Title::newFromText( 'BackupDumperTestP5' );
+                       $page = WikiPage::factory( $this->pageTitle5 );
+                       list( $this->revId5_1, $this->textId5_1 ) = $this->addRevision( $page,
+                               "BackupDumperTestP5 Text1",
+                               "BackupDumperTestP5 Summary1" );
+                       $this->pageId5 = $page->getId();
+
+                       $this->corruptRevisionData( $page->getRevision()->getRevisionRecord() );
                } catch ( Exception $e ) {
                        // We'd love to pass $e directly. However, ... see
                        // documentation of exceptionFromAddDBData in
@@ -114,6 +125,39 @@ class BackupDumperPageTest extends DumpTestCase {
                }
        }
 
+       /**
+        * Corrupt the information about the given revision in the database.
+        *
+        * @param RevisionRecord $revision
+        */
+       private function corruptRevisionData( RevisionRecord $revision ) {
+               global $wgMultiContentRevisionSchemaMigrationStage;
+
+               if ( ( $wgMultiContentRevisionSchemaMigrationStage & SCHEMA_COMPAT_WRITE_OLD ) ) {
+                       $this->db->update(
+                               'revision',
+                               [
+                                       'rev_text_id' => 0,
+                                       'rev_sha1' => '',
+                                       'rev_len' => '0',
+                               ],
+                               [ 'rev_id' => $revision->getId() ]
+                       );
+               }
+
+               if ( ( $wgMultiContentRevisionSchemaMigrationStage & SCHEMA_COMPAT_WRITE_NEW ) ) {
+                       $this->db->update(
+                               'content',
+                               [
+                                       'content_address' => 'tt:0',
+                                       'content_sha1' => '',
+                                       'content_size' => '0',
+                               ],
+                               [ 'content_id' => $revision->getSlot( SlotRecord::MAIN )->getContentId() ]
+                       );
+               }
+       }
+
        protected function setUp() {
                parent::setUp();
 
@@ -201,11 +245,14 @@ class BackupDumperPageTest extends DumpTestCase {
                $dumper = $this->newDumpBackup(
                        [ '--full', '--quiet', '--output', 'file:' . $fname, '--schema-version', $schemaVersion ],
                        $this->pageId1,
-                       $this->pageId4 + 1
+                       $this->pageId5 + 1
                );
 
-               // Performing the dump
+               // Performing the dump. Suppress warnings, since we want to test
+               // accessing broken revision data (page 5).
+               $this->setMwGlobals( 'wgDevelopmentWarnings', false );
                $dumper->execute();
+               $this->setMwGlobals( 'wgDevelopmentWarnings', true );
 
                // Checking the dumped data
                $this->assertDumpSchema( $fname, $this->getXmlSchemaPath( $schemaVersion ) );
@@ -295,6 +342,26 @@ class BackupDumperPageTest extends DumpTestCase {
                );
                $asserter->assertPageEnd();
 
+               // Page 5 (broken revision data)
+               $asserter->assertPageStart(
+                       $this->pageId5,
+                       $this->namespace,
+                       $this->pageTitle5->getPrefixedText()
+               );
+               $asserter->assertRevision(
+                       $this->revId5_1,
+                       "BackupDumperTestP5 Summary1",
+                       null,
+                       0,
+                       "",
+                       false,
+                       false,
+                       CONTENT_MODEL_WIKITEXT,
+                       CONTENT_FORMAT_WIKITEXT,
+                       $schemaVersion
+               );
+               $asserter->assertPageEnd();
+
                $asserter->assertDumpEnd();
 
                // FIXME: add multi-slot test case!
@@ -317,11 +384,14 @@ class BackupDumperPageTest extends DumpTestCase {
                                '--schema-version', $schemaVersion,
                        ],
                        $this->pageId1,
-                       $this->pageId4 + 1
+                       $this->pageId5 + 1
                );
 
-               // Performing the dump
+               // Performing the dump. Suppress warnings, since we want to test
+               // accessing broken revision data (page 5).
+               $this->setMwGlobals( 'wgDevelopmentWarnings', false );
                $dumper->execute();
+               $this->setMwGlobals( 'wgDevelopmentWarnings', true );
 
                // Checking the dumped data
                $this->assertDumpSchema( $fname, $this->getXmlSchemaPath( $schemaVersion ) );
@@ -404,6 +474,21 @@ class BackupDumperPageTest extends DumpTestCase {
                );
                $asserter->assertPageEnd();
 
+               // Page 5 (broken revision data)
+               $asserter->assertPageStart(
+                       $this->pageId5,
+                       $this->namespace,
+                       $this->pageTitle5->getPrefixedText()
+               );
+               $asserter->assertRevision(
+                       $this->revId5_1,
+                       "BackupDumperTestP5 Summary1",
+                       null,
+                       0,
+                       ""
+               );
+               $asserter->assertPageEnd();
+
                $asserter->assertDumpEnd();
        }
 
index 207ac28..6b31972 100644 (file)
@@ -5,7 +5,7 @@ use MediaWiki\MediaWikiServices;
 class MockSearchEngine extends SearchEngine {
        /** @var SearchResult[][] */
        private static $results = [];
-       /** @var SearchResultSet[][] */
+       /** @var ISearchResultSet[][] */
        private static $interwikiResults = [];
 
        public static function clearMockResults() {
@@ -33,7 +33,7 @@ class MockSearchEngine extends SearchEngine {
        }
 
        /**
-        * @param SearchResultSet[][] $interwikiResults
+        * @param ISearchResultSet[][] $interwikiResults
         */
        public static function setMockInterwikiResults( array $interwikiResults ) {
                self::$interwikiResults = $interwikiResults;
index 38f6731..e6ee016 100644 (file)
@@ -9,7 +9,7 @@ class MockSearchResultSet extends SearchResultSet {
 
        /**
         * @param SearchResult[]|callable[] $results
-        * @param SearchResultSet[][]|callable[][] $interwikiResults Map from result type
+        * @param ISearchResultSet[][]|callable[][] $interwikiResults Map from result type
         *  to list of results for that type.
         */
        public function __construct( array $results, array $interwikiResults = [] ) {
index b992a86..d7901be 100644 (file)
@@ -171,7 +171,7 @@ class SiteConfigurationTest extends \MediaWikiUnitTestCase {
                $this->assertEquals(
                        'wiki',
                        $this->mConf->get( 'SimpleKey', 'eswiki', 'wiki' ),
-                       'get(): simple setting on an non-existing wiki'
+                       'get(): simple setting on a non-existing wiki'
                );
 
                // Fallback
@@ -209,12 +209,12 @@ class SiteConfigurationTest extends \MediaWikiUnitTestCase {
                $this->assertEquals(
                        'wiki',
                        $this->mConf->get( 'Fallback', 'eswiki', 'wiki' ),
-                       'get(): fallback setting on an non-existing wiki'
+                       'get(): fallback setting on a non-existing wiki'
                );
                $this->assertEquals(
                        'tag',
                        $this->mConf->get( 'Fallback', 'eswiki', 'wiki', [], [ 'tag' ] ),
-                       'get(): fallback setting on an non-existing wiki (with wiki tag)'
+                       'get(): fallback setting on a non-existing wiki (with wiki tag)'
                );
 
                // Merging
@@ -263,12 +263,12 @@ class SiteConfigurationTest extends \MediaWikiUnitTestCase {
                $this->assertEquals(
                        $common,
                        $this->mConf->get( 'MergeIt', 'eswiki', 'wiki' ),
-                       'get(): merging setting on an non-existing wiki'
+                       'get(): merging setting on a non-existing wiki'
                );
                $this->assertEquals(
                        $commonTag,
                        $this->mConf->get( 'MergeIt', 'eswiki', 'wiki', [], [ 'tag' ] ),
-                       'get(): merging setting on an non-existing wiki (with tag)'
+                       'get(): merging setting on a non-existing wiki (with tag)'
                );
        }
 
@@ -324,7 +324,7 @@ class SiteConfigurationTest extends \MediaWikiUnitTestCase {
                $this->assertEquals(
                        'es wiki eswiki',
                        $this->mConf->get( 'WithParams', 'eswiki', 'wiki' ),
-                       'get(): parameter replacement on an non-existing wiki'
+                       'get(): parameter replacement on a non-existing wiki'
                );
        }
 
index e35e373..7233b86 100644 (file)
@@ -12,6 +12,11 @@ class RedisBagOStuffTest extends MediaWikiUnitTestCase {
 
        protected function setUp() {
                parent::setUp();
+
+               if ( defined( 'HHVM_VERSION' ) ) {
+                       $this->markTestSkipped( 'HHVM Reflection buggy' );
+               }
+
                $cache = $this->getMockBuilder( RedisBagOStuff::class )
                        ->disableOriginalConstructor()
                        ->getMock();
diff --git a/tests/phpunit/unit/includes/resourceloader/ResourceLoaderFilePathTest.php b/tests/phpunit/unit/includes/resourceloader/ResourceLoaderFilePathTest.php
new file mode 100644 (file)
index 0000000..b1db383
--- /dev/null
@@ -0,0 +1,23 @@
+<?php
+
+/**
+ * @covers ResourceLoaderFilePath
+ */
+class ResourceLoaderFilePathTest extends MediaWikiUnitTestCase {
+
+       public function testConstructor() {
+               $path = new ResourceLoaderFilePath( 'dummy/path', '/local', '/remote' );
+
+               $this->assertInstanceOf( ResourceLoaderFilePath::class, $path );
+       }
+
+       public function testGetters() {
+               $path = new ResourceLoaderFilePath( 'dummy/path', '/local', '/remote' );
+
+               $this->assertSame( '/local/dummy/path', $path->getLocalPath() );
+               $this->assertSame( '/remote/dummy/path', $path->getRemotePath() );
+               $this->assertSame( '/local', $path->getLocalBasePath() );
+               $this->assertSame( '/remote', $path->getRemoteBasePath() );
+               $this->assertSame( 'dummy/path', $path->getPath() );
+       }
+}
index daf7112..22c05f4 100644 (file)
@@ -35,7 +35,7 @@ describe( 'Rollback with confirmation', function () {
        it.skip( 'should offer rollback options for admin users', function () {
                assert.strictEqual( HistoryPage.rollback.getText(), 'rollback 1 edit' );
 
-               HistoryPage.rollback.click();
+               HistoryPage.rollbackLink.click();
 
                assert.strictEqual( HistoryPage.rollbackConfirmable.getText(), 'Please confirm:' );
                assert.strictEqual( HistoryPage.rollbackConfirmableYes.getText(), 'Rollback' );
index 521eee6..ed6c78a 100644 (file)
@@ -1,3 +1,9 @@
+## 0.4.0 / 2019-07-18
+
+* Util: Added a `waitForModuleState()` method.
+* Api: Added optional `username`, `password` and `baseUrl` parameters to `edit()` method.
+* RunJobs: Unpublished `getJobCount()`, `log()`, `runThroughMainPageRequests()` methods.
+
 ## 0.3.0 / 2019-01-25
 
 * RunJobs: Added initial version.
index a52d594..dc16e81 100644 (file)
@@ -22,7 +22,7 @@ Utilities to interact with the MediaWiki API. Uses the [mwbot](https://github.co
 Actions are performed logged-in using `browser.options.username` and `browser.options.password`,
 which typically come from `MEDIAWIKI_USER` and `MEDIAWIKI_PASSWORD` environment variables.
 
-* `edit(title, content)`
+* `edit(title, content [, string username [, string password [, string baseUrl ] ] ])`
 * `delete(title, reason)`
 * `createAccount(username, password)`
 * `blockUser(username, expiry)`
@@ -33,6 +33,13 @@ which typically come from `MEDIAWIKI_USER` and `MEDIAWIKI_PASSWORD` environment
 Use the static `RunJobs.run()` method to ensure that any queued jobs are executed before
 making assertions that depend on its outcome.
 
+### Util
+
+`Util` is a collection of popular utility methods.
+
+* `getTestString([ string prefix ])`
+* `waitForModuleState(string moduleName [, string moduleStatus [, number timeout ] ])`
+
 ## Versioning
 
 This package follows [Semantic Versioning guidelines](https://semver.org/) for its releases. In
index 4babd08..423487f 100644 (file)
@@ -1,6 +1,6 @@
 {
   "name": "wdio-mediawiki",
-  "version": "0.3.0",
+  "version": "0.4.0",
   "description": "WebdriverIO plugin for testing a MediaWiki site.",
   "homepage": "https://gerrit.wikimedia.org/g/mediawiki/core/+/master/tests/selenium/wdio-mediawiki/",
   "license": "MIT",