Merge "Revert "Mechanism for renaming/aliasing classes""
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Mon, 13 Jan 2014 04:25:38 +0000 (04:25 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Mon, 13 Jan 2014 04:25:38 +0000 (04:25 +0000)
307 files changed:
HISTORY
RELEASE-NOTES-1.22 [deleted file]
RELEASE-NOTES-1.23
composer-example.json
docs/hooks.txt
includes/Article.php
includes/AutoLoader.php
includes/CategoryViewer.php
includes/DefaultSettings.php
includes/EditPage.php
includes/Exception.php
includes/ForkController.php
includes/GlobalFunctions.php
includes/Hooks.php
includes/ImagePage.php
includes/Linker.php
includes/MagicWord.php
includes/Preferences.php
includes/Sanitizer.php
includes/Title.php
includes/WebRequest.php
includes/WikiError.php [deleted file]
includes/WikiPage.php
includes/actions/RawAction.php
includes/api/ApiBase.php
includes/api/ApiMain.php
includes/api/ApiParse.php
includes/api/ApiQuery.php
includes/api/ApiQueryContributors.php [new file with mode: 0644]
includes/api/ApiQueryRecentChanges.php
includes/api/ApiQueryWatchlist.php
includes/content/WikitextContent.php
includes/db/ChronologyProtector.php
includes/db/CloneDatabase.php
includes/db/Database.php
includes/db/DatabaseError.php
includes/db/DatabaseMssql.php
includes/db/DatabaseMysql.php
includes/db/DatabaseMysqlBase.php
includes/db/DatabaseMysqli.php
includes/db/DatabaseOracle.php
includes/db/DatabasePostgres.php
includes/db/DatabaseSqlite.php
includes/db/DatabaseUtility.php
includes/db/LBFactory.php
includes/db/LBFactoryMulti.php
includes/db/LBFactorySingle.php
includes/db/LoadBalancer.php
includes/db/LoadMonitor.php
includes/db/ORMTable.php
includes/deferred/LinksUpdate.php
includes/diff/DifferenceEngine.php
includes/filebackend/FileBackend.php
includes/filebackend/FileBackendMultiWrite.php
includes/filebackend/FileBackendStore.php
includes/filebackend/MemoryFileBackend.php
includes/filebackend/SwiftFileBackend.php
includes/filerepo/file/File.php
includes/filerepo/file/LocalFile.php
includes/installer/Installer.i18n.php
includes/installer/OracleInstaller.php
includes/installer/WebInstallerPage.php
includes/libs/HashRing.php [new file with mode: 0644]
includes/libs/MappedIterator.php [new file with mode: 0644]
includes/libs/MultiHttpClient.php [new file with mode: 0644]
includes/normal/.gitignore [new file with mode: 0644]
includes/normal/Makefile
includes/normal/Utf8Case.php [deleted file]
includes/normal/Utf8CaseGenerate.php [deleted file]
includes/parser/CoreParserFunctions.php
includes/parser/Parser.php
includes/parser/ParserOptions.php
includes/profiler/ProfilerMwprof.php [new file with mode: 0644]
includes/rcfeed/JSONRCFeedFormatter.php
includes/rcfeed/MachineReadableRCFeedFormatter.php [new file with mode: 0644]
includes/rcfeed/XMLRCFeedFormatter.php [new file with mode: 0644]
includes/search/SearchEngine.php
includes/specials/SpecialBooksources.php
includes/specials/SpecialLonelypages.php
includes/specials/SpecialRecentchanges.php
includes/specials/SpecialSearch.php
includes/specials/SpecialUserlogin.php
includes/specials/SpecialWatchlist.php
includes/utils/HashRing.php [deleted file]
includes/utils/MappedIterator.php [deleted file]
includes/utils/UIDGenerator.php
languages/messages/MessagesAf.php
languages/messages/MessagesAm.php
languages/messages/MessagesAn.php
languages/messages/MessagesAng.php
languages/messages/MessagesAr.php
languages/messages/MessagesArc.php
languages/messages/MessagesAry.php
languages/messages/MessagesArz.php
languages/messages/MessagesAs.php
languages/messages/MessagesAst.php
languages/messages/MessagesAvk.php
languages/messages/MessagesAz.php
languages/messages/MessagesAzb.php
languages/messages/MessagesBa.php
languages/messages/MessagesBar.php
languages/messages/MessagesBcc.php
languages/messages/MessagesBcl.php
languages/messages/MessagesBe.php
languages/messages/MessagesBe_tarask.php
languages/messages/MessagesBg.php
languages/messages/MessagesBjn.php
languages/messages/MessagesBn.php
languages/messages/MessagesBpy.php
languages/messages/MessagesBr.php
languages/messages/MessagesBs.php
languages/messages/MessagesCa.php
languages/messages/MessagesCe.php
languages/messages/MessagesCkb.php
languages/messages/MessagesCrh_cyrl.php
languages/messages/MessagesCs.php
languages/messages/MessagesCy.php
languages/messages/MessagesDa.php
languages/messages/MessagesDe.php
languages/messages/MessagesDiq.php
languages/messages/MessagesDsb.php
languages/messages/MessagesEgl.php
languages/messages/MessagesEl.php
languages/messages/MessagesEn.php
languages/messages/MessagesEo.php
languages/messages/MessagesEs.php
languages/messages/MessagesEt.php
languages/messages/MessagesEu.php
languages/messages/MessagesExt.php
languages/messages/MessagesFa.php
languages/messages/MessagesFi.php
languages/messages/MessagesFo.php
languages/messages/MessagesFr.php
languages/messages/MessagesFrp.php
languages/messages/MessagesFrr.php
languages/messages/MessagesFur.php
languages/messages/MessagesFy.php
languages/messages/MessagesGa.php
languages/messages/MessagesGan_hans.php
languages/messages/MessagesGan_hant.php
languages/messages/MessagesGl.php
languages/messages/MessagesGrc.php
languages/messages/MessagesGsw.php
languages/messages/MessagesGu.php
languages/messages/MessagesHe.php
languages/messages/MessagesHi.php
languages/messages/MessagesHr.php
languages/messages/MessagesHsb.php
languages/messages/MessagesHu.php
languages/messages/MessagesIa.php
languages/messages/MessagesId.php
languages/messages/MessagesIg.php
languages/messages/MessagesIlo.php
languages/messages/MessagesIo.php
languages/messages/MessagesIs.php
languages/messages/MessagesIt.php
languages/messages/MessagesJa.php
languages/messages/MessagesJv.php
languages/messages/MessagesKa.php
languages/messages/MessagesKab.php
languages/messages/MessagesKhw.php
languages/messages/MessagesKiu.php
languages/messages/MessagesKk_arab.php
languages/messages/MessagesKk_cyrl.php
languages/messages/MessagesKk_latn.php
languages/messages/MessagesKm.php
languages/messages/MessagesKn.php
languages/messages/MessagesKo.php
languages/messages/MessagesKrc.php
languages/messages/MessagesKsh.php
languages/messages/MessagesLa.php
languages/messages/MessagesLad.php
languages/messages/MessagesLb.php
languages/messages/MessagesLez.php
languages/messages/MessagesLi.php
languages/messages/MessagesLrc.php
languages/messages/MessagesLt.php
languages/messages/MessagesLus.php
languages/messages/MessagesLv.php
languages/messages/MessagesLzh.php
languages/messages/MessagesMai.php
languages/messages/MessagesMdf.php
languages/messages/MessagesMg.php
languages/messages/MessagesMin.php
languages/messages/MessagesMk.php
languages/messages/MessagesMl.php
languages/messages/MessagesMn.php
languages/messages/MessagesMr.php
languages/messages/MessagesMs.php
languages/messages/MessagesMt.php
languages/messages/MessagesMy.php
languages/messages/MessagesMyv.php
languages/messages/MessagesNah.php
languages/messages/MessagesNb.php
languages/messages/MessagesNds.php
languages/messages/MessagesNds_nl.php
languages/messages/MessagesNe.php
languages/messages/MessagesNl.php
languages/messages/MessagesNn.php
languages/messages/MessagesOc.php
languages/messages/MessagesOr.php
languages/messages/MessagesOs.php
languages/messages/MessagesPa.php
languages/messages/MessagesPam.php
languages/messages/MessagesPl.php
languages/messages/MessagesPms.php
languages/messages/MessagesPnb.php
languages/messages/MessagesPrg.php
languages/messages/MessagesPs.php
languages/messages/MessagesPt.php
languages/messages/MessagesPt_br.php
languages/messages/MessagesQqq.php
languages/messages/MessagesQu.php
languages/messages/MessagesRm.php
languages/messages/MessagesRo.php
languages/messages/MessagesRoa_tara.php
languages/messages/MessagesRu.php
languages/messages/MessagesRue.php
languages/messages/MessagesSa.php
languages/messages/MessagesSah.php
languages/messages/MessagesSat.php
languages/messages/MessagesSc.php
languages/messages/MessagesScn.php
languages/messages/MessagesSdc.php
languages/messages/MessagesSgs.php
languages/messages/MessagesSh.php
languages/messages/MessagesSi.php
languages/messages/MessagesSk.php
languages/messages/MessagesSl.php
languages/messages/MessagesSq.php
languages/messages/MessagesSr_ec.php
languages/messages/MessagesSr_el.php
languages/messages/MessagesStq.php
languages/messages/MessagesSu.php
languages/messages/MessagesSv.php
languages/messages/MessagesSw.php
languages/messages/MessagesSzl.php
languages/messages/MessagesTa.php
languages/messages/MessagesTe.php
languages/messages/MessagesTg_cyrl.php
languages/messages/MessagesTg_latn.php
languages/messages/MessagesTh.php
languages/messages/MessagesTk.php
languages/messages/MessagesTl.php
languages/messages/MessagesTr.php
languages/messages/MessagesTru.php
languages/messages/MessagesTt_cyrl.php
languages/messages/MessagesTt_latn.php
languages/messages/MessagesTyv.php
languages/messages/MessagesUg_arab.php
languages/messages/MessagesUk.php
languages/messages/MessagesUz.php
languages/messages/MessagesVec.php
languages/messages/MessagesVep.php
languages/messages/MessagesVi.php
languages/messages/MessagesVo.php
languages/messages/MessagesVro.php
languages/messages/MessagesWa.php
languages/messages/MessagesWar.php
languages/messages/MessagesWuu.php
languages/messages/MessagesXal.php
languages/messages/MessagesYi.php
languages/messages/MessagesYo.php
languages/messages/MessagesYue.php
languages/messages/MessagesZea.php
languages/messages/MessagesZh_hans.php
languages/messages/MessagesZh_hant.php
languages/utils/CLDRPluralRuleEvaluator.php
maintenance/copyFileBackend.php
maintenance/fixExtLinksProtocolRelative.php
maintenance/generateJsonI18n.php
maintenance/language/generateNormalizerData.php [deleted file]
maintenance/language/generateNormalizerDataAr.php [new file with mode: 0644]
maintenance/language/generateNormalizerDataMl.php [new file with mode: 0644]
maintenance/language/generateUtf8Case.php [new file with mode: 0644]
maintenance/language/messageTypes.inc
maintenance/language/messages.inc
maintenance/rebuildrecentchanges.php
resources/Resources.php
resources/jquery/jquery.makeCollapsible.css
resources/mediawiki.action/mediawiki.action.view.redirectToFragment.js [new file with mode: 0644]
resources/mediawiki/mediawiki.js
resources/mediawiki/mediawiki.searchSuggest.js
serialized/.gitignore [new file with mode: 0644]
serialized/Makefile
serialized/serialize.php [deleted file]
skins/common/shared.css
skins/common/wikibits.js
skins/vector/collapsibleNav.less [deleted file]
skins/vector/components/collapsibleNav.less [new file with mode: 0644]
skins/vector/components/common.less [new file with mode: 0644]
skins/vector/components/externalLinks.less [new file with mode: 0644]
skins/vector/components/footer.less [new file with mode: 0644]
skins/vector/components/navigation.less [new file with mode: 0644]
skins/vector/components/notifications.less [new file with mode: 0644]
skins/vector/components/personalMenu.less [new file with mode: 0644]
skins/vector/components/search.less [new file with mode: 0644]
skins/vector/components/tabs.less [new file with mode: 0644]
skins/vector/components/watchstar.less [new file with mode: 0644]
skins/vector/externalLinks.less [deleted file]
skins/vector/screen.less [deleted file]
skins/vector/styles.less
tests/parser/parserTests.txt
tests/phpunit/includes/filebackend/FileBackendTest.php
tests/phpunit/includes/libs/HashRingTest.php [new file with mode: 0644]
tests/phpunit/includes/utils/HashRingTest.php [deleted file]
tests/phpunit/phpunit.php

diff --git a/HISTORY b/HISTORY
index a0ddfba..672cb64 100644 (file)
--- a/HISTORY
+++ b/HISTORY
@@ -1,9 +1,535 @@
 Change notes from older releases. For current info see RELEASE-NOTES-1.23.
 
-== MediaWiki 1.21 ==
+== MediaWiki 1.22 ==
+
+=== Configuration changes in 1.22 ===
+* $wgRedirectScript was removed. It was unused.
+* Removed $wgLocalMessageCacheSerialized, it is now always true.
+* $wgVectorUseIconWatch is now enabled by default.
+* $wgCascadingRestrictionLevels was added.
+* ftps, ssh, sftp, xmpp, sip, sips, tel, sms, bitcoin, magnet, urn, and geo
+  have been whitelisted inside of $wgUrlProtocols.
+* $wgDocType and $wgDTD have been removed and are no longer used for the DOCTYPE.
+* $wgHtml5 is no longer used by core. Setting it to false will no longer disable HTML5.
+  It is still set to true for extension compatibility but doing so in extensions is deprecated.
+* $wgXhtmlDefaultNamespace is no longer used by core. Setting it will no longer change the
+  xmlns used by MediaWiki. Reliance on this variable by extensions is deprecated.
+* $wgHandheldStyle was removed.
+* $wgHandheldForIPhone was removed.
+* $wgJsMimeType is no longer used by core. Most usage has been removed since
+  HTML output is now exclusively HTML5.
+* $wgDBOracleDRCP added. True enables persistent connection with DRCP on Oracle.
+* $wgLogAutopatrol added to allow disabling logging of autopatrol edits in the logging table.
+  default for $wgLogAutopatrol is true.
+* The 'edit' right no longer allows for editing a user's own CSS and JS.
+* New rights 'editmyusercss', 'editmyuserjs', 'viewmywatchlist',
+  'editmywatchlist', 'viewmyprivateinfo', 'editmyprivateinfo', and
+  'editmyoptions' restrict actions that were formerly allowed by default. They
+  have been added to the default for $wgGroupPermissions['*'].
+* The 'editprotected' right no longer allows bypassing of all page protection
+  restrictions. Any group using it for this purpose will now need to have all
+  the individual rights listed in $wgRestrictionTypes for the same effect.
+* The 'protect' and 'autoconfirmed' rights are no longer used for the default
+  page protection levels. The rights 'editprotected' and 'editsemiprotected'
+  are now used for this purpose instead.
+* (bug 40866) wgOldChangeTagsIndex removed.
+* $wgNoFollowDomainExceptions now only matches entire domains. For example,
+  an entry for 'bar.com' will still match 'foo.bar.com' but not 'foobar.com'.
+* $wgCopyUploadTimeout and $wgCopyUploadAsyncTimeout added to change the timeout times for
+  fetching the file during upload by url.
+* New key added to $wgGalleryOptions - $wgGalleryOptions['mode'] to set
+  default gallery mode.
+* New hook 'GalleryGetModes' to allow extensions to make new gallery modes.
+* The checkbox for staying in HTTPS displayed on the login form when $wgSecureLogin is
+  enabled has been removed. Instead, whether the user stays in HTTPS will be determined
+  based on the user's preferences, and whether they came from HTTPS or not.
+* $wgRC2UDPAddress, $wgRC2UDPInterwikiPrefix, $wgRC2UDPOmitBots, $wgRC2UDPPort,
+  and $wgRC2UDPPrefix configuration options have been deprecated in favor of a
+  $wgRCFeeds configuration array. $wgRCFeeds makes both the format and
+  destination of recent change notifications customizable, and allows for
+  multiple destinations to be specified.
+* (bug 53862) portal-url, currentevents-url and helppage have been removed from the
+  default Sidebar.
+* The 'vector-simplesearch' preference is now enabled by default. Previously
+  it was only enabled if the Vector extension was installed.
+* The precise format of metric datagrams produced by the UDP profiler and stats counter
+  may now be specified as $wgUDPProfilerFormatString and $wgStatsFormatString,
+  respectively.
+* (bug 54597) $wgBlockOpenProxies, $wgProxyPorts, $wgProxyScriptPath, and
+  $wgProxyMemcExpiry have been removed, along with the open proxy scanner
+  script they were added for.
+* Default value of $wgMaxShellMemory has been tripled (it's now 300 MB).
+
+=== New features in 1.22 ===
+* You can now install extensions using Composer.
+  See https://www.mediawiki.org/wiki/Composer
+* (bug 44525) mediawiki.jqueryMsg can now parse (whitelisted) HTML elements and attributes.
+* (bug 33454) Language::sprintfDate now has a timezone parameter, and supports
+  the "eIOPTZ" formatting characters.
+* EditWarning: A warning is shown when an editor leaves the edit form without
+  saving (enabled by default, users can opt-out via the 'useeditwarning'
+  preference). This feature was moved from the Vector extension, and is now part
+  of core for all skins. Take care when upgrading that you don't use an older
+  version of the Vector extension as this feature may conflict.
+* New 'mediawiki.ui' CSS module providing mw-ui-* styles for buttons and a
+  compact vertical form layout.
+* HTMLForm supports a new display format 'vform' which applies this compact vertical
+  layout and button styling. Special:PasswordReset uses this format.
+* New versions of login (Special:UserLogin) and create account
+  (Special:UserLogin/signup) forms using the "vform" compact vertical form layout.
+  These forms use new messages that assume a "Help logging in" link, see
+  https://www.mediawiki.org/wiki/Manual:Page_customizations;
+  https://www.mediawiki.org/wiki/Account_creation_user_experience/Strings lists the
+  message key changes.
+* (bug 23343) Implemented ability to apply IP blocks to the contents of X-Forwarded-For headers
+  by adding a new configuration variable $wgApplyIpBlocksToXff (disabled by default).
+* The new hook 'APIGetPossibleErrors' to modify the list of possible errors was
+  added.
+* (bug 25592) LogEventsList::showLogExtract() will now ignore various
+  Pager-related WebRequest parameters by default, as this is overwhelmingly
+  likely to be what was intended by users of the method. If any caller wishes
+  to use these parameters, the new param 'useRequestParams' may be set to true.
+* mw.util.addPortletLink: Tooltip is no longer required to be plain (without
+  an accesskey in it already). As such it now rountrips. Creating a link with a
+  message as tooltip, grabbing the title attribute and using it to create
+  another portlet will work as expected.
+* (bug 6747) {{ROOTPAGENAME}} introduced, contains the name of the topmost
+  page without namespace.
+* BREAKING CHANGE: (bug 41729) Display editsection links next to headings. Also
+  change their class name from .editsection to .mw-editsection and place them at
+  the end of the heading element instead of the beginning. Client-side code and
+  screen-scrapers will have to be adjusted to handle both cases (old HTML will
+  still be visible on cached page renders until they are purged); extensions
+  using the DoEditSectionLink or EditSectionLink hooks might need adjustments as
+  well.
+* (bug 45535) introduced the new 'LanguageLinks' hook for manipulating the
+  language links associated with a page before display.
+* Chosen (http://harvesthq.github.io/chosen/) was added as module 'jquery.chosen'
+* HTMLForm will turn multiselect checkboxes into a Chosen interface when setting cssclass 'mw-chosen'
+* rebuildLocalisationCache learned --lang option. Let you rebuild l10n caches
+  of the specified languages instead of all of them.
+* New GetNewMessagesAlert hook allowing extensions to disable or modify the new
+  messages alert
+* New wgUserNewMsgRevisionId JS global for logged in users. This will be null
+  if the user has no new talk page messages. Otherwise it will be set to the
+  revision ID of the oldest new talk page message. This will allow gadgets and
+  extensions to create their own new message alerts on the client side.
+* mediawiki.log: Added log.warn wrapper (uses console.warn and console.trace).
+* mediawiki.log: Implemented log.deprecate. This method defines a property and
+  uses ES5 getter/setter to emit a warning when they are used.
+* $wgCascadingRestrictionLevels was added, allowing one to specify restriction levels
+  which can be cascading (previously 'sysop' was hard-coded as the only one).
+* XHTML5 support has been improved. If you set $wgMimeType = 'application/xhtml+xml'
+  MediaWiki will try outputting markup acording to XHTML5 rules.
+* Altered hook 'ProtectionForm::save', adding the reason page protection is
+  changed as third parameter.
+* New hook 'TitleSquidURLs' for manipulating the list of URLs to be purged from
+  HTTP caches when a page is changed.
+* Changed the patrolling system to always show the link for patrolling in case the
+  current revision is patrollable. This also removed the usage of the rcid URI parameters.
+* Oracle DB backend now supports Database Resident Connection Pooling (DRCP).
+  Can be enabled by setting $wgDBOracleDRCP=true.
+  Requires Oracle DB 11gR1 or above, enabled DRCP inside the DB itself and a
+  propper connect string.
+  More about DRCP can be found at:
+  http://www.oracle-base.com/articles/11g/database-resident-connection-pool-11gr1.php
+* Add a new parameter $patrolFooterShown to hook ArticleViewFooter so the hook
+  handlers can take further action based on the status of the patrol footer
+* A new hook TitleQuickPermissions was added to allow overriding of quick
+  permissions in the Title class.
+* LinkCache singleton can now be altered or cleared, letting one to specify
+  another instance that does not rely on a database backend.
+* MediaWiki's PHPUnit tests can now use PHPUnit installed using composer --dev.
+* (bug 43689) The lists of templates used on the page and hidden categories it
+  is a member of, shown below the edit form, are now collapsible (and collapsed
+  by default).
+* Parser profiling data, formerly only available in the "NewPP limit report"
+  HTML comment, is now also displayed at the bottom of page previews.
+* Added ParserLimitReportPrepare and ParserLimitReportFormat hooks, deprecated
+  ParserLimitReport hook.
+* New user rights have been added to increase granularity in rights management
+  for extensions such as OAuth:
+** editmyusercss controls whether a user may edit their own CSS subpages.
+** editmyuserjs controls whether a user may edit their own JS subpages.
+** viewmywatchlist controls whether a user may view their watchlist.
+** editmywatchlist controls whether a user may edit their watchlist.
+** viewmyprivateinfo controls whether a user may access their private
+   information (e.g. registered email address, real name).
+** editmyprivateinfo controls whether a user may change their private
+   information.
+** editmyoptions controls whether a user may change their preferences.
+* Add new hook AbortTalkPageEmailNotification, this will be used to determine
+  whether to send the regular talk page email notification
+* Action classes registered in $wgActions are now also supported in the form of
+  a callback (which returns an instance of Action) instead of providing the name
+  of a subclass of Action.
+* (bug 46513) Vector: Add the collapsibleTabs script from the Vector extension.
+* Added $wgRecentChangesFlags for defining new flags for RecentChanges and
+  watchlists.
+* (bug 40518) mw.toolbar: Implemented mw.toolbar.addButtons for adding multiple
+ button objects in one call.
+* Rights used for the default protection levels ('sysop' and 'autoconfirmed')
+  are now used just for that purpose, instead of overloading other rights. This
+  allows easy granting of the ability to edit sysop-protected pages without
+  also granting the ability to protect and unprotect.
+* (bug 48256) Make brackets in section edit links accessible to CSS.
+  They are now wrapped in <span class="mw-editsection-bracket" />.
+* (bug 8480) Allow handler specific parameters in galleries (like page number)
+* jquery.client: Add detection for Opera 15 and Internet Explorer 11.
+* Change tags (used by the AbuseFilter extension) are now shown on diff pages.
+* Change tag lists (shown on recent changes, watchlist, user contributions,
+  history pages, diff pages) now include a link to Special:Tags to distinguish
+  them from edit summaries.
+* Added a new method and hook, User::isEveryoneAllowed() and
+  UserIsEveryoneAllowed, for use in situations where a "does everyone have this
+  right?" check is used to avoid more expensive checks.
+* (bug 14431) Display "(No difference)" instead of an empty diff (when comparing
+  revisions in the history or when previewing changes while editing).
+* New hook 'IsUploadAllowedFromUrl' is added which can be used to intercept uploads by
+  URL, useful for blacklisting specific URLs
+* (bug 21912) Watchlist token implementation has been refactored and
+  Special:ResetTokens was added to allow users to reset their tokens
+  instead of presenting them in Preferences.
+* Special:PrefixIndex now lets you strip the searched prefix from the displayed
+  titles. Given a list of articles named Bug1, Bug2, you can now transclude the
+  list of bug numbers using: {{Special:PrefixIndex/Bug|stripprefix=1}}.
+  The special page form received a new checkbox matching that option.
+* (bug 23580) Implement javascript callback interface "mw.hook".
+* (bug 30713) New mw.hook "wikipage.content".
+* (bug 40430) jquery.placeholder gets a new parameter to set the attribute value
+  to be used.
+* $wgHTCPMulticastRouting renamed $wgHTCPRouting since it accepts unicast.
+* $wgHTCPRouting rules can now be passed an array of hosts/ports to send purge
+  too. Can be used whenever several multicast group could be interested by a
+  specific purge.
+* (bug 25931) Add Special:RandomInCategory.
+* mediawiki.util: addPortletLink now supports passing a jQuery object as nextnode.
+* <wbr> can now be used inside WikiText.
+* WebResponse::setcookie is much more featureful. Callers using PHP's
+  setcookie() or setrawcookie() should begin using this instead.
+* New hook WebResponseSetCookie, called from WebResponse::setcookie().
+* New hook ResetSessionID, called when the session id is reset.
+* Add a mode parameter to <gallery> tag with potential options of "traditional",
+  "nolines", "packed", "packed-overlay", or "packed-hover".
+* (bug 47399) A success message is now displayed after changing the password.
+* Make thumb.php give HTTP redirects for file redirects
+* (bug 30607) Special:ListFiles can now show old versions of files. Additionally
+  Special:AllMyUploads was introduced so the user can get a list of all things
+  they have ever uploaded, even if it was subsequently overriden.
+* Introduced Special:MyFiles and Special:AllMyFiles as an alias for Special:MyUploads
+  and Special:AllMyUploads respectively.
+* IPv6 addresses in X-Forwarded-For headers are now normalised before checking
+  against allowed proxy lists.
+* Add deferrable update support for callback/closure.
+* Add TitleMove hook before page renames.
+* Revision deletion backend code is moved out of SpecialRevisiondelete
+* Added {{REVISIONSIZE}} variable to get the current size of a revision.
+* Add support for the LESS stylesheet language to ResourceLoader. LESS is a
+  stylesheet language that compiles into CSS. ResourceLoader file modules may
+  include LESS style files; ResourceLoader will compile these files into CSS
+  before sending them to the client.
+** The $wgResourceLoaderLESSVars configuration variable is an associative array
+   mapping variable names to string CSS values. These variables are considered
+   declared for all LESS files. Additional variables may be registered by
+   adding keys to the array.
+** $wgResourceLoaderLESSFunctions is an associative array of custom LESS
+   function names to PHP callables. See <http://leafo.net/lessphp/docs/#custom_functions>
+   for more details regarding custom functions.
+** $wgResourceLoaderLESSImportPaths is an array of file system paths. Files
+   referenced in LESS '@import' statements are looked up here first.
+* ResourceLoader supports hashes as module cache invalidation trigger (instead
+  of or in addition to timestamps).
+* Added $wgExtensionEntryPointListFiles for use in mergeMessageFileList.php.
+* Added a hook, APIQuerySiteInfoStatisticsInfo, to allow extensions to modify
+  the output of the API query meta=siteinfo&siprop=statistics
+* Primary keys have been added to both the archive table and the externallinks
+  tables.
+* Added $wgEnableParserLimitReporting to control whether the NewPP limit report is
+  output in a HTML comment.
+* The 'UnwatchArticle' and 'WatchArticle' hooks now support a Status object
+  instead of just a boolean return value to abort the hook.
+* Added a hook, SpecialWatchlistGetNonRevisionTypes, to allow extensions
+  with custom recentchanges entries to hook into the Watchlist without
+  clobbering each other.
+* A hidden, empty input field was added to the edit form, and any edit that fills
+  it in will be rejected. This prevents against the simplest form of spambots.
+  Previously in the "SimpleAntiSpam" extension by Ryan Schmidt.
+* populateRevisionLength.php maintenance script updated to also populate
+  archive.ar_len field.
+* (bug 43571) DatabaseMySQLBase learned to list views, optionally filtered by a
+  prefix. Also fixed PHPUnit test suite when using a MySQL backend containing
+  views.
+
+=== Bug fixes in 1.22 ===
+* (bug 47271) $wgContentHandlerUseDB should be set to false during the upgrade
+* Disable Special:PasswordReset when $wgEnableEmail is false. Previously one
+  could still navigate to the page by entering the URL directly.
+* (bug 47138) Fixed a fatal error when a blocked user tries to automatically
+  create an account on login due external authentication in some circumstances.
+* (bug 23393) HTML <hN> headings containing line breaks are now handled
+  correctly.
+* (bug 45803) Whitespace within == Headline == syntax and within <hN> headings
+  is now non-significant and not preserved in the HTML output.
+* (bug 47218) Special:BlockList now handles correctly user names with spaces
+  when passed as subpage.
+* Pager's properly validate which fields are allowed to be sorted on.
+* mw.util.tooltipAccessKeyRegexp: The regex now matches "option-" as well.
+  Support for Mac "option" was added in 1.16, but the regex was never updated.
+* (bug 46768) Usernames of blocking users now display correctly, even if numeric.
+* (bug 39590) Self-transclusions now show the most up to date result always
+  after save instead of being a revision behind.
+* A bias in wfRandomString() toward digits 1-7 has been corrected. Generated
+  strings will now start with digits 0 and 8-f as often as they should.
+* (bug 45371) Removed Parser_LinkHooks and CoreLinkFunctions classes.
+* (bug 41545) Allow <kbd>, <samp>, and <var> to be nested like allowed in html.
+* PLURAL magic word no longer causes a PHP notice when no matching form exists.
+* (bug 36641) Patrol page links no longer show on non-existent revisions.
+* (bug 35810) Pages not linked from Special:RecentChanges or Special:NewPages
+  are patrollable now.
+* (bug 30213) JavaScript for search suggestions is now disabled when the API
+  is disabled, and AJAX patrolling and watching are now disabled when use of
+  the write API is not allowed.
+* (bug 48294) API: Fix chunk upload async mode.
+* (bug 46749) Broken files tracking category removed from pages if an image
+  with that name is uploaded.
+* (bug 14176) System messages that are empty were previously incorrectly treated
+  as non-existent, causing a fallback to the default. This stopped users from
+  overriding system messages to make them blank.
+* (bug 48319) action=parse no longer returns an error if passed none of 'oldid',
+  'pageid', 'page', 'title', and 'text' (e.g. if only passed 'summary'). A
+  warning will instead be issued if 'title' is non-default, unless no props are
+  requested.
+* Special:Recentchangeslinked will now include upload log entries
+* (bug 41281) Fixed ugly output if file size could not be extracted for multi-page media.
+* (bug 50315) list=logevents API module will now output log entries by anonymous users.
+* (bug 38911) Handle headers with rowspan in jquery.tablesorter
+* (bug 658) Converted the table of contents on wiki pages from <table> to <div>
+  and adjusted skin CSS accordingly. The CSS was carefully crafted to be
+  backwards-compatible in all reasonable cases (uses of the __TOC__ magic word,
+  the #toc CSS id and the .toc CSS class). However, particularly bad abuse of
+  the id or the class can possibly break.
+* CSSJanus now supports rgb, hsl, rgba, and hsla color syntaxes.
+* Special:Listfiles can no longer be sorted by image name when filtering
+  by user in miser mode.
+* (bug 49074) CSSJanus: Handle values of border-radius correctly.
+* Handle relative inclusions ({{../name}}) in main namespace with subpages
+  enabled correctly (previously MediaWiki tried to include Template:Parent/name
+  instead of just Parent/name).
+* Added $wgAPIUselessQueryPages to allow extensions to flag their query pages
+  for non-inclusion in ApiQueryQueryPages.
+* (bug 50870) mediawiki.notification: Notification area should remain visible
+  when scrolled down.
+* (bug 13438) Special:MIMESearch no longer an expensive special page.
+* (bug 48342) Fixed a fatal error when $wgValidateAllHtml is set to true and
+  the function apache_request_headers() function is not available.
+* (bug 33399) LivePreview: Re-run wikipage content handlers
+  (jquery.makeCollapsible, jquery.tablesorter) after preview content is loaded.
+* (bug 51891) Fixed PHP notice on Special:PagesWithProp when no properties
+  are defined.
+* (bug 52006) Corrected documentation of $wgTranscludeCacheExpiry.
+* (bug 52077) The APIEditBeforeSave hook is giving the content of the whole
+  revision as second argument now, rather than just the current section.
+* (bug 49694) $wgSpamRegex is now also applied on the new section headline text
+  adding a new topic on a page
+* (bug 41756) Improve treatment of multiple comments on a blank line.
+* (bug 51064) Purge upstream caches when deleting file assets.
+* (bug 39012) File types with a mime that we do not know the extension for
+  can no longer be uploaded as an extension that we do know the mime type
+  for.
+* (bug 51742) Add data-sort-value for better sorting of hitcounts Special:Tags
+* (bug 26811) On DB error pages, server hostnames are now hidden when both
+  $wgShowHostnames and $wgShowSQLErrors are false.
+* (bug 6200) line breaks in <blockquote> are handled like they are in <div>
+* (bug 14931) Default character set now set to 'utf8' when a new MySQL
+  database is created.
+* (bug 47191) Fixed "Column 'si_title' cannot be part of FULLTEXT index"
+  MySQL error when installing using the binary character set option.
+* (bug 45288) Support mysqli PHP extension
+* (bug 55818) BREAKING CHANGE: Removed undocumented 'Debug' hook in wfDebug.
+  This resolves an infinite loop when using $wgDebugFunctionEntry = true.
+* (bug 56707) Correct tooltip of "Next n results" on query special pages.
+* (bug 56770) mw.util.addPortletLink: Check length before access array index.
+
+=== API changes in 1.22 ===
+* (bug 25553) The JSON output formatter now leaves forward slashes unescaped
+  to improve human readability of URLs and similar strings. Also, a "utf8"
+  option is now provided to use UTF-8 encoding instead of hex escape codes
+  for most non-ASCII characters.
+* (bug 46626) xmldoublequote parameter was removed. Because of a bug, the
+  parameter has had no effect since MediaWiki 1.16, and so its removal is
+  unlikely to impact existing clients.
+* (bug 47216) action=query&meta=siteinfo&siprop=skins will now indicate which
+  skin is the default and which are unusable (e.g. listed in $wgSkipSkins).
+* (bug 25325) Added support for wlshow filtering (bots/anon/minor/patrolled)
+  to action=feedwatchlist.
+* WDDX formatted output will actually be formatted (and normal output will no
+  longer be), and will no longer choke on booleans.
+* action=opensearch no longer silently ignores the format parameter.
+* action=opensearch now supports format=jsonfm.
+* list=usercontribs&ucprop=ids will now include the parent revision id.
+* BREAKING CHANGE: action=parse no longer returns all langlinks for the page
+  with prop=langlinks by default. The new effectivelanglinks parameter will
+  request that the LanguageLinks hook be called to determine the effective
+  language links.
+* BREAKING CHANGE: list=allpages, list=langbacklinks, and prop=langlinks do not
+  apply the new LanguageLinks hook, and thus only consider language links
+  stored in the database.
+* (bug 47219) Allow specifying change type of Wikipedia feed items
+* prop=imageinfo now allows setting iiurlheight without setting iiurlwidth
+* prop=info now adds the content model and page language of the title.
+* New upload log entries will now contain information on the relevant
+  image (sha1 and timestamp).
+* (bug 49239) action=parse now can parse in preview and section preview modes.
+* (bug 49259) action=patrol now accepts revision ids.
+* (bug 48129) list=blocks&bkip= now correctly handles IPv6 CIDR ranges and
+  honors $wgBlockCIDRLimit. Note any clients passing invalid values to bkip
+  will now receive an error, rather than the previous behavior listing all
+  user blocks.
+* (bug 48201) action=parse&text=foo now assumes wikitext if no title is given,
+  rather than using the content model of the page "API".
+* action=watch no longer silently ignores hook abort.
+* (bug 50785) action=purge with forcelinkupdate=1 no longer queues refreshLinks
+  jobs in the job queue for link table updates of pages that use the given page
+  as a template. Instead, forcerecursivelinkupdate=1 is introduced and should
+  be used if that behaviour is desirable.
+* The 'debugLog' property (enabled by $wgDebugToolbar) no longer sets the log
+  entry values through ApiResult::content but directly. This changes the JSON
+  output from an array of objects with content in '*' to an array of strings
+  with the content.
+* (bug 51342) prop=imageinfo iicontinue now contains the dbkey, not the text
+  version of the title.
+* (bug 52538) action=edit will now use empty text instead of the contents
+  of section 0 when passed prependtext or appendtext with section=new.
+* Support for the 'gettoken' parameter to action=block and action=unblock,
+  deprecated since 1.20, has been removed.
+* (bug 49090) Token-getting functions will fail when using jsonp callbacks.
+* (bug 52699) action=upload returns normalized file name on warning
+  "exists-normalized" instead of filename to be uploaded to.
+* (bug 53884) action=edit will now return an error when the specified section
+  does not exist in the page.
+* Added meta=filerepoinfo API module for getting information about foreign
+  file repositories, and related ForeignAPIRepo methods getInfo and getApiUrl.
+* The new query module list=allfileusages to enumerate file usages was added.
+
+=== Languages updated in 1.22===
+
+MediaWiki supports over 350 languages. Many localisations are updated
+regularly. Below only new and removed languages are listed, as well as
+changes to languages because of Bugzilla reports.
+
+* Batak Toba (bbc-latn) added.
+* (bug 46751) Made Buryat (Russia) (буряад) (bxr) fallback to Russian.
+
+=== Other changes in 1.22 ===
+* BREAKING CHANGE: Implementation of MediaWiki's JS and JSON value encoding
+  has changed:
+** MediaWiki no longer supports PHP installations in which the native JSON
+   extension is missing or disabled.
+** XmlJsCode objects can no longer be nested inside objects or arrays.
+   (For Xml::encodeJsCall(), this individually applies to each argument.)
+** The sets of characters escaped by default, along with the precise escape
+   sequences used, have changed (except for the Xml::escapeJsString()
+   function, which is now deprecated).
+* BREAKING CHANGE: The Services_JSON class has been removed. If necessary,
+  be sure to upgrade affected extensions at the same time (e.g. Collection).
+* redirect.php was removed. It was unused.
+* ClickTracking integration was dropped from the mediaWiki.user.bucket
+  JavaScript function. The 'tracked' option is now ignored.
+* BREAKING CHANGE: Legacy skins Simple, MySkin, Chick, Standard and Nostalgia
+  were all removed. (Nostalgia was moved to an extension.) The SkinLegacy and
+  LegacyTemplate classes that supported them were removed as well and are now a
+  part of the Nostalgia extension.
+* Event namespace used by jquery.makeCollapsible has been changed from
+  'mw-collapse' to 'mw-collapsible' for consistency with the module name.
+* BREAKING CHANGE: The "ExternalAuth" authentication subsystem was removed, along
+  with its associated globals of $wgExternalAuthType, $wgExternalAuthConf,
+  $wgAutocreatePolicy and $wgAllowPrefChange. Affected users are encouraged to
+  use AuthPlugin for external authentication/authorization needs.
+* The Quickbar feature of the legacy skin model and the last remnants of it
+  throughout the code base have been removed.
+* Externaledit/externaldiff preference was removed. Very few users used this
+  feature, and improper configuration can actually prevent a user from editing
+* Calling Linker methods using a skin will now output deprecation warnings.
+* (bug 46680) "Return to" links are no longer tagged with rel="next".
+* BREAKING CHANGE: mw.util.tooltipAccessKeyRegexp: The match group for the
+  accesskey character is now $6 instead of $5.
+* HipHop compiler (hphpc) support was removed. HipHop VM support (hhvm) was
+  added.
+* A new Special:Redirect page was added, providing lookup by revision ID,
+  user ID, or file name.  The old Special:Filepath page was reimplemented
+  to redirect through Special:Redirect.
+* Monobook: Removed the old conditional stylesheets for Opera 6, 7 and 9.
+* Support for XHTML 1.0 has been removed. MediaWiki now only outputs (X)HTML5.
+* wikibits: User-agent related globals have been deprecated. The following
+  properties now default to false and emit mw.log.warn: is_gecko, is_chrome_mac,
+  is_chrome, webkit_version, is_safari_win, is_safari, webkit_match, is_ff2,
+  ff2_bugs, is_ff2_win, is_ff2_x11, opera95_bugs, opera7_bugs, opera6_bugs,
+  is_opera_95, is_opera_preseven, is_opera, and ie6_bugs.
+* (bug 48276) MediaWiki will now flash a confirmation message upon successfully
+  editing a page.
+* (bug 40785) mediawiki.legacy.ajax has been marked as deprecated. The following
+  properties now emit mw.log.warn when accessed: sajax_debug, sajax_init_object,
+  sajax_do_call and wfSupportsAjax.
+* BREAKING CHANGE: meta keywords are no longer supported. A <meta name="keywords"
+  will no longer be output and OutputPage::addKeyword no longer exists.
+* Methods Title::userCanEditCssSubpage and Title::userCanEditJsSubpage,
+  deprecated since 1.19, have been removed.
+* (bug 50134) Hook functions are no longer required to return a value. When a
+  hook function does not return a value (or when it returns an explicit null),
+  processing continues. To abort the hook, a hook function must return an
+  explicit, boolean false or a string error message. Other falsey values are
+  tantamount to a 'return true' in earlier versions of MediaWiki.
+* BREAKING CHANGE: The EditSectionLink hook was removed after being
+  deprecated since MediaWiki 1.14. Use DoEditSectionLink instead.
+* (bug 48256) The 'editsection-brackets' optional message was removed.
+  Section edit links' brackets can now be customized using CSS by
+  styling span.mw-editsection-bracket.
+* The usePatrol function in ChangesList has been marked as deprecated.
+* (bug 50785) A "null edit", that is, a save action in which no changes to the
+  page text are made and no revision recorded, will no longer send refreshLinks
+  jobs to the job table to update pages which use the edited page as a template.
+* The LivePreviewPrepare and LivePreviewDone events triggered on "jQuery( mw )"
+  have been deprecated in favour of using mw.hook.
+* The 'showjumplinks' user preference has been removed, jump links are now
+  always included.
+* Methods RecentChange::notifyRC2UDP, RecentChange::sendToUDP, and
+  RecentChange::cleanupForIRC have been deprecated, as it is now the
+  responsibility of classes implementing the RCFeedFormatter and RCFeedEngine
+  interfaces to implement the formatting and delivery for recent change
+  notifications.
+* SpecialPrefixindex methods namespacePrefixForm() and showPrefixChunk() have
+  been made protected. They were accepting form variance arguments, this is now
+  using properties in the SpecialPrefixindex class.
+* (bug 50310) BREAKING CHANGE: wikibits: Drop support for mwCustomEditButtons.
+  It defaults to an empty array and emits mw.log.warn when accessed.
+* BREAKING CHANGE: Special:Disambiguations has been removed from MediaWiki core.
+  Functions related to disambiguation pages are now handled by the Disambiguator
+  extension (https://www.mediawiki.org/wiki/Extension:Disambiguator) (bug
+  35981).
+* BREAKING CHANGE: The 'mediawiki.legacy.wikiprintable' module has been removed.
+  The skins/common/wikiprintable.css file no longer exists. Return value of
+  Skin#commonPrintStylesheet is ignored. Please use the 'mediawiki.legacy.commonPrint'
+  module instead or base your skin on SkinTemplate.
+* (bug 49629) The hook ExtractThumbParamaters has been deprecated in favour
+  of media handler overriding MediaHandler::parseParamString.
+* (bug 46512) The collapsibleNav feature from the Vector extension has been moved
+  to the Vector skin in core.
+* SpecialRecentChanges::addRecentChangesJS() function has been renamed
+  to addModules() and made protected.
+* Methods WatchAction::doWatch and WatchAction::doUnwatch now return a Status
+  object instead of a boolean.
+* Information boxes (CSS classes errorbox, warningbox, successbox) have been
+  made more subtle.
+* BREAKING CHANGE: The module 'mediawiki.legacy.IEFixes' has been removed as it was
+  unused. The file skins/common/IEFixes.js remains but is only used by wikibits.
+  The file never contained any re-usable components. To use it in a skin, load
+  'mediawiki.legacy.wikibits' (which IEFixes depends on) and that will import
+  IEFixes automatically if user agent conditions are met.
+* Code specific to the Math extension was marked as deprecated.
+* mediawiki.util: mw.util.wikiGetlink has been renamed to getUrl. (The old name
+  still works, but is deprecated.)
 
-MediaWiki 1.21 is an alpha-quality branch and is not recommended for use in
-production.
+== MediaWiki 1.21 ==
 
 === Configuration changes in 1.21 ===
 * (bug 29374) $wgVectorUseSimpleSearch is now enabled by default.
diff --git a/RELEASE-NOTES-1.22 b/RELEASE-NOTES-1.22
deleted file mode 100644 (file)
index 333696b..0000000
+++ /dev/null
@@ -1,600 +0,0 @@
-Security reminder: MediaWiki does not require PHP's register_globals. If you
-have it on, turn it '''off''' if you can.
-
-== MediaWiki 1.22 ==
-
-THIS IS NOT A RELEASE YET
-
-MediaWiki 1.22 is an alpha-quality branch and is not recommended for use in
-production.
-
-=== Configuration changes in 1.22 ===
-* $wgRedirectScript was removed. It was unused.
-* Removed $wgLocalMessageCacheSerialized, it is now always true.
-* $wgVectorUseIconWatch is now enabled by default.
-* $wgCascadingRestrictionLevels was added.
-* ftps, ssh, sftp, xmpp, sip, sips, tel, sms, bitcoin, magnet, urn, and geo
-  have been whitelisted inside of $wgUrlProtocols.
-* $wgDocType and $wgDTD have been removed and are no longer used for the DOCTYPE.
-* $wgHtml5 is no longer used by core. Setting it to false will no longer disable HTML5.
-  It is still set to true for extension compatibility but doing so in extensions is deprecated.
-* $wgXhtmlDefaultNamespace is no longer used by core. Setting it will no longer change the
-  xmlns used by MediaWiki. Reliance on this variable by extensions is deprecated.
-* $wgHandheldStyle was removed.
-* $wgHandheldForIPhone was removed.
-* $wgJsMimeType is no longer used by core. Most usage has been removed since
-  HTML output is now exclusively HTML5.
-* $wgDBOracleDRCP added. True enables persistent connection with DRCP on Oracle.
-* $wgLogAutopatrol added to allow disabling logging of autopatrol edits in the logging table.
-  default for $wgLogAutopatrol is true.
-* The 'edit' right no longer allows for editing a user's own CSS and JS.
-* New rights 'editmyusercss', 'editmyuserjs', 'viewmywatchlist',
-  'editmywatchlist', 'viewmyprivateinfo', 'editmyprivateinfo', and
-  'editmyoptions' restrict actions that were formerly allowed by default. They
-  have been added to the default for $wgGroupPermissions['*'].
-* The 'editprotected' right no longer allows bypassing of all page protection
-  restrictions. Any group using it for this purpose will now need to have all
-  the individual rights listed in $wgRestrictionTypes for the same effect.
-* The 'protect' and 'autoconfirmed' rights are no longer used for the default
-  page protection levels. The rights 'editprotected' and 'editsemiprotected'
-  are now used for this purpose instead.
-* (bug 40866) wgOldChangeTagsIndex removed.
-* $wgNoFollowDomainExceptions now only matches entire domains. For example,
-  an entry for 'bar.com' will still match 'foo.bar.com' but not 'foobar.com'.
-* $wgCopyUploadTimeout and $wgCopyUploadAsyncTimeout added to change the timeout times for
-  fetching the file during upload by url.
-* New key added to $wgGalleryOptions - $wgGalleryOptions['mode'] to set
-  default gallery mode.
-* New hook 'GalleryGetModes' to allow extensions to make new gallery modes.
-* The checkbox for staying in HTTPS displayed on the login form when $wgSecureLogin is
-  enabled has been removed. Instead, whether the user stays in HTTPS will be determined
-  based on the user's preferences, and whether they came from HTTPS or not.
-* $wgRC2UDPAddress, $wgRC2UDPInterwikiPrefix, $wgRC2UDPOmitBots, $wgRC2UDPPort,
-  and $wgRC2UDPPrefix configuration options have been deprecated in favor of a
-  $wgRCFeeds configuration array. $wgRCFeeds makes both the format and
-  destination of recent change notifications customizable, and allows for
-  multiple destinations to be specified.
-* (bug 53862) portal-url, currentevents-url and helppage have been removed from the
-  default Sidebar.
-* The 'vector-simplesearch' preference is now enabled by default. Previously
-  it was only enabled if the Vector extension was installed.
-* The precise format of metric datagrams produced by the UDP profiler and stats counter
-  may now be specified as $wgUDPProfilerFormatString and $wgStatsFormatString,
-  respectively.
-* (bug 54597) $wgBlockOpenProxies, $wgProxyPorts, $wgProxyScriptPath, and
-  $wgProxyMemcExpiry have been removed, along with the open proxy scanner
-  script they were added for.
-* Default value of $wgMaxShellMemory has been tripled (it's now 300 MB).
-
-=== New features in 1.22 ===
-* You can now install extensions using Composer.
-  See https://www.mediawiki.org/wiki/Composer
-* (bug 44525) mediawiki.jqueryMsg can now parse (whitelisted) HTML elements and attributes.
-* (bug 33454) Language::sprintfDate now has a timezone parameter, and supports
-  the "eIOPTZ" formatting characters.
-* EditWarning: A warning is shown when an editor leaves the edit form without
-  saving (enabled by default, users can opt-out via the 'useeditwarning'
-  preference). This feature was moved from the Vector extension, and is now part
-  of core for all skins. Take care when upgrading that you don't use an older
-  version of the Vector extension as this feature may conflict.
-* New 'mediawiki.ui' CSS module providing mw-ui-* styles for buttons and a
-  compact vertical form layout.
-* HTMLForm supports a new display format 'vform' which applies this compact vertical
-  layout and button styling. Special:PasswordReset uses this format.
-* New versions of login (Special:UserLogin) and create account
-  (Special:UserLogin/signup) forms using the "vform" compact vertical form layout.
-  These forms use new messages that assume a "Help logging in" link, see
-  https://www.mediawiki.org/wiki/Manual:Page_customizations;
-  https://www.mediawiki.org/wiki/Account_creation_user_experience/Strings lists the
-  message key changes.
-* (bug 23343) Implemented ability to apply IP blocks to the contents of X-Forwarded-For headers
-  by adding a new configuration variable $wgApplyIpBlocksToXff (disabled by default).
-* The new hook 'APIGetPossibleErrors' to modify the list of possible errors was
-  added.
-* (bug 25592) LogEventsList::showLogExtract() will now ignore various
-  Pager-related WebRequest parameters by default, as this is overwhelmingly
-  likely to be what was intended by users of the method. If any caller wishes
-  to use these parameters, the new param 'useRequestParams' may be set to true.
-* mw.util.addPortletLink: Tooltip is no longer required to be plain (without
-  an accesskey in it already). As such it now rountrips. Creating a link with a
-  message as tooltip, grabbing the title attribute and using it to create
-  another portlet will work as expected.
-* (bug 6747) {{ROOTPAGENAME}} introduced, contains the name of the topmost
-  page without namespace.
-* BREAKING CHANGE: (bug 41729) Display editsection links next to headings. Also
-  change their class name from .editsection to .mw-editsection and place them at
-  the end of the heading element instead of the beginning. Client-side code and
-  screen-scrapers will have to be adjusted to handle both cases (old HTML will
-  still be visible on cached page renders until they are purged); extensions
-  using the DoEditSectionLink or EditSectionLink hooks might need adjustments as
-  well.
-* (bug 45535) introduced the new 'LanguageLinks' hook for manipulating the
-  language links associated with a page before display.
-* Chosen (http://harvesthq.github.io/chosen/) was added as module 'jquery.chosen'
-* HTMLForm will turn multiselect checkboxes into a Chosen interface when setting cssclass 'mw-chosen'
-* rebuildLocalisationCache learned --lang option. Let you rebuild l10n caches
-  of the specified languages instead of all of them.
-* New GetNewMessagesAlert hook allowing extensions to disable or modify the new
-  messages alert
-* New wgUserNewMsgRevisionId JS global for logged in users. This will be null
-  if the user has no new talk page messages. Otherwise it will be set to the
-  revision ID of the oldest new talk page message. This will allow gadgets and
-  extensions to create their own new message alerts on the client side.
-* mediawiki.log: Added log.warn wrapper (uses console.warn and console.trace).
-* mediawiki.log: Implemented log.deprecate. This method defines a property and
-  uses ES5 getter/setter to emit a warning when they are used.
-* $wgCascadingRestrictionLevels was added, allowing one to specify restriction levels
-  which can be cascading (previously 'sysop' was hard-coded as the only one).
-* XHTML5 support has been improved. If you set $wgMimeType = 'application/xhtml+xml'
-  MediaWiki will try outputting markup acording to XHTML5 rules.
-* Altered hook 'ProtectionForm::save', adding the reason page protection is
-  changed as third parameter.
-* New hook 'TitleSquidURLs' for manipulating the list of URLs to be purged from
-  HTTP caches when a page is changed.
-* Changed the patrolling system to always show the link for patrolling in case the
-  current revision is patrollable. This also removed the usage of the rcid URI parameters.
-* Oracle DB backend now supports Database Resident Connection Pooling (DRCP).
-  Can be enabled by setting $wgDBOracleDRCP=true.
-  Requires Oracle DB 11gR1 or above, enabled DRCP inside the DB itself and a
-  propper connect string.
-  More about DRCP can be found at:
-  http://www.oracle-base.com/articles/11g/database-resident-connection-pool-11gr1.php
-* Add a new parameter $patrolFooterShown to hook ArticleViewFooter so the hook
-  handlers can take further action based on the status of the patrol footer
-* A new hook TitleQuickPermissions was added to allow overriding of quick
-  permissions in the Title class.
-* LinkCache singleton can now be altered or cleared, letting one to specify
-  another instance that does not rely on a database backend.
-* MediaWiki's PHPUnit tests can now use PHPUnit installed using composer --dev.
-* (bug 43689) The lists of templates used on the page and hidden categories it
-  is a member of, shown below the edit form, are now collapsible (and collapsed
-  by default).
-* Parser profiling data, formerly only available in the "NewPP limit report"
-  HTML comment, is now also displayed at the bottom of page previews.
-* Added ParserLimitReportPrepare and ParserLimitReportFormat hooks, deprecated
-  ParserLimitReport hook.
-* New user rights have been added to increase granularity in rights management
-  for extensions such as OAuth:
-** editmyusercss controls whether a user may edit their own CSS subpages.
-** editmyuserjs controls whether a user may edit their own JS subpages.
-** viewmywatchlist controls whether a user may view their watchlist.
-** editmywatchlist controls whether a user may edit their watchlist.
-** viewmyprivateinfo controls whether a user may access their private
-   information (e.g. registered email address, real name).
-** editmyprivateinfo controls whether a user may change their private
-   information.
-** editmyoptions controls whether a user may change their preferences.
-* Add new hook AbortTalkPageEmailNotification, this will be used to determine
-  whether to send the regular talk page email notification
-* Action classes registered in $wgActions are now also supported in the form of
-  a callback (which returns an instance of Action) instead of providing the name
-  of a subclass of Action.
-* (bug 46513) Vector: Add the collapsibleTabs script from the Vector extension.
-* Added $wgRecentChangesFlags for defining new flags for RecentChanges and
-  watchlists.
-* (bug 40518) mw.toolbar: Implemented mw.toolbar.addButtons for adding multiple
- button objects in one call.
-* Rights used for the default protection levels ('sysop' and 'autoconfirmed')
-  are now used just for that purpose, instead of overloading other rights. This
-  allows easy granting of the ability to edit sysop-protected pages without
-  also granting the ability to protect and unprotect.
-* (bug 48256) Make brackets in section edit links accessible to CSS.
-  They are now wrapped in <span class="mw-editsection-bracket" />.
-* (bug 8480) Allow handler specific parameters in galleries (like page number)
-* jquery.client: Add detection for Opera 15 and Internet Explorer 11.
-* Change tags (used by the AbuseFilter extension) are now shown on diff pages.
-* Change tag lists (shown on recent changes, watchlist, user contributions,
-  history pages, diff pages) now include a link to Special:Tags to distinguish
-  them from edit summaries.
-* Added a new method and hook, User::isEveryoneAllowed() and
-  UserIsEveryoneAllowed, for use in situations where a "does everyone have this
-  right?" check is used to avoid more expensive checks.
-* (bug 14431) Display "(No difference)" instead of an empty diff (when comparing
-  revisions in the history or when previewing changes while editing).
-* New hook 'IsUploadAllowedFromUrl' is added which can be used to intercept uploads by
-  URL, useful for blacklisting specific URLs
-* (bug 21912) Watchlist token implementation has been refactored and
-  Special:ResetTokens was added to allow users to reset their tokens
-  instead of presenting them in Preferences.
-* Special:PrefixIndex now lets you strip the searched prefix from the displayed
-  titles. Given a list of articles named Bug1, Bug2, you can now transclude the
-  list of bug numbers using: {{Special:PrefixIndex/Bug|stripprefix=1}}.
-  The special page form received a new checkbox matching that option.
-* (bug 23580) Implement javascript callback interface "mw.hook".
-* (bug 30713) New mw.hook "wikipage.content".
-* (bug 40430) jquery.placeholder gets a new parameter to set the attribute value
-  to be used.
-* $wgHTCPMulticastRouting renamed $wgHTCPRouting since it accepts unicast.
-* $wgHTCPRouting rules can now be passed an array of hosts/ports to send purge
-  too. Can be used whenever several multicast group could be interested by a
-  specific purge.
-* (bug 25931) Add Special:RandomInCategory.
-* mediawiki.util: addPortletLink now supports passing a jQuery object as nextnode.
-* <wbr> can now be used inside WikiText.
-* WebResponse::setcookie is much more featureful. Callers using PHP's
-  setcookie() or setrawcookie() should begin using this instead.
-* New hook WebResponseSetCookie, called from WebResponse::setcookie().
-* New hook ResetSessionID, called when the session id is reset.
-* Add a mode parameter to <gallery> tag with potential options of "traditional",
-  "nolines", "packed", "packed-overlay", or "packed-hover".
-* (bug 47399) A success message is now displayed after changing the password.
-* Make thumb.php give HTTP redirects for file redirects
-* (bug 30607) Special:ListFiles can now show old versions of files. Additionally
-  Special:AllMyUploads was introduced so the user can get a list of all things
-  they have ever uploaded, even if it was subsequently overriden.
-* Introduced Special:MyFiles and Special:AllMyFiles as an alias for Special:MyUploads
-  and Special:AllMyUploads respectively.
-* IPv6 addresses in X-Forwarded-For headers are now normalised before checking
-  against allowed proxy lists.
-* Add deferrable update support for callback/closure.
-* Add TitleMove hook before page renames.
-* Revision deletion backend code is moved out of SpecialRevisiondelete
-* Added {{REVISIONSIZE}} variable to get the current size of a revision.
-* Add support for the LESS stylesheet language to ResourceLoader. LESS is a
-  stylesheet language that compiles into CSS. ResourceLoader file modules may
-  include LESS style files; ResourceLoader will compile these files into CSS
-  before sending them to the client.
-** The $wgResourceLoaderLESSVars configuration variable is an associative array
-   mapping variable names to string CSS values. These variables are considered
-   declared for all LESS files. Additional variables may be registered by
-   adding keys to the array.
-** $wgResourceLoaderLESSFunctions is an associative array of custom LESS
-   function names to PHP callables. See <http://leafo.net/lessphp/docs/#custom_functions>
-   for more details regarding custom functions.
-** $wgResourceLoaderLESSImportPaths is an array of file system paths. Files
-   referenced in LESS '@import' statements are looked up here first.
-* ResourceLoader supports hashes as module cache invalidation trigger (instead
-  of or in addition to timestamps).
-* Added $wgExtensionEntryPointListFiles for use in mergeMessageFileList.php.
-* Added a hook, APIQuerySiteInfoStatisticsInfo, to allow extensions to modify
-  the output of the API query meta=siteinfo&siprop=statistics
-* Primary keys have been added to both the archive table and the externallinks
-  tables.
-* Added $wgEnableParserLimitReporting to control whether the NewPP limit report is
-  output in a HTML comment.
-* The 'UnwatchArticle' and 'WatchArticle' hooks now support a Status object
-  instead of just a boolean return value to abort the hook.
-* Added a hook, SpecialWatchlistGetNonRevisionTypes, to allow extensions
-  with custom recentchanges entries to hook into the Watchlist without
-  clobbering each other.
-* A hidden, empty input field was added to the edit form, and any edit that fills
-  it in will be rejected. This prevents against the simplest form of spambots.
-  Previously in the "SimpleAntiSpam" extension by Ryan Schmidt.
-* populateRevisionLength.php maintenance script updated to also populate
-  archive.ar_len field.
-* (bug 43571) DatabaseMySQLBase learned to list views, optionally filtered by a
-  prefix. Also fixed PHPUnit test suite when using a MySQL backend containing
-  views.
-
-=== Bug fixes in 1.22 ===
-* (bug 47271) $wgContentHandlerUseDB should be set to false during the upgrade
-* Disable Special:PasswordReset when $wgEnableEmail is false. Previously one
-  could still navigate to the page by entering the URL directly.
-* (bug 47138) Fixed a fatal error when a blocked user tries to automatically
-  create an account on login due external authentication in some circumstances.
-* (bug 23393) HTML <hN> headings containing line breaks are now handled
-  correctly.
-* (bug 45803) Whitespace within == Headline == syntax and within <hN> headings
-  is now non-significant and not preserved in the HTML output.
-* (bug 47218) Special:BlockList now handles correctly user names with spaces
-  when passed as subpage.
-* Pager's properly validate which fields are allowed to be sorted on.
-* mw.util.tooltipAccessKeyRegexp: The regex now matches "option-" as well.
-  Support for Mac "option" was added in 1.16, but the regex was never updated.
-* (bug 46768) Usernames of blocking users now display correctly, even if numeric.
-* (bug 39590) Self-transclusions now show the most up to date result always
-  after save instead of being a revision behind.
-* A bias in wfRandomString() toward digits 1-7 has been corrected. Generated
-  strings will now start with digits 0 and 8-f as often as they should.
-* (bug 45371) Removed Parser_LinkHooks and CoreLinkFunctions classes.
-* (bug 41545) Allow <kbd>, <samp>, and <var> to be nested like allowed in html.
-* PLURAL magic word no longer causes a PHP notice when no matching form exists.
-* (bug 36641) Patrol page links no longer show on non-existent revisions.
-* (bug 35810) Pages not linked from Special:RecentChanges or Special:NewPages
-  are patrollable now.
-* (bug 30213) JavaScript for search suggestions is now disabled when the API
-  is disabled, and AJAX patrolling and watching are now disabled when use of
-  the write API is not allowed.
-* (bug 48294) API: Fix chunk upload async mode.
-* (bug 46749) Broken files tracking category removed from pages if an image
-  with that name is uploaded.
-* (bug 14176) System messages that are empty were previously incorrectly treated
-  as non-existent, causing a fallback to the default. This stopped users from
-  overriding system messages to make them blank.
-* (bug 48319) action=parse no longer returns an error if passed none of 'oldid',
-  'pageid', 'page', 'title', and 'text' (e.g. if only passed 'summary'). A
-  warning will instead be issued if 'title' is non-default, unless no props are
-  requested.
-* Special:Recentchangeslinked will now include upload log entries
-* (bug 41281) Fixed ugly output if file size could not be extracted for multi-page media.
-* (bug 50315) list=logevents API module will now output log entries by anonymous users.
-* (bug 38911) Handle headers with rowspan in jquery.tablesorter
-* (bug 658) Converted the table of contents on wiki pages from <table> to <div>
-  and adjusted skin CSS accordingly. The CSS was carefully crafted to be
-  backwards-compatible in all reasonable cases (uses of the __TOC__ magic word,
-  the #toc CSS id and the .toc CSS class). However, particularly bad abuse of
-  the id or the class can possibly break.
-* CSSJanus now supports rgb, hsl, rgba, and hsla color syntaxes.
-* Special:Listfiles can no longer be sorted by image name when filtering
-  by user in miser mode.
-* (bug 49074) CSSJanus: Handle values of border-radius correctly.
-* Handle relative inclusions ({{../name}}) in main namespace with subpages
-  enabled correctly (previously MediaWiki tried to include Template:Parent/name
-  instead of just Parent/name).
-* Added $wgAPIUselessQueryPages to allow extensions to flag their query pages
-  for non-inclusion in ApiQueryQueryPages.
-* (bug 50870) mediawiki.notification: Notification area should remain visible
-  when scrolled down.
-* (bug 13438) Special:MIMESearch no longer an expensive special page.
-* (bug 48342) Fixed a fatal error when $wgValidateAllHtml is set to true and
-  the function apache_request_headers() function is not available.
-* (bug 33399) LivePreview: Re-run wikipage content handlers
-  (jquery.makeCollapsible, jquery.tablesorter) after preview content is loaded.
-* (bug 51891) Fixed PHP notice on Special:PagesWithProp when no properties
-  are defined.
-* (bug 52006) Corrected documentation of $wgTranscludeCacheExpiry.
-* (bug 52077) The APIEditBeforeSave hook is giving the content of the whole
-  revision as second argument now, rather than just the current section.
-* (bug 49694) $wgSpamRegex is now also applied on the new section headline text
-  adding a new topic on a page
-* (bug 41756) Improve treatment of multiple comments on a blank line.
-* (bug 51064) Purge upstream caches when deleting file assets.
-* (bug 39012) File types with a mime that we do not know the extension for
-  can no longer be uploaded as an extension that we do know the mime type
-  for.
-* (bug 51742) Add data-sort-value for better sorting of hitcounts Special:Tags
-* (bug 26811) On DB error pages, server hostnames are now hidden when both
-  $wgShowHostnames and $wgShowSQLErrors are false.
-* (bug 6200) line breaks in <blockquote> are handled like they are in <div>
-* (bug 14931) Default character set now set to 'utf8' when a new MySQL
-  database is created.
-* (bug 47191) Fixed "Column 'si_title' cannot be part of FULLTEXT index"
-  MySQL error when installing using the binary character set option.
-* (bug 45288) Support mysqli PHP extension
-* (bug 55818) BREAKING CHANGE: Removed undocumented 'Debug' hook in wfDebug.
-  This resolves an infinite loop when using $wgDebugFunctionEntry = true.
-* (bug 56707) Correct tooltip of "Next n results" on query special pages.
-* (bug 56770) mw.util.addPortletLink: Check length before access array index.
-
-=== API changes in 1.22 ===
-* (bug 25553) The JSON output formatter now leaves forward slashes unescaped
-  to improve human readability of URLs and similar strings. Also, a "utf8"
-  option is now provided to use UTF-8 encoding instead of hex escape codes
-  for most non-ASCII characters.
-* (bug 46626) xmldoublequote parameter was removed. Because of a bug, the
-  parameter has had no effect since MediaWiki 1.16, and so its removal is
-  unlikely to impact existing clients.
-* (bug 47216) action=query&meta=siteinfo&siprop=skins will now indicate which
-  skin is the default and which are unusable (e.g. listed in $wgSkipSkins).
-* (bug 25325) Added support for wlshow filtering (bots/anon/minor/patrolled)
-  to action=feedwatchlist.
-* WDDX formatted output will actually be formatted (and normal output will no
-  longer be), and will no longer choke on booleans.
-* action=opensearch no longer silently ignores the format parameter.
-* action=opensearch now supports format=jsonfm.
-* list=usercontribs&ucprop=ids will now include the parent revision id.
-* BREAKING CHANGE: action=parse no longer returns all langlinks for the page
-  with prop=langlinks by default. The new effectivelanglinks parameter will
-  request that the LanguageLinks hook be called to determine the effective
-  language links.
-* BREAKING CHANGE: list=allpages, list=langbacklinks, and prop=langlinks do not
-  apply the new LanguageLinks hook, and thus only consider language links
-  stored in the database.
-* (bug 47219) Allow specifying change type of Wikipedia feed items
-* prop=imageinfo now allows setting iiurlheight without setting iiurlwidth
-* prop=info now adds the content model and page language of the title.
-* New upload log entries will now contain information on the relevant
-  image (sha1 and timestamp).
-* (bug 49239) action=parse now can parse in preview and section preview modes.
-* (bug 49259) action=patrol now accepts revision ids.
-* (bug 48129) list=blocks&bkip= now correctly handles IPv6 CIDR ranges and
-  honors $wgBlockCIDRLimit. Note any clients passing invalid values to bkip
-  will now receive an error, rather than the previous behavior listing all
-  user blocks.
-* (bug 48201) action=parse&text=foo now assumes wikitext if no title is given,
-  rather than using the content model of the page "API".
-* action=watch no longer silently ignores hook abort.
-* (bug 50785) action=purge with forcelinkupdate=1 no longer queues refreshLinks
-  jobs in the job queue for link table updates of pages that use the given page
-  as a template. Instead, forcerecursivelinkupdate=1 is introduced and should
-  be used if that behaviour is desirable.
-* The 'debugLog' property (enabled by $wgDebugToolbar) no longer sets the log
-  entry values through ApiResult::content but directly. This changes the JSON
-  output from an array of objects with content in '*' to an array of strings
-  with the content.
-* (bug 51342) prop=imageinfo iicontinue now contains the dbkey, not the text
-  version of the title.
-* (bug 52538) action=edit will now use empty text instead of the contents
-  of section 0 when passed prependtext or appendtext with section=new.
-* Support for the 'gettoken' parameter to action=block and action=unblock,
-  deprecated since 1.20, has been removed.
-* (bug 49090) Token-getting functions will fail when using jsonp callbacks.
-* (bug 52699) action=upload returns normalized file name on warning
-  "exists-normalized" instead of filename to be uploaded to.
-* (bug 53884) action=edit will now return an error when the specified section
-  does not exist in the page.
-* Added meta=filerepoinfo API module for getting information about foreign
-  file repositories, and related ForeignAPIRepo methods getInfo and getApiUrl.
-* The new query module list=allfileusages to enumerate file usages was added.
-
-=== Languages updated in 1.22===
-
-MediaWiki supports over 350 languages. Many localisations are updated
-regularly. Below only new and removed languages are listed, as well as
-changes to languages because of Bugzilla reports.
-
-* Batak Toba (bbc-latn) added.
-* (bug 46751) Made Buryat (Russia) (буряад) (bxr) fallback to Russian.
-
-=== Other changes in 1.22 ===
-* BREAKING CHANGE: Implementation of MediaWiki's JS and JSON value encoding
-  has changed:
-** MediaWiki no longer supports PHP installations in which the native JSON
-   extension is missing or disabled.
-** XmlJsCode objects can no longer be nested inside objects or arrays.
-   (For Xml::encodeJsCall(), this individually applies to each argument.)
-** The sets of characters escaped by default, along with the precise escape
-   sequences used, have changed (except for the Xml::escapeJsString()
-   function, which is now deprecated).
-* BREAKING CHANGE: The Services_JSON class has been removed. If necessary,
-  be sure to upgrade affected extensions at the same time (e.g. Collection).
-* redirect.php was removed. It was unused.
-* ClickTracking integration was dropped from the mediaWiki.user.bucket
-  JavaScript function. The 'tracked' option is now ignored.
-* BREAKING CHANGE: Legacy skins Simple, MySkin, Chick, Standard and Nostalgia
-  were all removed. (Nostalgia was moved to an extension.) The SkinLegacy and
-  LegacyTemplate classes that supported them were removed as well and are now a
-  part of the Nostalgia extension.
-* Event namespace used by jquery.makeCollapsible has been changed from
-  'mw-collapse' to 'mw-collapsible' for consistency with the module name.
-* BREAKING CHANGE: The "ExternalAuth" authentication subsystem was removed, along
-  with its associated globals of $wgExternalAuthType, $wgExternalAuthConf,
-  $wgAutocreatePolicy and $wgAllowPrefChange. Affected users are encouraged to
-  use AuthPlugin for external authentication/authorization needs.
-* The Quickbar feature of the legacy skin model and the last remnants of it
-  throughout the code base have been removed.
-* Externaledit/externaldiff preference was removed. Very few users used this
-  feature, and improper configuration can actually prevent a user from editing
-* Calling Linker methods using a skin will now output deprecation warnings.
-* (bug 46680) "Return to" links are no longer tagged with rel="next".
-* BREAKING CHANGE: mw.util.tooltipAccessKeyRegexp: The match group for the
-  accesskey character is now $6 instead of $5.
-* HipHop compiler (hphpc) support was removed. HipHop VM support (hhvm) was
-  added.
-* A new Special:Redirect page was added, providing lookup by revision ID,
-  user ID, or file name.  The old Special:Filepath page was reimplemented
-  to redirect through Special:Redirect.
-* Monobook: Removed the old conditional stylesheets for Opera 6, 7 and 9.
-* Support for XHTML 1.0 has been removed. MediaWiki now only outputs (X)HTML5.
-* wikibits: User-agent related globals have been deprecated. The following
-  properties now default to false and emit mw.log.warn: is_gecko, is_chrome_mac,
-  is_chrome, webkit_version, is_safari_win, is_safari, webkit_match, is_ff2,
-  ff2_bugs, is_ff2_win, is_ff2_x11, opera95_bugs, opera7_bugs, opera6_bugs,
-  is_opera_95, is_opera_preseven, is_opera, and ie6_bugs.
-* (bug 48276) MediaWiki will now flash a confirmation message upon successfully
-  editing a page.
-* (bug 40785) mediawiki.legacy.ajax has been marked as deprecated. The following
-  properties now emit mw.log.warn when accessed: sajax_debug, sajax_init_object,
-  sajax_do_call and wfSupportsAjax.
-* BREAKING CHANGE: meta keywords are no longer supported. A <meta name="keywords"
-  will no longer be output and OutputPage::addKeyword no longer exists.
-* Methods Title::userCanEditCssSubpage and Title::userCanEditJsSubpage,
-  deprecated since 1.19, have been removed.
-* (bug 50134) Hook functions are no longer required to return a value. When a
-  hook function does not return a value (or when it returns an explicit null),
-  processing continues. To abort the hook, a hook function must return an
-  explicit, boolean false or a string error message. Other falsey values are
-  tantamount to a 'return true' in earlier versions of MediaWiki.
-* BREAKING CHANGE: The EditSectionLink hook was removed after being
-  deprecated since MediaWiki 1.14. Use DoEditSectionLink instead.
-* (bug 48256) The 'editsection-brackets' optional message was removed.
-  Section edit links' brackets can now be customized using CSS by
-  styling span.mw-editsection-bracket.
-* The usePatrol function in ChangesList has been marked as deprecated.
-* (bug 50785) A "null edit", that is, a save action in which no changes to the
-  page text are made and no revision recorded, will no longer send refreshLinks
-  jobs to the job table to update pages which use the edited page as a template.
-* The LivePreviewPrepare and LivePreviewDone events triggered on "jQuery( mw )"
-  have been deprecated in favour of using mw.hook.
-* The 'showjumplinks' user preference has been removed, jump links are now
-  always included.
-* Methods RecentChange::notifyRC2UDP, RecentChange::sendToUDP, and
-  RecentChange::cleanupForIRC have been deprecated, as it is now the
-  responsibility of classes implementing the RCFeedFormatter and RCFeedEngine
-  interfaces to implement the formatting and delivery for recent change
-  notifications.
-* SpecialPrefixindex methods namespacePrefixForm() and showPrefixChunk() have
-  been made protected. They were accepting form variance arguments, this is now
-  using properties in the SpecialPrefixindex class.
-* (bug 50310) BREAKING CHANGE: wikibits: Drop support for mwCustomEditButtons.
-  It defaults to an empty array and emits mw.log.warn when accessed.
-* BREAKING CHANGE: Special:Disambiguations has been removed from MediaWiki core.
-  Functions related to disambiguation pages are now handled by the Disambiguator
-  extension (https://www.mediawiki.org/wiki/Extension:Disambiguator) (bug
-  35981).
-* BREAKING CHANGE: The 'mediawiki.legacy.wikiprintable' module has been removed.
-  The skins/common/wikiprintable.css file no longer exists. Return value of
-  Skin#commonPrintStylesheet is ignored. Please use the 'mediawiki.legacy.commonPrint'
-  module instead or base your skin on SkinTemplate.
-* (bug 49629) The hook ExtractThumbParamaters has been deprecated in favour
-  of media handler overriding MediaHandler::parseParamString.
-* (bug 46512) The collapsibleNav feature from the Vector extension has been moved
-  to the Vector skin in core.
-* SpecialRecentChanges::addRecentChangesJS() function has been renamed
-  to addModules() and made protected.
-* Methods WatchAction::doWatch and WatchAction::doUnwatch now return a Status
-  object instead of a boolean.
-* Information boxes (CSS classes errorbox, warningbox, successbox) have been
-  made more subtle.
-* BREAKING CHANGE: The module 'mediawiki.legacy.IEFixes' has been removed as it was
-  unused. The file skins/common/IEFixes.js remains but is only used by wikibits.
-  The file never contained any re-usable components. To use it in a skin, load
-  'mediawiki.legacy.wikibits' (which IEFixes depends on) and that will import
-  IEFixes automatically if user agent conditions are met.
-* Code specific to the Math extension was marked as deprecated.
-* mediawiki.util: mw.util.wikiGetlink has been renamed to getUrl. (The old name
-  still works, but is deprecated.)
-
-== Compatibility ==
-
-MediaWiki 1.22 requires PHP 5.3.2 or later.
-
-MySQL is the recommended DBMS. PostgreSQL or SQLite can also be used, but
-support for them is somewhat less mature. There is experimental support for
-Oracle.
-
-The supported versions are:
-
-* MySQL 5.0.2 or later
-* PostgreSQL 8.3 or later
-* SQLite 3.3.7 or later
-* Oracle 9.0.1 or later
-
-== Upgrading ==
-
-1.22 has several database changes since 1.21, and will not work without schema
-updates. Note that due to changes to some very large tables like the revision
-table, the schema update may take quite long (minutes on a medium sized site,
-many hours on a large site).
-
-If upgrading from before 1.11, and you are using a wiki as a commons
-repository, make sure that it is updated as well. Otherwise, errors may arise
-due to database schema changes.
-
-If upgrading from before 1.7, you may want to run refreshLinks.php to ensure
-new database fields are filled with data.
-
-If you are upgrading from MediaWiki 1.4.x or earlier, you should upgrade to
-1.5 first. The upgrade script maintenance/upgrade1_5.php has been removed
-with MediaWiki 1.21.
-
-Don't forget to always back up your database before upgrading!
-
-See the file UPGRADE for more detailed upgrade instructions.
-
-For notes on 1.21.x and older releases, see HISTORY.
-
-== Online documentation ==
-
-Documentation for both end-users and site administrators is available on
-MediaWiki.org, and is covered under the GNU Free Documentation License (except
-for pages that explicitly state that their contents are in the public domain):
-
-       https://www.mediawiki.org/wiki/Documentation
-
-== Mailing list ==
-
-A mailing list is available for MediaWiki user support and discussion:
-
-       https://lists.wikimedia.org/mailman/listinfo/mediawiki-l
-
-A low-traffic announcements-only list is also available:
-
-       https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce
-
-It's highly recommended that you sign up for one of these lists if you're
-going to run a public MediaWiki, so you can be notified of security fixes.
-
-== IRC help ==
-
-There's usually someone online in #mediawiki on irc.freenode.net.
index 2a0f673..b0d97aa 100644 (file)
@@ -44,6 +44,8 @@ production.
 * (bug 56033) Add content model to the page information.
 * Added Article::MissingArticleConditions hook to give extensions a chance to
   hide their (unrelated) log entries.
+* Added LonelyPagesQuery hook to let extensions modify the query used to
+  generate Special:LonelyPages.
 * Added $wgOpenSearchDefaultLimit defining the default number of entries to show
   on action=opensearch API call.
 * For namespaces with $wgNamespaceProtection (including the MediaWiki
@@ -65,6 +67,13 @@ production.
   its #test method when strings are used in the browser map: version '1.10' is
   now correctly considered larger than '1.2'. Using numbers in the version map
   is not affected.
+* All API modules now support an assert parameter, which can either be
+  'user' or 'bot'. The API will throw an error if the user is not logged
+  in (user) or does not have the 'bot' userright (bot). Based off of the
+  AssertEdit extension by Steve Sanbeg.
+* WikitextContent will now render redirects with the expected "redirect"
+  header, rather than as an ordered list. Code calling Article::viewRedirect
+  can probably be changed to no longer special-case redirects.
 
 === Bug fixes in 1.23 ===
 * (bug 41759) The "updated since last visit" markers (on history pages, recent
@@ -89,6 +98,14 @@ production.
   the JavaScript evaluator were updated to support the new format. Plural rules
   for some languages have changed, most notably Russian. Affected software
   messages have been updated and marked for review at translatewiki.net.
+* (bug 14323) Redirect pages, when viewed with redirect=no, no longer hide the
+  remaining page content.
+* (bug 23542) imagelinks now stores both the redirect and target (as
+  templatelinks does).
+* (bug 58167) The web installer no longer throws an exception when PHP is
+  compiled without support for MySQL yet with support for another DBMS.
+* (bug 56199) Raw option of parser functions must now match complete word,
+  to take effect.
 
 === Web API changes in 1.23 ===
 * (bug 54884) action=parse&prop=categories now indicates hidden and missing
@@ -104,6 +121,9 @@ production.
 * ApiQueryBase::titlePartToKey allows an extra parameter that indicates the
   namespace in order to properly capitalize the title part.
 * (bug 57874) action=feedcontributions no longer has one item more than limit.
+* All API modules now support an assert parameter. See the new features section
+  for more details.
+* Added prop=contributors to fetch the list of contributors to the page.
 
 === Languages updated in 1.23 ===
 
@@ -141,10 +161,23 @@ changes to languages because of Bugzilla reports.
 * A page_links_updated field has been added to the page table.
 * SpecialPage::getTitle has been deprecated in favor of
   SpecialPage::getPageTitle.
+* BREAKING CHANGE: Two potentially backwards-incompatible changes have been made
+  to the 'SpecialWatchlistQuery' hook's last parameter (array $values) to make
+  the hook more consistent with the 'SpecialRecentChangesQuery' one:
+** Several array keys have been renamed: hideMinor → hideminor,
+   hideBots → hidebots, hideAnons → hideanons, hideLiu → hideliu,
+   hidePatrolled → hidepatrolled, hideOwn → hidemyself.
+** The parameter value is now a FormOptions object, not a plain array (array
+   access operators should continue to work, as it implements the ArrayAccess
+   interface).
+* Option to mark hooks as deprecated has been added.
 
 ==== Removed classes ====
-* TitleDependency
-* TitleListDependency
+* TitleDependency (unused)
+* TitleListDependency (unused)
+* WikiError (deprecated in 1.17)
+* WikiXmlError (deprecated in 1.17)
+* WikiErrorMsg (deprecated in 1.17)
 
 ==== Renamed classes ====
 * CdbReader_DBA to CdbReaderDBA
@@ -176,6 +209,10 @@ changes to languages because of Bugzilla reports.
 * wikiStatsOutput to WikiStatsOutput
 
 ==== Removed methods ====
+* ApiBase::getValidNamespaces() (deprecated in 1.17)
+* ApiMain::setCachePrivate() (deprecated in 1.17)
+* ApiMain::setVaryCookie (deprecated in 1.17)
+* CategoryViewer::addSubcategory() (deprecated in 1.17)
 * EditPage::spamPage() (deprecated since 1.17)
 * Exif::getFormattedData() (deprecated in 1.18)
 * Exif::makeFormattedData() (deprecated in 1.18)
@@ -214,6 +251,8 @@ changes to languages because of Bugzilla reports.
 * SpecialRecentChanges::feedSetup()
 * SpecialRevisionDelete::extractBitField() (deprecated in 1.22)
 * User::getPageRenderingHash() (deprecated in 1.17)
+* WebRequest::getFileSize() (deprecated in 1.17)
+* WebRequest::isPathInfoBad() (deprecated in 1.17)
 * WikiPage::quickEdit() (deprecated in 1.18)
 * WikiPage::useParserCache() (deprecated in 1.18)
 * WikiPage::viewUpdates() (deprecated in 1.18)
index 6c4d37f..cf63678 100644 (file)
@@ -3,9 +3,9 @@
                "php": ">=5.3.2"
        },
        "suggest": {
-               "ext-fileinfo": "*",
-               "ext-mbstring": "*",
-               "ext-wikidiff2": "*",
-               "ext-apc": "*"
+               "ext-fileinfo": "More accurate file type detection for uploaded files",
+               "ext-mbstring": "Faster unicode handling",
+               "ext-wikidiff2": "Faster diff generation",
+               "ext-apc": "Speed up MediaWiki with opcode caching (before PHP 5.5)"
        }
 }
index fc4d40e..bbe1680 100644 (file)
@@ -1596,6 +1596,12 @@ $paramArray: Array of parameters that corresponds to logging.log_params field.
 &$revert: string that is displayed in the UI, similar to $comment.
 $time: timestamp of the log entry (added in 1.12)
 
+'LonelyPagesQuery': Allow extensions to modify the query used by
+Special:LonelyPages.
+&$tables: tables to join in the query
+&$conds: conditions for the query
+&$joinConds: join conditions for the query
+
 'MaintenanceRefreshLinksInit': before executing the refreshLinks.php maintenance
 script.
 $refreshLinks: RefreshLinks object
@@ -1793,7 +1799,8 @@ $queryInfo: the query parameters
 'PageRenderingHash': Alter the parser cache option hash key. A parser extension
 which depends on user options should install this hook and append its values to
 the key.
-$hash: reference to a hash key string which can be modified
+&$confstr: reference to a hash key string which can be modified
+$user: User (object) requesting the page
 
 'ParserAfterParse': Called from Parser::parse() just after the call to
 Parser::internalParse() returns.
@@ -2400,7 +2407,7 @@ $special: the special page object
 &$tables: array of tables to be queried
 &$join_conds: join conditions for the tables
 &$fields: array of query fields
-$values: array of variables with watchlist options
+$opts: A FormOptions object with watchlist options for the current request
 
 'SpecialWatchlistGetNonRevisionTypes': Called when building sql query for
 SpecialWatchlist. Allows extensions to register custom values they have
index c82b39f..ce6407a 100644 (file)
@@ -684,26 +684,15 @@ class Article implements Page {
 
                                                # Allow extensions do their own custom view for certain pages
                                                $outputDone = true;
-                                       } else {
-                                               $content = $this->getContentObject();
-                                               $rt = $content ? $content->getRedirectChain() : null;
-                                               if ( $rt ) {
-                                                       wfDebug( __METHOD__ . ": showing redirect=no page\n" );
-                                                       # Viewing a redirect page (e.g. with parameter redirect=no)
-                                                       $outputPage->addHTML( $this->viewRedirect( $rt ) );
-                                                       # Parse just to get categories, displaytitle, etc.
-                                                       $this->mParserOutput = $content->getParserOutput( $this->getTitle(), $oldid, $parserOptions, false );
-                                                       $outputPage->addParserOutputNoText( $this->mParserOutput );
-                                                       $outputDone = true;
-                                               }
                                        }
                                        break;
                                case 4:
                                        # Run the parse, protected by a pool counter
                                        wfDebug( __METHOD__ . ": doing uncached parse\n" );
 
+                                       $content = $this->getContentObject();
                                        $poolArticleView = new PoolWorkArticleView( $this->getPage(), $parserOptions,
-                                               $this->getRevIdFetched(), $useParserCache, $this->getContentObject() );
+                                               $this->getRevIdFetched(), $useParserCache, $content );
 
                                        if ( !$poolArticleView->execute() ) {
                                                $error = $poolArticleView->getError();
@@ -722,6 +711,9 @@ class Article implements Page {
 
                                        $this->mParserOutput = $poolArticleView->getParserOutput();
                                        $outputPage->addParserOutput( $this->mParserOutput );
+                                       if ( $content->getRedirectTarget() ) {
+                                               $outputPage->addSubtitle( wfMessage( 'redirectpagesub' )->parse() );
+                                       }
 
                                        # Don't cache a dirty ParserOutput object
                                        if ( $poolArticleView->getIsDirty() ) {
@@ -989,9 +981,8 @@ class Article implements Page {
 
                                // Set the fragment if one was specified in the redirect
                                if ( strval( $this->getTitle()->getFragment() ) != '' ) {
-                                       $outputPage->addInlineScript( Xml::encodeJsCall(
-                                               'redirectToFragment', array( $this->getTitle()->getFragmentForURL() )
-                                       ) );
+                                       $outputPage->addJsConfigVars( 'wgRedirectToFragment', $this->getTitle()->getFragmentForURL() );
+                                       $outputPage->addModules( 'mediawiki.action.view.redirectToFragment' );
                                }
 
                                // Add a <link rel="canonical"> tag
@@ -1420,7 +1411,10 @@ class Article implements Page {
        }
 
        /**
-        * View redirect
+        * Return the HTML for the top of a redirect page
+        *
+        * Chances are you should just be using the ParserOutput from
+        * WikitextContent::getParserOutput instead of calling this for redirects.
         *
         * @param $target Title|Array of destination(s) to redirect
         * @param $appendSubtitle Boolean [optional]
@@ -1428,20 +1422,35 @@ class Article implements Page {
         * @return string containing HMTL with redirect link
         */
        public function viewRedirect( $target, $appendSubtitle = true, $forceKnown = false ) {
+               $lang = $this->getTitle()->getPageLanguage();
+               if ( $appendSubtitle ) {
+                       $out = $this->getContext()->getOutput();
+                       $out->addSubtitle( wfMessage( 'redirectpagesub' )->parse() );
+               }
+               return static::getRedirectHeaderHtml( $lang, $target, $forceKnown );
+       }
+
+       /**
+        * Return the HTML for the top of a redirect page
+        *
+        * Chances are you should just be using the ParserOutput from
+        * WikitextContent::getParserOutput instead of calling this for redirects.
+        *
+        * @since 1.23
+        * @param Language $lang
+        * @param Title|array $target destination(s) to redirect
+        * @param bool $forceKnown Should the image be shown as a bluelink regardless of existence?
+        * @return string containing HMTL with redirect link
+        */
+       public static function getRedirectHeaderHtml( Language $lang, $target, $forceKnown = false ) {
                global $wgStylePath;
 
                if ( !is_array( $target ) ) {
                        $target = array( $target );
                }
 
-               $lang = $this->getTitle()->getPageLanguage();
                $imageDir = $lang->getDir();
 
-               if ( $appendSubtitle ) {
-                       $out = $this->getContext()->getOutput();
-                       $out->addSubtitle( wfMessage( 'redirectpagesub' )->parse() );
-               }
-
                // the loop prepends the arrow image before the link, so the first case needs to be outside
 
                /**
index cd062e0..f179e78 100644 (file)
@@ -234,8 +234,6 @@ $wgAutoloadLocalClasses = array(
        'WebRequestUpload' => 'includes/WebRequest.php',
        'WebResponse' => 'includes/WebResponse.php',
        'WikiCategoryPage' => 'includes/WikiCategoryPage.php',
-       'WikiError' => 'includes/WikiError.php',
-       'WikiErrorMsg' => 'includes/WikiError.php',
        'WikiExporter' => 'includes/Export.php',
        'WikiFilePage' => 'includes/WikiFilePage.php',
        'WikiImporter' => 'includes/Import.php',
@@ -243,7 +241,6 @@ $wgAutoloadLocalClasses = array(
        'WikiRevision' => 'includes/Import.php',
        'WikiMap' => 'includes/WikiMap.php',
        'WikiReference' => 'includes/WikiMap.php',
-       'WikiXmlError' => 'includes/WikiError.php',
        'Xml' => 'includes/Xml.php',
        'XmlDumpWriter' => 'includes/Export.php',
        'XmlJsCode' => 'includes/Xml.php',
@@ -333,6 +330,7 @@ $wgAutoloadLocalClasses = array(
        'ApiQueryCategoryInfo' => 'includes/api/ApiQueryCategoryInfo.php',
        'ApiQueryCategoryMembers' => 'includes/api/ApiQueryCategoryMembers.php',
        'ApiQueryContributions' => 'includes/api/ApiQueryUserContributions.php',
+       'ApiQueryContributors' => 'includes/api/ApiQueryContributors.php',
        'ApiQueryDeletedrevs' => 'includes/api/ApiQueryDeletedrevs.php',
        'ApiQueryDisabled' => 'includes/api/ApiQueryDisabled.php',
        'ApiQueryDuplicateFiles' => 'includes/api/ApiQueryDuplicateFiles.php',
@@ -677,9 +675,11 @@ $wgAutoloadLocalClasses = array(
        'CSSJanus_Tokenizer' => 'includes/libs/CSSJanus.php',
        'CSSMin' => 'includes/libs/CSSMin.php',
        'GenericArrayObject' => 'includes/libs/GenericArrayObject.php',
+       'HashRing' => 'includes/libs/HashRing.php',
        'HttpStatus' => 'includes/libs/HttpStatus.php',
        'IEContentAnalyzer' => 'includes/libs/IEContentAnalyzer.php',
        'IEUrlExtension' => 'includes/libs/IEUrlExtension.php',
+       'MappedIterator' => 'includes/libs/MappedIterator.php',
        'JavaScriptMinifier' => 'includes/libs/JavaScriptMinifier.php',
        'JSCompilerContext' => 'includes/libs/jsminplus.php',
        'JSMinPlus' => 'includes/libs/jsminplus.php',
@@ -687,6 +687,7 @@ $wgAutoloadLocalClasses = array(
        'JSParser' => 'includes/libs/jsminplus.php',
        'JSToken' => 'includes/libs/jsminplus.php',
        'JSTokenizer' => 'includes/libs/jsminplus.php',
+       'MultiHttpClient' => 'includes/libs/MultiHttpClient.php',
        'MWMessagePack' => 'includes/libs/MWMessagePack.php',
        'RunningStat' => 'includes/libs/RunningStat.php',
        'ScopedCallback' => 'includes/libs/ScopedCallback.php',
@@ -826,6 +827,7 @@ $wgAutoloadLocalClasses = array(
 
        # includes/profiler
        'Profiler' => 'includes/profiler/Profiler.php',
+       'ProfilerMwprof' => 'includes/profiler/ProfilerMwprof.php',
        'ProfilerSimple' => 'includes/profiler/ProfilerSimple.php',
        'ProfilerSimpleText' => 'includes/profiler/ProfilerSimpleText.php',
        'ProfilerSimpleTrace' => 'includes/profiler/ProfilerSimpleTrace.php',
@@ -840,6 +842,8 @@ $wgAutoloadLocalClasses = array(
        'RCFeedFormatter' => 'includes/rcfeed/RCFeedFormatter.php',
        'IRCColourfulRCFeedFormatter' => 'includes/rcfeed/IRCColourfulRCFeedFormatter.php',
        'JSONRCFeedFormatter' => 'includes/rcfeed/JSONRCFeedFormatter.php',
+       'XMLRCFeedFormatter' => 'includes/rcfeed/XMLRCFeedFormatter.php',
+       'MachineReadableRCFeedFormatter' => 'includes/rcfeed/MachineReadableRCFeedFormatter.php',
 
        # includes/resourceloader
        'ResourceLoader' => 'includes/resourceloader/ResourceLoader.php',
@@ -1068,12 +1072,10 @@ $wgAutoloadLocalClasses = array(
        'ConfEditorToken' => 'includes/utils/ConfEditor.php',
        'DoubleReplacer' => 'includes/utils/StringUtils.php',
        'ExplodeIterator' => 'includes/utils/StringUtils.php',
-       'HashRing' => 'includes/utils/HashRing.php',
        'HashtableReplacer' => 'includes/utils/StringUtils.php',
        'IP' => 'includes/utils/IP.php',
        'MWCryptRand' => 'includes/utils/MWCryptRand.php',
        'MWFunction' => 'includes/utils/MWFunction.php',
-       'MappedIterator' => 'includes/utils/MappedIterator.php',
        'RegexlikeReplacer' => 'includes/utils/StringUtils.php',
        'ReplacementArray' => 'includes/utils/StringUtils.php',
        'Replacer' => 'includes/utils/StringUtils.php',
index 55d9c1e..4027bef 100644 (file)
@@ -181,15 +181,6 @@ class CategoryViewer extends ContextSource {
                        $this->getSubcategorySortChar( $cat->getTitle(), $sortkey );
        }
 
-       /**
-        * Add a subcategory to the internal lists, using a title object
-        * @deprecated since 1.17 kept for compatibility, use addSubcategoryObject instead
-        */
-       function addSubcategory( Title $title, $sortkey, $pageLength ) {
-               wfDeprecated( __METHOD__, '1.17' );
-               $this->addSubcategoryObject( Category::newFromTitle( $title ), $sortkey, $pageLength );
-       }
-
        /**
         * Get the character to be used for sorting subcategories.
         * If there's a link from Category:A to Category:B, the sortkey of the resulting
index 9b2b676..92ceb6f 100644 (file)
@@ -4026,7 +4026,6 @@ $wgDefaultUserOptions = array(
        'rclimit' => 50,
        'rememberpassword' => 0,
        'rows' => 25,
-       'searchlimit' => 20,
        'showhiddencats' => 0,
        'shownumberswatching' => 1,
        'showtoc' => 1,
index ba49378..7115eab 100644 (file)
@@ -319,6 +319,18 @@ class EditPage {
                }
        }
 
+       /**
+        * Returns if the given content model is editable.
+        *
+        * @param string $modelId The ID of the content model to test. Use CONTENT_MODEL_XXX constants.
+        * @return bool
+        * @throws MWException if $modelId has no known handler
+        */
+       public function isSupportedContentModel( $modelId ) {
+               return $this->allowNonTextContent ||
+                       ContentHandler::getForModelID( $modelId ) instanceof TextContentHandler;
+       }
+
        function submit() {
                $this->edit();
        }
@@ -613,6 +625,7 @@ class EditPage {
        /**
         * This function collects the form data and uses it to populate various member variables.
         * @param $request WebRequest
+        * @throws ErrorPageError
         */
        function importFormData( &$request ) {
                global $wgContLang, $wgUser;
@@ -777,12 +790,17 @@ class EditPage {
                $this->bot = $request->getBool( 'bot', true );
                $this->nosummary = $request->getBool( 'nosummary' );
 
-               $content_handler = ContentHandler::getForTitle( $this->mTitle );
-               $this->contentModel = $request->getText( 'model', $content_handler->getModelID() ); #may be overridden by revision
-               $this->contentFormat = $request->getText( 'format', $content_handler->getDefaultFormat() ); #may be overridden by revision
+               $this->contentModel = $request->getText( 'model', $this->contentModel ); #may be overridden by revision
+               $this->contentFormat = $request->getText( 'format', $this->contentFormat ); #may be overridden by revision
 
+               if ( !ContentHandler::getForModelID( $this->contentModel )->isSupportedFormat( $this->contentFormat ) ) {
+                       throw new ErrorPageError(
+                               'editpage-notsupportedcontentformat-title',
+                               'editpage-notsupportedcontentformat-text',
+                               array( $this->contentFormat, ContentHandler::getLocalizedName( $this->contentModel ) )
+                       );
+               }
                #TODO: check if the desired model is allowed in this namespace, and if a transition from the page's current model to the new model is allowed
-               #TODO: check if the desired content model supports the given content format!
 
                $this->live = $request->getCheck( 'live' );
                $this->editintro = $request->getText( 'editintro',
@@ -2126,9 +2144,9 @@ class EditPage {
                        return $content;
                }
 
-               if ( !$this->allowNonTextContent && !( $content instanceof TextContent ) ) {
-                       throw new MWException( "This content model can not be edited as text: "
-                                                               . ContentHandler::getLocalizedName( $content->getModel() ) );
+               if ( !$this->isSupportedContentModel( $content->getModel() ) ) {
+                       throw new MWException( 'This content model is not supported: '
+                               . ContentHandler::getLocalizedName( $content->getModel() ) );
                }
 
                return $content->serialize( $this->contentFormat );
@@ -2156,8 +2174,8 @@ class EditPage {
                $content = ContentHandler::makeContent( $text, $this->getTitle(),
                        $this->contentModel, $this->contentFormat );
 
-               if ( !$this->allowNonTextContent && !( $content instanceof TextContent ) ) {
-                       throw new MWException( "This content model can not be edited as text: "
+               if ( !$this->isSupportedContentModel( $content->getModel() ) ) {
+                       throw new MWException( 'This content model is not supported: '
                                . ContentHandler::getLocalizedName( $content->getModel() ) );
                }
 
@@ -3222,36 +3240,30 @@ HTML
                                }
                        }
 
-                       $rt = $content->getRedirectChain();
-                       if ( $rt ) {
-                               $previewHTML = $this->mArticle->viewRedirect( $rt, false );
-                       } else {
-
-                               # If we're adding a comment, we need to show the
-                               # summary as the headline
-                               if ( $this->section === "new" && $this->summary !== "" ) {
-                                       $content = $content->addSectionHeader( $this->summary );
-                               }
+                       # If we're adding a comment, we need to show the
+                       # summary as the headline
+                       if ( $this->section === "new" && $this->summary !== "" ) {
+                               $content = $content->addSectionHeader( $this->summary );
+                       }
 
-                               $hook_args = array( $this, &$content );
-                               ContentHandler::runLegacyHooks( 'EditPageGetPreviewText', $hook_args );
-                               wfRunHooks( 'EditPageGetPreviewContent', $hook_args );
+                       $hook_args = array( $this, &$content );
+                       ContentHandler::runLegacyHooks( 'EditPageGetPreviewText', $hook_args );
+                       wfRunHooks( 'EditPageGetPreviewContent', $hook_args );
 
-                               $parserOptions->enableLimitReport();
+                       $parserOptions->enableLimitReport();
 
-                               # For CSS/JS pages, we should have called the ShowRawCssJs hook here.
-                               # But it's now deprecated, so never mind
+                       # For CSS/JS pages, we should have called the ShowRawCssJs hook here.
+                       # But it's now deprecated, so never mind
 
-                               $content = $content->preSaveTransform( $this->mTitle, $wgUser, $parserOptions );
-                               $parserOutput = $content->getParserOutput( $this->getArticle()->getTitle(), null, $parserOptions );
+                       $content = $content->preSaveTransform( $this->mTitle, $wgUser, $parserOptions );
+                       $parserOutput = $content->getParserOutput( $this->getArticle()->getTitle(), null, $parserOptions );
 
-                               $previewHTML = $parserOutput->getText();
-                               $this->mParserOutput = $parserOutput;
-                               $wgOut->addParserOutputNoText( $parserOutput );
+                       $previewHTML = $parserOutput->getText();
+                       $this->mParserOutput = $parserOutput;
+                       $wgOut->addParserOutputNoText( $parserOutput );
 
-                               if ( count( $parserOutput->getWarnings() ) ) {
-                                       $note .= "\n\n" . implode( "\n\n", $parserOutput->getWarnings() );
-                               }
+                       if ( count( $parserOutput->getWarnings() ) ) {
+                               $note .= "\n\n" . implode( "\n\n", $parserOutput->getWarnings() );
                        }
                } catch ( MWContentSerializationException $ex ) {
                        $m = wfMessage( 'content-failed-to-parse', $this->contentModel, $this->contentFormat, $ex->getMessage() );
index 4548345..5377add 100644 (file)
@@ -38,8 +38,7 @@ class MWException extends Exception {
        function useOutputPage() {
                return $this->useMessageCache() &&
                        !empty( $GLOBALS['wgFullyInitialised'] ) &&
-                       !empty( $GLOBALS['wgOut'] ) &&
-                       !empty( $GLOBALS['wgTitle'] );
+                       !empty( $GLOBALS['wgOut'] );
        }
 
        /**
index ced45af..0582230 100644 (file)
  * @ingroup Maintenance
  */
 class ForkController {
-       var $children = array();
-       var $termReceived = false;
-       var $flags = 0, $procsToStart = 0;
+       protected $children = array(), $childNumber = 0;
+       protected $termReceived = false;
+       protected $flags = 0, $procsToStart = 0;
 
-       static $restartableSignals = array(
+       protected static $restartableSignals = array(
                SIGFPE,
                SIGILL,
                SIGSEGV,
@@ -137,6 +137,16 @@ class ForkController {
                return 'done';
        }
 
+       /**
+        * Get the number of the child currently running. Note, this
+        * is not the pid, but rather which of the total number of children
+        * we are
+        * @return int
+        */
+       public function getChildNumber() {
+               return $this->childNumber;
+       }
+
        protected function prepareEnvironment() {
                global $wgMemc;
                // Don't share DB, storage, or memcached connections
@@ -166,6 +176,7 @@ class ForkController {
 
                        if ( !$pid ) {
                                $this->initChild();
+                               $this->childNumber = $i;
                                return 'child';
                        } else {
                                // This is the parent process
index 3250ec8..a638287 100644 (file)
@@ -4026,10 +4026,12 @@ function wfGetLangConverterCacheStorage() {
  *
  * @param string $event event name
  * @param array $args parameters passed to hook functions
+ * @param string|null $deprecatedVersion optionally mark hook as deprecated with version number
+ *
  * @return Boolean True if no handler aborted the hook
  */
-function wfRunHooks( $event, array $args = array() ) {
-       return Hooks::run( $event, $args );
+function wfRunHooks( $event, array $args = array(), $deprecatedVersion = null ) {
+       return Hooks::run( $event, $args, $deprecatedVersion );
 }
 
 /**
index db47d31..785e717 100644 (file)
@@ -124,6 +124,7 @@ class Hooks {
         *
         * @param string $event Event name
         * @param array $args  Array of parameters passed to hook functions
+        * @param string|null $deprecatedVersion Optionally, mark hook as deprecated with version number
         * @return bool True if no handler aborted the hook
         *
         * @since 1.22 A hook function is not required to return a value for
@@ -132,7 +133,7 @@ class Hooks {
         * @throws MWException
         * @throws FatalError
         */
-       public static function run( $event, array $args = array() ) {
+       public static function run( $event, array $args = array(), $deprecatedVersion = null ) {
                wfProfileIn( 'hook: ' . $event );
                foreach ( self::getHandlers( $event ) as $hook ) {
                        // Turn non-array values into an array. (Can't use casting because of objects.)
@@ -195,6 +196,12 @@ class Hooks {
                        // Profile first in case the Profiler causes errors.
                        wfProfileIn( $func );
                        set_error_handler( 'Hooks::hookErrorHandler' );
+
+                       // mark hook as deprecated, if deprecation version is specified
+                       if ( $deprecatedVersion !== null ) {
+                               wfDeprecated( "$event hook (used in $func)", $deprecatedVersion );
+                       }
+
                        try {
                                $retval = call_user_func_array( $callback, $hook_args );
                        } catch ( MWHookException $e ) {
index 997a948..a83217d 100644 (file)
@@ -732,7 +732,7 @@ EOT
 
                return $dbr->select(
                        array( 'imagelinks', 'page' ),
-                       array( 'page_namespace', 'page_title', 'page_is_redirect', 'il_to' ),
+                       array( 'page_namespace', 'page_title', 'il_to' ),
                        array( 'il_to' => $target, 'il_from = page_id' ),
                        __METHOD__,
                        array( 'LIMIT' => $limit + 1, 'ORDER BY' => 'il_from', )
@@ -743,13 +743,19 @@ EOT
                $limit = 100;
 
                $out = $this->getContext()->getOutput();
-               $res = $this->queryImageLinks( $this->getTitle()->getDBkey(), $limit + 1 );
+
                $rows = array();
                $redirects = array();
+               foreach ( $this->getTitle()->getRedirectsHere( NS_FILE ) as $redir ) {
+                       $redirects[$redir->getDBkey()] = array();
+                       $rows[] = (object)array(
+                               'page_namespace' => NS_FILE,
+                               'page_title' => $redir->getDBkey(),
+                       );
+               }
+
+               $res = $this->queryImageLinks( $this->getTitle()->getDBkey(), $limit + 1 );
                foreach ( $res as $row ) {
-                       if ( $row->page_is_redirect ) {
-                               $redirects[$row->page_title] = array();
-                       }
                        $rows[] = $row;
                }
                $count = count( $rows );
index 867b88b..5eda642 100644 (file)
@@ -159,9 +159,6 @@ class Linker {
         * link() replaces the old functions in the makeLink() family.
         *
         * @since 1.18 Method exists since 1.16 as non-static, made static in 1.18.
-        * You can call it using this if you want to keep compat with these:
-        * $linker = class_exists( 'DummyLinker' ) ? new DummyLinker() : new Linker();
-        * $linker->link( ... );
         *
         * @param $target        Title  Can currently only be a Title, but this may
         *   change to support Images, literal URLs, etc.
index 232f43e..377d406 100644 (file)
@@ -65,6 +65,7 @@ class MagicWord {
        var $mId, $mSynonyms, $mCaseSensitive;
        var $mRegex = '';
        var $mRegexStart = '';
+       var $mRegexStartToEnd = '';
        var $mBaseRegex = '';
        var $mVariableRegex = '';
        var $mVariableStartToEndRegex = '';
@@ -149,6 +150,7 @@ class MagicWord {
                'contentlanguage',
                'numberofadmins',
                'numberofviews',
+               'cascadingsources',
        );
 
        /* Array of caching hints for ParserCache */
@@ -338,6 +340,7 @@ class MagicWord {
                $case = $this->mCaseSensitive ? '' : 'iu';
                $this->mRegex = "/{$this->mBaseRegex}/{$case}";
                $this->mRegexStart = "/^(?:{$this->mBaseRegex})/{$case}";
+               $this->mRegexStartToEnd = "/^(?:{$this->mBaseRegex})$/{$case}";
                $this->mVariableRegex = str_replace( "\\$1", "(.*?)", $this->mRegex );
                $this->mVariableStartToEndRegex = str_replace( "\\$1", "(.*?)",
                        "/^(?:{$this->mBaseRegex})$/{$case}" );
@@ -404,6 +407,19 @@ class MagicWord {
                return $this->mRegexStart;
        }
 
+       /**
+        * Gets a regex matching the word from start to end of a string
+        *
+        * @return string
+        * @since 1.23
+        */
+       function getRegexStartToEnd() {
+               if ( $this->mRegexStartToEnd == '' ) {
+                       $this->initRegex();
+               }
+               return $this->mRegexStartToEnd;
+       }
+
        /**
         * regex without the slashes and what not
         *
@@ -438,6 +454,18 @@ class MagicWord {
                return (bool)preg_match( $this->getRegexStart(), $text );
        }
 
+       /**
+        * Returns true if the text matched the word
+        *
+        * @param $text string
+        *
+        * @return bool
+        * @since 1.23
+        */
+       function matchStartToEnd( $text ) {
+               return (bool)preg_match( $this->getRegexStartToEnd(), $text );
+       }
+
        /**
         * Returns NULL if there's no match, the value of $1 otherwise
         * The return code is the matched string, if there's no variable
index 3ff99fc..5413f30 100644 (file)
@@ -748,7 +748,7 @@ class Preferences {
                }
 
                $defaultPreferences['stubthreshold'] = array(
-                       'type' => 'selectorother',
+                       'type' => 'select',
                        'section' => 'rendering/advancedrendering',
                        'options' => $stubThresholdOptions,
                        'size' => 20,
@@ -1047,14 +1047,6 @@ class Preferences {
        static function searchPreferences( $user, IContextSource $context, &$defaultPreferences ) {
                global $wgContLang, $wgVectorUseSimpleSearch;
 
-               ## Search #####################################
-               $defaultPreferences['searchlimit'] = array(
-                       'type' => 'int',
-                       'label-message' => 'resultsperpage',
-                       'section' => 'searchoptions/displaysearchoptions',
-                       'min' => 0,
-               );
-
                if ( $wgVectorUseSimpleSearch ) {
                        $defaultPreferences['vector-simplesearch'] = array(
                                'type' => 'toggle',
index 3384af0..a6fb6d0 100644 (file)
@@ -355,12 +355,12 @@ class Sanitizer {
         * Cleans up HTML, removes dangerous tags and attributes, and
         * removes HTML comments
         * @private
-        * @param $text String
-        * @param $processCallback Callback to do any variable or parameter
-        *        replacements in HTML attribute values
-        * @param array $args for the processing callback
-        * @param array $extratags for any extra tags to include
-        * @param array $removetags for any tags (default or extra) to exclude
+        * @param string $text
+        * @param callable $processCallback Callback to do any variable or parameter
+        *   replacements in HTML attribute values
+        * @param array $args Arguments for the processing callback
+        * @param array $extratags For any extra tags to include
+        * @param array $removetags For any tags (default or extra) to exclude
         * @return string
         */
        static function removeHTMLtags( $text, $processCallback = null,
@@ -601,7 +601,7 @@ class Sanitizer {
         * trailing spaces and one of the newlines.
         *
         * @private
-        * @param $text String
+        * @param string $text
         * @return string
         */
        static function removeHTMLcomments( $text ) {
@@ -649,8 +649,8 @@ class Sanitizer {
         * where we may want to allow a tag within content but ONLY when it has
         * specific attributes set.
         *
-        * @param $params
-        * @param $element
+        * @param string $params
+        * @param string $element
         * @return bool
         */
        static function validateTag( $params, $element ) {
@@ -682,9 +682,9 @@ class Sanitizer {
         * - Unsafe style attributes are discarded
         * - Invalid id attributes are re-encoded
         *
-        * @param $attribs Array
-        * @param $element String
-        * @return Array
+        * @param array $attribs
+        * @param string $element
+        * @return array
         *
         * @todo Check for legal values where the DTD limits things.
         * @todo Check for unique id attribute :P
@@ -702,9 +702,9 @@ class Sanitizer {
         * - Unsafe style attributes are discarded
         * - Invalid id attributes are re-encoded
         *
-        * @param $attribs Array
+        * @param array $attribs
         * @param array $whitelist list of allowed attribute names
-        * @return Array
+        * @return array
         *
         * @todo Check for legal values where the DTD limits things.
         * @todo Check for unique id attribute :P
@@ -801,8 +801,8 @@ class Sanitizer {
         * will be combined (if they're both strings).
         *
         * @todo implement merging for other attributes such as style
-        * @param $a Array
-        * @param $b Array
+        * @param array $a
+        * @param array $b
         * @return array
         */
        static function mergeAttributes( $a, $b ) {
@@ -833,8 +833,8 @@ class Sanitizer {
         * clever input strings. These character references must
         * be escaped before the return value is embedded in HTML.
         *
-        * @param $value String
-        * @return String
+        * @param string $value
+        * @return string
         */
        static function checkCss( $value ) {
                // Decode character references like &#123;
@@ -925,15 +925,18 @@ class Sanitizer {
                // Reject problematic keywords and control characters
                if ( preg_match( '/[\000-\010\013\016-\037\177]/', $value ) ) {
                        return '/* invalid control char */';
-               } elseif ( preg_match( '! expression | filter\s*: | accelerator\s*: | url\s*\( | image\s*\( | image-set\s*\( !ix', $value ) ) {
+               } elseif ( preg_match(
+                       '! expression | filter\s*: | accelerator\s*: | url\s*\( | image\s*\( | image-set\s*\( !ix',
+                       $value
+               ) ) {
                        return '/* insecure input */';
                }
                return $value;
        }
 
        /**
-        * @param $matches array
-        * @return String
+        * @param array $matches
+        * @return string
         */
        static function cssDecodeCallback( $matches ) {
                if ( $matches[1] !== '' ) {
@@ -971,9 +974,9 @@ class Sanitizer {
         * - Unsafe style attributes are discarded
         * - Prepends space if there are attributes.
         *
-        * @param $text String
-        * @param $element String
-        * @return String
+        * @param string $text
+        * @param string $element
+        * @return string
         */
        static function fixTagAttributes( $text, $element ) {
                if ( trim( $text ) == '' ) {
@@ -988,8 +991,8 @@ class Sanitizer {
 
        /**
         * Encode an attribute value for HTML output.
-        * @param $text String
-        * @return HTML-encoded text fragment
+        * @param string $text
+        * @return string HTML-encoded text fragment
         */
        static function encodeAttribute( $text ) {
                $encValue = htmlspecialchars( $text, ENT_QUOTES );
@@ -1009,8 +1012,8 @@ class Sanitizer {
        /**
         * Encode an attribute value for HTML tags, with extra armoring
         * against further wiki processing.
-        * @param $text String
-        * @return HTML-encoded text fragment
+        * @param string $text
+        * @return string HTML-encoded text fragment
         */
        static function safeEncodeAttribute( $text ) {
                $encValue = Sanitizer::encodeAttribute( $text );
@@ -1053,9 +1056,9 @@ class Sanitizer {
         * (which don't work reliably in fragments cross-browser).
         *
         * @see http://www.w3.org/TR/html401/types.html#type-name Valid characters
-        *                                                          in the id and
-        *                                                          name attributes
-        * @see http://www.w3.org/TR/html401/struct/links.html#h-12.2.3 Anchors with the id attribute
+        *   in the id and name attributes
+        * @see http://www.w3.org/TR/html401/struct/links.html#h-12.2.3 Anchors with
+        *   the id attribute
         * @see http://www.whatwg.org/html/elements.html#the-id-attribute
         *   HTML5 definition of id attribute
         *
@@ -1068,7 +1071,7 @@ class Sanitizer {
         *   'legacy': Behave the way the old HTML 4-based ID escaping worked even
         *       if $wgExperimentalHtmlIds is used, so we can generate extra
         *       anchors and links won't break.
-        * @return String
+        * @return string
         */
        static function escapeId( $id, $options = array() ) {
                global $wgExperimentalHtmlIds;
@@ -1111,8 +1114,8 @@ class Sanitizer {
         *
         * @see http://www.w3.org/TR/CSS21/syndata.html Valid characters/format
         *
-        * @param $class String
-        * @return String
+        * @param string $class
+        * @return string
         */
        static function escapeClass( $class ) {
                // Convert ugly stuff to underscores and kill underscores in ugly places
@@ -1126,8 +1129,8 @@ class Sanitizer {
         * Given HTML input, escape with htmlspecialchars but un-escape entities.
         * This allows (generally harmless) entities like &#160; to survive.
         *
-        * @param string $html to escape
-        * @return String: escaped input
+        * @param string $html HTML to escape
+        * @return string: escaped input
         */
        static function escapeHtmlAllowEntities( $html ) {
                $html = Sanitizer::decodeCharReferences( $html );
@@ -1139,7 +1142,7 @@ class Sanitizer {
 
        /**
         * Regex replace callback for armoring links against further processing.
-        * @param $matches Array
+        * @param array $matches
         * @return string
         */
        private static function armorLinksCallback( $matches ) {
@@ -1151,8 +1154,8 @@ class Sanitizer {
         * a partial tag string. Attribute names are forces to lowercase,
         * character references are decoded to UTF-8 text.
         *
-        * @param $text String
-        * @return Array
+        * @param string $text
+        * @return array
         */
        public static function decodeTagAttributes( $text ) {
                if ( trim( $text ) == '' ) {
@@ -1187,8 +1190,8 @@ class Sanitizer {
         * Build a partial tag string from an associative array of attribute
         * names and values as returned by decodeTagAttributes.
         *
-        * @param $assoc_array Array
-        * @return String
+        * @param array $assoc_array
+        * @return string
         */
        public static function safeEncodeTagAttributes( $assoc_array ) {
                $attribs = array();
@@ -1205,9 +1208,9 @@ class Sanitizer {
         * Pick the appropriate attribute value from a match set from the
         * attribs regex matches.
         *
-        * @param $set Array
-        * @throws MWException
-        * @return String
+        * @param array $set
+        * @throws MWException when tag conditions are not met.
+        * @return string
         */
        private static function getTagAttributeCallback( $set ) {
                if ( isset( $set[6] ) ) {
@@ -1239,8 +1242,9 @@ class Sanitizer {
         * but note that we're not returning the value, but are returning
         * XML source fragments that will be slapped into output.
         *
-        * @param $text String
-        * @return String
+        * @param string $text
+        * @return string
+        * @todo Remove, unused?
         */
        private static function normalizeAttributeValue( $text ) {
                return str_replace( '"', '&quot;',
@@ -1249,8 +1253,8 @@ class Sanitizer {
        }
 
        /**
-        * @param $text string
-        * @return mixed
+        * @param string $text
+        * @return string
         */
        private static function normalizeWhitespace( $text ) {
                return preg_replace(
@@ -1264,8 +1268,8 @@ class Sanitizer {
         * by Parser::stripSectionName(), for use in the id's that are used for
         * section links.
         *
-        * @param $section String
-        * @return String
+        * @param string $section
+        * @return string
         */
        static function normalizeSectionNameWhitespace( $section ) {
                return trim( preg_replace( '/[ _]+/', ' ', $section ) );
@@ -1282,8 +1286,8 @@ class Sanitizer {
         * c. use lower cased "&#x", not "&#X"
         * d. fix or reject non-valid attributes
         *
-        * @param $text String
-        * @return String
+        * @param string $text
+        * @return string
         * @private
         */
        static function normalizeCharReferences( $text ) {
@@ -1293,8 +1297,8 @@ class Sanitizer {
                        $text );
        }
        /**
-        * @param $matches String
-        * @return String
+        * @param string $matches
+        * @return string
         */
        static function normalizeCharReferencesCallback( $matches ) {
                $ret = null;
@@ -1319,8 +1323,8 @@ class Sanitizer {
         * the HTML equivalent. Otherwise, returns HTML-escaped text of
         * pseudo-entity source (eg &amp;foo;)
         *
-        * @param $name String
-        * @return String
+        * @param string $name
+        * @return string
         */
        static function normalizeEntity( $name ) {
                if ( isset( self::$htmlEntityAliases[$name] ) ) {
@@ -1336,7 +1340,7 @@ class Sanitizer {
        }
 
        /**
-        * @param $codepoint
+        * @param int $codepoint
         * @return null|string
         */
        static function decCharReference( $codepoint ) {
@@ -1349,7 +1353,7 @@ class Sanitizer {
        }
 
        /**
-        * @param $codepoint
+        * @param int $codepoint
         * @return null|string
         */
        static function hexCharReference( $codepoint ) {
@@ -1363,8 +1367,8 @@ class Sanitizer {
 
        /**
         * Returns true if a given Unicode codepoint is a valid character in XML.
-        * @param $codepoint Integer
-        * @return Boolean
+        * @param int $codepoint
+        * @return bool
         */
        private static function validateCodepoint( $codepoint ) {
                return $codepoint == 0x09
@@ -1379,8 +1383,8 @@ class Sanitizer {
         * Decode any character references, numeric or named entities,
         * in the text and return a UTF-8 string.
         *
-        * @param $text String
-        * @return String
+        * @param string $text
+        * @return string
         */
        public static function decodeCharReferences( $text ) {
                return preg_replace_callback(
@@ -1396,8 +1400,8 @@ class Sanitizer {
         * This is useful for page titles, not for text to be displayed,
         * MediaWiki allows HTML entities to escape normalization as a feature.
         *
-        * @param string $text (already normalized, containing entities)
-        * @return String (still normalized, without entities)
+        * @param string $text Already normalized, containing entities
+        * @return string Still normalized, without entities
         */
        public static function decodeCharReferencesAndNormalize( $text ) {
                global $wgContLang;
@@ -1414,8 +1418,8 @@ class Sanitizer {
        }
 
        /**
-        * @param $matches String
-        * @return String
+        * @param string $matches
+        * @return string
         */
        static function decodeCharReferencesCallback( $matches ) {
                if ( $matches[1] != '' ) {
@@ -1432,8 +1436,8 @@ class Sanitizer {
        /**
         * Return UTF-8 string for a codepoint if that is a valid
         * character reference, otherwise U+FFFD REPLACEMENT CHARACTER.
-        * @param $codepoint Integer
-        * @return String
+        * @param int $codepoint
+        * @return string
         * @private
         */
        static function decodeChar( $codepoint ) {
@@ -1449,8 +1453,8 @@ class Sanitizer {
         * return the UTF-8 encoding of that character. Otherwise, returns
         * pseudo-entity source (eg "&foo;")
         *
-        * @param $name String
-        * @return String
+        * @param string $name
+        * @return string
         */
        static function decodeEntity( $name ) {
                if ( isset( self::$htmlEntityAliases[$name] ) ) {
@@ -1466,8 +1470,8 @@ class Sanitizer {
        /**
         * Fetch the whitelist of acceptable attributes for a given element name.
         *
-        * @param $element String
-        * @return Array
+        * @param string $element
+        * @return array
         */
        static function attributeWhitelist( $element ) {
                $list = Sanitizer::setupAttributeWhitelist();
@@ -1479,7 +1483,7 @@ class Sanitizer {
        /**
         * Foreach array key (an allowed HTML element), return an array
         * of allowed attributes
-        * @return Array
+        * @return array
         */
        static function setupAttributeWhitelist() {
                global $wgAllowRdfaAttributes, $wgAllowMicrodataAttributes;
@@ -1702,7 +1706,7 @@ class Sanitizer {
         * inclusion in HTML output as of 1.10!
         *
         * @param string $text HTML fragment
-        * @return String
+        * @return string
         */
        static function stripAllTags( $text ) {
                # Actual <tags>
@@ -1722,7 +1726,7 @@ class Sanitizer {
         *
         * Use for passing XHTML fragments to PHP's XML parsing functions
         *
-        * @return String
+        * @return string
         */
        static function hackDocType() {
                $out = "<!DOCTYPE html [\n";
@@ -1734,7 +1738,7 @@ class Sanitizer {
        }
 
        /**
-        * @param $url string
+        * @param string $url
         * @return mixed|string
         */
        static function cleanUrl( $url ) {
@@ -1781,7 +1785,7 @@ class Sanitizer {
        }
 
        /**
-        * @param $matches array
+        * @param array $matches
         * @return string
         */
        static function cleanUrlCallback( $matches ) {
@@ -1814,7 +1818,7 @@ class Sanitizer {
         * @since 1.18
         *
         * @param string $addr E-mail address
-        * @return Bool
+        * @return bool
         */
        public static function validateEmail( $addr ) {
                $result = null;
index d300513..096a04d 100644 (file)
@@ -3538,6 +3538,13 @@ class Title {
                        }
                }
 
+               // If we are looking at a css/js user subpage, purge the action=raw.
+               if ( $this->isJsSubpage() ) {
+                       $urls[] = $this->getInternalUrl( 'action=raw&ctype=text/javascript' );
+               } elseif ( $this->isCssSubpage() ) {
+                       $urls[] = $this->getInternalUrl( 'action=raw&ctype=text/css' );
+               }
+
                wfRunHooks( 'TitleSquidURLs', array( $this, &$urls ) );
                return $urls;
        }
index 2a7c032..b42564c 100644 (file)
@@ -795,11 +795,12 @@ class WebRequest {
         * defaults if not given. The limit must be positive and is capped at 5000.
         * Offset must be positive but is not capped.
         *
-        * @param $deflimit Integer: limit to use if no input and the user hasn't set the option.
+        * @param int $deflimit limit to use if no input and the user hasn't set the option.
         * @param string $optionname to specify an option other than rclimit to pull from.
+        * @param int $hardlimit the maximum upper limit to allow, usually 5000
         * @return array first element is limit, second is offset
         */
-       public function getLimitOffset( $deflimit = 50, $optionname = 'rclimit' ) {
+       public function getLimitOffset( $deflimit = 50, $optionname = 'rclimit', $hardlimit = 5000 ) {
                global $wgUser;
 
                $limit = $this->getInt( 'limit', 0 );
@@ -812,8 +813,8 @@ class WebRequest {
                if ( $limit <= 0 ) {
                        $limit = $deflimit;
                }
-               if ( $limit > 5000 ) {
-                       $limit = 5000; # We have *some* limits...
+               if ( $limit > $hardlimit ) {
+                       $limit = $hardlimit; # We have *some* limits...
                }
 
                $offset = $this->getInt( 'offset', 0 );
@@ -835,19 +836,6 @@ class WebRequest {
                return $file->getTempName();
        }
 
-       /**
-        * Return the size of the upload, or 0.
-        *
-        * @deprecated since 1.17
-        * @param $key String:
-        * @return integer
-        */
-       public function getFileSize( $key ) {
-               wfDeprecated( __METHOD__, '1.17' );
-               $file = new WebRequestUpload( $this, $key );
-               return $file->getSize();
-       }
-
        /**
         * Return the upload error or 0
         *
@@ -1035,35 +1023,6 @@ HTML;
                return true;
        }
 
-       /**
-        * Returns true if the PATH_INFO ends with an extension other than a script
-        * extension. This could confuse IE for scripts that send arbitrary data which
-        * is not HTML but may be detected as such.
-        *
-        * Various past attempts to use the URL to make this check have generally
-        * run up against the fact that CGI does not provide a standard method to
-        * determine the URL. PATH_INFO may be mangled (e.g. if cgi.fix_pathinfo=0),
-        * but only by prefixing it with the script name and maybe some other stuff,
-        * the extension is not mangled. So this should be a reasonably portable
-        * way to perform this security check.
-        *
-        * Also checks for anything that looks like a file extension at the end of
-        * QUERY_STRING, since IE 6 and earlier will use this to get the file type
-        * if there was no dot before the question mark (bug 28235).
-        *
-        * @deprecated Use checkUrlExtension().
-        *
-        * @param $extWhitelist array
-        *
-        * @return bool
-        */
-       public function isPathInfoBad( $extWhitelist = array() ) {
-               wfDeprecated( __METHOD__, '1.17' );
-               global $wgScriptExtension;
-               $extWhitelist[] = ltrim( $wgScriptExtension, '.' );
-               return IEUrlExtension::areServerVarsBad( $_SERVER, $extWhitelist );
-       }
-
        /**
         * Parse the Accept-Language header sent by the client into an array
         * @return array array( languageCode => q-value ) sorted by q-value in descending order then
@@ -1462,14 +1421,6 @@ class FauxRequest extends WebRequest {
                return $this->session;
        }
 
-       /**
-        * @param array $extWhitelist
-        * @return bool
-        */
-       public function isPathInfoBad( $extWhitelist = array() ) {
-               return false;
-       }
-
        /**
         * FauxRequests shouldn't depend on raw request data (but that could be implemented here)
         * @return String
diff --git a/includes/WikiError.php b/includes/WikiError.php
deleted file mode 100644 (file)
index 08eb800..0000000
+++ /dev/null
@@ -1,154 +0,0 @@
-<?php
-/**
- * MediaWiki error classes
- *
- * Copyright © 2005 Brion Vibber <brion@pobox.com>
- * http://www.mediawiki.org/
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- */
-
-/**
- * Since PHP4 doesn't have exceptions, here's some error objects
- * loosely modeled on the standard PEAR_Error model...
- * @ingroup Exception
- */
-class WikiError {
-       /**
-        * @param $message string
-        *
-        * @deprecated since 1.17
-        */
-       function __construct( $message ) {
-               wfDeprecated( __METHOD__, '1.17' );
-               $this->mMessage = $message;
-       }
-
-       /**
-        * @return string Plaintext error message to display
-        */
-       function getMessage() {
-               return $this->mMessage;
-       }
-
-       /**
-        * In following PEAR_Error model this could be formatted differently,
-        * but so far it's not.
-        * @return string
-        */
-       function toString() {
-               return $this->getMessage();
-       }
-
-       /**
-        * Returns true if the given object is a WikiError-descended
-        * error object, false otherwise.
-        *
-        * @param $object mixed
-        * @return bool
-        *
-        * @deprecated since 1.17
-        */
-       public static function isError( $object ) {
-               wfDeprecated( __METHOD__, '1.17' );
-               if ( $object instanceof WikiError ) {
-                       return true;
-               } elseif ( $object instanceof Status ) {
-                       return !$object->isOK();
-               } else {
-                       return false;
-               }
-       }
-}
-
-/**
- * Localized error message object
- * @ingroup Exception
- */
-class WikiErrorMsg extends WikiError {
-       /**
-        * @param string $message wiki message name
-        * @param ... parameters to pass to wfMsg()
-        *
-        * @deprecated since 1.17
-        */
-       function __construct( $message/*, ... */ ) {
-               wfDeprecated( __METHOD__, '1.17' );
-               $args = func_get_args();
-               array_shift( $args );
-               $this->mMessage = wfMessage( $message )->rawParams( $args )->text();
-               $this->mMsgKey = $message;
-               $this->mMsgArgs = $args;
-       }
-
-       function getMessageKey() {
-               return $this->mMsgKey;
-       }
-
-       function getMessageArgs() {
-               return $this->mMsgArgs;
-       }
-}
-
-/**
- * Error class designed to handle errors involved with
- * XML parsing
- * @ingroup Exception
- */
-class WikiXmlError extends WikiError {
-       /**
-        * @param $parser resource
-        * @param $message string
-        * @param $context
-        * @param $offset Int
-        *
-        * @deprecated since 1.17
-        */
-       function __construct( $parser, $message = 'XML parsing error', $context = null, $offset = 0 ) {
-               wfDeprecated( __METHOD__, '1.17' );
-               $this->mXmlError = xml_get_error_code( $parser );
-               $this->mColumn = xml_get_current_column_number( $parser );
-               $this->mLine = xml_get_current_line_number( $parser );
-               $this->mByte = xml_get_current_byte_index( $parser );
-               $this->mContext = $this->_extractContext( $context, $offset );
-               $this->mMessage = $message;
-               xml_parser_free( $parser );
-               wfDebug( "WikiXmlError: " . $this->getMessage() . "\n" );
-       }
-
-       /** @return string */
-       function getMessage() {
-               // '$1 at line $2, col $3 (byte $4): $5',
-               return wfMessage( 'xml-error-string',
-                       $this->mMessage,
-                       $this->mLine,
-                       $this->mColumn,
-                       $this->mByte . $this->mContext,
-                       xml_error_string( $this->mXmlError ) )->escaped();
-       }
-
-       function _extractContext( $context, $offset ) {
-               if ( is_null( $context ) ) {
-                       return null;
-               } else {
-                       // Hopefully integer overflow will be handled transparently here
-                       $inlineOffset = $this->mByte - $offset;
-                       return '; "' . substr( $context, $inlineOffset, 16 ) . '"';
-               }
-       }
-}
index f0a58d3..8c035aa 100644 (file)
@@ -51,7 +51,7 @@ class WikiPage implements Page, IDBAccessObject {
        /**@}}*/
 
        /** @var stdclass Map of cache fields (text, parser output, ect) for a proposed/new edit */
-       protected $mPreparedEdit = false;
+       public $mPreparedEdit = false;
 
        /**
         * @var int
@@ -2794,6 +2794,11 @@ class WikiPage implements Page, IDBAccessObject {
                // Reparse any pages transcluding this page
                LinksUpdate::queueRecursiveJobsForTable( $this->mTitle, 'templatelinks' );
 
+               // Reparse any pages including this image
+               if ( $this->mTitle->getNamespace() == NS_FILE ) {
+                       LinksUpdate::queueRecursiveJobsForTable( $this->mTitle, 'imagelinks' );
+               }
+
                // Clear caches
                WikiPage::onArticleDelete( $this->mTitle );
 
@@ -3262,17 +3267,17 @@ class WikiPage implements Page, IDBAccessObject {
                        return;
                }
 
-               // templatelinks table may have become out of sync,
+               // templatelinks or imagelinks tables may have become out of sync,
                // especially if using variable-based transclusions.
                // For paranoia, check if things have changed and if
                // so apply updates to the database. This will ensure
                // that cascaded protections apply as soon as the changes
                // are visible.
 
-               // Get templates from templatelinks
+               // Get templates from templatelinks and images from imagelinks
                $id = $this->getId();
 
-               $tlTemplates = array();
+               $dbLinks = array();
 
                $dbr = wfGetDB( DB_SLAVE );
                $res = $dbr->select( array( 'templatelinks' ),
@@ -3282,21 +3287,35 @@ class WikiPage implements Page, IDBAccessObject {
                );
 
                foreach ( $res as $row ) {
-                       $tlTemplates["{$row->tl_namespace}:{$row->tl_title}"] = true;
+                       $dbLinks["{$row->tl_namespace}:{$row->tl_title}"] = true;
+               }
+
+               $dbr = wfGetDB( DB_SLAVE );
+               $res = $dbr->select( array( 'imagelinks' ),
+                       array( 'il_to' ),
+                       array( 'il_from' => $id ),
+                       __METHOD__
+               );
+
+               foreach ( $res as $row ) {
+                       $dbLinks[NS_FILE . ":{$row->il_to}"] = true;
                }
 
-               // Get templates from parser output.
-               $poTemplates = array();
+               // Get templates and images from parser output.
+               $poLinks = array();
                foreach ( $parserOutput->getTemplates() as $ns => $templates ) {
                        foreach ( $templates as $dbk => $id ) {
-                               $poTemplates["$ns:$dbk"] = true;
+                               $poLinks["$ns:$dbk"] = true;
                        }
                }
+               foreach ( $parserOutput->getImages() as $dbk => $id ) {
+                       $poLinks[NS_FILE . ":$dbk"] = true;
+               }
 
                // Get the diff
-               $templates_diff = array_diff_key( $poTemplates, $tlTemplates );
+               $links_diff = array_diff_key( $poLinks, $dbLinks );
 
-               if ( count( $templates_diff ) > 0 ) {
+               if ( count( $links_diff ) > 0 ) {
                        // Whee, link updates time.
                        // Note: we are only interested in links here. We don't need to get other DataUpdate items from the parser output.
                        $u = new LinksUpdate( $this->mTitle, $parserOutput, false );
index a0116fb..bab2f93 100644 (file)
@@ -77,7 +77,8 @@ class RawAction extends FormlessAction {
 
                $contentType = $this->getContentType();
 
-               # Force caching for CSS and JS raw content, default: 5 minutes
+               # Force caching for CSS and JS raw content, default: 5 minutes.
+               # Note: If using a canonical url for userpage css/js, we send an HTCP purge.
                if ( $smaxage === null ) {
                        if ( $contentType == 'text/css' || $contentType == 'text/javascript' ) {
                                $smaxage = intval( $wgForcedRawSMaxage );
index b6a7ca8..40edf4e 100644 (file)
@@ -861,17 +861,6 @@ abstract class ApiBase extends ContextSource {
                return !is_null( $x ) && $x !== false;
        }
 
-       /**
-        * @deprecated since 1.17 use MWNamespace::getValidNamespaces()
-        *
-        * @return array
-        */
-       public static function getValidNamespaces() {
-               wfDeprecated( __METHOD__, '1.17' );
-
-               return MWNamespace::getValidNamespaces();
-       }
-
        /**
         * Return true if we're to watch the page, false if not, null if no change.
         * @param string $watchlist Valid values: 'watch', 'unwatch', 'preferences', 'nochange'
index 829ba6f..ea61932 100644 (file)
@@ -292,16 +292,6 @@ class ApiMain extends ApiBase {
                $this->mCacheMode = $mode;
        }
 
-       /**
-        * @deprecated since 1.17 Private caching is now the default, so there is usually no
-        * need to call this function. If there is a need, you can use
-        * $this->setCacheMode('private')
-        */
-       public function setCachePrivate() {
-               wfDeprecated( __METHOD__, '1.17' );
-               $this->setCacheMode( 'private' );
-       }
-
        /**
         * Set directives (key/value pairs) for the Cache-Control header.
         * Boolean values will be formatted as such, by including or omitting
@@ -316,21 +306,6 @@ class ApiMain extends ApiBase {
                $this->mCacheControl = $directives + $this->mCacheControl;
        }
 
-       /**
-        * Make sure Vary: Cookie and friends are set. Use this when the output of a request
-        * may be cached for anons but may not be cached for logged-in users.
-        *
-        * WARNING: This function must be called CONSISTENTLY for a given URL. This means that a
-        * given URL must either always or never call this function; if it sometimes does and
-        * sometimes doesn't, stuff will break.
-        *
-        * @deprecated since 1.17 Use setCacheMode( 'anon-public-user-private' )
-        */
-       public function setVaryCookie() {
-               wfDeprecated( __METHOD__, '1.17' );
-               $this->setCacheMode( 'anon-public-user-private' );
-       }
-
        /**
         * Create an instance of an output formatter by its name
         *
@@ -815,6 +790,28 @@ class ApiMain extends ApiBase {
                }
        }
 
+       /**
+        * Check asserts of the user's rights
+        * @param $params array
+        */
+       protected function checkAsserts( $params ) {
+               if ( isset( $params['assert'] ) ) {
+                       $user = $this->getUser();
+                       switch ( $params['assert'] ) {
+                               case 'user':
+                                       if ( $user->isAnon() ) {
+                                               $this->dieUsage( 'Assertion that the user is logged in failed', 'assertuserfailed' );
+                                       }
+                                       break;
+                               case 'bot':
+                                       if ( !$user->isAllowed( 'bot' ) ) {
+                                               $this->dieUsage( 'Assertion that the user has the bot right failed', 'assertbotfailed' );
+                                       }
+                                       break;
+                       }
+               }
+       }
+
        /**
         * Check POST for external response and setup result printer
         * @param $module ApiBase An Api module
@@ -857,6 +854,8 @@ class ApiMain extends ApiBase {
                        $this->setupExternalResponse( $module, $params );
                }
 
+               $this->checkAsserts( $params );
+
                // Execute
                $module->profileIn();
                $module->execute();
@@ -1046,6 +1045,9 @@ class ApiMain extends ApiBase {
                                ApiBase::PARAM_TYPE => 'integer',
                                ApiBase::PARAM_DFLT => 0
                        ),
+                       'assert' => array(
+                               ApiBase::PARAM_TYPE => array( 'user', 'bot' )
+                       ),
                        'requestid' => null,
                        'servedby' => false,
                        'origin' => null,
@@ -1071,6 +1073,7 @@ class ApiMain extends ApiBase {
                        ),
                        'smaxage' => 'Set the s-maxage header to this many seconds. Errors are never cached',
                        'maxage' => 'Set the max-age header to this many seconds. Errors are never cached',
+                       'assert' => 'Verify the user is logged in if set to "user", or has the bot userright if "bot"',
                        'requestid' => 'Request ID to distinguish requests. This will just be output back to you',
                        'servedby' => 'Include the hostname that served the request in the ' .
                                'results. Unconditionally shown on error',
@@ -1143,6 +1146,8 @@ class ApiMain extends ApiBase {
                        array( 'code' => 'unknown_action', 'info' => 'The API requires a valid action parameter' ),
                        array( 'code' => 'maxlag', 'info' => 'Waiting for host: x seconds lagged' ),
                        array( 'code' => 'maxlag', 'info' => 'Waiting for a database server: x seconds lagged' ),
+                       array( 'code' => 'assertuserfailed', 'info' => 'Assertion that the user is logged in failed' ),
+                       array( 'code' => 'assertbotfailed', 'info' => 'Assertion that the user has the bot right failed' ),
                ) );
        }
 
index a323aad..464fde6 100644 (file)
@@ -176,11 +176,14 @@ class ApiParse extends ApiBase {
                        if ( !$titleObj || $titleObj->isExternal() ) {
                                $this->dieUsageMsg( array( 'invalidtitle', $title ) );
                        }
-                       if ( !$titleObj->canExist() ) {
-                               $this->dieUsage( "Namespace doesn't allow actual pages", 'pagecannotexist' );
-                       }
                        $wgTitle = $titleObj;
-                       $pageObj = WikiPage::factory( $titleObj );
+                       if ( $titleObj->canExist() ) {
+                               $pageObj = WikiPage::factory( $titleObj );
+                       } else {
+                               // Do like MediaWiki::initializeArticle()
+                               $article = Article::newFromTitle( $titleObj, $this->getContext() );
+                               $pageObj = $article->getPage();
+                       }
 
                        $popts = $this->makeParserOptions( $pageObj, $params );
 
@@ -805,7 +808,6 @@ class ApiParse extends ApiBase {
                                'code' => 'notwikitext',
                                'info' => 'The requested operation is only supported on wikitext content.'
                        ),
-                       array( 'code' => 'pagecannotexist', 'info' => "Namespace doesn't allow actual pages" ),
                ) );
        }
 
index cec1ca8..c054bc1 100644 (file)
@@ -44,6 +44,7 @@ class ApiQuery extends ApiBase {
        private static $QueryPropModules = array(
                'categories' => 'ApiQueryCategories',
                'categoryinfo' => 'ApiQueryCategoryInfo',
+               'contributors' => 'ApiQueryContributors',
                'duplicatefiles' => 'ApiQueryDuplicateFiles',
                'extlinks' => 'ApiQueryExternalLinks',
                'images' => 'ApiQueryImages',
diff --git a/includes/api/ApiQueryContributors.php b/includes/api/ApiQueryContributors.php
new file mode 100644 (file)
index 0000000..6b896e3
--- /dev/null
@@ -0,0 +1,287 @@
+<?php
+/**
+ * Query the list of contributors to a page
+ *
+ * Created on Nov 14, 2013
+ *
+ * Copyright © 2013 Brad Jorsch
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @since 1.23
+ */
+
+/**
+ * A query module to show contributors to a page
+ *
+ * @ingroup API
+ * @since 1.23
+ */
+class ApiQueryContributors extends ApiQueryBase {
+       /** We don't want to process too many pages at once (it hits cold
+        * database pages too heavily), so only do the first MAX_PAGES input pages
+        * in each API call (leaving the rest for continuation).
+        */
+       const MAX_PAGES = 100;
+
+       public function __construct( $query, $moduleName ) {
+               // "pc" is short for "page contributors", "co" was already taken by the
+               // GeoData extension's prop=coordinates.
+               parent::__construct( $query, $moduleName, 'pc' );
+       }
+
+       public function execute() {
+               $db = $this->getDB();
+               $params = $this->extractRequestParams();
+               $this->requireMaxOneParameter( $params, 'group', 'excludegroup', 'rights', 'excluderights' );
+
+               // Only operate on existing pages
+               $pages = array_keys( $this->getPageSet()->getGoodTitles() );
+
+               // Filter out already-processed pages
+               if ( $params['continue'] !== null ) {
+                       $cont = explode( '|', $params['continue'] );
+                       $this->dieContinueUsageIf( count( $cont ) != 2 );
+                       $cont_page = (int)$cont[0];
+                       $pages = array_filter( $pages, function ( $v ) use ( $cont_page ) {
+                               return $v >= $cont_page;
+                       } );
+               }
+               if ( !count( $pages ) ) {
+                       // Nothing to do
+                       return;
+               }
+
+               // Apply MAX_PAGES, leaving any over the limit for a continue.
+               sort( $pages );
+               $continuePages = null;
+               if ( count( $pages ) > self::MAX_PAGES ) {
+                       $continuePages = $pages[self::MAX_PAGES] . '|0';
+                       $pages = array_slice( $pages, 0, self::MAX_PAGES );
+               }
+
+               $result = $this->getResult();
+
+               // First, count anons
+               $this->addTables( 'revision' );
+               $this->addFields( array(
+                       'page' => 'rev_page',
+                       'anons' => 'COUNT(DISTINCT rev_user_text)',
+               ) );
+               $this->addWhereFld( 'rev_page', $pages );
+               $this->addWhere( 'rev_user = 0' );
+               $this->addWhere( $db->bitAnd( 'rev_deleted', Revision::DELETED_USER ) . ' = 0' );
+               $this->addOption( 'GROUP BY', 'rev_page' );
+               $res = $this->select( __METHOD__ );
+               foreach ( $res as $row ) {
+                       $fit = $result->addValue( array( 'query', 'pages', $row->page ),
+                               'anoncontributors', $row->anons
+                       );
+                       if ( !$fit ) {
+                               // This not fitting isn't reasonable, so it probably means that
+                               // some other module used up all the space. Just set a dummy
+                               // continue and hope it works next time.
+                               $this->setContinueEnumParameter( 'continue',
+                                       $params['continue'] !== null ? $params['continue'] : '0|0'
+                               );
+                               return;
+                       }
+               }
+
+               // Next, add logged-in users
+               $this->resetQueryParams();
+               $this->addTables( 'revision' );
+               $this->addFields( array(
+                       'page' => 'rev_page',
+                       'user' => 'rev_user',
+                       'username' => 'MAX(rev_user_text)', // Non-MySQL databases don't like partial group-by
+               ) );
+               $this->addWhereFld( 'rev_page', $pages );
+               $this->addWhere( 'rev_user != 0' );
+               $this->addWhere( $db->bitAnd( 'rev_deleted', Revision::DELETED_USER ) . ' = 0' );
+               $this->addOption( 'GROUP BY', 'rev_page, rev_user' );
+               $this->addOption( 'LIMIT', $params['limit'] + 1 );
+
+               // Force a sort order to ensure that properties are grouped by page
+               // But only if pp_page is not constant in the WHERE clause.
+               if ( count( $pages ) > 1 ) {
+                       $this->addOption( 'ORDER BY', 'rev_page, rev_user' );
+               } else {
+                       $this->addOption( 'ORDER BY', 'rev_user' );
+               }
+
+               $limitGroups = array();
+               if ( $params['group'] ) {
+                       $excludeGroups = false;
+                       $limitGroups = $params['group'];
+               } elseif ( $params['excludegroup'] ) {
+                       $excludeGroups = true;
+                       $limitGroups = $params['excludegroup'];
+               } elseif ( $params['rights'] ) {
+                       $excludeGroups = false;
+                       foreach ( $params['rights'] as $r ) {
+                               $limitGroups = array_merge( $limitGroups, User::getGroupsWithPermission( $r ) );
+                       }
+
+                       // If no group has the rights requested, no need to query
+                       if ( !$limitGroups ) {
+                               if ( $continuePages !== null ) {
+                                       // But we still need to continue for the next page's worth
+                                       // of anoncontributors
+                                       $this->setContinueEnumParameter( 'continue', $continuePages );
+                               }
+                               return;
+                       }
+               } elseif ( $params['excluderights'] ) {
+                       $excludeGroups = true;
+                       foreach ( $params['excluderights'] as $r ) {
+                               $limitGroups = array_merge( $limitGroups, User::getGroupsWithPermission( $r ) );
+                       }
+               }
+
+               if ( $limitGroups ) {
+                       $limitGroups = array_unique( $limitGroups );
+                       $this->addTables( 'user_groups' );
+                       $this->addJoinConds( array( 'user_groups' => array(
+                               $excludeGroups ? 'LEFT OUTER JOIN' : 'INNER JOIN',
+                               array( 'ug_user=rev_user', 'ug_group' => $limitGroups )
+                       ) ) );
+                       $this->addWhereIf( 'ug_user IS NULL', $excludeGroups );
+               }
+
+               if ( $params['continue'] !== null ) {
+                       $cont = explode( '|', $params['continue'] );
+                       $this->dieContinueUsageIf( count( $cont ) != 2 );
+                       $cont_page = (int)$cont[0];
+                       $cont_user = (int)$cont[1];
+                       $this->addWhere(
+                               "rev_page > $cont_page OR " .
+                               "(rev_page = $cont_page AND " .
+                               "rev_user >= $cont_user)"
+                       );
+               }
+
+               $res = $this->select( __METHOD__ );
+               $count = 0;
+               foreach ( $res as $row ) {
+                       if ( ++$count > $params['limit'] ) {
+                               // We've reached the one extra which shows that
+                               // there are additional pages to be had. Stop here...
+                               $this->setContinueEnumParameter( 'continue', $row->page . '|' . $row->user );
+                               return;
+                       }
+
+                       $fit = $this->addPageSubItem( $row->page,
+                               array( 'userid' => $row->user, 'name' => $row->username ),
+                               'user'
+                       );
+                       if ( !$fit ) {
+                               $this->setContinueEnumParameter( 'continue', $row->page . '|' . $row->user );
+                               return;
+                       }
+               }
+
+               if ( $continuePages !== null ) {
+                       $this->setContinueEnumParameter( 'continue', $continuePages );
+               }
+       }
+
+       public function getCacheMode( $params ) {
+               return 'public';
+       }
+
+       public function getAllowedParams() {
+               $userGroups = User::getAllGroups();
+               $userRights = User::getAllRights();
+
+               return array(
+                       'group' => array(
+                               ApiBase::PARAM_TYPE => $userGroups,
+                               ApiBase::PARAM_ISMULTI => true,
+                       ),
+                       'excludegroup' => array(
+                               ApiBase::PARAM_TYPE => $userGroups,
+                               ApiBase::PARAM_ISMULTI => true,
+                       ),
+                       'rights' => array(
+                               ApiBase::PARAM_TYPE => $userRights,
+                               ApiBase::PARAM_ISMULTI => true,
+                       ),
+                       'excluderights' => array(
+                               ApiBase::PARAM_TYPE => $userRights,
+                               ApiBase::PARAM_ISMULTI => true,
+                       ),
+                       'limit' => array(
+                               ApiBase::PARAM_DFLT => 10,
+                               ApiBase::PARAM_TYPE => 'limit',
+                               ApiBase::PARAM_MIN => 1,
+                               ApiBase::PARAM_MAX => ApiBase::LIMIT_BIG1,
+                               ApiBase::PARAM_MAX2 => ApiBase::LIMIT_BIG2
+                       ),
+                       'continue' => null,
+               );
+       }
+
+       public function getParamDescription() {
+               return array(
+                       'group' => array(
+                               'Limit users to given group name(s)',
+                               'Does not include implicit or auto-promoted groups like *, user, or autoconfirmed'
+                       ),
+                       'excludegroup' => array(
+                               'Exclude users in given group name(s)',
+                               'Does not include implicit or auto-promoted groups like *, user, or autoconfirmed'
+                       ),
+                       'rights' => array(
+                               'Limit users to those having given right(s)',
+                               'Does not include rights granted by implicit or auto-promoted groups ' .
+                                       'like *, user, or autoconfirmed'
+                       ),
+                       'excluderights' => array(
+                               'Limit users to those not having given right(s)',
+                               'Does not include rights granted by implicit or auto-promoted groups ' .
+                                       'like *, user, or autoconfirmed'
+                       ),
+                       'limit' => 'How many contributors to return',
+                       'continue' => 'When more results are available, use this to continue',
+               );
+       }
+
+       public function getPossibleErrors() {
+               return array_merge( parent::getPossibleErrors(),
+                       $this->getRequireMaxOneParameterErrorMessages(
+                               array( 'group', 'excludegroup', 'rights', 'excluderights' )
+                       )
+               );
+       }
+
+
+       public function getDescription() {
+               return 'Get the list of logged-in contributors and ' .
+                       'the count of anonymous contributors to a page';
+       }
+
+       public function getExamples() {
+               return array(
+                       'api.php?action=query&prop=contributors&titles=Main_Page',
+               );
+       }
+
+       public function getHelpUrls() {
+               return 'https://www.mediawiki.org/wiki/API:Properties#contributors_.2F_pc';
+       }
+}
index 02a05e8..b298003 100644 (file)
@@ -559,6 +559,7 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
 
                        return $retval;
                }
+
                switch ( $type ) {
                        case 'edit':
                                return RC_EDIT;
@@ -568,6 +569,8 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
                                return RC_LOG;
                        case 'external':
                                return RC_EXTERNAL;
+                       default:
+                               ApiBase::dieDebug( __METHOD__, "Unknown type '$type'" );
                }
        }
 
index f8e521f..3465e48 100644 (file)
@@ -374,6 +374,7 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
 
                        return $retval;
                }
+
                switch ( $type ) {
                        case 'edit':
                                return RC_EDIT;
@@ -383,6 +384,8 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
                                return RC_LOG;
                        case 'external':
                                return RC_EXTERNAL;
+                       default:
+                               ApiBase::dieDebug( __METHOD__, "Unknown type '$type'" );
                }
        }
 
index 1f96bdc..a92699b 100644 (file)
@@ -152,29 +152,27 @@ class WikitextContent extends TextContent {
        }
 
        /**
-        * Implement redirect extraction for wikitext.
-        *
-        * @return null|Title
+        * Extract the redirect target and the remaining text on the page.
         *
         * @note: migrated here from Title::newFromRedirectInternal()
         *
-        * @see Content::getRedirectTarget
-        * @see AbstractContent::getRedirectTarget
+        * @since 1.23
+        * @return array 2 elements: Title|null and string
         */
-       public function getRedirectTarget() {
+       protected function getRedirectTargetAndText() {
                global $wgMaxRedirects;
                if ( $wgMaxRedirects < 1 ) {
                        // redirects are disabled, so quit early
-                       return null;
+                       return array( null, $this->getNativeData() );
                }
                $redir = MagicWord::get( 'redirect' );
-               $text = trim( $this->getNativeData() );
+               $text = ltrim( $this->getNativeData() );
                if ( $redir->matchStartAndRemove( $text ) ) {
                        // Extract the first link and see if it's usable
                        // Ensure that it really does come directly after #REDIRECT
                        // Some older redirects included a colon, so don't freak about that!
                        $m = array();
-                       if ( preg_match( '!^\s*:?\s*\[{2}(.*?)(?:\|.*?)?\]{2}!', $text, $m ) ) {
+                       if ( preg_match( '!^\s*:?\s*\[{2}(.*?)(?:\|.*?)?\]{2}\s*!', $text, $m ) ) {
                                // Strip preceding colon used to "escape" categories, etc.
                                // and URL-decode links
                                if ( strpos( $m[1], '%' ) !== false ) {
@@ -184,14 +182,27 @@ class WikitextContent extends TextContent {
                                $title = Title::newFromText( $m[1] );
                                // If the title is a redirect to bad special pages or is invalid, return null
                                if ( !$title instanceof Title || !$title->isValidRedirectTarget() ) {
-                                       return null;
+                                       return array( null, $this->getNativeData() );
                                }
 
-                               return $title;
+                               return array( $title, substr( $text, strlen( $m[0] ) ) );
                        }
                }
 
-               return null;
+               return array( null, $this->getNativeData() );
+       }
+
+       /**
+        * Implement redirect extraction for wikitext.
+        *
+        * @return null|Title
+        *
+        * @see Content::getRedirectTarget
+        * @see AbstractContent::getRedirectTarget
+        */
+       public function getRedirectTarget() {
+               list( $title, ) = $this->getRedirectTargetAndText();
+               return $title;
        }
 
        /**
@@ -303,7 +314,21 @@ class WikitextContent extends TextContent {
                        $options = $this->getContentHandler()->makeParserOptions( 'canonical' );
                }
 
-               $po = $wgParser->parse( $this->getNativeData(), $title, $options, true, true, $revId );
+               list( $redir, $text ) = $this->getRedirectTargetAndText();
+               $po = $wgParser->parse( $text, $title, $options, true, true, $revId );
+
+               // Add redirect indicator at the top
+               if ( $redir ) {
+                       // Make sure to include the redirect link in pagelinks
+                       $po->addLink( $redir );
+                       if ( $generateHtml ) {
+                               $chain = $this->getRedirectChain();
+                               $po->setText(
+                                       Article::getRedirectHeaderHtml( $title->getPageLanguage(), $chain, false ) .
+                                       $po->getText()
+                               );
+                       }
+               }
 
                return $po;
        }
index 3d1f453..0c7b612 100644 (file)
  * Kind of like Hawking's [[Chronology Protection Agency]].
  */
 class ChronologyProtector {
-       /** @var Array (DB master name => position) */
+       /** @var array (DB master name => position) */
        protected $startupPositions = array();
-       /** @var Array (DB master name => position) */
+
+       /** @var array (DB master name => position) */
        protected $shutdownPositions = array();
 
-       protected $initialized = false; // bool; whether the session data was loaded
+       /** @var bool Whether the session data was loaded */
+       protected $initialized = false;
 
        /**
         * Initialise a LoadBalancer to give it appropriate chronology protection.
@@ -41,7 +43,7 @@ class ChronologyProtector {
         * to that position by delaying execution. The delay may timeout and allow stale
         * data if no non-lagged slaves are available.
         *
-        * @param $lb LoadBalancer
+        * @param LoadBalancer $lb
         * @return void
         */
        public function initLB( LoadBalancer $lb ) {
@@ -67,7 +69,7 @@ class ChronologyProtector {
         * Notify the ChronologyProtector that the LoadBalancer is about to shut
         * down. Saves replication positions.
         *
-        * @param $lb LoadBalancer
+        * @param LoadBalancer $lb
         * @return void
         */
        public function shutdownLB( LoadBalancer $lb ) {
index 1e01d29..c5dc882 100644 (file)
  */
 
 class CloneDatabase {
-       /**
-        * Table prefix for cloning
-        * @var String
-        */
+       /** @var string Table prefix for cloning */
        private $newTablePrefix = '';
 
-       /**
-        * Current table prefix
-        * @var String
-        */
+       /** @var string Current table prefix */
        private $oldTablePrefix = '';
 
-       /**
-        * List of tables to be cloned
-        * @var Array
-        */
+       /** @var array List of tables to be cloned */
        private $tablesToClone = array();
 
-       /**
-        * Should we DROP tables containing the new names?
-        * @var Bool
-        */
+       /** @var bool Should we DROP tables containing the new names? */
        private $dropCurrentTables = true;
 
-       /**
-        * Whether to use temporary tables or not
-        * @var Bool
-        */
+       /** @var bool Whether to use temporary tables or not */
        private $useTemporaryTables = true;
 
        /**
         * Constructor
         *
-        * @param $db DatabaseBase A database subclass
+        * @param DatabaseBase $db A database subclass
         * @param array $tablesToClone An array of tables to clone, unprefixed
         * @param string $newTablePrefix Prefix to assign to the tables
         * @param string $oldTablePrefix Prefix on current tables, if not $wgDBprefix
-        * @param $dropCurrentTables bool
+        * @param bool $dropCurrentTables
         */
        public function __construct( DatabaseBase $db, array $tablesToClone,
                $newTablePrefix, $oldTablePrefix = '', $dropCurrentTables = true
@@ -128,7 +113,7 @@ class CloneDatabase {
        /**
         * Change the table prefix on all open DB connections/
         *
-        * @param $prefix
+        * @param string $prefix
         * @return void
         */
        public static function changePrefix( $prefix ) {
@@ -138,8 +123,8 @@ class CloneDatabase {
        }
 
        /**
-        * @param $lb LoadBalancer
-        * @param $prefix
+        * @param LoadBalancer $lb
+        * @param string $prefix
         * @return void
         */
        public static function changeLBPrefix( $lb, $prefix ) {
@@ -147,8 +132,8 @@ class CloneDatabase {
        }
 
        /**
-        * @param $db DatabaseBase
-        * @param $prefix
+        * @param DatabaseBase $db
+        * @param string $prefix
         * @return void
         */
        public static function changeDBPrefix( $db, $prefix ) {
index 2e19f6a..6e87c40 100644 (file)
@@ -57,18 +57,18 @@ interface DatabaseType {
         * member variables.
         * If no more rows are available, false is returned.
         *
-        * @param $res ResultWrapper|object as returned from DatabaseBase::query(), etc.
-        * @return object|bool
+        * @param ResultWrapper|stdClass $res Object as returned from DatabaseBase::query(), etc.
+        * @return stdClass|bool
         * @throws DBUnexpectedError Thrown if the database returns an error
         */
        function fetchObject( $res );
 
        /**
         * Fetch the next row from the given result object, in associative array
-        * form.  Fields are retrieved with $row['fieldname'].
+        * form. Fields are retrieved with $row['fieldname'].
         * If no more rows are available, false is returned.
         *
-        * @param $res ResultWrapper result object as returned from DatabaseBase::query(), etc.
+        * @param ResultWrapper $res Result object as returned from DatabaseBase::query(), etc.
         * @return array|bool
         * @throws DBUnexpectedError Thrown if the database returns an error
         */
@@ -77,7 +77,7 @@ interface DatabaseType {
        /**
         * Get the number of rows in a result object
         *
-        * @param $res Mixed: A SQL result
+        * @param mixed $res A SQL result
         * @return int
         */
        function numRows( $res );
@@ -86,7 +86,7 @@ interface DatabaseType {
         * Get the number of fields in a result object
         * @see http://www.php.net/mysql_num_fields
         *
-        * @param $res Mixed: A SQL result
+        * @param mixed $res A SQL result
         * @return int
         */
        function numFields( $res );
@@ -95,8 +95,8 @@ interface DatabaseType {
         * Get a field name in a result object
         * @see http://www.php.net/mysql_field_name
         *
-        * @param $res Mixed: A SQL result
-        * @param $n Integer
+        * @param mixed $res A SQL result
+        * @param int $n
         * @return string
         */
        function fieldName( $res, $n );
@@ -119,8 +119,8 @@ interface DatabaseType {
         * Change the position of the cursor in a result object
         * @see http://www.php.net/mysql_data_seek
         *
-        * @param $res Mixed: A SQL result
-        * @param $row Mixed: Either MySQL row or ResultWrapper
+        * @param mixed $res A SQL result
+        * @param int $row
         */
        function dataSeek( $res, $row );
 
@@ -144,8 +144,8 @@ interface DatabaseType {
         * mysql_fetch_field() wrapper
         * Returns false if the field doesn't exist
         *
-        * @param string $table table name
-        * @param string $field field name
+        * @param string $table Table name
+        * @param string $field Field name
         *
         * @return Field
         */
@@ -156,7 +156,7 @@ interface DatabaseType {
         * @param string $table Table name
         * @param string $index Index name
         * @param string $fname Calling function name
-        * @return Mixed: Database-specific index description class or false if the index does not exist
+        * @return mixed Database-specific index description class or false if the index does not exist
         */
        function indexInfo( $table, $index, $fname = __METHOD__ );
 
@@ -171,18 +171,18 @@ interface DatabaseType {
        /**
         * Wrapper for addslashes()
         *
-        * @param string $s to be slashed.
-        * @return string: slashed string.
+        * @param string $s String to be slashed.
+        * @return string Slashed string.
         */
        function strencode( $s );
 
        /**
         * Returns a wikitext link to the DB's website, e.g.,
-        *     return "[http://www.mysql.com/ MySQL]";
+        *   return "[http://www.mysql.com/ MySQL]";
         * Should at least contain plain text, if for some reason
         * your database has no website.
         *
-        * @return string: wikitext of a link to the server software's web site
+        * @return string Wikitext of a link to the server software's web site
         */
        function getSoftwareLink();
 
@@ -190,16 +190,16 @@ interface DatabaseType {
         * A string describing the current software version, like from
         * mysql_get_server_info().
         *
-        * @return string: Version information from the database server.
+        * @return string Version information from the database server.
         */
        function getServerVersion();
 
        /**
         * A string describing the current software version, and possibly
-        * other details in a user-friendly way.  Will be listed on Special:Version, etc.
+        * other details in a user-friendly way. Will be listed on Special:Version, etc.
         * Use getServerVersion() to get machine-friendly information.
         *
-        * @return string: Version information from the database server
+        * @return string Version information from the database server
         */
        function getServerInfo();
 }
@@ -218,8 +218,10 @@ interface IDatabase {
 abstract class DatabaseBase implements IDatabase, DatabaseType {
        /** Number of times to re-try an operation in case of deadlock */
        const DEADLOCK_TRIES = 4;
+
        /** Minimum time to wait before retry, in microseconds */
        const DEADLOCK_DELAY_MIN = 500000;
+
        /** Maximum time to wait before retry */
        const DEADLOCK_DELAY_MAX = 1500000;
 
@@ -233,6 +235,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
 
        protected $mServer, $mUser, $mPassword, $mDBname;
 
+       /** @var resource Database connection */
        protected $mConn = null;
        protected $mOpened = false;
 
@@ -268,7 +271,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * Remembers the function name given for starting the most recent transaction via begin().
         * Used to provide additional context for error reporting.
         *
-        * @var String
+        * @var string
         * @see DatabaseBase::mTrxLevel
         */
        private $mTrxFname = null;
@@ -276,7 +279,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
        /**
         * Record if possible write queries were done in the last transaction started
         *
-        * @var Bool
+        * @var bool
         * @see DatabaseBase::mTrxLevel
         */
        private $mTrxDoneWrites = false;
@@ -284,7 +287,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
        /**
         * Record if the current transaction was started implicitly due to DBO_TRX being set.
         *
-        * @var Bool
+        * @var bool
         * @see DatabaseBase::mTrxLevel
         */
        private $mTrxAutomatic = false;
@@ -299,19 +302,19 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
        /**
         * Record if the current transaction was started implicitly by DatabaseBase::startAtomic
         *
-        * @var Bool
+        * @var bool
         */
        private $mTrxAutomaticAtomic = false;
 
        /**
         * @since 1.21
-        * @var file handle for upgrade
+        * @var resource File handle for upgrade
         */
        protected $fileHandle = null;
 
        /**
         * @since 1.22
-        * @var Process cache of VIEWs names in the database
+        * @var string[] Process cache of VIEWs names in the database
         */
        protected $allViews = null;
 
@@ -322,17 +325,17 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
 
        /**
         * A string describing the current software version, and possibly
-        * other details in a user-friendly way.  Will be listed on Special:Version, etc.
+        * other details in a user-friendly way. Will be listed on Special:Version, etc.
         * Use getServerVersion() to get machine-friendly information.
         *
-        * @return string: Version information from the database server
+        * @return string Version information from the database server
         */
        public function getServerInfo() {
                return $this->getServerVersion();
        }
 
        /**
-        * @return string: command delimiter used by this database engine
+        * @return string command delimiter used by this database engine
         */
        public function getDelimiter() {
                return $this->delimiter;
@@ -340,7 +343,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
 
        /**
         * Boolean, controls output of large amounts of debug information.
-        * @param $debug bool|null
+        * @param bool|null $debug
         *   - true to enable debugging
         *   - false to disable debugging
         *   - omitted or null to do nothing
@@ -369,8 +372,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * split up queries into batches using a LIMIT clause than to switch off
         * buffering.
         *
-        * @param $buffer null|bool
-        *
+        * @param null|bool $buffer
         * @return null|bool The previous value of the flag
         */
        public function bufferResults( $buffer = null ) {
@@ -390,8 +392,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         *
         * Do not use this function outside of the Database classes.
         *
-        * @param $ignoreErrors bool|null
-        *
+        * @param null|bool $ignoreErrors
         * @return bool The previous value of the flag.
         */
        public function ignoreErrors( $ignoreErrors = null ) {
@@ -431,7 +432,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
        /**
         * Set the filehandle to copy write statements to.
         *
-        * @param $fh filehandle
+        * @param resource $fh File handle
         */
        public function setFileHandle( $fh ) {
                $this->fileHandle = $fh;
@@ -444,7 +445,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * @param string $name The entry of the info array to get, or null to get the
         *   whole array
         *
-        * @return LoadBalancer|null
+        * @return array|mixed|null
         */
        public function getLBInfo( $name = null ) {
                if ( is_null( $name ) ) {
@@ -463,7 +464,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * the LB info array is set to that parameter. If it is called with two
         * parameters, the member with the given name is set to the given value.
         *
-        * @param $name
+        * @param string $name
         * @param $value
         */
        public function setLBInfo( $name, $value = null ) {
@@ -477,7 +478,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
        /**
         * Set lag time in seconds for a fake slave
         *
-        * @param $lag int
+        * @param int $lag
         */
        public function setFakeSlaveLag( $lag ) {
                $this->mFakeSlaveLag = $lag;
@@ -486,7 +487,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
        /**
         * Make this connection a fake master
         *
-        * @param $enabled bool
+        * @param bool $enabled
         */
        public function setFakeMaster( $enabled = true ) {
                $this->mFakeMaster = $enabled;
@@ -569,7 +570,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
 
        /**
         * Return the last query that went through DatabaseBase::query()
-        * @return String
+        * @return string
         */
        public function lastQuery() {
                return $this->mLastQuery;
@@ -599,7 +600,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
 
        /**
         * Is a connection to the database open?
-        * @return Boolean
+        * @return bool
         */
        public function isOpen() {
                return $this->mOpened;
@@ -608,7 +609,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
        /**
         * Set a flag for this connection
         *
-        * @param $flag Integer: DBO_* constants from Defines.php:
+        * @param int $flag DBO_* constants from Defines.php:
         *   - DBO_DEBUG: output some debug info (same as debug())
         *   - DBO_NOBUFFER: don't buffer results (inverse of bufferResults())
         *   - DBO_TRX: automatically start transactions
@@ -620,14 +621,20 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
                global $wgDebugDBTransactions;
                $this->mFlags |= $flag;
                if ( ( $flag & DBO_TRX ) & $wgDebugDBTransactions ) {
-                       wfDebug( "Implicit transactions are now  disabled.\n" );
+                       wfDebug( "Implicit transactions are now disabled.\n" );
                }
        }
 
        /**
         * Clear a flag for this connection
         *
-        * @param $flag : same as setFlag()'s $flag param
+        * @param int $flag DBO_* constants from Defines.php:
+        *   - DBO_DEBUG: output some debug info (same as debug())
+        *   - DBO_NOBUFFER: don't buffer results (inverse of bufferResults())
+        *   - DBO_TRX: automatically start transactions
+        *   - DBO_DEFAULT: automatically sets DBO_TRX if not in command line mode
+        *       and removes it in command line mode
+        *   - DBO_PERSISTENT: use persistant database connection
         */
        public function clearFlag( $flag ) {
                global $wgDebugDBTransactions;
@@ -640,8 +647,14 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
        /**
         * Returns a boolean whether the flag $flag is set for this connection
         *
-        * @param $flag : same as setFlag()'s $flag param
-        * @return Boolean
+        * @param int $flag DBO_* constants from Defines.php:
+        *   - DBO_DEBUG: output some debug info (same as debug())
+        *   - DBO_NOBUFFER: don't buffer results (inverse of bufferResults())
+        *   - DBO_TRX: automatically start transactions
+        *   - DBO_DEFAULT: automatically sets DBO_TRX if not in command line mode
+        *       and removes it in command line mode
+        *   - DBO_PERSISTENT: use persistant database connection
+        * @return bool
         */
        public function getFlag( $flag ) {
                return !!( $this->mFlags & $flag );
@@ -650,8 +663,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
        /**
         * General read-only accessor
         *
-        * @param $name string
-        *
+        * @param string $name
         * @return string
         */
        public function getProperty( $name ) {
@@ -697,7 +709,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * DatabaseBase subclasses should not be constructed directly in external
         * code. DatabaseBase::factory() should be used instead.
         *
-        * @param array Parameters passed from DatabaseBase::factory()
+        * @param array $params Parameters passed from DatabaseBase::factory()
         */
        function __construct( $params = null ) {
                global $wgDBprefix, $wgCommandLineMode, $wgDebugDBTransactions;
@@ -782,7 +794,8 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * @param string $dbType A possible DB type
         * @param array $p An array of options to pass to the constructor.
         *    Valid options are: host, user, password, dbname, flags, tablePrefix, driver
-        * @return DatabaseBase subclass or null
+        * @throws MWException If the database driver or extension cannot be found
+        * @return DatabaseBase|null DatabaseBase subclass or null
         */
        final public static function factory( $dbType, $p = array() ) {
                $canonicalDBTypes = array(
@@ -864,8 +877,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
 
        /**
         * @param $errno
-        * @param $errstr
-        * @access private
+        * @param string $errstr
         */
        public function connectionErrorHandler( $errno, $errstr ) {
                $this->mPHPError = $errstr;
@@ -876,7 +888,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * if it is open : commits any open transactions
         *
         * @throws MWException
-        * @return Bool operation success. true if already closed.
+        * @return bool Operation success. true if already closed.
         */
        public function close() {
                if ( count( $this->mTrxIdleCallbacks ) ) { // sanity
@@ -905,12 +917,12 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
        /**
         * Closes underlying database connection
         * @since 1.20
-        * @return bool: Whether connection was closed successfully
+        * @return bool Whether connection was closed successfully
         */
        abstract protected function closeConnection();
 
        /**
-        * @param string $error fallback error message, used if none is given by DB
+        * @param string $error Fallback error message, used if none is given by DB
         * @throws DBConnectionError
         */
        function reportConnectionError( $error = 'Unknown error' ) {
@@ -926,8 +938,9 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
        /**
         * The DBMS-dependent part of query()
         *
-        * @param  $sql String: SQL query.
-        * @return ResultWrapper Result object to feed to fetchObject, fetchRow, ...; or false on failure
+        * @param string $sql SQL query.
+        * @return ResultWrapper|bool Result object to feed to fetchObject,
+        *   fetchRow, ...; or false on failure
         */
        abstract protected function doQuery( $sql );
 
@@ -935,8 +948,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * Determine whether a query writes to the DB.
         * Should return true if unsure.
         *
-        * @param $sql string
-        *
+        * @param string $sql
         * @return bool
         */
        public function isWriteQuery( $sql ) {
@@ -956,13 +968,13 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         *
         * However, the query wrappers themselves should call this function.
         *
-        * @param  $sql        String: SQL query
-        * @param  $fname      String: Name of the calling function, for profiling/SHOW PROCESSLIST
+        * @param string $sql SQL query
+        * @param string $fname Name of the calling function, for profiling/SHOW PROCESSLIST
         *     comment (you can use __METHOD__ or add some extra info)
-        * @param  $tempIgnore Boolean:   Whether to avoid throwing an exception on errors...
+        * @param bool $tempIgnore Whether to avoid throwing an exception on errors...
         *     maybe best to catch the exception instead?
         * @throws MWException
-        * @return boolean|ResultWrapper. true for a successful write query, ResultWrapper object
+        * @return bool|ResultWrapper True for a successful write query, ResultWrapper object
         *     for a successful read query, or false on failure if $tempIgnore set
         */
        public function query( $sql, $fname = __METHOD__, $tempIgnore = false ) {
@@ -1013,7 +1025,10 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
                        Profiler::instance()->transactionWritingIn( $this->mServer, $this->mDBname );
                }
 
+               $queryProf = '';
+               $totalProf = '';
                $isMaster = !is_null( $this->getLBInfo( 'master' ) );
+
                if ( !Profiler::instance()->isStub() ) {
                        # generalizeSQL will probably cut down the query to reasonable
                        # logging size most of the time. The substr is really just a sanity check.
@@ -1089,11 +1104,11 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * Report a query error. Log the error, and if neither the object ignore
         * flag nor the $tempIgnore flag is set, throw a DBQueryError.
         *
-        * @param $error String
-        * @param $errno Integer
-        * @param $sql String
-        * @param $fname String
-        * @param $tempIgnore Boolean
+        * @param string $error
+        * @param int $errno
+        * @param string $sql
+        * @param string $fname
+        * @param bool $tempIgnore
         * @throws DBQueryError
         */
        public function reportQueryError( $error, $errno, $sql, $fname, $tempIgnore = false ) {
@@ -1121,21 +1136,22 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * & = filename; reads the file and inserts as a blob
         *     (we don't use this though...)
         *
-        * @param $sql string
-        * @param $func string
+        * @param string $sql
+        * @param string $func
         *
         * @return array
         */
        protected function prepare( $sql, $func = 'DatabaseBase::prepare' ) {
                /* MySQL doesn't support prepared statements (yet), so just
-                  pack up the query for reference. We'll manually replace
-                  the bits later. */
+                * pack up the query for reference. We'll manually replace
+                * the bits later.
+                */
                return array( 'query' => $sql, 'func' => $func );
        }
 
        /**
         * Free a prepared query, generated by prepare().
-        * @param $prepared
+        * @param string $prepared
         */
        protected function freePrepared( $prepared ) {
                /* No-op by default */
@@ -1144,7 +1160,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
        /**
         * Execute a prepared query with the various arguments
         * @param string $prepared the prepared sql
-        * @param $args Mixed: Either an array here, or put scalars as varargs
+        * @param mixed $args Either an array here, or put scalars as varargs
         *
         * @return ResultWrapper
         */
@@ -1163,9 +1179,9 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
        /**
         * For faking prepared SQL statements on DBs that don't support it directly.
         *
-        * @param string $preparedQuery a 'preparable' SQL statement
-        * @param array $args of arguments to fill it with
-        * @return string executable SQL
+        * @param string $preparedQuery A 'preparable' SQL statement
+        * @param array $args of Arguments to fill it with
+        * @return string Executable SQL
         */
        public function fillPrepared( $preparedQuery, $args ) {
                reset( $args );
@@ -1180,9 +1196,9 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * The arguments should be in $this->preparedArgs and must not be touched
         * while we're doing this.
         *
-        * @param $matches Array
+        * @param array $matches
         * @throws DBUnexpectedError
-        * @return String
+        * @return string
         */
        protected function fillPreparedArg( $matches ) {
                switch ( $matches[1] ) {
@@ -1220,7 +1236,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * necessary to call this, just use unset() or let the variable holding
         * the result object go out of scope.
         *
-        * @param $res Mixed: A SQL result
+        * @param mixed $res A SQL result
         */
        public function freeResult( $res ) {
        }
@@ -1270,9 +1286,9 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * Returns an optional USE INDEX clause to go after the table, and a
         * string to go at the end of the query.
         *
-        * @param array $options associative array of options to be turned into
-        *              an SQL query, valid keys are listed in the function.
-        * @return Array
+        * @param array $options Associative array of options to be turned into
+        *   an SQL query, valid keys are listed in the function.
+        * @return array
         * @see DatabaseBase::select()
         */
        public function makeSelectOptions( $options ) {
@@ -1354,7 +1370,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
        /**
         * Returns an optional GROUP BY with an optional HAVING
         *
-        * @param array $options associative array of options
+        * @param array $options Associative array of options
         * @return string
         * @see DatabaseBase::select()
         * @since 1.21
@@ -1380,7 +1396,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
        /**
         * Returns an optional ORDER BY
         *
-        * @param array $options associative array of options
+        * @param array $options Associative array of options
         * @return string
         * @see DatabaseBase::select()
         * @since 1.21
@@ -1406,9 +1422,9 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * @param string|array $conds Conditions
         * @param string $fname Caller function name
         * @param array $options Query options
-        * @param $join_conds Array Join conditions
+        * @param array $join_conds Join conditions
         *
-        * @param $table string|array
+        * @param string|array $table
         *
         * May be either an array of table names, or a single string holding a table
         * name. If an array is given, table aliases can be specified, for example:
@@ -1423,7 +1439,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * added, and various other table name mappings to be performed.
         *
         *
-        * @param $vars string|array
+        * @param string|array $vars
         *
         * May be either a field name or an array of field names. The field names
         * can be complete fragments of SQL, for direct inclusion into the SELECT
@@ -1437,7 +1453,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * DBMS-independent.
         *
         *
-        * @param $conds string|array
+        * @param string|array $conds
         *
         * May be either a string containing a single condition, or an array of
         * conditions. If an array is given, the conditions constructed from each
@@ -1462,7 +1478,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         *    - DatabaseBase::conditional()
         *
         *
-        * @param $options string|array
+        * @param string|array $options
         *
         * Optional: Array of query options. Boolean options are specified by
         * including them in the array as a string value with a numeric key, for
@@ -1518,7 +1534,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         *    - SQL_NO_CACHE
         *
         *
-        * @param $join_conds string|array
+        * @param string|array $join_conds
         *
         * Optional associative array of table-specific join conditions. In the
         * most common case, this is unnecessary, since the join condition can be
@@ -1531,7 +1547,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         *
         *    array( 'page' => array( 'LEFT JOIN', 'page_latest=rev_id' ) )
         *
-        * @return ResultWrapper. If the query returned no rows, a ResultWrapper
+        * @return ResultWrapper|bool If the query returned no rows, a ResultWrapper
         *   with no rows in it will be returned. If there was a query error, a
         *   DBQueryError exception will be thrown, except if the "ignore errors"
         *   option was set, in which case false will be returned.
@@ -1554,7 +1570,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * @param string|array $conds Conditions
         * @param string $fname Caller function name
         * @param string|array $options Query options
-        * @param $join_conds string|array Join conditions
+        * @param string|array $join_conds Join conditions
         *
         * @return string SQL query string.
         * @see DatabaseBase::select()
@@ -1620,7 +1636,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * @param array $conds Conditions
         * @param string $fname Caller function name
         * @param string|array $options Query options
-        * @param $join_conds array|string Join conditions
+        * @param array|string $join_conds Join conditions
         *
         * @return stdClass|bool
         */
@@ -1657,12 +1673,12 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         *
         * Takes the same arguments as DatabaseBase::select().
         *
-        * @param string $table table name
-        * @param array|string $vars : unused
-        * @param array|string $conds : filters on the table
-        * @param string $fname function name for profiling
-        * @param array $options options for select
-        * @return Integer: row count
+        * @param string $table Table name
+        * @param string $vars Unused
+        * @param array|string $conds Filters on the table
+        * @param string $fname Function name for profiling
+        * @param array $options Options for select
+        * @return int Row count
         */
        public function estimateRowCount( $table, $vars = '*', $conds = '',
                $fname = __METHOD__, $options = array()
@@ -1710,10 +1726,10 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
        /**
         * Determines whether a field exists in a table
         *
-        * @param string $table table name
-        * @param string $field filed to check on that table
-        * @param string $fname calling function name (optional)
-        * @return Boolean: whether $table has filed $field
+        * @param string $table Table name
+        * @param string $field Filed to check on that table
+        * @param string $fname Calling function name (optional)
+        * @return bool Whether $table has filed $field
         */
        public function fieldExists( $table, $field, $fname = __METHOD__ ) {
                $info = $this->fieldInfo( $table, $field );
@@ -1726,10 +1742,9 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * Usually throws a DBQueryError on failure
         * If errors are explicitly ignored, returns NULL on failure
         *
-        * @param $table
-        * @param $index
-        * @param $fname string
-        *
+        * @param string $table
+        * @param string $index
+        * @param string $fname
         * @return bool|null
         */
        public function indexExists( $table, $index, $fname = __METHOD__ ) {
@@ -1748,9 +1763,8 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
        /**
         * Query whether a given table exists
         *
-        * @param $table string
-        * @param $fname string
-        *
+        * @param string $table
+        * @param string $fname
         * @return bool
         */
        public function tableExists( $table, $fname = __METHOD__ ) {
@@ -1765,8 +1779,8 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
        /**
         * Determines if a given index is unique
         *
-        * @param $table string
-        * @param $index string
+        * @param string $table
+        * @param string $index
         *
         * @return bool
         */
@@ -1783,7 +1797,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
        /**
         * Helper for DatabaseBase::insert().
         *
-        * @param $options array
+        * @param array $options
         * @return string
         */
        protected function makeInsertOptions( $options ) {
@@ -1815,10 +1829,10 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         *     possible to determine how many rows were successfully inserted using
         *     DatabaseBase::affectedRows().
         *
-        * @param $table   String Table name. This will be passed through
-        *                 DatabaseBase::tableName().
-        * @param $a       Array of rows to insert
-        * @param $fname   String Calling function name (use __METHOD__) for logs/profiling
+        * @param string $table Table name. This will be passed through
+        *   DatabaseBase::tableName().
+        * @param array $a Array of rows to insert
+        * @param string $fname Calling function name (use __METHOD__) for logs/profiling
         * @param array $options of options
         *
         * @return bool
@@ -1902,25 +1916,20 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
        /**
         * UPDATE wrapper. Takes a condition array and a SET array.
         *
-        * @param $table  String name of the table to UPDATE. This will be passed through
-        *                DatabaseBase::tableName().
-        *
+        * @param string $table Name of the table to UPDATE. This will be passed through
+        *   DatabaseBase::tableName().
         * @param array $values An array of values to SET. For each array element,
-        *                the key gives the field name, and the value gives the data
-        *                to set that field to. The data will be quoted by
-        *                DatabaseBase::addQuotes().
-        *
-        * @param $conds  Array:  An array of conditions (WHERE). See
-        *                DatabaseBase::select() for the details of the format of
-        *                condition arrays. Use '*' to update all rows.
-        *
-        * @param $fname  String: The function name of the caller (from __METHOD__),
-        *                for logging and profiling.
-        *
+        *   the key gives the field name, and the value gives the data to set
+        *   that field to. The data will be quoted by DatabaseBase::addQuotes().
+        * @param array $conds An array of conditions (WHERE). See
+        *   DatabaseBase::select() for the details of the format of condition
+        *   arrays. Use '*' to update all rows.
+        * @param string $fname The function name of the caller (from __METHOD__),
+        *   for logging and profiling.
         * @param array $options An array of UPDATE options, can be:
-        *                   - IGNORE: Ignore unique key conflicts
-        *                   - LOW_PRIORITY: MySQL-specific, see MySQL manual.
-        * @return Boolean
+        *   - IGNORE: Ignore unique key conflicts
+        *   - LOW_PRIORITY: MySQL-specific, see MySQL manual.
+        * @return bool
         */
        function update( $table, $values, $conds, $fname = __METHOD__, $options = array() ) {
                $table = $this->tableName( $table );
@@ -1936,15 +1945,15 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
 
        /**
         * Makes an encoded list of strings from an array
-        * @param array $a containing the data
-        * @param int $mode Constant
-        *      - LIST_COMMA:          comma separated, no field names
-        *      - LIST_AND:            ANDed WHERE clause (without the WHERE). See
-        *        the documentation for $conds in DatabaseBase::select().
-        *      - LIST_OR:             ORed WHERE clause (without the WHERE)
-        *      - LIST_SET:            comma separated with field names, like a SET clause
-        *      - LIST_NAMES:          comma separated field names
         *
+        * @param array $a Containing the data
+        * @param int $mode Constant
+        *    - LIST_COMMA: Comma separated, no field names
+        *    - LIST_AND:   ANDed WHERE clause (without the WHERE). See the
+        *      documentation for $conds in DatabaseBase::select().
+        *    - LIST_OR:    ORed WHERE clause (without the WHERE)
+        *    - LIST_SET:   Comma separated with field names, like a SET clause
+        *    - LIST_NAMES: Comma separated field names
         * @throws MWException|DBUnexpectedError
         * @return string
         */
@@ -2008,9 +2017,9 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * The keys on each level may be either integers or strings.
         *
         * @param array $data organized as 2-d
-        *              array(baseKeyVal => array(subKeyVal => [ignored], ...), ...)
-        * @param string $baseKey field name to match the base-level keys to (eg 'pl_namespace')
-        * @param string $subKey field name to match the sub-level keys to (eg 'pl_title')
+        *    array(baseKeyVal => array(subKeyVal => [ignored], ...), ...)
+        * @param string $baseKey Field name to match the base-level keys to (eg 'pl_namespace')
+        * @param string $subKey Field name to match the sub-level keys to (eg 'pl_title')
         * @return Mixed: string SQL fragment, or false if no items in array.
         */
        public function makeWhereFrom2d( $data, $baseKey, $subKey ) {
@@ -2036,7 +2045,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * Return aggregated value alias
         *
         * @param $valuedata
-        * @param $valuename string
+        * @param string $valuename
         *
         * @return string
         */
@@ -2045,7 +2054,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
        }
 
        /**
-        * @param $field
+        * @param string $field
         * @return string
         */
        public function bitNot( $field ) {
@@ -2053,8 +2062,8 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
        }
 
        /**
-        * @param $fieldLeft
-        * @param $fieldRight
+        * @param string $fieldLeft
+        * @param string $fieldRight
         * @return string
         */
        public function bitAnd( $fieldLeft, $fieldRight ) {
@@ -2062,8 +2071,8 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
        }
 
        /**
-        * @param  $fieldLeft
-        * @param  $fieldRight
+        * @param string $fieldLeft
+        * @param string $fieldRight
         * @return string
         */
        public function bitOr( $fieldLeft, $fieldRight ) {
@@ -2072,8 +2081,9 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
 
        /**
         * Build a concatenation list to feed into a SQL query
-        * @param array $stringList list of raw SQL expressions; caller is responsible for any quoting
-        * @return String
+        * @param array $stringList List of raw SQL expressions; caller is
+        *   responsible for any quoting
+        * @return string
         */
        public function buildConcat( $stringList ) {
                return 'CONCAT(' . implode( ',', $stringList ) . ')';
@@ -2092,7 +2102,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * @param string $field Field name
         * @param string|array $conds Conditions
         * @param string|array $join_conds Join conditions
-        * @return String SQL text
+        * @return string SQL text
         * @since 1.23
         */
        public function buildGroupConcatField(
@@ -2113,7 +2123,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * @return bool Success or failure
         */
        public function selectDB( $db ) {
-               # Stub.  Shouldn't cause serious problems if it's not overridden, but
+               # Stub. Shouldn't cause serious problems if it's not overridden, but
                # if your database engine supports a concept similar to MySQL's
                # databases you may as well.
                $this->mDBname = $db;
@@ -2145,12 +2155,12 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * themselves. Pass the canonical name to such functions. This is only needed
         * when calling query() directly.
         *
-        * @param string $name database table name
+        * @param string $name Database table name
         * @param string $format One of:
         *   quoted - Automatically pass the table name through addIdentifierQuotes()
         *            so that it can be used in a query.
         *   raw - Do not add identifier quotes to the table name
-        * @return String: full database name
+        * @return string Full database name
         */
        public function tableName( $name, $format = 'quoted' ) {
                global $wgSharedDB, $wgSharedPrefix, $wgSharedTables;
@@ -2276,8 +2286,8 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
        /**
         * Gets an array of aliased table names
         *
-        * @param $tables array( [alias] => table )
-        * @return array of strings, see tableNameWithAlias()
+        * @param array $tables array( [alias] => table )
+        * @return string[] See tableNameWithAlias()
         */
        public function tableNamesWithAlias( $tables ) {
                $retval = array();
@@ -2310,8 +2320,8 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
        /**
         * Gets an array of aliased field names
         *
-        * @param $fields array( [alias] => field )
-        * @return array of strings, see fieldNameWithAlias()
+        * @param array $fields array( [alias] => field )
+        * @return string[] See fieldNameWithAlias()
         */
        public function fieldNamesWithAlias( $fields ) {
                $retval = array();
@@ -2330,8 +2340,8 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * which might have a JOIN and/or USE INDEX clause
         *
         * @param array $tables ( [alias] => table )
-        * @param $use_index array Same as for select()
-        * @param $join_conds array Same as for select()
+        * @param array $use_index Same as for select()
+        * @param array $join_conds Same as for select()
         * @return string
         */
        protected function tableNamesWithUseIndexOrJOIN(
@@ -2389,8 +2399,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
        /**
         * Get the name of an index in a given table
         *
-        * @param $index
-        *
+        * @param string $index
         * @return string
         */
        protected function indexName( $index ) {
@@ -2411,8 +2420,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
        /**
         * Adds quotes and backslashes.
         *
-        * @param $s string
-        *
+        * @param string $s
         * @return string
         */
        public function addQuotes( $s ) {
@@ -2433,8 +2441,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * Since MySQL is the odd one out here the double quotes are our generic
         * and we implement backticks in DatabaseMysql.
         *
-        * @param $s string
-        *
+        * @param string $s
         * @return string
         */
        public function addIdentifierQuotes( $s ) {
@@ -2445,16 +2452,15 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * Returns if the given identifier looks quoted or not according to
         * the database convention for quoting identifiers .
         *
-        * @param $name string
-        *
-        * @return boolean
+        * @param string $name
+        * @return bool
         */
        public function isQuotedIdentifier( $name ) {
                return $name[0] == '"' && substr( $name, -1, 1 ) == '"';
        }
 
        /**
-        * @param $s string
+        * @param string $s
         * @return string
         */
        protected function escapeLikeInternal( $s ) {
@@ -2479,7 +2485,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         *   $query .= $dbr->buildLike( $pattern );
         *
         * @since 1.16
-        * @return String: fully built LIKE statement
+        * @return string Fully built LIKE statement
         */
        public function buildLike() {
                $params = func_get_args();
@@ -2527,21 +2533,21 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * Any implementation of this function should *not* involve reusing
         * sequence numbers created for rolled-back transactions.
         * See http://bugs.mysql.com/bug.php?id=30767 for details.
-        * @param $seqName string
-        * @return null
+        * @param string $seqName
+        * @return null|int
         */
        public function nextSequenceValue( $seqName ) {
                return null;
        }
 
        /**
-        * USE INDEX clause.  Unlikely to be useful for anything but MySQL.  This
+        * USE INDEX clause. Unlikely to be useful for anything but MySQL. This
         * is only needed because a) MySQL must be as efficient as possible due to
         * its use on Wikipedia, and b) MySQL 4.0 is kind of dumb sometimes about
-        * which index to pick.  Anyway, other databases might have different
-        * indexes on a given table.  So don't bother overriding this unless you're
+        * which index to pick. Anyway, other databases might have different
+        * indexes on a given table. So don't bother overriding this unless you're
         * MySQL.
-        * @param $index
+        * @param string $index
         * @return string
         */
        public function useIndexClause( $index ) {
@@ -2564,10 +2570,10 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * errors which wouldn't have occurred in MySQL.
         *
         * @param string $table The table to replace the row(s) in.
+        * @param array $uniqueIndexes Is an array of indexes. Each element may be either
+        *    a field name or an array of field names
         * @param array $rows Can be either a single row to insert, or multiple rows,
         *    in the same format as for DatabaseBase::insert()
-        * @param array $uniqueIndexes is an array of indexes. Each element may be either
-        *    a field name or an array of field names
         * @param string $fname Calling function name (use __METHOD__) for logs/profiling
         */
        public function replace( $table, $uniqueIndexes, $rows, $fname = __METHOD__ ) {
@@ -2622,7 +2628,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * statement.
         *
         * @param string $table Table name
-        * @param array $rows Rows to insert
+        * @param array|string $rows Row(s) to insert
         * @param string $fname Caller function name
         *
         * @return ResultWrapper
@@ -2673,20 +2679,20 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * Usually throws a DBQueryError on failure. If errors are explicitly ignored,
         * returns success.
         *
+        * @since 1.22
+        *
         * @param string $table Table name. This will be passed through DatabaseBase::tableName().
         * @param array $rows A single row or list of rows to insert
         * @param array $uniqueIndexes List of single field names or field name tuples
-        * @param array $set An array of values to SET. For each array element,
-        *                the key gives the field name, and the value gives the data
-        *                to set that field to. The data will be quoted by
-        *                DatabaseBase::addQuotes().
+        * @param array $set An array of values to SET. For each array element, the
+        *   key gives the field name, and the value gives the data to set that
+        *   field to. The data will be quoted by DatabaseBase::addQuotes().
         * @param string $fname Calling function name (use __METHOD__) for logs/profiling
-        *
+        * @throws Exception
         * @return bool
-        * @since 1.22
         */
-       public function upsert(
-               $table, array $rows, array $uniqueIndexes, array $set, $fname = __METHOD__
+       public function upsert( $table, array $rows, array $uniqueIndexes, array $set,
+               $fname = __METHOD__
        ) {
                if ( !count( $rows ) ) {
                        return true; // nothing to do
@@ -2747,14 +2753,13 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         *
         * DO NOT put the join condition in $conds.
         *
-        * @param $delTable   String: The table to delete from.
-        * @param $joinTable  String: The other table.
-        * @param $delVar     String: The variable to join on, in the first table.
-        * @param $joinVar    String: The variable to join on, in the second table.
-        * @param $conds      Array: Condition array of field names mapped to variables,
-        *                    ANDed together in the WHERE clause
-        * @param $fname      String: Calling function name (use __METHOD__) for
-        *                    logs/profiling
+        * @param string $delTable The table to delete from.
+        * @param string $joinTable The other table.
+        * @param string $delVar The variable to join on, in the first table.
+        * @param string$joinVar The variable to join on, in the second table.
+        * @param array $conds Condition array of field names mapped to variables,
+        *   ANDed together in the WHERE clause
+        * @param string $fname Calling function name (use __METHOD__) for logs/profiling
         * @throws DBUnexpectedError
         */
        public function deleteJoin( $delTable, $joinTable, $delVar, $joinVar, $conds,
@@ -2779,9 +2784,8 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
        /**
         * Returns the size of a text field, or -1 for "unlimited"
         *
-        * @param $table string
-        * @param $field string
-        *
+        * @param string $table
+        * @param string $field
         * @return int
         */
        public function textFieldSize( $table, $field ) {
@@ -2803,7 +2807,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
 
        /**
         * A string to insert into queries to show that they're low-priority, like
-        * MySQL's LOW_PRIORITY.  If no such feature exists, return an empty
+        * MySQL's LOW_PRIORITY. If no such feature exists, return an empty
         * string and nothing bad should happen.
         *
         * @return string Returns the text of the low priority option if it is
@@ -2817,10 +2821,9 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * DELETE query wrapper.
         *
         * @param array $table Table name
-        * @param string|array $conds of conditions. See $conds in DatabaseBase::select() for
-        *               the format. Use $conds == "*" to delete all rows
+        * @param string|array $conds of conditions. See $conds in DatabaseBase::select()
+        *   for the format. Use $conds == "*" to delete all rows
         * @param string $fname name of the calling function
-        *
         * @throws DBUnexpectedError
         * @return bool|ResultWrapper
         */
@@ -2850,7 +2853,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * @param string|array $srcTable May be either a table name, or an array of table names
         *    to include in a join.
         *
-        * @param array $varMap must be an associative array of the form
+        * @param array $varMap Must be an associative array of the form
         *    array( 'dest1' => 'source1', ...). Source items may be literals
         *    rather than field names, but strings should be quoted with
         *    DatabaseBase::addQuotes()
@@ -2909,22 +2912,21 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
        }
 
        /**
-        * Construct a LIMIT query with optional offset.  This is used for query
-        * pages.  The SQL should be adjusted so that only the first $limit rows
-        * are returned.  If $offset is provided as well, then the first $offset
+        * Construct a LIMIT query with optional offset. This is used for query
+        * pages. The SQL should be adjusted so that only the first $limit rows
+        * are returned. If $offset is provided as well, then the first $offset
         * rows should be discarded, and the next $limit rows should be returned.
         * If the result of the query is not ordered, then the rows to be returned
         * are theoretically arbitrary.
         *
         * $sql is expected to be a SELECT, if that makes a difference.
         *
-        * The version provided by default works in MySQL and SQLite.  It will very
+        * The version provided by default works in MySQL and SQLite. It will very
         * likely need to be overridden for most other DBMSes.
         *
         * @param string $sql SQL query we will append the limit too
-        * @param $limit Integer the SQL limit
-        * @param $offset Integer|bool the SQL offset (default false)
-        *
+        * @param int $limit The SQL limit
+        * @param int|bool $offset The SQL offset (default false)
         * @throws DBUnexpectedError
         * @return string
         */
@@ -2952,8 +2954,8 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * This is used for providing overload point for other DB abstractions
         * not compatible with the MySQL syntax.
         * @param array $sqls SQL statements to combine
-        * @param $all Boolean: use UNION ALL
-        * @return String: SQL fragment
+        * @param bool $all Use UNION ALL
+        * @return string SQL fragment
         */
        public function unionQueries( $sqls, $all ) {
                $glue = $all ? ') UNION ALL (' : ') UNION (';
@@ -2962,13 +2964,13 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
        }
 
        /**
-        * Returns an SQL expression for a simple conditional.  This doesn't need
+        * Returns an SQL expression for a simple conditional. This doesn't need
         * to be overridden unless CASE isn't supported in your DBMS.
         *
         * @param string|array $cond SQL expression which will result in a boolean value
         * @param string $trueVal SQL expression to return if true
         * @param string $falseVal SQL expression to return if false
-        * @return String: SQL fragment
+        * @return string SQL fragment
         */
        public function conditional( $cond, $trueVal, $falseVal ) {
                if ( is_array( $cond ) ) {
@@ -2982,9 +2984,9 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * Returns a comand for str_replace function in SQL query.
         * Uses REPLACE() in MySQL
         *
-        * @param string $orig column to modify
-        * @param string $old column to seek
-        * @param string $new column to replace with
+        * @param string $orig Column to modify
+        * @param string $old Column to seek
+        * @param string $new Column to replace with
         *
         * @return string
         */
@@ -3107,11 +3109,10 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
        /**
         * Wait for the slave to catch up to a given master position.
         *
-        * @param $pos DBMasterPos object
-        * @param $timeout Integer: the maximum number of seconds to wait for
+        * @param DBMasterPos $pos
+        * @param int $timeout The maximum number of seconds to wait for
         *   synchronisation
-        *
-        * @return integer: zero if the slave was past that position already,
+        * @return int Zzero if the slave was past that position already,
         *   greater than zero if we waited for some period of time, less than
         *   zero if we timed out.
         */
@@ -3149,7 +3150,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
        /**
         * Get the replication position of this slave
         *
-        * @return DBMasterPos, or false if this is not a slave.
+        * @return DBMasterPos|bool False if this is not a slave.
         */
        public function getSlavePos() {
                if ( !is_null( $this->mFakeSlaveLag ) ) {
@@ -3166,7 +3167,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
        /**
         * Get the position of this master
         *
-        * @return DBMasterPos, or false if this is not a master
+        * @return DBMasterPos|bool False if this is not a master
         */
        public function getMasterPos() {
                if ( $this->mFakeMaster ) {
@@ -3340,7 +3341,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * will cause a warning, unless the current transaction was started
         * automatically because of the DBO_TRX flag.
         *
-        * @param $fname string
+        * @param string $fname
         * @throws DBError
         */
        final public function begin( $fname = __METHOD__ ) {
@@ -3392,7 +3393,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * Issues the BEGIN command to the database server.
         *
         * @see DatabaseBase::begin()
-        * @param type $fname
+        * @param string $fname
         */
        protected function doBegin( $fname ) {
                $this->query( 'BEGIN', $fname );
@@ -3405,12 +3406,13 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         *
         * Nesting of transactions is not supported.
         *
-        * @param $fname string
+        * @param string $fname
         * @param string $flush Flush flag, set to 'flush' to disable warnings about
         *   explicitly committing implicit transactions, or calling commit when no
         *   transaction is in progress. This will silently break any ongoing
         *   explicit transaction. Only set the flush flag if you are sure that it
         *   is safe to ignore these warnings in your context.
+        * @throws DBUnexpectedError
         */
        final public function commit( $fname = __METHOD__, $flush = '' ) {
                if ( !$this->mTrxAtomicLevels->isEmpty() ) {
@@ -3447,7 +3449,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * Issues the COMMIT command to the database server.
         *
         * @see DatabaseBase::commit()
-        * @param type $fname
+        * @param string $fname
         */
        protected function doCommit( $fname ) {
                if ( $this->mTrxLevel ) {
@@ -3462,7 +3464,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         *
         * No-op on non-transactional databases.
         *
-        * @param $fname string
+        * @param string $fname
         */
        final public function rollback( $fname = __METHOD__ ) {
                if ( !$this->mTrxLevel ) {
@@ -3481,7 +3483,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * Issues the ROLLBACK command to the database server.
         *
         * @see DatabaseBase::rollback()
-        * @param type $fname
+        * @param string $fname
         */
        protected function doRollback( $fname ) {
                if ( $this->mTrxLevel ) {
@@ -3498,12 +3500,12 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * The table names passed to this function shall not be quoted (this
         * function calls addIdentifierQuotes when needed).
         *
-        * @param string $oldName name of table whose structure should be copied
-        * @param string $newName name of table to be created
-        * @param $temporary Boolean: whether the new table should be temporary
-        * @param string $fname calling function name
+        * @param string $oldName Name of table whose structure should be copied
+        * @param string $newName Name of table to be created
+        * @param bool $temporary Whether the new table should be temporary
+        * @param string $fname Calling function name
         * @throws MWException
-        * @return Boolean: true if operation was successful
+        * @return bool True if operation was successful
         */
        public function duplicateTableStructure( $oldName, $newName, $temporary = false,
                $fname = __METHOD__
@@ -3516,7 +3518,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * List all tables on the database
         *
         * @param string $prefix Only show tables with this prefix, e.g. mw_
-        * @param string $fname calling function name
+        * @param string $fname Calling function name
         * @throws MWException
         */
        function listTables( $prefix = null, $fname = __METHOD__ ) {
@@ -3549,7 +3551,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
        /**
         * Differentiates between a TABLE and a VIEW
         *
-        * @param $name string: Name of the database-structure to test.
+        * @param string $name Name of the database-structure to test.
         * @throws MWException
         * @since 1.22
         */
@@ -3564,7 +3566,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * The result is unquoted, and needs to be passed through addQuotes()
         * before it can be included in raw SQL.
         *
-        * @param $ts string|int
+        * @param string|int $ts
         *
         * @return string
         */
@@ -3581,7 +3583,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * The result is unquoted, and needs to be passed through addQuotes()
         * before it can be included in raw SQL.
         *
-        * @param $ts string|int
+        * @param string|int $ts
         *
         * @return string
         */
@@ -3604,8 +3606,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * callers, so this is unnecessary in external code. For compatibility with
         * old code, ResultWrapper objects are passed through unaltered.
         *
-        * @param $result bool|ResultWrapper
-        *
+        * @param bool|ResultWrapper|resource $result
         * @return bool|ResultWrapper
         */
        public function resultObject( $result ) {
@@ -3627,7 +3628,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * @return bool Success or failure
         */
        public function ping() {
-               # Stub.  Not essential to override.
+               # Stub. Not essential to override.
                return true;
        }
 
@@ -3658,7 +3659,8 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * don't allow simple quoted strings to be inserted. To insert into such
         * a field, pass the data through this function before passing it to
         * DatabaseBase::insert().
-        * @param $b string
+        *
+        * @param string $b
         * @return string
         */
        public function encodeBlob( $b ) {
@@ -3669,7 +3671,8 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * Some DBMSs return a special placeholder object representing blob fields
         * in result objects. Pass the object through this function to return the
         * original string.
-        * @param $b string
+        *
+        * @param string $b
         * @return string
         */
        public function decodeBlob( $b ) {
@@ -3683,7 +3686,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         *                     full-wiki dumps, where a single query reads out over
         *                     hours or days.
         *
-        * @param $options Array
+        * @param array $options
         * @return void
         */
        public function setSessionOptions( array $options ) {
@@ -3700,9 +3703,8 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * @param bool|callable $resultCallback Optional function called for each MySQL result
         * @param bool|string $fname Calling function name or false if name should be
         *   generated dynamically using $filename
-        * @param bool|callable $inputCallback Callback: Optional function called
-        *   for each complete line sent
-        * @throws MWException
+        * @param bool|callable $inputCallback Optional function called for each
+        *   complete line sent
         * @throws Exception|MWException
         * @return bool|string
         */
@@ -3739,7 +3741,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * it fails back to MySQL if no DB-specific patch can be found
         *
         * @param string $patch The name of the patch, like patch-something.sql
-        * @return String Full path to patch file
+        * @return string Full path to patch file
         */
        public function patchPath( $patch ) {
                global $IP;
@@ -3757,7 +3759,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * ones in $GLOBALS. If an array is set here, $GLOBALS will not be used at
         * all. If it's set to false, $GLOBALS will be used.
         *
-        * @param bool|array $vars mapping variable name to value.
+        * @param bool|array $vars Mapping variable name to value.
         */
        public function setSchemaVars( $vars ) {
                $this->mSchemaVars = $vars;
@@ -3769,11 +3771,11 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * Returns true on success, error string or exception on failure (depending
         * on object's error ignore settings).
         *
-        * @param $fp Resource: File handle
-        * @param $lineCallback Callback: Optional function called before reading each query
-        * @param $resultCallback Callback: Optional function called for each MySQL result
+        * @param resource $fp File handle
+        * @param bool|callable $lineCallback Optional function called before reading each query
+        * @param bool|callable $resultCallback Optional function called for each MySQL result
         * @param string $fname Calling function name
-        * @param $inputCallback Callback: Optional function called for each complete query sent
+        * @param bool|callable $inputCallback Optional function called for each complete query sent
         * @return bool|string
         */
        public function sourceStream( $fp, $lineCallback = false, $resultCallback = false,
@@ -3832,7 +3834,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         *
         * @param string $sql SQL assembled so far
         * @param string $newLine New line about to be added to $sql
-        * @return Bool Whether $newLine contains end of the statement
+        * @return bool Whether $newLine contains end of the statement
         */
        public function streamStatementEnd( &$sql, &$newLine ) {
                if ( $this->delimiter ) {
@@ -3861,7 +3863,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         *   table options its use should be avoided.
         *
         * @param string $ins SQL statement to replace variables in
-        * @return String The new SQL statement with variables replaced
+        * @return string The new SQL statement with variables replaced
         */
        protected function replaceSchemaVars( $ins ) {
                $vars = $this->getSchemaVars();
@@ -3880,8 +3882,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
        /**
         * Replace variables in sourced SQL
         *
-        * @param $ins string
-        *
+        * @param string $ins
         * @return string
         */
        protected function replaceVars( $ins ) {
@@ -3927,8 +3928,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
        /**
         * Table name callback
         *
-        * @param $matches array
-        *
+        * @param array $matches
         * @return string
         */
        protected function tableNameCallback( $matches ) {
@@ -3938,8 +3938,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
        /**
         * Index name callback
         *
-        * @param $matches array
-        *
+        * @param array $matches
         * @return string
         */
        protected function indexNameCallback( $matches ) {
@@ -3949,9 +3948,9 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
        /**
         * Check to see if a named lock is available. This is non-blocking.
         *
-        * @param string $lockName name of lock to poll
-        * @param string $method name of method calling us
-        * @return Boolean
+        * @param string $lockName Name of lock to poll
+        * @param string $method Name of method calling us
+        * @return bool
         * @since 1.20
         */
        public function lockIsFree( $lockName, $method ) {
@@ -3964,10 +3963,10 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * Abstracted from Filestore::lock() so child classes can implement for
         * their own needs.
         *
-        * @param string $lockName name of lock to aquire
-        * @param string $method name of method calling us
-        * @param $timeout Integer: timeout
-        * @return Boolean
+        * @param string $lockName Name of lock to aquire
+        * @param string $method Name of method calling us
+        * @param int $timeout
+        * @return bool
         */
        public function lock( $lockName, $method, $timeout = 5 ) {
                return true;
@@ -3990,11 +3989,10 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
        /**
         * Lock specific tables
         *
-        * @param array $read of tables to lock for read access
-        * @param array $write of tables to lock for write access
-        * @param string $method name of caller
+        * @param array $read Array of tables to lock for read access
+        * @param array $write Array of tables to lock for write access
+        * @param string $method Name of caller
         * @param bool $lowPriority Whether to indicate writes to be LOW PRIORITY
-        *
         * @return bool
         */
        public function lockTables( $read, $write, $method, $lowPriority = true ) {
@@ -4004,8 +4002,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
        /**
         * Unlock specific tables
         *
-        * @param string $method the caller
-        *
+        * @param string $method The caller
         * @return bool
         */
        public function unlockTables( $method ) {
@@ -4014,8 +4011,8 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
 
        /**
         * Delete a table
-        * @param $tableName string
-        * @param $fName string
+        * @param string $tableName
+        * @param string $fName
         * @return bool|ResultWrapper
         * @since 1.18
         */
@@ -4035,7 +4032,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * Get search engine class. All subclasses of this need to implement this
         * if they wish to use searching.
         *
-        * @return String
+        * @return string
         */
        public function getSearchEngine() {
                return 'SearchEngineDummy';
@@ -4046,7 +4043,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * keyword for timestamps in PostgreSQL, and works with CHAR(14) as well
         * because "i" sorts after all numbers.
         *
-        * @return String
+        * @return string
         */
        public function getInfinity() {
                return 'infinity';
@@ -4056,7 +4053,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * Encode an expiry time into the DBMS dependent format
         *
         * @param string $expiry timestamp for expiry, or the 'infinity' string
-        * @return String
+        * @return string
         */
        public function encodeExpiry( $expiry ) {
                return ( $expiry == '' || $expiry == 'infinity' || $expiry == $this->getInfinity() )
@@ -4068,8 +4065,8 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * Decode an expiry time into a DBMS independent format
         *
         * @param string $expiry DB timestamp field value for expiry
-        * @param $format integer: TS_* constant, defaults to TS_MW
-        * @return String
+        * @param int $format TS_* constant, defaults to TS_MW
+        * @return string
         */
        public function decodeExpiry( $expiry, $format = TS_MW ) {
                return ( $expiry == '' || $expiry == $this->getInfinity() )
@@ -4083,7 +4080,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         *
         * This is a MySQL-specific feature.
         *
-        * @param $value Mixed: true for allow, false for deny, or "default" to
+        * @param bool|string $value True for allow, false for deny, or "default" to
         *   restore the initial value
         */
        public function setBigSelects( $value = true ) {
index a314605..b4c7365 100644 (file)
  * @ingroup Database
  */
 class DBError extends MWException {
-       /**
-        * @var DatabaseBase
-        */
+       /** @var DatabaseBase */
        public $db;
 
        /**
         * Construct a database error
-        * @param $db DatabaseBase object which threw the error
+        * @param DatabaseBase $db Object which threw the error
         * @param string $error A simple error message to be used for debugging
         */
        function __construct( DatabaseBase $db = null, $error ) {
@@ -90,8 +88,13 @@ class DBError extends MWException {
  * @ingroup Database
  */
 class DBConnectionError extends DBError {
+       /** @var string Error text */
        public $error;
 
+       /**
+        * @param DatabaseBase $db Object throwing the error
+        * @param string $error Error text
+        */
        function __construct( DatabaseBase $db = null, $error = 'unknown error' ) {
                $msg = 'DB connection error';
 
@@ -114,9 +117,11 @@ class DBConnectionError extends DBError {
        }
 
        /**
-        * @param $key
-        * @param $fallback
-        * @return string
+        * @param string $key
+        * @param string $fallback Unescaped alternative error text in case the
+        *   message cache cannot be used. Can contain parameters as in regular
+        *   messages, that should be passed as additional parameters.
+        * @return string Unprocessed plain error text with parameters replaced
         */
        function msg( $key, $fallback /*[, params...] */ ) {
                global $wgLang;
@@ -141,7 +146,7 @@ class DBConnectionError extends DBError {
        }
 
        /**
-        * @return string
+        * @return string Safe HTML
         */
        function getHTML() {
                global $wgShowDBErrorBacktrace, $wgShowHostnames, $wgShowSQLErrors;
@@ -192,6 +197,11 @@ class DBConnectionError extends DBError {
                }
        }
 
+       /**
+        * Output the exception report using HTML.
+        *
+        * @return void
+        */
        public function reportHTML() {
                global $wgUseFileCache;
 
@@ -307,11 +317,11 @@ class DBQueryError extends DBError {
        public $error, $errno, $sql, $fname;
 
        /**
-        * @param $db DatabaseBase
-        * @param $error string
-        * @param $errno int|string
-        * @param $sql string
-        * @param $fname string
+        * @param DatabaseBase $db
+        * @param string $error
+        * @param int|string $errno
+        * @param string $sql
+        * @param string $fname
         */
        function __construct( DatabaseBase $db, $error, $errno, $sql, $fname ) {
                $message = "A database error has occurred. Did you forget to run " .
@@ -329,7 +339,7 @@ class DBQueryError extends DBError {
        }
 
        /**
-        * @return boolean
+        * @return bool
         */
        function isLoggable() {
                // Don't send to the exception log, already in dberror log
@@ -391,7 +401,7 @@ class DBQueryError extends DBError {
         * sites using this option probably don't care much about "security by obscurity". Of course,
         * if $wgShowSQLErrors is true, the SQL query *is* shown.
         *
-        * @return array: Keys are message keys; values are arrays of arguments for Html::element().
+        * @return array Keys are message keys; values are arrays of arguments for Html::element().
         *   Array will be empty if users are not allowed to see any of these details at all.
         */
        protected function getTechnicalDetails() {
@@ -416,7 +426,7 @@ class DBQueryError extends DBError {
 
        /**
         * @param string $key Message key
-        * @return string: English message text
+        * @return string English message text
         */
        private function getFallbackMessage( $key ) {
                $messages = array(
index 3a89cd5..9636da5 100644 (file)
@@ -159,9 +159,13 @@ class DatabaseMssql extends DatabaseBase {
                return sqlsrv_close( $this->mConn );
        }
 
+       /**
+        * @param string $sql
+        * @return bool|MssqlResult
+        * @throws DBUnexpectedError
+        */
        protected function doQuery( $sql ) {
                wfDebug( "SQL: [$sql]\n" );
-               $this->offset = 0;
 
                // several extensions seem to think that all databases support limits
                // via LIMIT N after the WHERE clause well, MSSQL uses SELECT TOP N,
@@ -213,6 +217,9 @@ class DatabaseMssql extends DatabaseBase {
                return $res;
        }
 
+       /**
+        * @param mixed|ResultWrapper $res
+        */
        function freeResult( $res ) {
                if ( $res instanceof ResultWrapper ) {
                        $res = $res->result;
@@ -220,6 +227,10 @@ class DatabaseMssql extends DatabaseBase {
                $res->free();
        }
 
+       /**
+        * @param ResultWrapper|stdClass $res
+        * @return stdClass
+        */
        function fetchObject( $res ) {
                if ( $res instanceof ResultWrapper ) {
                        $res = $res->result;
@@ -229,6 +240,9 @@ class DatabaseMssql extends DatabaseBase {
                return $row;
        }
 
+       /**
+        * @return string
+        */
        function getErrors() {
                $strRet = '';
                $retErrors = sqlsrv_errors( SQLSRV_ERR_ALL );
@@ -245,6 +259,10 @@ class DatabaseMssql extends DatabaseBase {
                return $strRet;
        }
 
+       /**
+        * @param resource $res
+        * @return Blob
+        */
        function fetchRow( $res ) {
                if ( $res instanceof ResultWrapper ) {
                        $res = $res->result;
@@ -254,6 +272,10 @@ class DatabaseMssql extends DatabaseBase {
                return $row;
        }
 
+       /**
+        * @param mixed $res
+        * @return int
+        */
        function numRows( $res ) {
                if ( $res instanceof ResultWrapper ) {
                        $res = $res->result;
@@ -286,6 +308,11 @@ class DatabaseMssql extends DatabaseBase {
                return $this->mInsertId;
        }
 
+       /**
+        * @param mixed $res
+        * @param int $row
+        * @return bool
+        */
        function dataSeek( $res, $row ) {
                if ( $res instanceof ResultWrapper ) {
                        $res = $res->result;
@@ -318,16 +345,16 @@ class DatabaseMssql extends DatabaseBase {
        /**
         * SELECT wrapper
         *
-        * @param $table   Mixed: array or string, table name(s) (prefix auto-added)
-        * @param $vars    Mixed: array or string, field name(s) to be retrieved
-        * @param $conds   Mixed: array or string, condition(s) for WHERE
-        * @param $fname   String: calling function name (use __METHOD__) for logs/profiling
-        * @param array $options associative array of options (e.g.
+        * @param mixed $table Array or string, table name(s) (prefix auto-added)
+        * @param mixed $vars Array or string, field name(s) to be retrieved
+        * @param mixed $conds Array or string, condition(s) for WHERE
+        * @param string $fname Calling function name (use __METHOD__) for logs/profiling
+        * @param array $options Associative array of options (e.g.
         *   array('GROUP BY' => 'page_title')), see Database::makeSelectOptions
         *   code for list of supported stuff
-        * @param $join_conds Array: Associative array of table join conditions
+        * @param array $join_conds Associative array of table join conditions
         *   (optional) (e.g. array( 'page' => array('LEFT JOIN','page_latest=rev_id') )
-        * @return Mixed: database result resource (feed to Database::fetchObject
+        * @return mixed Database result resource (feed to Database::fetchObject
         *   or whatever), or false on failure
         */
        function select( $table, $vars, $conds = '', $fname = __METHOD__,
@@ -348,15 +375,15 @@ class DatabaseMssql extends DatabaseBase {
        /**
         * SELECT wrapper
         *
-        * @param $table   Mixed:  Array or string, table name(s) (prefix auto-added)
-        * @param $vars    Mixed:  Array or string, field name(s) to be retrieved
-        * @param $conds   Mixed:  Array or string, condition(s) for WHERE
-        * @param $fname   String: Calling function name (use __METHOD__) for logs/profiling
+        * @param mixed $table Array or string, table name(s) (prefix auto-added)
+        * @param mixed $vars Array or string, field name(s) to be retrieved
+        * @param mixed $conds Array or string, condition(s) for WHERE
+        * @param string $fname Calling function name (use __METHOD__) for logs/profiling
         * @param array $options Associative array of options (e.g. array('GROUP BY' => 'page_title')),
-        *                 see Database::makeSelectOptions code for list of supported stuff
-        * @param $join_conds Array: Associative array of table join conditions (optional)
-        *                    (e.g. array( 'page' => array('LEFT JOIN','page_latest=rev_id') )
-        * @return string, the SQL text
+        *   see Database::makeSelectOptions code for list of supported stuff
+        * @param array $join_conds Associative array of table join conditions (optional)
+        *    (e.g. array( 'page' => array('LEFT JOIN','page_latest=rev_id') )
+        * @return string The SQL text
         */
        function selectSQLText( $table, $vars, $conds = '', $fname = __METHOD__,
                $options = array(), $join_conds = array()
@@ -374,6 +401,11 @@ class DatabaseMssql extends DatabaseBase {
         * This is not necessarily an accurate estimate, so use sparingly
         * Returns -1 if count cannot be found
         * Takes same arguments as Database::select()
+        * @param string $table
+        * @param string $vars
+        * @param string $conds
+        * @param string $fname
+        * @param array $options
         * @return int
         */
        function estimateRowCount( $table, $vars = '*', $conds = '',
@@ -397,6 +429,9 @@ class DatabaseMssql extends DatabaseBase {
        /**
         * Returns information about an index
         * If errors are explicitly ignored, returns NULL on failure
+        * @param string $table
+        * @param string $index
+        * @param string $fname
         * @return array|bool|null
         */
        function indexInfo( $table, $index, $fname = __METHOD__ ) {
@@ -607,6 +642,7 @@ class DatabaseMssql extends DatabaseBase {
                        throw new DBQueryError( $this, $this->getErrors(), $this->lastErrno(), /*$sql*/ '', $fname );
                } elseif ( $ret != null ) {
                        // remember number of rows affected
+                       // @todo FIXME: $ret type does not appear to be a resource
                        $this->mAffectedRows = sqlsrv_rows_affected( $ret );
 
                        return $ret;
@@ -617,7 +653,8 @@ class DatabaseMssql extends DatabaseBase {
 
        /**
         * Return the next in a sequence, save the value for retrieval via insertId()
-        * @return
+        * @param string $seqName
+        * @return int|null
         */
        function nextSequenceValue( $seqName ) {
                if ( !$this->tableExists( 'sequence_' . $seqName ) ) {
@@ -639,7 +676,8 @@ class DatabaseMssql extends DatabaseBase {
 
        /**
         * Return the current value of a sequence. Assumes it has ben nextval'ed in this session.
-        * @return
+        * @param string $seqName
+        * @return int|null
         */
        function currentSequenceValue( $seqName ) {
                $ret = sqlsrv_query( $this->mConn, "SELECT TOP 1 id FROM [sequence_$seqName] ORDER BY id DESC" );
@@ -653,7 +691,11 @@ class DatabaseMssql extends DatabaseBase {
                }
        }
 
-       # Returns the size of a text field, or -1 for "unlimited"
+       /**
+        * @param string $table
+        * @param string $field
+        * @return int Returns the size of a text field, or -1 for "unlimited"
+        */
        function textFieldSize( $table, $field ) {
                $table = $this->tableName( $table );
                $sql = "SELECT CHARACTER_MAXIMUM_LENGTH,DATA_TYPE FROM INFORMATION_SCHEMA.Columns
@@ -671,10 +713,11 @@ class DatabaseMssql extends DatabaseBase {
        /**
         * Construct a LIMIT query with optional offset
         * This is used for query pages
-        * $sql string SQL query we will append the limit too
-        * $limit integer the SQL limit
-        * $offset integer the SQL offset (default false)
-        * @return mixed|string
+        *
+        * @param string $sql SQL query we will append the limit too
+        * @param int $limit The SQL limit
+        * @param bool|int $offset The SQL offset (default false)
+        * @return array|string
         */
        function limitResult( $sql, $limit, $offset = false ) {
                if ( $offset === false || $offset == 0 ) {
@@ -696,11 +739,16 @@ class DatabaseMssql extends DatabaseBase {
                }
        }
 
-       // If there is a limit clause, parse it, strip it, and pass the remaining
-       // SQL through limitResult() with the appropriate parameters. Not the
-       // prettiest solution, but better than building a whole new parser. This
-       // exists becase there are still too many extensions that don't use dynamic
-       // sql generation.
+       /**
+        * If there is a limit clause, parse it, strip it, and pass the remaining
+        * SQL through limitResult() with the appropriate parameters. Not the
+        * prettiest solution, but better than building a whole new parser. This
+        * exists becase there are still too many extensions that don't use dynamic
+        * sql generation.
+        *
+        * @param string $sql
+        * @return array|mixed|string
+        */
        function LimitToTopN( $sql ) {
                // Matches: LIMIT {[offset,] row_count | row_count OFFSET offset}
                $pattern = '/\bLIMIT\s+((([0-9]+)\s*,\s*)?([0-9]+)(\s+OFFSET\s+([0-9]+))?)/i';
@@ -721,15 +769,21 @@ class DatabaseMssql extends DatabaseBase {
                return $sql;
        }
 
+       /**
+        * Timestamp in ISO 8601 format with no timezone: 1986-02-09T20:00:00Z
+        *
+        * @param int $ts Timestamp
+        * @return bool|string The same date in ISO 8601 format with no timezone or false
+        */
        function timestamp( $ts = 0 ) {
                return wfTimestamp( TS_ISO_8601, $ts );
        }
 
        /**
-        * @return string wikitext of a link to the server software's web site
+        * @return string Wikitext of a link to the server software's web site
         */
        public function getSoftwareLink() {
-               return "[http://www.microsoft.com/sql/ MS SQL Server]";
+               return "[{{int:version-db-mssql-url}} MS SQL Server]";
        }
 
        /**
@@ -745,6 +799,12 @@ class DatabaseMssql extends DatabaseBase {
                return $version;
        }
 
+       /**
+        * @param string $table
+        * @param string $fname
+        * @param bool $schema
+        * @return bool
+        */
        function tableExists( $table, $fname = __METHOD__, $schema = false ) {
                $res = sqlsrv_query( $this->mConn, "SELECT * FROM information_schema.tables
                        WHERE table_type='BASE TABLE' AND table_name = '$table'" );
@@ -762,6 +822,9 @@ class DatabaseMssql extends DatabaseBase {
 
        /**
         * Query whether a given column exists in the mediawiki schema
+        * @param string $table
+        * @param string $field
+        * @param string $fname
         * @return bool
         */
        function fieldExists( $table, $field, $fname = __METHOD__ ) {
@@ -826,7 +889,7 @@ class DatabaseMssql extends DatabaseBase {
         * Escapes a identifier for use inm SQL.
         * Throws an exception if it is invalid.
         * Reference: http://msdn.microsoft.com/en-us/library/aa224033%28v=SQL.80%29.aspx
-        * @param $identifier
+        * @param string $identifier
         * @throws MWException
         * @return string
         */
@@ -916,10 +979,12 @@ class DatabaseMssql extends DatabaseBase {
        }
 
        /**
-        * @private
+        * @param array $tables
+        * @param array $use_index
+        * @param array $join_conds
         * @return string
         */
-       function tableNamesWithUseIndexOrJOIN( $tables, $use_index = array(), $join_conds = array() ) {
+       protected function tableNamesWithUseIndexOrJOIN( $tables, $use_index = array(), $join_conds = array() ) {
                $ret = array();
                $retJOIN = array();
                $use_index_safe = is_array( $use_index ) ? $use_index : array();
@@ -980,11 +1045,9 @@ class DatabaseMssql extends DatabaseBase {
        }
 
        /**
-        * @private
-        *
         * @param array $options an associative array of options to be turned into
-        *                 an SQL query, valid keys are listed in the function.
-        * @return Array
+        *   an SQL query, valid keys are listed in the function.
+        * @return array
         */
        function makeSelectOptions( $options ) {
                $tailOpts = '';
@@ -1041,11 +1104,11 @@ class DatabaseMssql extends DatabaseBase {
  * @ingroup Database
  */
 class MssqlField implements Field {
-       private $name, $tablename, $default, $max_length, $nullable, $type;
+       private $name, $tableName, $default, $max_length, $nullable, $type;
 
        function __construct( $info ) {
                $this->name = $info['COLUMN_NAME'];
-               $this->tablename = $info['TABLE_NAME'];
+               $this->tableName = $info['TABLE_NAME'];
                $this->default = $info['COLUMN_DEFAULT'];
                $this->max_length = $info['CHARACTER_MAXIMUM_LENGTH'];
                $this->nullable = !( strtolower( $info['IS_NULLABLE'] ) == 'no' );
@@ -1085,7 +1148,21 @@ class MssqlField implements Field {
  * @ingroup Database
  */
 class MssqlResult {
+       /** @var int */
+       private $mCursor;
+
+       /** @var array */
+       private $mRows;
 
+       /** @var bool|int */
+       private $mNumFields;
+
+       /** @var array|bool */
+       private $mFieldMeta;
+
+       /**
+        * @param bool|resource $queryresult
+        */
        public function __construct( $queryresult = false ) {
                $this->mCursor = 0;
                $this->mRows = array();
@@ -1108,6 +1185,11 @@ class MssqlResult {
                sqlsrv_free_stmt( $queryresult );
        }
 
+       /**
+        * @param array $array
+        * @param stdClass $obj
+        * @return stdClass
+        */
        private function array_to_obj( $array, &$obj ) {
                foreach ( $array as $key => $value ) {
                        if ( is_array( $value ) ) {
index b600d94..dc4a67d 100644 (file)
@@ -29,8 +29,8 @@
  */
 class DatabaseMysql extends DatabaseMysqlBase {
        /**
-        * @param $sql string
-        * @return resource
+        * @param string $sql
+        * @return resource False on error
         */
        protected function doQuery( $sql ) {
                if ( $this->bufferResults() ) {
@@ -42,6 +42,11 @@ class DatabaseMysql extends DatabaseMysqlBase {
                return $ret;
        }
 
+       /**
+        * @param string $realServer
+        * @return bool|resource MySQL Database connection or false on failure to connect
+        * @throws DBConnectionError
+        */
        protected function mysqlConnect( $realServer ) {
                # Fail now
                # Otherwise we get a suppressed fatal error, which is very hard to track down
@@ -84,6 +89,7 @@ class DatabaseMysql extends DatabaseMysqlBase {
        }
 
        /**
+        * @param string $charset
         * @return bool
         */
        protected function mysqlSetCharset( $charset ) {
@@ -127,7 +133,7 @@ class DatabaseMysql extends DatabaseMysqlBase {
        }
 
        /**
-        * @param $db
+        * @param string $db
         * @return bool
         */
        function selectDB( $db ) {
index 12fee94..2c448ed 100644 (file)
@@ -41,12 +41,12 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
        }
 
        /**
-        * @param $server string
-        * @param $user string
-        * @param $password string
-        * @param $dbName string
+        * @param string $server
+        * @param string $user
+        * @param string $password
+        * @param string $dbName
+        * @throws Exception|DBConnectionError
         * @return bool
-        * @throws DBConnectionError
         */
        function open( $server, $user, $password, $dbName ) {
                global $wgAllDBsAreLocalhost, $wgSQLMode;
@@ -155,7 +155,7 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
        /**
         * Open a connection to a MySQL server
         *
-        * @param $realServer string
+        * @param string $realServer
         * @return mixed Raw connection
         * @throws DBConnectionError
         */
@@ -170,7 +170,7 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
        abstract protected function mysqlSetCharset( $charset );
 
        /**
-        * @param $res ResultWrapper
+        * @param ResultWrapper|resource $res
         * @throws DBUnexpectedError
         */
        function freeResult( $res ) {
@@ -188,14 +188,14 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
        /**
         * Free result memory
         *
-        * @param $res Raw result
+        * @param resource $res Raw result
         * @return bool
         */
        abstract protected function mysqlFreeResult( $res );
 
        /**
-        * @param $res ResultWrapper
-        * @return object|bool
+        * @param ResultWrapper|resource $res
+        * @return stdClass|bool
         * @throws DBUnexpectedError
         */
        function fetchObject( $res ) {
@@ -224,13 +224,13 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
        /**
         * Fetch a result row as an object
         *
-        * @param $res Raw result
+        * @param resource $res Raw result
         * @return stdClass
         */
        abstract protected function mysqlFetchObject( $res );
 
        /**
-        * @param $res ResultWrapper
+        * @param ResultWrapper|resource $res
         * @return array|bool
         * @throws DBUnexpectedError
         */
@@ -260,14 +260,14 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
        /**
         * Fetch a result row as an associative and numeric array
         *
-        * @param $res Raw result
+        * @param resource $res Raw result
         * @return array
         */
        abstract protected function mysqlFetchArray( $res );
 
        /**
         * @throws DBUnexpectedError
-        * @param $res ResultWrapper
+        * @param ResultWrapper|resource $res
         * @return int
         */
        function numRows( $res ) {
@@ -289,13 +289,13 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
        /**
         * Get number of rows in result
         *
-        * @param $res Raw result
+        * @param resource $res Raw result
         * @return int
         */
        abstract protected function mysqlNumRows( $res );
 
        /**
-        * @param $res ResultWrapper
+        * @param ResultWrapper|resource $res
         * @return int
         */
        function numFields( $res ) {
@@ -309,13 +309,13 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
        /**
         * Get number of fields in result
         *
-        * @param $res Raw result
+        * @param resource $res Raw result
         * @return int
         */
        abstract protected function mysqlNumFields( $res );
 
        /**
-        * @param $res ResultWrapper
+        * @param ResultWrapper|resource $res
         * @param $n int
         * @return string
         */
@@ -330,7 +330,7 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
        /**
         * Get the name of the specified field in a result
         *
-        * @param $res Raw result
+        * @param ResultWrapper|resource $res
         * @param $n int
         * @return string
         */
@@ -338,7 +338,7 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
 
        /**
         * mysql_field_type() wrapper
-        * @param $res
+        * @param ResultWrapper|resource $res
         * @param $n int
         * @return string
         */
@@ -353,15 +353,15 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
        /**
         * Get the type of the specified field in a result
         *
-        * @param $res Raw result
-        * @param $n int
+        * @param ResultWrapper|resource $res
+        * @param int $n
         * @return string
         */
        abstract protected function mysqlFieldType( $res, $n );
 
        /**
-        * @param $res ResultWrapper
-        * @param $row
+        * @param ResultWrapper|resource $res
+        * @param int $row
         * @return bool
         */
        function dataSeek( $res, $row ) {
@@ -375,8 +375,8 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
        /**
         * Move internal result pointer
         *
-        * @param $res Raw result
-        * @param $row int
+        * @param ResultWrapper|resource $res
+        * @param int $row
         * @return bool
         */
        abstract protected function mysqlDataSeek( $res, $row );
@@ -406,16 +406,16 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
        /**
         * Returns the text of the error message from previous MySQL operation
         *
-        * @param $conn Raw connection
+        * @param resource $conn Raw connection
         * @return string
         */
        abstract protected function mysqlError( $conn = null );
 
        /**
-        * @param $table string
-        * @param $uniqueIndexes
-        * @param $rows array
-        * @param $fname string
+        * @param string $table
+        * @param array $uniqueIndexes
+        * @param array $rows
+        * @param string $fname
         * @return ResultWrapper
         */
        function replace( $table, $uniqueIndexes, $rows, $fname = __METHOD__ ) {
@@ -427,12 +427,12 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
         * Returns estimated count, based on EXPLAIN output
         * Takes same arguments as Database::select()
         *
-        * @param $table string|array
-        * @param $vars string|array
-        * @param $conds string|array
-        * @param $fname string
-        * @param $options string|array
-        * @return int
+        * @param string|array $table
+        * @param string|array $vars
+        * @param string|array $conds
+        * @param string $fname
+        * @param string|array $options
+        * @return bool|int
         */
        public function estimateRowCount( $table, $vars = '*', $conds = '',
                $fname = __METHOD__, $options = array()
@@ -455,8 +455,8 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
        }
 
        /**
-        * @param $table string
-        * @param $field string
+        * @param string $table
+        * @param string $field
         * @return bool|MySQLField
         */
        function fieldInfo( $table, $field ) {
@@ -479,8 +479,8 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
        /**
         * Get column information from a result
         *
-        * @param $res Raw result
-        * @param $n int
+        * @param resource $res Raw result
+        * @param int $n
         * @return stdClass
         */
        abstract protected function mysqlFetchField( $res, $n );
@@ -489,9 +489,9 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
         * Get information about an index into an object
         * Returns false if the index does not exist
         *
-        * @param $table string
-        * @param $index string
-        * @param $fname string
+        * @param string $table
+        * @param string $index
+        * @param string $fname
         * @return bool|array|null False or null on failure
         */
        function indexInfo( $table, $index, $fname = __METHOD__ ) {
@@ -520,8 +520,7 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
        }
 
        /**
-        * @param $s string
-        *
+        * @param string $s
         * @return string
         */
        function strencode( $s ) {
@@ -538,8 +537,7 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
        /**
         * MySQL uses `backticks` for identifier quoting instead of the sql standard "double quotes".
         *
-        * @param $s string
-        *
+        * @param string $s
         * @return string
         */
        public function addIdentifierQuotes( $s ) {
@@ -549,7 +547,7 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
        }
 
        /**
-        * @param $name string
+        * @param string $name
         * @return bool
         */
        public function isQuotedIdentifier( $name ) {
@@ -659,10 +657,10 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
 
        /**
         * Wait for the slave to catch up to a given master position.
-        * @TODO: return values for this and base class are rubbish
+        * @todo Return values for this and base class are rubbish
         *
-        * @param $pos DBMasterPos object
-        * @param $timeout Integer: the maximum number of seconds to wait for synchronisation
+        * @param DBMasterPos|MySQLMasterPos $pos
+        * @param int $timeout The maximum number of seconds to wait for synchronisation
         * @return bool|string
         */
        function masterPosWait( DBMasterPos $pos, $timeout ) {
@@ -683,7 +681,7 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
 
                # Call doQuery() directly, to avoid opening a transaction if DBO_TRX is set
                $encFile = $this->addQuotes( $pos->file );
-               $encPos = intval( $pos->pos );
+               $encPos = intval( $pos->getMasterPos() );
                $sql = "SELECT MASTER_POS_WAIT($encFile, $encPos, $timeout)";
                $res = $this->doQuery( $sql );
 
@@ -745,7 +743,7 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
        }
 
        /**
-        * @param $index
+        * @param string $index
         * @return string
         */
        function useIndexClause( $index ) {
@@ -763,11 +761,18 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
         * @return string
         */
        public function getSoftwareLink() {
-               return '[http://www.mysql.com/ MySQL]';
+               $version = $this->getServerVersion();
+               if ( strpos( $version, 'MariaDB' ) !== false ) {
+                       return '[{{int:version-db-mariadb-url}} MariaDB]';
+               } elseif ( strpos( $version, 'percona' ) !== false ) {
+                       return '[{{int:version-db-percona-url}} Percona Server]';
+               } else {
+                       return '[{{int:version-db-mysql-url}} MySQL]';
+               }
        }
 
        /**
-        * @param $options array
+        * @param array $options
         */
        public function setSessionOptions( array $options ) {
                if ( isset( $options['connTimeout'] ) ) {
@@ -777,6 +782,11 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
                }
        }
 
+       /**
+        * @param string $sql
+        * @param string $newLine
+        * @return bool
+        */
        public function streamStatementEnd( &$sql, &$newLine ) {
                if ( strtoupper( substr( $newLine, 0, 9 ) ) == 'DELIMITER' ) {
                        preg_match( '/^DELIMITER\s+(\S+)/', $newLine, $m );
@@ -792,7 +802,7 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
         *
         * @param string $lockName name of lock to poll
         * @param string $method name of method calling us
-        * @return Boolean
+        * @return bool
         * @since 1.20
         */
        public function lockIsFree( $lockName, $method ) {
@@ -804,9 +814,9 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
        }
 
        /**
-        * @param $lockName string
-        * @param $method string
-        * @param $timeout int
+        * @param string $lockName
+        * @param string $method
+        * @param int $timeout
         * @return bool
         */
        public function lock( $lockName, $method, $timeout = 5 ) {
@@ -826,8 +836,8 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
        /**
         * FROM MYSQL DOCS:
         * http://dev.mysql.com/doc/refman/5.0/en/miscellaneous-functions.html#function_release-lock
-        * @param $lockName string
-        * @param $method string
+        * @param string $lockName
+        * @param string $method
         * @return bool
         */
        public function unlock( $lockName, $method ) {
@@ -839,10 +849,10 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
        }
 
        /**
-        * @param $read array
-        * @param $write array
-        * @param $method string
-        * @param $lowPriority bool
+        * @param array $read
+        * @param array $write
+        * @param string $method
+        * @param bool $lowPriority
         * @return bool
         */
        public function lockTables( $read, $write, $method, $lowPriority = true ) {
@@ -864,7 +874,7 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
        }
 
        /**
-        * @param $method string
+        * @param string $method
         * @return bool
         */
        public function unlockTables( $method ) {
@@ -877,7 +887,7 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
         * Get search engine class. All subclasses of this
         * need to implement this if they wish to use searching.
         *
-        * @return String
+        * @return string
         */
        public function getSearchEngine() {
                return 'SearchMySQL';
@@ -885,7 +895,7 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
 
        /**
         * @param bool $value
-        * @return mixed
+        * @return mixed null|bool|ResultWrapper
         */
        public function setBigSelects( $value = true ) {
                if ( $value === 'default' ) {
@@ -937,8 +947,8 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
         * @param string $fname
         * @return bool
         */
-       public function upsert(
-               $table, array $rows, array $uniqueIndexes, array $set, $fname = __METHOD__
+       public function upsert( $table, array $rows, array $uniqueIndexes,
+               array $set, $fname = __METHOD__
        ) {
                if ( !count( $rows ) ) {
                        return true; // nothing to do
@@ -1009,24 +1019,26 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
        }
 
        /**
-        * @param $oldName
-        * @param $newName
-        * @param $temporary bool
-        * @param $fname string
+        * @param string $oldName
+        * @param string $newName
+        * @param bool $temporary
+        * @param string $fname
+        * @return bool
         */
        function duplicateTableStructure( $oldName, $newName, $temporary = false, $fname = __METHOD__ ) {
                $tmp = $temporary ? 'TEMPORARY ' : '';
                $newName = $this->addIdentifierQuotes( $newName );
                $oldName = $this->addIdentifierQuotes( $oldName );
                $query = "CREATE $tmp TABLE $newName (LIKE $oldName)";
-               $this->query( $query, $fname );
+
+               return $this->query( $query, $fname );
        }
 
        /**
         * List all tables on the database
         *
         * @param string $prefix Only show tables with this prefix, e.g. mw_
-        * @param string $fname calling function name
+        * @param string $fname Calling function name
         * @return array
         */
        function listTables( $prefix = null, $fname = __METHOD__ ) {
@@ -1077,7 +1089,7 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
        /**
         * Get status information from SHOW STATUS in an associative array
         *
-        * @param $which string
+        * @param string $which
         * @return array
         */
        function getMysqlStatus( $which = "%" ) {
@@ -1133,7 +1145,8 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
        /**
         * Differentiates between a TABLE and a VIEW.
         *
-        * @param $name string: Name of the TABLE/VIEW to test
+        * @param string $name Name of the TABLE/VIEW to test
+        * @param string $prefix
         * @return bool
         * @since 1.22
         */
@@ -1216,7 +1229,11 @@ class MySQLField implements Field {
 }
 
 class MySQLMasterPos implements DBMasterPos {
-       var $file, $pos;
+       /** @var string */
+       public $file;
+
+       /** @var int */
+       private $pos;
 
        function __construct( $file, $pos ) {
                $this->file = $file;
@@ -1246,4 +1263,11 @@ class MySQLMasterPos implements DBMasterPos {
 
                return ( $thisPos && $thatPos && $thisPos >= $thatPos );
        }
+
+       /**
+        * @return int
+        */
+       public function getMasterPos() {
+               return $this->pos;
+       }
 }
index d0c19fa..d41f3e4 100644 (file)
@@ -30,7 +30,7 @@
  */
 class DatabaseMysqli extends DatabaseMysqlBase {
        /**
-        * @param $sql string
+        * @param string $sql
         * @return resource
         */
        protected function doQuery( $sql ) {
@@ -43,6 +43,11 @@ class DatabaseMysqli extends DatabaseMysqlBase {
                return $ret;
        }
 
+       /**
+        * @param string $realServer
+        * @return bool|mysqli
+        * @throws DBConnectionError
+        */
        protected function mysqlConnect( $realServer ) {
                global $wgDBmysql5;
                # Fail now
@@ -93,6 +98,7 @@ class DatabaseMysqli extends DatabaseMysqlBase {
        }
 
        /**
+        * @param string $charset
         * @return bool
         */
        protected function mysqlSetCharset( $charset ) {
@@ -136,7 +142,7 @@ class DatabaseMysqli extends DatabaseMysqlBase {
        }
 
        /**
-        * @param $db
+        * @param string $db
         * @return bool
         */
        function selectDB( $db ) {
@@ -152,12 +158,20 @@ class DatabaseMysqli extends DatabaseMysqlBase {
                return $this->mConn->server_info;
        }
 
+       /**
+        * @param mysqli $res
+        * @return bool
+        */
        protected function mysqlFreeResult( $res ) {
                $res->free_result();
 
                return true;
        }
 
+       /**
+        * @param mysqli $res
+        * @return bool
+        */
        protected function mysqlFetchObject( $res ) {
                $object = $res->fetch_object();
                if ( $object === null ) {
@@ -167,6 +181,10 @@ class DatabaseMysqli extends DatabaseMysqlBase {
                return $object;
        }
 
+       /**
+        * @param mysqli $res
+        * @return bool
+        */
        protected function mysqlFetchArray( $res ) {
                $array = $res->fetch_array();
                if ( $array === null ) {
@@ -176,14 +194,27 @@ class DatabaseMysqli extends DatabaseMysqlBase {
                return $array;
        }
 
+       /**
+        * @param mysqli $res
+        * @return mixed
+        */
        protected function mysqlNumRows( $res ) {
                return $res->num_rows;
        }
 
+       /**
+        * @param mysqli $res
+        * @return mixed
+        */
        protected function mysqlNumFields( $res ) {
                return $res->field_count;
        }
 
+       /**
+        * @param mysqli $res
+        * @param int $n
+        * @return mixed
+        */
        protected function mysqlFetchField( $res, $n ) {
                $field = $res->fetch_field_direct( $n );
                $field->not_null = $field->flags & MYSQLI_NOT_NULL_FLAG;
@@ -195,21 +226,40 @@ class DatabaseMysqli extends DatabaseMysqlBase {
                return $field;
        }
 
+       /**
+        * @param resource|ResultWrapper $res
+        * @param int $n
+        * @return mixed
+        */
        protected function mysqlFieldName( $res, $n ) {
                $field = $res->fetch_field_direct( $n );
 
                return $field->name;
        }
 
+       /**
+        * @param resource|ResultWrapper $res
+        * @param int $n
+        * @return mixed
+        */
        protected function mysqlFieldType( $res, $n ) {
                $field = $res->fetch_field_direct( $n );
                return $field->type;
        }
 
+       /**
+        * @param resource|ResultWrapper $res
+        * @param int $row
+        * @return mixed
+        */
        protected function mysqlDataSeek( $res, $row ) {
                return $res->data_seek( $row );
        }
 
+       /**
+        * @param mysqli $conn Optional connection object
+        * @return string
+        */
        protected function mysqlError( $conn = null ) {
                if ( $conn === null ) {
                        return mysqli_connect_error();
@@ -218,6 +268,11 @@ class DatabaseMysqli extends DatabaseMysqlBase {
                }
        }
 
+       /**
+        * Escapes special characters in a string for use in an SQL statement
+        * @param string $s
+        * @return string
+        */
        protected function mysqlRealEscapeString( $s ) {
                return $this->mConn->real_escape_string( $s );
        }
index 3336d1e..d90b3e1 100644 (file)
@@ -50,8 +50,8 @@ class ORAResult {
        }
 
        /**
-        * @param $db DatabaseBase
-        * @param $stmt
+        * @param DatabaseBase $db
+        * @param resource $stmt A valid OCI statement identifier
         * @param bool $unique
         */
        function __construct( &$db, $stmt, $unique = false ) {
@@ -442,6 +442,10 @@ class DatabaseOracle extends DatabaseBase {
                return $this->query( $sql, $fname, true );
        }
 
+       /**
+        * Frees resources associated with the LOB descriptor
+        * @param ResultWrapper|resource $res
+        */
        function freeResult( $res ) {
                if ( $res instanceof ResultWrapper ) {
                        $res = $res->result;
@@ -450,6 +454,10 @@ class DatabaseOracle extends DatabaseBase {
                $res->free();
        }
 
+       /**
+        * @param ResultWrapper|stdClass $res
+        * @return mixed
+        */
        function fetchObject( $res ) {
                if ( $res instanceof ResultWrapper ) {
                        $res = $res->result;
@@ -494,6 +502,10 @@ class DatabaseOracle extends DatabaseBase {
                return $this->mInsertId;
        }
 
+       /**
+        * @param mixed $res
+        * @param int $row
+        */
        function dataSeek( $res, $row ) {
                if ( $res instanceof ORAResult ) {
                        $res->seek( $row );
@@ -529,6 +541,9 @@ class DatabaseOracle extends DatabaseBase {
        /**
         * Returns information about an index
         * If errors are explicitly ignored, returns NULL on failure
+        * @param string $table
+        * @param string $index
+        * @param string $fname
         * @return bool
         */
        function indexInfo( $table, $index, $fname = __METHOD__ ) {
@@ -603,6 +618,13 @@ class DatabaseOracle extends DatabaseBase {
                return $bind;
        }
 
+       /**
+        * @param string $table
+        * @param $row
+        * @param string $fname
+        * @return bool
+        * @throws DBUnexpectedError
+        */
        private function insertOneRow( $table, $row, $fname ) {
                global $wgContLang;
 
@@ -654,6 +676,7 @@ class DatabaseOracle extends DatabaseBase {
                                        return false;
                                }
                        } else {
+                               /** @var OCI_Lob[] $lob */
                                if ( ( $lob[$col] = oci_new_descriptor( $this->mConn, OCI_D_LOB ) ) === false ) {
                                        $e = oci_error( $stmt );
                                        throw new DBUnexpectedError( $this, "Cannot create LOB descriptor: " . $e['message'] );
@@ -700,7 +723,7 @@ class DatabaseOracle extends DatabaseBase {
                        oci_commit( $this->mConn );
                }
 
-               oci_free_statement( $stmt );
+               return oci_free_statement( $stmt );
        }
 
        function insertSelect( $destTable, $srcTable, $varMap, $conds, $fname = __METHOD__,
@@ -822,7 +845,13 @@ class DatabaseOracle extends DatabaseBase {
                return ( isset( $this->sequenceData[$table] ) ) ? $this->sequenceData[$table] : false;
        }
 
-       # Returns the size of a text field, or -1 for "unlimited"
+       /**
+        * Returns the size of a text field, or -1 for "unlimited"
+        *
+        * @param string $table
+        * @param string $field
+        * @return mixed
+        */
        function textFieldSize( $table, $field ) {
                $fieldInfoData = $this->fieldInfo( $table, $field );
 
@@ -916,6 +945,10 @@ class DatabaseOracle extends DatabaseBase {
 
        /**
         * Return aggregated value function call
+        *
+        * @param $valuedata
+        * @param string $valuename
+        * @return mixed
         */
        public function aggregateValue( $valuedata, $valuename = 'value' ) {
                return $valuedata;
@@ -939,7 +972,7 @@ class DatabaseOracle extends DatabaseBase {
         * @return string wikitext of a link to the server software's web site
         */
        public function getSoftwareLink() {
-               return '[http://www.oracle.com/ Oracle]';
+               return '[{{int:version-db-oracle-url}} Oracle]';
        }
 
        /**
@@ -960,6 +993,9 @@ class DatabaseOracle extends DatabaseBase {
 
        /**
         * Query whether a given index exists
+        * @param string $table
+        * @param string $index
+        * @param string $fname
         * @return bool
         */
        function indexExists( $table, $index, $fname = __METHOD__ ) {
@@ -981,6 +1017,8 @@ class DatabaseOracle extends DatabaseBase {
 
        /**
         * Query whether a given table exists (in the given schema, or the default mw one if not given)
+        * @param string $table
+        * @param string $fname
         * @return bool
         */
        function tableExists( $table, $fname = __METHOD__ ) {
@@ -1006,8 +1044,8 @@ class DatabaseOracle extends DatabaseBase {
         * For internal calls. Use fieldInfo for normal usage.
         * Returns false if the field doesn't exist
         *
-        * @param $table Array
-        * @param $field String
+        * @param array|string $table
+        * @param string $field
         * @return ORAField|ORAResult
         */
        private function fieldInfoMulti( $table, $field ) {
@@ -1064,8 +1102,8 @@ class DatabaseOracle extends DatabaseBase {
 
        /**
         * @throws DBUnexpectedError
-        * @param  $table
-        * @param  $field
+        * @param  string $table
+        * @param  string $field
         * @return ORAField
         */
        function fieldInfo( $table, $field ) {
@@ -1100,7 +1138,16 @@ class DatabaseOracle extends DatabaseBase {
                }
        }
 
-       /* defines must comply with ^define\s*([^\s=]*)\s*=\s?'\{\$([^\}]*)\}'; */
+       /**
+        * defines must comply with ^define\s*([^\s=]*)\s*=\s?'\{\$([^\}]*)\}';
+        *
+        * @param resource $fp
+        * @param bool|string $lineCallback
+        * @param bool|callable $resultCallback
+        * @param string $fname
+        * @param bool|callable $inputCallback
+        * @return bool|string
+        */
        function sourceStream( $fp, $lineCallback = false, $resultCallback = false,
                $fname = __METHOD__, $inputCallback = false ) {
                $cmd = '';
@@ -1275,10 +1322,8 @@ class DatabaseOracle extends DatabaseBase {
         * Returns an optional USE INDEX clause to go after the table, and a
         * string to go at the end of the query
         *
-        * @private
-        *
-        * @param array $options an associative array of options to be turned into
-        *              an SQL query, valid keys are listed in the function.
+        * @param array $options An associative array of options to be turned into
+        *   an SQL query, valid keys are listed in the function.
         * @return array
         */
        function makeSelectOptions( $options ) {
@@ -1347,6 +1392,15 @@ class DatabaseOracle extends DatabaseBase {
                return parent::delete( $table, $conds, $fname );
        }
 
+       /**
+        * @param string $table
+        * @param array $values
+        * @param array $conds
+        * @param string $fname
+        * @param array $options
+        * @return bool
+        * @throws DBUnexpectedError
+        */
        function update( $table, $values, $conds, $fname = __METHOD__, $options = array() ) {
                global $wgContLang;
 
@@ -1443,7 +1497,7 @@ class DatabaseOracle extends DatabaseBase {
                        oci_commit( $this->mConn );
                }
 
-               oci_free_statement( $stmt );
+               return oci_free_statement( $stmt );
        }
 
        function bitNot( $field ) {
@@ -1485,4 +1539,4 @@ class DatabaseOracle extends DatabaseBase {
        public function getInfinity() {
                return '31-12-2030 12:00:00.000000';
        }
-} // end DatabaseOracle class
+}
index 21a7bcf..cb671d8 100644 (file)
@@ -26,9 +26,9 @@ class PostgresField implements Field {
                $has_default, $default;
 
        /**
-        * @param $db DatabaseBase
-        * @param  $table
-        * @param  $field
+        * @param DatabaseBase $db
+        * @param string $table
+        * @param string $field
         * @return null|PostgresField
         */
        static function fromText( $db, $table, $field ) {
@@ -216,13 +216,15 @@ class PostgresTransactionState {
  * @since 1.19
  */
 class SavepointPostgres {
-       /**
-        * Establish a savepoint within a transaction
-        */
+       /** @var DatabaseBase Establish a savepoint within a transaction */
        protected $dbw;
        protected $id;
        protected $didbegin;
 
+       /**
+        * @param DatabaseBase $dbw
+        * @param $id
+        */
        public function __construct( $dbw, $id ) {
                $this->dbw = $dbw;
                $this->id = $id;
@@ -362,7 +364,7 @@ class DatabasePostgres extends DatabaseBase {
         * @param string $user
         * @param string $password
         * @param string $dbName
-        * @throws DBConnectionError
+        * @throws DBConnectionError|Exception
         * @return DatabaseBase|null
         */
        function open( $server, $user, $password, $dbName ) {
@@ -379,7 +381,7 @@ class DatabasePostgres extends DatabaseBase {
                global $wgDBport;
 
                if ( !strlen( $user ) ) { # e.g. the class is being loaded
-                       return;
+                       return null;
                }
 
                $this->mServer = $server;
@@ -450,7 +452,8 @@ class DatabasePostgres extends DatabaseBase {
        /**
         * Postgres doesn't support selectDB in the same way MySQL does. So if the
         * DB name doesn't match the open connection, open a new one
-        * @return
+        * @param string $db
+        * @return bool
         */
        function selectDB( $db ) {
                if ( $this->mDBname !== $db ) {
@@ -536,6 +539,10 @@ class DatabasePostgres extends DatabaseBase {
                return $this->query( $sql, $fname, true );
        }
 
+       /**
+        * @param stdClass|ResultWrapper $res
+        * @throws DBUnexpectedError
+        */
        function freeResult( $res ) {
                if ( $res instanceof ResultWrapper ) {
                        $res = $res->result;
@@ -548,6 +555,11 @@ class DatabasePostgres extends DatabaseBase {
                }
        }
 
+       /**
+        * @param ResultWrapper|stdClass $res
+        * @return stdClass
+        * @throws DBUnexpectedError
+        */
        function fetchObject( $res ) {
                if ( $res instanceof ResultWrapper ) {
                        $res = $res->result;
@@ -629,6 +641,11 @@ class DatabasePostgres extends DatabaseBase {
                return $this->mInsertId;
        }
 
+       /**
+        * @param mixed $res
+        * @param int $row
+        * @return bool
+        */
        function dataSeek( $res, $row ) {
                if ( $res instanceof ResultWrapper ) {
                        $res = $res->result;
@@ -675,6 +692,12 @@ class DatabasePostgres extends DatabaseBase {
         * This is not necessarily an accurate estimate, so use sparingly
         * Returns -1 if count cannot be found
         * Takes same arguments as Database::select()
+        *
+        * @param string $table
+        * @param string $vars
+        * @param string $conds
+        * @param string $fname
+        * @param array $options
         * @return int
         */
        function estimateRowCount( $table, $vars = '*', $conds = '',
@@ -697,6 +720,10 @@ class DatabasePostgres extends DatabaseBase {
        /**
         * Returns information about an index
         * If errors are explicitly ignored, returns NULL on failure
+        *
+        * @param string $table
+        * @param string $index
+        * @param string $fname
         * @return bool|null
         */
        function indexInfo( $table, $index, $fname = __METHOD__ ) {
@@ -718,7 +745,9 @@ class DatabasePostgres extends DatabaseBase {
         * Returns is of attributes used in index
         *
         * @since 1.19
-        * @return Array
+        * @param string $index
+        * @param bool|string $schema
+        * @return array
         */
        function indexAttributes( $index, $schema = false ) {
                if ( $schema === false ) {
@@ -790,17 +819,39 @@ __INDEXATTR__;
                return $res->numRows() > 0;
        }
 
+       /**
+        * Change the FOR UPDATE option as necessary based on the join conditions. Then pass
+        * to the parent function to get the actual SQL text.
+        *
+        * In Postgres when using FOR UPDATE, only the main table and tables that are inner joined
+        * can be locked. That means tables in an outer join cannot be FOR UPDATE locked. Trying to do
+        * so causes a DB error. This wrapper checks which tables can be locked and adjusts it accordingly.
+        */
+       function selectSQLText( $table, $vars, $conds = '', $fname = __METHOD__, $options = array(), $join_conds = array() ) {
+               $forUpdateKey = array_search( 'FOR UPDATE', $options );
+               if ( $forUpdateKey !== false && $join_conds ) {
+                       unset( $options[$forUpdateKey] );
+
+                       foreach ( $join_conds as $table => $join_cond ) {
+                               if ( 0 === preg_match( '/^(?:LEFT|RIGHT|FULL)(?: OUTER)? JOIN$/i', $join_cond[0] ) ) {
+                                       $options['FOR UPDATE'][] = $table;
+                               }
+                       }
+               }
+
+               return parent::selectSQLText( $table, $vars, $conds, $fname, $options, $join_conds );
+       }
+
        /**
         * INSERT wrapper, inserts an array into a table
         *
         * $args may be a single associative array, or an array of these with numeric keys,
         * for multi-row insert (Postgres version 8.2 and above only).
         *
-        * @param $table   String: Name of the table to insert to.
-        * @param $args    Array: Items to insert into the table.
-        * @param $fname   String: Name of the function, for profiling
-        * @param string $options or Array. Valid options: IGNORE
-        *
+        * @param string $table Name of the table to insert to.
+        * @param array $args Items to insert into the table.
+        * @param string $fname Name of the function, for profiling
+        * @param array|string $options String or array. Valid options: IGNORE
         * @return bool Success of insert operation. IGNORE always returns true.
         */
        function insert( $table, $args, $fname = __METHOD__, $options = array() ) {
@@ -919,6 +970,14 @@ __INDEXATTR__;
         * $conds may be "*" to copy the whole table
         * srcTable may be an array of tables.
         * @todo FIXME: Implement this a little better (seperate select/insert)?
+        *
+        * @param string $destTable
+        * @param array|string $srcTable
+        * @param array $varMap
+        * @param array $conds
+        * @param string $fname
+        * @param array $insertOptions
+        * @param array $selectOptions
         * @return bool
         */
        function insertSelect( $destTable, $srcTable, $varMap, $conds, $fname = __METHOD__,
@@ -1019,7 +1078,7 @@ __INDEXATTR__;
         * Return the current value of a sequence. Assumes it has been nextval'ed in this session.
         *
         * @param string $seqName
-        * @return
+        * @return int
         */
        function currentSequenceValue( $seqName ) {
                $safeseq = str_replace( "'", "''", $seqName );
@@ -1096,10 +1155,10 @@ __INDEXATTR__;
         * This should really be handled by PHP PostgreSQL module
         *
         * @since 1.19
-        * @param $text   string: postgreql array returned in a text form like {a,b}
-        * @param $output string
-        * @param $limit  int
-        * @param $offset int
+        * @param string $text Postgreql array returned in a text form like {a,b}
+        * @param string $output
+        * @param int $limit
+        * @param int $offset
         * @return string
         */
        function pg_array_parse( $text, &$output, $limit = false, $offset = 1 ) {
@@ -1137,10 +1196,10 @@ __INDEXATTR__;
        }
 
        /**
-        * @return string wikitext of a link to the server software's web site
+        * @return string Wikitext of a link to the server software's web site
         */
        public function getSoftwareLink() {
-               return '[http://www.postgresql.org/ PostgreSQL]';
+               return '[{{int:version-db-postgres-url}} PostgreSQL]';
        }
 
        /**
@@ -1184,7 +1243,7 @@ __INDEXATTR__;
         * Needs transaction
         *
         * @since 1.19
-        * @return array how to search for table names schemas for the current user
+        * @return array How to search for table names schemas for the current user
         */
        function getSearchPath() {
                $res = $this->query( "SHOW search_path", __METHOD__ );
@@ -1217,14 +1276,15 @@ __INDEXATTR__;
         * This will be also called by the installer after the schema is created
         *
         * @since 1.19
-        * @param $desired_schema string
+        *
+        * @param string $desiredSchema
         */
-       function determineCoreSchema( $desired_schema ) {
+       function determineCoreSchema( $desiredSchema ) {
                $this->begin( __METHOD__ );
-               if ( $this->schemaExists( $desired_schema ) ) {
-                       if ( in_array( $desired_schema, $this->getSchemas() ) ) {
-                               $this->mCoreSchema = $desired_schema;
-                               wfDebug( "Schema \"" . $desired_schema . "\" already in the search path\n" );
+               if ( $this->schemaExists( $desiredSchema ) ) {
+                       if ( in_array( $desiredSchema, $this->getSchemas() ) ) {
+                               $this->mCoreSchema = $desiredSchema;
+                               wfDebug( "Schema \"" . $desiredSchema . "\" already in the search path\n" );
                        } else {
                                /**
                                 * Prepend our schema (e.g. 'mediawiki') in front
@@ -1233,14 +1293,14 @@ __INDEXATTR__;
                                 */
                                $search_path = $this->getSearchPath();
                                array_unshift( $search_path,
-                                       $this->addIdentifierQuotes( $desired_schema ) );
+                                       $this->addIdentifierQuotes( $desiredSchema ) );
                                $this->setSearchPath( $search_path );
-                               $this->mCoreSchema = $desired_schema;
-                               wfDebug( "Schema \"" . $desired_schema . "\" added to the search path\n" );
+                               $this->mCoreSchema = $desiredSchema;
+                               wfDebug( "Schema \"" . $desiredSchema . "\" added to the search path\n" );
                        }
                } else {
                        $this->mCoreSchema = $this->getCurrentSchema();
-                       wfDebug( "Schema \"" . $desired_schema . "\" not found, using current \"" .
+                       wfDebug( "Schema \"" . $desiredSchema . "\" not found, using current \"" .
                                $this->mCoreSchema . "\"\n" );
                }
                /* Commit SET otherwise it will be rollbacked on error or IGNORE SELECT */
@@ -1281,6 +1341,9 @@ __INDEXATTR__;
        /**
         * Query whether a given relation exists (in the given schema, or the
         * default mw one if not given)
+        * @param string $table
+        * @param array|string $types
+        * @param bool|string $schema
         * @return bool
         */
        function relationExists( $table, $types, $schema = false ) {
@@ -1305,6 +1368,9 @@ __INDEXATTR__;
        /**
         * For backward compatibility, this function checks both tables and
         * views.
+        * @param string $table
+        * @param string $fname
+        * @param bool|string $schema
         * @return bool
         */
        function tableExists( $table, $fname = __METHOD__, $schema = false ) {
@@ -1368,6 +1434,7 @@ SQL;
 
        /**
         * Query whether a given schema exists. Returns true if it does, false if it doesn't.
+        * @param string $schema
         * @return bool
         */
        function schemaExists( $schema ) {
@@ -1379,6 +1446,7 @@ SQL;
 
        /**
         * Returns true if a given role (i.e. user) exists, false otherwise.
+        * @param string $roleName
         * @return bool
         */
        function roleExists( $roleName ) {
@@ -1394,6 +1462,8 @@ SQL;
 
        /**
         * pg_field_type() wrapper
+        * @param ResultWrapper|resource $res ResultWrapper or PostgreSQL query result resource
+        * @param int $index Field number, starting from 0
         * @return string
         */
        function fieldType( $res, $index ) {
@@ -1405,7 +1475,7 @@ SQL;
        }
 
        /**
-        * @param $b
+        * @param string $b
         * @return Blob
         */
        function encodeBlob( $b ) {
@@ -1425,7 +1495,7 @@ SQL;
        }
 
        /**
-        * @param $s null|bool|Blob
+        * @param null|bool|Blob $s
         * @return int|string
         */
        function addQuotes( $s ) {
@@ -1444,10 +1514,7 @@ SQL;
         * Postgres specific version of replaceVars.
         * Calls the parent version in Database.php
         *
-        * @private
-        *
         * @param string $ins SQL string, read from a stream (usually tables.sql)
-        *
         * @return string SQL string
         */
        protected function replaceVars( $ins ) {
@@ -1468,10 +1535,8 @@ SQL;
        /**
         * Various select options
         *
-        * @private
-        *
         * @param array $options an associative array of options to be turned into
-        *              an SQL query, valid keys are listed in the function.
+        *   an SQL query, valid keys are listed in the function.
         * @return array
         */
        function makeSelectOptions( $options ) {
@@ -1495,9 +1560,12 @@ SQL;
                //              : false );
                //}
 
-               if ( isset( $noKeyOptions['FOR UPDATE'] ) ) {
+               if ( isset( $options['FOR UPDATE'] ) ) {
+                       $postLimitTail .= ' FOR UPDATE OF ' . implode( ', ', $options['FOR UPDATE'] );
+               } else if ( isset( $noKeyOptions['FOR UPDATE'] ) ) {
                        $postLimitTail .= ' FOR UPDATE';
                }
+
                if ( isset( $noKeyOptions['DISTINCT'] ) || isset( $noKeyOptions['DISTINCTROW'] ) ) {
                        $startOpts .= 'DISTINCT';
                }
@@ -1549,9 +1617,9 @@ SQL;
         * Check to see if a named lock is available. This is non-blocking.
         * See http://www.postgresql.org/docs/8.2/static/functions-admin.html#FUNCTIONS-ADVISORY-LOCKS
         *
-        * @param string $lockName name of lock to poll
-        * @param string $method name of method calling us
-        * @return Boolean
+        * @param string $lockName Name of lock to poll
+        * @param string $method Name of method calling us
+        * @return bool
         * @since 1.20
         */
        public function lockIsFree( $lockName, $method ) {
@@ -1565,9 +1633,9 @@ SQL;
 
        /**
         * See http://www.postgresql.org/docs/8.2/static/functions-admin.html#FUNCTIONS-ADVISORY-LOCKS
-        * @param $lockName string
-        * @param $method string
-        * @param $timeout int
+        * @param string $lockName
+        * @param string $method
+        * @param int $timeout
         * @return bool
         */
        public function lock( $lockName, $method, $timeout = 5 ) {
@@ -1590,8 +1658,8 @@ SQL;
        /**
         * See http://www.postgresql.org/docs/8.2/static/functions-admin.html#FUNCTIONS-ADVISORY-LOCKSFROM
         * PG DOCS: http://www.postgresql.org/docs/8.2/static/functions-admin.html#FUNCTIONS-ADVISORY-LOCKS
-        * @param $lockName string
-        * @param $method string
+        * @param string $lockName
+        * @param string $method
         * @return bool
         */
        public function unlock( $lockName, $method ) {
index ea35391..5aaeb65 100644 (file)
@@ -119,12 +119,13 @@ class DatabaseSqlite extends DatabaseBase {
        /**
         * Opens a database file
         *
-        * @param $fileName string
-        *
+        * @param string $fileName
         * @throws DBConnectionError
         * @return PDO|bool SQL connection or false if failed
         */
        function openFile( $fileName ) {
+               $err = false;
+
                $this->mDatabaseFile = $fileName;
                try {
                        if ( $this->mFlags & DBO_PERSISTENT ) {
@@ -136,10 +137,12 @@ class DatabaseSqlite extends DatabaseBase {
                } catch ( PDOException $e ) {
                        $err = $e->getMessage();
                }
+
                if ( !$this->mConn ) {
                        wfDebug( "DB connection error: $err\n" );
                        throw new DBConnectionError( $this, $err );
                }
+
                $this->mOpened = !!$this->mConn;
                # set error codes only, don't raise exceptions
                if ( $this->mOpened ) {
@@ -147,8 +150,10 @@ class DatabaseSqlite extends DatabaseBase {
                        # Enforce LIKE to be case sensitive, just like MySQL
                        $this->query( 'PRAGMA case_sensitive_like = 1' );
 
-                       return true;
+                       return $this->mConn;
                }
+
+               return false;
        }
 
        /**
@@ -165,7 +170,7 @@ class DatabaseSqlite extends DatabaseBase {
         * Generates a database file name. Explicitly public for installer.
         * @param string $dir Directory where database resides
         * @param string $dbName Database name
-        * @return String
+        * @return string
         */
        public static function generateFileName( $dir, $dbName ) {
                return "$dir/$dbName.sqlite";
@@ -191,7 +196,7 @@ class DatabaseSqlite extends DatabaseBase {
 
        /**
         * Returns version of currently supported SQLite fulltext search module or false if none present.
-        * @return String
+        * @return string
         */
        static function getFulltextSearchModule() {
                static $cachedResult = null;
@@ -215,12 +220,11 @@ class DatabaseSqlite extends DatabaseBase {
         * Attaches external database to our connection, see http://sqlite.org/lang_attach.html
         * for details.
         *
-        * @param string $name database name to be used in queries like
+        * @param string $name Database name to be used in queries like
         *   SELECT foo FROM dbname.table
-        * @param string $file database file name. If omitted, will be generated
+        * @param bool|string $file Database file name. If omitted, will be generated
         *   using $name and $wgSQLiteDataDir
-        * @param string $fname calling function name
-        *
+        * @param string $fname Calling function name
         * @return ResultWrapper
         */
        function attachDatabase( $name, $file = false, $fname = __METHOD__ ) {
@@ -237,7 +241,6 @@ class DatabaseSqlite extends DatabaseBase {
         * @see DatabaseBase::isWriteQuery()
         *
         * @param $sql string
-        *
         * @return bool
         */
        function isWriteQuery( $sql ) {
@@ -247,9 +250,8 @@ class DatabaseSqlite extends DatabaseBase {
        /**
         * SQLite doesn't allow buffered results or data seeking etc, so we'll use fetchAll as the result
         *
-        * @param $sql string
-        *
-        * @return ResultWrapper
+        * @param string $sql
+        * @return bool|ResultWrapper
         */
        protected function doQuery( $sql ) {
                $res = $this->mConn->query( $sql );
@@ -265,7 +267,7 @@ class DatabaseSqlite extends DatabaseBase {
        }
 
        /**
-        * @param $res ResultWrapper
+        * @param ResultWrapper|mixed $res
         */
        function freeResult( $res ) {
                if ( $res instanceof ResultWrapper ) {
@@ -276,8 +278,8 @@ class DatabaseSqlite extends DatabaseBase {
        }
 
        /**
-        * @param $res ResultWrapper
-        * @return object|bool
+        * @param ResultWrapper|array $res
+        * @return stdClass|bool
         */
        function fetchObject( $res ) {
                if ( $res instanceof ResultWrapper ) {
@@ -303,7 +305,7 @@ class DatabaseSqlite extends DatabaseBase {
        }
 
        /**
-        * @param $res ResultWrapper
+        * @param ResultWrapper|mixed $res
         * @return array|bool
         */
        function fetchRow( $res ) {
@@ -325,8 +327,7 @@ class DatabaseSqlite extends DatabaseBase {
        /**
         * The PDO::Statement class implements the array interface so count() will work
         *
-        * @param $res ResultWrapper
-        *
+        * @param ResultWrapper|array $res
         * @return int
         */
        function numRows( $res ) {
@@ -336,7 +337,7 @@ class DatabaseSqlite extends DatabaseBase {
        }
 
        /**
-        * @param $res ResultWrapper
+        * @param ResultWrapper $res
         * @return int
         */
        function numFields( $res ) {
@@ -346,7 +347,7 @@ class DatabaseSqlite extends DatabaseBase {
        }
 
        /**
-        * @param $res ResultWrapper
+        * @param ResultWrapper $res
         * @param $n
         * @return bool
         */
@@ -364,8 +365,8 @@ class DatabaseSqlite extends DatabaseBase {
        /**
         * Use MySQL's naming (accounts for prefix etc) but remove surrounding backticks
         *
-        * @param $name
-        * @param $format String
+        * @param string $name
+        * @param string $format
         * @return string
         */
        function tableName( $name, $format = 'quoted' ) {
@@ -380,8 +381,7 @@ class DatabaseSqlite extends DatabaseBase {
        /**
         * Index names have DB scope
         *
-        * @param $index string
-        *
+        * @param string $index
         * @return string
         */
        function indexName( $index ) {
@@ -399,8 +399,8 @@ class DatabaseSqlite extends DatabaseBase {
        }
 
        /**
-        * @param $res ResultWrapper
-        * @param $row
+        * @param ResultWrapper|array $res
+        * @param int $row
         */
        function dataSeek( $res, $row ) {
                if ( $res instanceof ResultWrapper ) {
@@ -453,6 +453,9 @@ class DatabaseSqlite extends DatabaseBase {
         * Returns false if the index does not exist
         * - if errors are explicitly ignored, returns NULL on failure
         *
+        * @param string $table
+        * @param string $index
+        * @param string $fname
         * @return array
         */
        function indexInfo( $table, $index, $fname = __METHOD__ ) {
@@ -473,9 +476,9 @@ class DatabaseSqlite extends DatabaseBase {
        }
 
        /**
-        * @param $table
-        * @param $index
-        * @param $fname string
+        * @param string $table
+        * @param string $index
+        * @param string $fname
         * @return bool|null
         */
        function indexUnique( $table, $index, $fname = __METHOD__ ) {
@@ -502,8 +505,7 @@ class DatabaseSqlite extends DatabaseBase {
        /**
         * Filter the options used in SELECT statements
         *
-        * @param $options array
-        *
+        * @param array $options
         * @return array
         */
        function makeSelectOptions( $options ) {
@@ -517,17 +519,17 @@ class DatabaseSqlite extends DatabaseBase {
        }
 
        /**
-        * @param $options array
+        * @param array $options
         * @return string
         */
-       function makeUpdateOptions( $options ) {
+       protected function makeUpdateOptions( $options ) {
                $options = self::fixIgnore( $options );
 
                return parent::makeUpdateOptions( $options );
        }
 
        /**
-        * @param $options array
+        * @param array $options
         * @return array
         */
        static function fixIgnore( $options ) {
@@ -542,7 +544,7 @@ class DatabaseSqlite extends DatabaseBase {
        }
 
        /**
-        * @param $options array
+        * @param array $options
         * @return string
         */
        function makeInsertOptions( $options ) {
@@ -553,6 +555,10 @@ class DatabaseSqlite extends DatabaseBase {
 
        /**
         * Based on generic method (parent) with some prior SQLite-sepcific adjustments
+        * @param string $table
+        * @param array $a
+        * @param string $fname
+        * @param array $options
         * @return bool
         */
        function insert( $table, $a, $fname = __METHOD__, $options = array() ) {
@@ -576,10 +582,10 @@ class DatabaseSqlite extends DatabaseBase {
        }
 
        /**
-        * @param $table
-        * @param $uniqueIndexes
-        * @param $rows
-        * @param $fname string
+        * @param string $table
+        * @param array $uniqueIndexes Unused
+        * @param string|array $rows
+        * @param string $fname
         * @return bool|ResultWrapper
         */
        function replace( $table, $uniqueIndexes, $rows, $fname = __METHOD__ ) {
@@ -606,6 +612,8 @@ class DatabaseSqlite extends DatabaseBase {
         * Returns the size of a text field, or -1 for "unlimited"
         * In SQLite this is SQLITE_MAX_LENGTH, by default 1GB. No way to query it though.
         *
+        * @param string $table
+        * @param string $field
         * @return int
         */
        function textFieldSize( $table, $field ) {
@@ -620,8 +628,8 @@ class DatabaseSqlite extends DatabaseBase {
        }
 
        /**
-        * @param $sqls
-        * @param $all
+        * @param string $sqls
+        * @param bool $all Whether to "UNION ALL" or not
         * @return string
         */
        function unionQueries( $sqls, $all ) {
@@ -655,7 +663,7 @@ class DatabaseSqlite extends DatabaseBase {
         * @return string wikitext of a link to the server software's web site
         */
        public function getSoftwareLink() {
-               return "[http://sqlite.org/ SQLite]";
+               return "[{{int:version-db-sqlite-url}} SQLite]";
        }
 
        /**
@@ -680,8 +688,8 @@ class DatabaseSqlite extends DatabaseBase {
         * Get information about a given field
         * Returns false if the field does not exist.
         *
-        * @param $table string
-        * @param $field string
+        * @param string $table
+        * @param string $field
         * @return SQLiteField|bool False on failure
         */
        function fieldInfo( $table, $field ) {
@@ -730,7 +738,7 @@ class DatabaseSqlite extends DatabaseBase {
        }
 
        /**
-        * @param $s string
+        * @param string $s
         * @return string
         */
        function strencode( $s ) {
@@ -758,7 +766,7 @@ class DatabaseSqlite extends DatabaseBase {
        }
 
        /**
-        * @param $s Blob|string
+        * @param Blob|string $s
         * @return string
         */
        function addQuotes( $s ) {
@@ -800,6 +808,7 @@ class DatabaseSqlite extends DatabaseBase {
 
        /**
         * No-op version of deadlockLoop
+        *
         * @return mixed
         */
        public function deadlockLoop( /*...*/ ) {
@@ -810,7 +819,7 @@ class DatabaseSqlite extends DatabaseBase {
        }
 
        /**
-        * @param $s string
+        * @param string $s
         * @return string
         */
        protected function replaceVars( $s ) {
@@ -866,8 +875,7 @@ class DatabaseSqlite extends DatabaseBase {
        /**
         * Build a concatenation list to feed into a SQL query
         *
-        * @param $stringList array
-        *
+        * @param string[] $stringList
         * @return string
         */
        function buildConcat( $stringList ) {
@@ -884,10 +892,10 @@ class DatabaseSqlite extends DatabaseBase {
 
        /**
         * @throws MWException
-        * @param $oldName
-        * @param $newName
-        * @param $temporary bool
-        * @param $fname string
+        * @param string $oldName
+        * @param string $newName
+        * @param bool $temporary
+        * @param string $fname
         * @return bool|ResultWrapper
         */
        function duplicateTableStructure( $oldName, $newName, $temporary = false, $fname = __METHOD__ ) {
@@ -919,7 +927,7 @@ class DatabaseSqlite extends DatabaseBase {
         * List all tables on the database
         *
         * @param string $prefix Only show tables with this prefix, e.g. mw_
-        * @param string $fname calling function name
+        * @param string $fname Calling function name
         *
         * @return array
         */
index 5451e98..2b4b634 100644 (file)
@@ -129,7 +129,7 @@ class ResultWrapper implements Iterator {
        /**
         * Get the number of rows in a result object
         *
-        * @return integer
+        * @return int
         */
        function numRows() {
                return $this->db->numRows( $this );
@@ -151,7 +151,7 @@ class ResultWrapper implements Iterator {
         * Fetch the next row from the given result object, in associative array
         * form. Fields are retrieved with $row['fieldname'].
         *
-        * @return Array
+        * @return array
         * @throws DBUnexpectedError Thrown if the database returns an error
         */
        function fetchRow() {
@@ -171,7 +171,7 @@ class ResultWrapper implements Iterator {
         * Change the position of the cursor in a result object.
         * See mysql_data_seek()
         *
-        * @param $row integer
+        * @param int $row
         */
        function seek( $row ) {
                $this->db->dataSeek( $this, $row );
@@ -302,6 +302,7 @@ class FakeResultWrapper extends ResultWrapper {
  * manually, use DatabaseBase::anyChar() and anyString() instead.
  */
 class LikeMatch {
+       /** @var string */
        private $str;
 
        /**
@@ -316,7 +317,7 @@ class LikeMatch {
        /**
         * Return the original stored string.
         *
-        * @return String
+        * @return string
         */
        public function toString() {
                return $this->str;
@@ -327,4 +328,10 @@ class LikeMatch {
  * An object representing a master or slave position in a replicated setup.
  */
 interface DBMasterPos {
+       /**
+        * Return the master position.
+        *
+        * @return mixed Master position
+        */
+       public function getMasterPos();
 }
index 847e173..ae105e2 100644 (file)
@@ -59,7 +59,6 @@ abstract class LBFactory {
         * Returns the LBFactory class to use and the load balancer configuration.
         *
         * @param array $config (e.g. $wgLBFactoryConf)
-        *
         * @return string class name
         */
        public static function getLBFactoryClass( array $config ) {
@@ -99,7 +98,7 @@ abstract class LBFactory {
        /**
         * Set the instance to be the given object
         *
-        * @param $instance LBFactory
+        * @param LBFactory $instance
         */
        static function setInstance( $instance ) {
                self::destroyInstance();
@@ -108,7 +107,7 @@ abstract class LBFactory {
 
        /**
         * Construct a factory based on a configuration array (typically from $wgLBFactoryConf)
-        * @param $conf
+        * @param array $conf
         */
        abstract function __construct( $conf );
 
@@ -116,7 +115,7 @@ abstract class LBFactory {
         * Create a new load balancer object. The resulting object will be untracked,
         * not chronology-protected, and the caller is responsible for cleaning it up.
         *
-        * @param string $wiki wiki ID, or false for the current wiki
+        * @param bool|string $wiki Wiki ID, or false for the current wiki
         * @return LoadBalancer
         */
        abstract function newMainLB( $wiki = false );
@@ -124,7 +123,7 @@ abstract class LBFactory {
        /**
         * Get a cached (tracked) load balancer object.
         *
-        * @param string $wiki wiki ID, or false for the current wiki
+        * @param bool|string $wiki Wiki ID, or false for the current wiki
         * @return LoadBalancer
         */
        abstract function getMainLB( $wiki = false );
@@ -134,9 +133,8 @@ abstract class LBFactory {
         * untracked, not chronology-protected, and the caller is responsible for
         * cleaning it up.
         *
-        * @param string $cluster external storage cluster, or false for core
-        * @param string $wiki wiki ID, or false for the current wiki
-        *
+        * @param string $cluster External storage cluster, or false for core
+        * @param bool|string $wiki Wiki ID, or false for the current wiki
         * @return LoadBalancer
         */
        abstract function newExternalLB( $cluster, $wiki = false );
@@ -145,8 +143,7 @@ abstract class LBFactory {
         * Get a cached (tracked) load balancer for external storage
         *
         * @param string $cluster external storage cluster, or false for core
-        * @param string $wiki wiki ID, or false for the current wiki
-        *
+        * @param bool|string $wiki Wiki ID, or false for the current wiki
         * @return LoadBalancer
         */
        abstract function &getExternalLB( $cluster, $wiki = false );
@@ -155,7 +152,8 @@ abstract class LBFactory {
         * Execute a function for each tracked load balancer
         * The callback is called with the load balancer as the first parameter,
         * and $params passed as the subsequent parameters.
-        * @param $callback string|array
+        *
+        * @param callable $callback
         * @param array $params
         */
        abstract function forEachLB( $callback, $params = array() );
@@ -169,8 +167,9 @@ abstract class LBFactory {
 
        /**
         * Call a method of each tracked load balancer
-        * @param $methodName string
-        * @param $args array
+        *
+        * @param string $methodName
+        * @param array $args
         */
        function forEachLBCallMethod( $methodName, $args = array() ) {
                $this->forEachLB( array( $this, 'callMethod' ), array( $methodName, $args ) );
@@ -178,8 +177,8 @@ abstract class LBFactory {
 
        /**
         * Private helper for forEachLBCallMethod
-        * @param $loadBalancer
-        * @param $methodName string
+        * @param LoadBalancer $loadBalancer
+        * @param string $methodName
         * @param $args
         */
        function callMethod( $loadBalancer, $methodName, $args ) {
@@ -212,7 +211,7 @@ class LBFactorySimple extends LBFactory {
        }
 
        /**
-        * @param $wiki
+        * @param bool|string $wiki
         * @return LoadBalancer
         */
        function newMainLB( $wiki = false ) {
@@ -249,7 +248,7 @@ class LBFactorySimple extends LBFactory {
        }
 
        /**
-        * @param $wiki
+        * @param bool|string $wiki
         * @return LoadBalancer
         */
        function getMainLB( $wiki = false ) {
@@ -264,8 +263,8 @@ class LBFactorySimple extends LBFactory {
 
        /**
         * @throws MWException
-        * @param $cluster
-        * @param $wiki
+        * @param string $cluster
+        * @param bool|string $wiki
         * @return LoadBalancer
         */
        function newExternalLB( $cluster, $wiki = false ) {
@@ -280,8 +279,8 @@ class LBFactorySimple extends LBFactory {
        }
 
        /**
-        * @param $cluster
-        * @param $wiki
+        * @param string $cluster
+        * @param bool|string $wiki
         * @return array
         */
        function &getExternalLB( $cluster, $wiki = false ) {
@@ -298,8 +297,9 @@ class LBFactorySimple extends LBFactory {
         * Execute a function for each tracked load balancer
         * The callback is called with the load balancer as the first parameter,
         * and $params passed as the subsequent parameters.
-        * @param $callback
-        * @param $params array
+        *
+        * @param callable $callback
+        * @param array $params
         */
        function forEachLB( $callback, $params = array() ) {
                if ( isset( $this->mainLB ) ) {
index 2ab0554..3c1885f 100644 (file)
@@ -149,7 +149,7 @@ class LBFactoryMulti extends LBFactory {
        protected $lastSection;
 
        /**
-        * @param $conf array
+        * @param array $conf
         * @throws MWException
         */
        function __construct( $conf ) {
@@ -183,7 +183,7 @@ class LBFactoryMulti extends LBFactory {
        }
 
        /**
-        * @param $wiki bool|string
+        * @param bool|string $wiki
         * @return string
         */
        function getSectionForWiki( $wiki = false ) {
@@ -203,7 +203,7 @@ class LBFactoryMulti extends LBFactory {
        }
 
        /**
-        * @param $wiki bool|string
+        * @param bool|string $wiki
         * @return LoadBalancer
         */
        function newMainLB( $wiki = false ) {
@@ -226,7 +226,7 @@ class LBFactoryMulti extends LBFactory {
        }
 
        /**
-        * @param $wiki bool|string
+        * @param bool|string $wiki
         * @return LoadBalancer
         */
        function getMainLB( $wiki = false ) {
@@ -243,7 +243,7 @@ class LBFactoryMulti extends LBFactory {
 
        /**
         * @param string $cluster
-        * @param bool $wiki
+        * @param bool|string $wiki
         * @throws MWException
         * @return LoadBalancer
         */
@@ -263,8 +263,8 @@ class LBFactoryMulti extends LBFactory {
        }
 
        /**
-        * @param $cluster
-        * @param $wiki
+        * @param string $cluster external storage cluster, or false for core
+        * @param bool|string $wiki Wiki ID, or false for the current wiki
         * @return LoadBalancer
         */
        function &getExternalLB( $cluster, $wiki = false ) {
@@ -280,9 +280,9 @@ class LBFactoryMulti extends LBFactory {
        /**
         * Make a new load balancer object based on template and load array
         *
-        * @param $template
-        * @param $loads array
-        * @param $groupLoads
+        * @param array $template
+        * @param array $loads
+        * @param array $groupLoads
         * @return LoadBalancer
         */
        function newLoadBalancer( $template, $loads, $groupLoads ) {
@@ -299,9 +299,9 @@ class LBFactoryMulti extends LBFactory {
        /**
         * Make a server array as expected by LoadBalancer::__construct, using a template and load array
         *
-        * @param $template
-        * @param $loads array
-        * @param $groupLoads
+        * @param array $template
+        * @param array $loads
+        * @param array $groupLoads
         * @return array
         */
        function makeServerArray( $template, $loads, $groupLoads ) {
@@ -343,7 +343,7 @@ class LBFactoryMulti extends LBFactory {
 
        /**
         * Take a group load array indexed by group then server, and reindex it by server then group
-        * @param $groupLoads
+        * @param array $groupLoads
         * @return array
         */
        function reindexGroupLoads( $groupLoads ) {
@@ -359,7 +359,7 @@ class LBFactoryMulti extends LBFactory {
 
        /**
         * Get the database name and prefix based on the wiki ID
-        * @param $wiki bool
+        * @param bool|string $wiki
         * @return array
         */
        function getDBNameAndPrefix( $wiki = false ) {
@@ -376,8 +376,8 @@ class LBFactoryMulti extends LBFactory {
         * Execute a function for each tracked load balancer
         * The callback is called with the load balancer as the first parameter,
         * and $params passed as the subsequent parameters.
-        * @param $callback
-        * @param $params array
+        * @param callable $callback
+        * @param array $params
         */
        function forEachLB( $callback, $params = array() ) {
                foreach ( $this->mainLBs as $lb ) {
index 83271ec..66e9d12 100644 (file)
@@ -25,6 +25,7 @@
  * An LBFactory class that always returns a single database object.
  */
 class LBFactorySingle extends LBFactory {
+       /** @var LoadBalancerSingle */
        protected $lb;
 
        /**
@@ -36,8 +37,7 @@ class LBFactorySingle extends LBFactory {
        }
 
        /**
-        * @param $wiki bool|string
-        *
+        * @param bool|string $wiki
         * @return LoadBalancerSingle
         */
        function newMainLB( $wiki = false ) {
@@ -45,8 +45,7 @@ class LBFactorySingle extends LBFactory {
        }
 
        /**
-        * @param $wiki bool|string
-        *
+        * @param bool|string $wiki
         * @return LoadBalancerSingle
         */
        function getMainLB( $wiki = false ) {
@@ -54,9 +53,8 @@ class LBFactorySingle extends LBFactory {
        }
 
        /**
-        * @param $cluster
-        * @param $wiki bool|string
-        *
+        * @param string $cluster External storage cluster, or false for core
+        * @param bool|string $wiki Wiki ID, or false for the current wiki
         * @return LoadBalancerSingle
         */
        function newExternalLB( $cluster, $wiki = false ) {
@@ -64,9 +62,8 @@ class LBFactorySingle extends LBFactory {
        }
 
        /**
-        * @param $cluster
-        * @param $wiki bool|string
-        *
+        * @param string $cluster external storage cluster, or false for core
+        * @param bool|string $wiki Wiki ID, or false for the current wiki
         * @return LoadBalancerSingle
         */
        function &getExternalLB( $cluster, $wiki = false ) {
@@ -74,8 +71,8 @@ class LBFactorySingle extends LBFactory {
        }
 
        /**
-        * @param $callback string|array
-        * @param $params array
+        * @param string|array $callback
+        * @param array $params
         */
        function forEachLB( $callback, $params = array() ) {
                call_user_func_array( $callback, array_merge( array( $this->lb ), $params ) );
@@ -104,8 +101,8 @@ class LoadBalancerSingle extends LoadBalancer {
 
        /**
         *
-        * @param $server string
-        * @param $dbNameOverride bool
+        * @param string $server
+        * @param bool $dbNameOverride
         *
         * @return DatabaseBase
         */
index 7dcb88f..7a49c78 100644 (file)
@@ -31,16 +31,20 @@ class LoadBalancer {
        private $mServers, $mConns, $mLoads, $mGroupLoads;
        private $mErrorConnection;
        private $mReadIndex, $mAllowLagged;
-       private $mWaitForPos, $mWaitTimeout;
+
+       /** @var bool|DBMasterPos False if not set */
+       private $mWaitForPos;
+
+       private $mWaitTimeout;
        private $mLaggedSlaveMode, $mLastError = 'Unknown error';
        private $mParentInfo, $mLagTimes;
        private $mLoadMonitorClass, $mLoadMonitor;
 
        /**
         * @param array $params with keys:
-        *    servers           Required. Array of server info structures.
-        *    masterWaitTimeout Replication lag wait timeout
-        *    loadMonitor       Name of a class used to fetch server lag and load.
+        *   servers           Required. Array of server info structures.
+        *   masterWaitTimeout Replication lag wait timeout
+        *   loadMonitor       Name of a class used to fetch server lag and load.
         * @throws MWException
         */
        function __construct( $params ) {
@@ -108,7 +112,7 @@ class LoadBalancer {
        /**
         * Get or set arbitrary data used by the parent object, usually an LBFactory
         * @param $x
-        * @return Mixed
+        * @return mixed
         */
        function parentInfo( $x = null ) {
                return wfSetVar( $this->mParentInfo, $x );
@@ -120,8 +124,7 @@ class LoadBalancer {
         *
         * @deprecated since 1.21, use ArrayUtils::pickRandom()
         *
-        * @param $weights array
-        *
+        * @param array $weights
         * @return bool|int|string
         */
        function pickRandom( $weights ) {
@@ -129,8 +132,8 @@ class LoadBalancer {
        }
 
        /**
-        * @param $loads array
-        * @param $wiki bool
+        * @param array $loads
+        * @param bool|string $wiki Wiki to get non-lagged for
         * @return bool|int|string
         */
        function getRandomNonLagged( $loads, $wiki = false ) {
@@ -177,8 +180,8 @@ class LoadBalancer {
         * always return a consistent index during a given invocation
         *
         * Side effect: opens connections to databases
-        * @param $group bool
-        * @param $wiki bool
+        * @param bool|string $group
+        * @param bool|string $wiki
         * @throws MWException
         * @return bool|int|string
         */
@@ -338,7 +341,7 @@ class LoadBalancer {
 
        /**
         * Wait for a specified number of microseconds, and return the period waited
-        * @param $t int
+        * @param int $t
         * @return int
         */
        function sleep( $t ) {
@@ -354,7 +357,7 @@ class LoadBalancer {
         * Set the master wait position
         * If a DB_SLAVE connection has been opened already, waits
         * Otherwise sets a variable telling it to wait if such a connection is opened
-        * @param $pos DBMasterPos
+        * @param DBMasterPos $pos
         */
        public function waitFor( $pos ) {
                wfProfileIn( __METHOD__ );
@@ -372,7 +375,7 @@ class LoadBalancer {
 
        /**
         * Set the master wait position and wait for ALL slaves to catch up to it
-        * @param $pos DBMasterPos
+        * @param DBMasterPos $pos
         */
        public function waitForAll( $pos ) {
                wfProfileIn( __METHOD__ );
@@ -390,7 +393,7 @@ class LoadBalancer {
         * Get any open connection to a given server index, local or foreign
         * Returns false if there is no connection open
         *
-        * @param $i int
+        * @param int $i
         * @return DatabaseBase|bool False on failure
         */
        function getAnyOpenConnection( $i ) {
@@ -575,7 +578,7 @@ class LoadBalancer {
         *
         * @param integer $db
         * @param mixed $groups
-        * @param string $wiki
+        * @param bool|string $wiki
         * @return DBConnRef
         */
        public function getConnectionRef( $db, $groups = array(), $wiki = false ) {
@@ -591,7 +594,7 @@ class LoadBalancer {
         *
         * @param integer $db
         * @param mixed $groups
-        * @param string $wiki
+        * @param bool|string $wiki
         * @return DBConnRef
         */
        public function getLazyConnectionRef( $db, $groups = array(), $wiki = false ) {
@@ -607,7 +610,7 @@ class LoadBalancer {
         * error will be available via $this->mErrorConnection.
         *
         * @param $i Integer server index
-        * @param string $wiki wiki ID to open
+        * @param bool|string $wiki wiki ID to open
         * @return DatabaseBase
         *
         * @access private
@@ -998,7 +1001,7 @@ class LoadBalancer {
 
        /**
         * Disables/enables lag checks
-        * @param $mode null
+        * @param null|bool $mode
         * @return bool
         */
        function allowLagged( $mode = null ) {
@@ -1030,7 +1033,7 @@ class LoadBalancer {
 
        /**
         * Call a function with each open connection object
-        * @param $callback
+        * @param callable $callback
         * @param array $params
         */
        function forEachOpenConnection( $callback, $params = array() ) {
@@ -1050,8 +1053,7 @@ class LoadBalancer {
         * May attempt to open connections to slaves on the default DB. If there is
         * no lag, the maximum lag will be reported as -1.
         *
-        * @param string $wiki Wiki ID, or false for the default database
-        *
+        * @param bool|string $wiki Wiki ID, or false for the default database
         * @return array ( host, max lag, index of max lagged host )
         */
        function getMaxLag( $wiki = false ) {
@@ -1086,8 +1088,7 @@ class LoadBalancer {
         * Get lag time for each server
         * Results are cached for a short time in memcached, and indefinitely in the process cache
         *
-        * @param $wiki
-        *
+        * @param string|bool $wiki
         * @return array
         */
        function getLagTimes( $wiki = false ) {
@@ -1118,8 +1119,7 @@ class LoadBalancer {
         * function instead of Database::getLag() avoids a fatal error in this
         * case on many installations.
         *
-        * @param $conn DatabaseBase
-        *
+        * @param DatabaseBase $conn
         * @return int
         */
        function safeGetLag( $conn ) {
@@ -1148,14 +1148,16 @@ class LoadBalancer {
 class DBConnRef implements IDatabase {
        /** @var LoadBalancer */
        protected $lb;
+
        /** @var DatabaseBase|null */
        protected $conn;
-       /** @var Array|null */
+
+       /** @var array|null */
        protected $params;
 
        /**
-        * @param $lb LoadBalancer
-        * @param $conn DatabaseBase|array Connection or (server index, group, wiki ID) array
+        * @param LoadBalancer $lb
+        * @param DatabaseBase|array $conn Connection or (server index, group, wiki ID) array
         */
        public function __construct( LoadBalancer $lb, $conn ) {
                $this->lb = $lb;
index 5854456..651c499 100644 (file)
@@ -37,7 +37,7 @@ interface LoadMonitor {
        /**
         * Perform pre-connection load ratio adjustment.
         * @param array $loads
-        * @param string|bool $group the selected query group. Default: false
+        * @param string|bool $group The selected query group. Default: false
         * @param string|bool $wiki Default: false
         */
        function scaleLoads( &$loads, $group = false, $wiki = false );
@@ -55,16 +55,16 @@ interface LoadMonitor {
         * to the running thread count. The threshold may be false, which indicates
         * that the sysadmin has not configured this feature.
         *
-        * @param $conn DatabaseBase
-        * @param $threshold Float
+        * @param DatabaseBase $conn
+        * @param float $threshold
         */
        function postConnectionBackoff( $conn, $threshold );
 
        /**
         * Return an estimate of replication lag for each server
         *
-        * @param $serverIndexes
-        * @param $wiki
+        * @param array $serverIndexes
+        * @param string $wiki
         *
         * @return array
         */
@@ -82,8 +82,8 @@ class LoadMonitorNull implements LoadMonitor {
        }
 
        /**
-        * @param $serverIndexes
-        * @param $wiki
+        * @param array $serverIndexes
+        * @param string $wiki
         * @return array
         */
        function getLagTimes( $serverIndexes, $wiki ) {
@@ -98,9 +98,7 @@ class LoadMonitorNull implements LoadMonitor {
  * @ingroup Database
  */
 class LoadMonitorMySQL implements LoadMonitor {
-       /**
-        * @var LoadBalancer
-        */
+       /** @var LoadBalancer */
        public $parent;
 
        /**
@@ -111,16 +109,16 @@ class LoadMonitorMySQL implements LoadMonitor {
        }
 
        /**
-        * @param $loads
-        * @param $group bool
-        * @param $wiki bool
+        * @param array $loads
+        * @param bool $group
+        * @param bool $wiki
         */
        function scaleLoads( &$loads, $group = false, $wiki = false ) {
        }
 
        /**
-        * @param $serverIndexes
-        * @param $wiki
+        * @param array $serverIndexes
+        * @param string $wiki
         * @return array
         */
        function getLagTimes( $serverIndexes, $wiki ) {
@@ -192,8 +190,8 @@ class LoadMonitorMySQL implements LoadMonitor {
        }
 
        /**
-        * @param $conn DatabaseBase
-        * @param $threshold
+        * @param DatabaseBase|DatabaseMySQLBase $conn
+        * @param int $threshold
         * @return int
         */
        function postConnectionBackoff( $conn, $threshold ) {
index e47bc67..3f91e0a 100644 (file)
@@ -246,9 +246,9 @@ class ORMTable extends DBAccessBase implements IORMTable {
         * @param array $conditions
         * @param array $options
         * @param null|string $functionName
-        *
         * @return ResultWrapper
-        * @throws DBQueryError if the quey failed (even if the database was in ignoreErrors mode).
+        * @throws DBQueryError if the query failed (even if the database was in
+        *   ignoreErrors mode).
         */
        public function rawSelect( $fields = null, array $conditions = array(),
                array $options = array(), $functionName = null
@@ -378,7 +378,7 @@ class ORMTable extends DBAccessBase implements IORMTable {
         * @param array $options
         * @param string|null $functionName
         *
-        * @return ResultWrapper
+        * @return stdClass
         */
        public function rawSelectRow( array $fields, array $conditions = array(),
                array $options = array(), $functionName = null
@@ -825,7 +825,7 @@ class ORMTable extends DBAccessBase implements IORMTable {
         * @since 1.20
         *
         * @param stdClass $result
-        *
+        * @throws MWException
         * @return array
         */
        public function getFieldsFromDBResult( stdClass $result ) {
index d5ed250..8c3b671 100644 (file)
@@ -233,11 +233,15 @@ class LinksUpdate extends SqlDataUpdate {
        /**
         * Queue recursive jobs for this page
         *
-        * Which means do LinksUpdate on all templates
-        * that include the current page, using the job queue.
+        * Which means do LinksUpdate on all pages that include the current page,
+        * using the job queue.
         */
        function queueRecursiveJobs() {
                self::queueRecursiveJobsForTable( $this->mTitle, 'templatelinks' );
+               if ( $this->mTitle->getNamespace() == NS_FILE ) {
+                       // Process imagelinks in case the title is or was a redirect
+                       self::queueRecursiveJobsForTable( $this->mTitle, 'imagelinks' );
+               }
        }
 
        /**
@@ -414,6 +418,7 @@ class LinksUpdate extends SqlDataUpdate {
                foreach ( $diffs as $url => $dummy ) {
                        foreach ( wfMakeUrlIndexes( $url ) as $index ) {
                                $arr[] = array(
+                                       'el_id' => $this->mDb->nextSequenceValue( 'externallinks_el_id_seq' ),
                                        'el_from' => $this->mId,
                                        'el_to' => $url,
                                        'el_index' => $index,
index 6e74f2c..b7601e9 100644 (file)
@@ -580,19 +580,8 @@ class DifferenceEngine extends ContextSource {
 
                                $parserOutput = $this->getParserOutput( $wikiPage, $this->mNewRev );
 
-                               # Also try to load it as a redirect
-                               $rt = $this->mNewContent ? $this->mNewContent->getRedirectTarget() : null;
-
-                               if ( $rt ) {
-                                       $article = Article::newFromTitle( $this->mNewPage, $this->getContext() );
-                                       $out->addHTML( $article->viewRedirect( $rt ) );
-
-                                       # WikiPage::getParserOutput() should not return false, but just in case
-                                       if ( $parserOutput ) {
-                                               # Show categories etc.
-                                               $out->addParserOutputNoText( $parserOutput );
-                                       }
-                               } elseif ( $parserOutput ) {
+                               # WikiPage::getParserOutput() should not return false, but just in case
+                               if ( $parserOutput ) {
                                        $out->addParserOutput( $parserOutput );
                                }
                        }
index bb21f1b..f5d63b9 100644 (file)
@@ -104,6 +104,10 @@ abstract class FileBackend {
        /** @var FileJournal */
        protected $fileJournal;
 
+       /** Flags for supported features */
+       const ATTR_HEADERS  = 1;
+       const ATTR_METADATA = 2;
+
        /**
         * Create a new backend instance from configuration.
         * This should only be called from within FileBackendGroup.
@@ -200,6 +204,27 @@ abstract class FileBackend {
                return ( $this->readOnly != '' ) ? $this->readOnly : false;
        }
 
+       /**
+        * Get the a bitfield of extra features supported by the backend medium
+        *
+        * @return integer Bitfield of FileBackend::ATTR_* flags
+        * @since 1.23
+        */
+       public function getFeatures() {
+               return 0;
+       }
+
+       /**
+        * Check if the backend medium supports a field of extra features
+        *
+        * @return integer Bitfield of FileBackend::ATTR_* flags
+        * @return bool
+        * @since 1.23
+        */
+       final public function hasFeatures( $bitfield ) {
+               return ( $this->getFeatures() & $bitfield ) === $bitfield;
+       }
+
        /**
         * This is the main entry point into the backend for write operations.
         * Callers supply an ordered list of operations to perform as a transaction.
@@ -901,6 +926,26 @@ abstract class FileBackend {
         */
        abstract public function getFileContentsMulti( array $params );
 
+       /**
+        * Get metadata about a file at a storage path in the backend.
+        * If the file does not exist, then this returns false.
+        * Otherwise, the result is an associative array that includes:
+        *   - headers  : map of HTTP headers used for GET/HEAD requests (name => value)
+        *   - metadata : map of file metadata (name => value)
+        * Metadata keys and headers names will be returned in all lower-case.
+        * Additional values may be included for internal use only.
+        *
+        * Use FileBackend::hasFeatures() to check how well this is supported.
+        *
+        * @param array $params
+        * $params include:
+        *   - src    : source storage path
+        *   - latest : use the latest available data
+        * @return Array|bool Returns false on failure
+        * @since 1.23
+        */
+       abstract public function getFileXAttributes( array $params );
+
        /**
         * Get the size (bytes) of a file at a storage path in the backend.
         *
index 1c9832d..1b2860a 100644 (file)
@@ -567,6 +567,11 @@ class FileBackendMultiWrite extends FileBackend {
                return $this->backends[$this->masterIndex]->getFileStat( $realParams );
        }
 
+       public function getFileXAttributes( array $params ) {
+               $realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
+               return $this->backends[$this->masterIndex]->getFileXAttributes( $realParams );
+       }
+
        public function getFileContentsMulti( array $params ) {
                $realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
                $contentsM = $this->backends[$this->masterIndex]->getFileContentsMulti( $realParams );
@@ -645,6 +650,10 @@ class FileBackendMultiWrite extends FileBackend {
                return $this->backends[$this->masterIndex]->getFileList( $realParams );
        }
 
+       public function getFeatures() {
+               return $this->backends[$this->masterIndex]->getFeatures();
+       }
+
        public function clearCache( array $paths = null ) {
                foreach ( $this->backends as $backend ) {
                        $realPaths = is_array( $paths ) ? $this->substPaths( $paths, $backend ) : null;
index fe3a068..13f6436 100644 (file)
@@ -655,10 +655,15 @@ abstract class FileBackendStore extends FileBackend {
                                $this->cheapCache->set( $path, 'sha1',
                                        array( 'hash' => $stat['sha1'], 'latest' => $latest ) );
                        }
+                       if ( isset( $stat['xattr'] ) ) { // some backends store headers/metadata
+                               $stat['xattr'] = self::normalizeXAttributes( $stat['xattr'] );
+                               $this->cheapCache->set( $path, 'xattr',
+                                       array( 'map' => $stat['xattr'], 'latest' => $latest ) );
+                       }
                } elseif ( $stat === false ) { // file does not exist
                        $this->cheapCache->set( $path, 'stat', $latest ? 'NOT_EXIST_LATEST' : 'NOT_EXIST' );
-                       $this->cheapCache->set( $path, 'sha1', // the SHA-1 must be false too
-                               array( 'hash' => false, 'latest' => $latest ) );
+                       $this->cheapCache->set( $path, 'xattr', array( 'map' => false, 'latest' => $latest ) );
+                       $this->cheapCache->set( $path, 'sha1', array( 'hash' => false, 'latest' => $latest ) );
                        wfDebug( __METHOD__ . ": File $path does not exist.\n" );
                } else { // an error occurred
                        wfDebug( __METHOD__ . ": Could not stat file $path.\n" );
@@ -697,6 +702,39 @@ abstract class FileBackendStore extends FileBackend {
                return $contents;
        }
 
+       final public function getFileXAttributes( array $params ) {
+               $path = self::normalizeStoragePath( $params['src'] );
+               if ( $path === null ) {
+                       return false; // invalid storage path
+               }
+               $section = new ProfileSection( __METHOD__ . "-{$this->name}" );
+               $latest = !empty( $params['latest'] ); // use latest data?
+               if ( $this->cheapCache->has( $path, 'xattr', self::CACHE_TTL ) ) {
+                       $stat = $this->cheapCache->get( $path, 'xattr' );
+                       // If we want the latest data, check that this cached
+                       // value was in fact fetched with the latest available data.
+                       if ( !$latest || $stat['latest'] ) {
+                               return $stat['map'];
+                       }
+               }
+               wfProfileIn( __METHOD__ . '-miss' );
+               wfProfileIn( __METHOD__ . '-miss-' . $this->name );
+               $fields = $this->doGetFileXAttributes( $params );
+               $fields = is_array( $fields ) ? self::normalizeXAttributes( $fields ) : false;
+               wfProfileOut( __METHOD__ . '-miss-' . $this->name );
+               wfProfileOut( __METHOD__ . '-miss' );
+               $this->cheapCache->set( $path, 'xattr', array( 'map' => $fields, 'latest' => $latest ) );
+               return $fields;
+       }
+
+       /**
+        * @see FileBackendStore::getFileXAttributes()
+        * @return bool|string
+        */
+       protected function doGetFileXAttributes( array $params ) {
+               return array( 'headers' => array(), 'metadata' => array() ); // not supported
+       }
+
        final public function getFileSha1Base36( array $params ) {
                $path = self::normalizeStoragePath( $params['src'] );
                if ( $path === null ) {
@@ -1625,10 +1663,33 @@ abstract class FileBackendStore extends FileBackend {
                                        $this->cheapCache->set( $path, 'sha1',
                                                array( 'hash' => $val['sha1'], 'latest' => $val['latest'] ) );
                                }
+                               if ( isset( $val['xattr'] ) ) { // some backends store headers/metadata
+                                       $val['xattr'] = self::normalizeXAttributes( $val['xattr'] );
+                                       $this->cheapCache->set( $path, 'xattr',
+                                               array( 'map' => $val['xattr'], 'latest' => $val['latest'] ) );
+                               }
                        }
                }
        }
 
+       /**
+        * Normalize file headers/metadata to the FileBackend::getFileXAttributes() format
+        *
+        * @param array $xattr
+        * @return array
+        * @since 1.22
+        */
+       final protected static function normalizeXAttributes( array $xattr ) {
+               $newXAttr = array( 'headers' => array(), 'metadata' => array() );
+               foreach ( $xattr['headers'] as $name => $value ) {
+                       $newXAttr['headers'][strtolower( $name )] = $value;
+               }
+               foreach ( $xattr['metadata'] as $name => $value ) {
+                       $newXAttr['metadata'][strtolower( $name )] = $value;
+               }
+               return $newXAttr;
+       }
+
        /**
         * Set the 'concurrency' option from a list of operation options
         *
index 3924c12..6f40957 100644 (file)
@@ -155,7 +155,9 @@ class MemoryFileBackend extends FileBackendStore {
                        if ( $src === null || !isset( $this->files[$src] ) ) {
                                $fsFile = null;
                        } else {
-                               $fsFile = TempFSFile::factory( 'localcopy_' );
+                               // Create a new temporary file with the same extension...
+                               $ext = FileBackend::extensionFromPath( $src );
+                               $fsFile = TempFSFile::factory( 'localcopy_', $ext );
                                if ( $fsFile ) {
                                        $bytes = file_put_contents( $fsFile->getPath(), $this->files[$src]['data'] );
                                        if ( $bytes !== strlen( $this->files[$src]['data'] ) ) {
index d79ceca..91df61b 100644 (file)
 /**
  * @brief Class for an OpenStack Swift (or Ceph RGW) based file backend.
  *
- * This requires the SwiftCloudFiles MediaWiki extension, which includes
- * the php-cloudfiles library (https://github.com/rackspace/php-cloudfiles).
- * php-cloudfiles requires the curl, fileinfo, and mb_string PHP extensions.
- *
  * Status messages should avoid mentioning the Swift account name.
  * Likewise, error suppression should be used to avoid path disclosure.
  *
  * @since 1.19
  */
 class SwiftFileBackend extends FileBackendStore {
-       /** @var CF_Authentication Swift authentication handler */
-       protected $auth;
+       /** @var MultiHttpClient */
+       protected $http;
 
        /** @var int TTL in seconds */
        protected $authTTL;
 
-       /** @var string Shared secret value for making temp URLs */
-       protected $swiftTempUrlKey;
-
-       /** @var string Username to handle unauthenticated requests */
-       protected $swiftAnonUser;
+       /** @var string Authentication base URL (without version) */
+       protected $swiftAuthUrl;
 
-       /** @var bool Whether CloudFiles CDN is enabled */
-       protected $swiftUseCDN;
+       /** @var string Swift user (account:user) to authenticate as */
+       protected $swiftUser;
 
-       /** @var int How long to cache things in the CDN */
-       protected $swiftCDNExpiry;
+       /** @var string Secret key for user */
+       protected $swiftKey;
 
-       /** @var bool Whether object CDN purging is enabled */
-       protected $swiftCDNPurgable;
+       /** @var string Shared secret value for making temp URLs */
+       protected $swiftTempUrlKey;
 
-       // Rados Gateway specific options
-       /** @var string S3 access key */
+       /** @var string S3 access key (RADOS Gateway) */
        protected $rgwS3AccessKey;
 
-       /** @var string S3 authentication key */
+       /** @var string S3 authentication key (RADOS Gateway) */
        protected $rgwS3SecretKey;
 
-       /** @var CF_Connection Swift connection handle*/
-       protected $conn;
+       /** @var BagOStuff */
+       protected $srvCache;
 
-       /** @var int UNIX timestamp */
-       protected $sessionStarted = 0;
+       /** @var ProcessCacheLRU Container stat cache */
+       protected $containerStatCache;
 
-       /** @var CloudFilesException */
-       protected $connException;
+       /** @var array */
+       protected $authCreds;
 
        /** @var int UNIX timestamp */
-       protected $connErrorTime = 0;
+       protected $authSessionTimestamp = 0;
 
-       /** @var BagOStuff */
-       protected $srvCache;
-
-       /** @var ProcessCacheLRU */
-       protected $connContainerCache; // container object cache
+       /** @var int UNIX timestamp */
+       protected $authErrorTimestamp = null;
 
        /**
         * @see FileBackendStore::__construct()
@@ -92,16 +81,6 @@ class SwiftFileBackend extends FileBackendStore {
         *   - swiftAuthTTL       : Swift authentication TTL (seconds)
         *   - swiftTempUrlKey    : Swift "X-Account-Meta-Temp-URL-Key" value on the account.
         *                          Do not set this until it has been set in the backend.
-        *   - swiftAnonUser      : Swift user used for end-user requests (account:username).
-        *                          If set, then views of public containers are assumed to go
-        *                          through this user. If not set, then public containers are
-        *                          accessible to unauthenticated requests via ".r:*" in the ACL.
-        *   - swiftUseCDN        : Whether a Cloud Files Content Delivery Network is set up
-        *   - swiftCDNExpiry     : How long (in seconds) to store content in the CDN.
-        *                          If files may likely change, this should probably not exceed
-        *                          a few days. For example, deletions may take this long to apply.
-        *                          If object purging is enabled, however, this is not an issue.
-        *   - swiftCDNPurgable   : Whether object purge requests are allowed by the CDN.
         *   - shardViaHashLevels : Map of container names to sharding config with:
         *                             - base   : base of hash characters, 16 or 36
         *                             - levels : the number of hash levels (and digits)
@@ -110,12 +89,12 @@ class SwiftFileBackend extends FileBackendStore {
         *   - cacheAuthInfo      : Whether to cache authentication tokens in APC, XCache, ect.
         *                          If those are not available, then the main cache will be used.
         *                          This is probably insecure in shared hosting environments.
-        *   - rgwS3AccessKey     : Ragos Gateway S3 "access key" value on the account.
+        *   - rgwS3AccessKey     : Rados Gateway S3 "access key" value on the account.
         *                          Do not set this until it has been set in the backend.
         *                          This is used for generating expiring pre-authenticated URLs.
         *                          Only use this when using rgw and to work around
         *                          http://tracker.newdream.net/issues/3454.
-        *   - rgwS3SecretKey     : Ragos Gateway S3 "secret key" value on the account.
+        *   - rgwS3SecretKey     : Rados Gateway S3 "secret key" value on the account.
         *                          Do not set this until it has been set in the backend.
         *                          This is used for generating expiring pre-authenticated URLs.
         *                          Only use this when using rgw and to work around
@@ -123,48 +102,32 @@ class SwiftFileBackend extends FileBackendStore {
         */
        public function __construct( array $config ) {
                parent::__construct( $config );
-               if ( !class_exists( 'CF_Constants' ) ) {
-                       throw new FileBackendException( 'SwiftCloudFiles extension not installed.' );
-               }
                // Required settings
-               $this->auth = new CF_Authentication(
-                       $config['swiftUser'],
-                       $config['swiftKey'],
-                       null, // account; unused
-                       $config['swiftAuthUrl']
-               );
+               $this->swiftAuthUrl = $config['swiftAuthUrl'];
+               $this->swiftUser = $config['swiftUser'];
+               $this->swiftKey = $config['swiftKey'];
                // Optional settings
                $this->authTTL = isset( $config['swiftAuthTTL'] )
                        ? $config['swiftAuthTTL']
                        : 5 * 60; // some sane number
-               $this->swiftAnonUser = isset( $config['swiftAnonUser'] )
-                       ? $config['swiftAnonUser']
-                       : '';
                $this->swiftTempUrlKey = isset( $config['swiftTempUrlKey'] )
                        ? $config['swiftTempUrlKey']
                        : '';
                $this->shardViaHashLevels = isset( $config['shardViaHashLevels'] )
                        ? $config['shardViaHashLevels']
                        : '';
-               $this->swiftUseCDN = isset( $config['swiftUseCDN'] )
-                       ? $config['swiftUseCDN']
-                       : false;
-               $this->swiftCDNExpiry = isset( $config['swiftCDNExpiry'] )
-                       ? $config['swiftCDNExpiry']
-                       : 12 * 3600; // 12 hours is safe (tokens last 24 hours per http://docs.openstack.org)
-               $this->swiftCDNPurgable = isset( $config['swiftCDNPurgable'] )
-                       ? $config['swiftCDNPurgable']
-                       : true;
                $this->rgwS3AccessKey = isset( $config['rgwS3AccessKey'] )
                        ? $config['rgwS3AccessKey']
                        : '';
                $this->rgwS3SecretKey = isset( $config['rgwS3SecretKey'] )
                        ? $config['rgwS3SecretKey']
                        : '';
+               // HTTP helper client
+               $this->http = new MultiHttpClient( array() );
                // Cache container information to mask latency
                $this->memCache = wfGetMainCache();
                // Process cache for container info
-               $this->connContainerCache = new ProcessCacheLRU( 300 );
+               $this->containerStatCache = new ProcessCacheLRU( 300 );
                // Cache auth token information to avoid RTTs
                if ( !empty( $config['cacheAuthInfo'] ) ) {
                        if ( PHP_SAPI === 'cli' ) {
@@ -176,16 +139,13 @@ class SwiftFileBackend extends FileBackendStore {
                                }
                        }
                }
-               $this->srvCache = $this->srvCache ? $this->srvCache : new EmptyBagOStuff();
+               $this->srvCache = $this->srvCache ?: new EmptyBagOStuff();
+       }
+
+       public function getFeatures() {
+               return ( FileBackend::ATTR_HEADERS | FileBackend::ATTR_METADATA );
        }
 
-       /**
-        * @see FileBackendStore::resolveContainerPath()
-        * @param string $container
-        * @param string $relStoragePath
-        * @return string|null Returns null when the URL encoded storage path is
-        *   longer than 1024 characters or not UTF-8 encoded.
-        */
        protected function resolveContainerPath( $container, $relStoragePath ) {
                if ( !mb_check_encoding( $relStoragePath, 'UTF-8' ) ) { // mb_string required by CF
                        return null; // not UTF-8, makes it hard to use CF and the swift HTTP API
@@ -202,48 +162,48 @@ class SwiftFileBackend extends FileBackendStore {
                        return false; // invalid
                }
 
-               try {
-                       $this->getContainer( $container );
-
-                       return true; // container exists
-               } catch ( NoSuchContainerException $e ) {
-               } catch ( CloudFilesException $e ) { // some other exception?
-                       $this->handleException( $e, null, __METHOD__, array( 'path' => $storagePath ) );
-               }
-
-               return false;
+               return is_array( $this->getContainerStat( $container ) );
        }
 
        /**
+        * Sanitize and filter the custom headers from a $params array.
+        * We only allow certain Content- and X-Content- headers.
+        *
         * @param array $headers
-        * @return array
+        * @return array Sanitized value of 'headers' field in $params
         */
-       protected function sanitizeHdrs( array $headers ) {
-               // By default, Swift has annoyingly low maximum header value limits
-               if ( isset( $headers['Content-Disposition'] ) ) {
-                       $headers['Content-Disposition'] = $this->truncDisp( $headers['Content-Disposition'] );
+       protected function sanitizeHdrs( array $params ) {
+               $headers = array();
+
+               // Normalize casing, and strip out illegal headers
+               if ( isset( $params['headers'] )  ) {
+                       foreach ( $params['headers'] as $name => $value ) {
+                               $name = strtolower( $name );
+                               if ( preg_match( '/^content-(type|length)$/', $name ) ) {
+                                       continue; // blacklisted
+                               } elseif ( preg_match( '/^(x-)?content-/', $name ) ) {
+                                       $headers[$name] = $value; // allowed
+                               } elseif ( preg_match( '/^content-(disposition)/', $name ) ) {
+                                       $headers[$name] = $value; // allowed
+                               }
+                       }
                }
-
-               return $headers;
-       }
-
-       /**
-        * @param string $disposition Content-Disposition header value
-        * @return string Truncated Content-Disposition header value to meet Swift limits
-        */
-       protected function truncDisp( $disposition ) {
-               $res = '';
-               foreach ( explode( ';', $disposition ) as $part ) {
-                       $part = trim( $part );
-                       $new = ( $res === '' ) ? $part : "{$res};{$part}";
-                       if ( strlen( $new ) <= 255 ) {
-                               $res = $new;
-                       } else {
-                               break; // too long; sigh
+               // By default, Swift has annoyingly low maximum header value limits
+               if ( isset( $headers['content-disposition'] ) ) {
+                       $disposition = '';
+                       foreach ( explode( ';', $headers['content-disposition'] ) as $part ) {
+                               $part = trim( $part );
+                               $new = ( $disposition === '' ) ? $part : "{$disposition};{$part}";
+                               if ( strlen( $new ) <= 255 ) {
+                                       $disposition = $new;
+                               } else {
+                                       break; // too long; sigh
+                               }
                        }
+                       $headers['content-disposition'] = $disposition;
                }
 
-               return $res;
+               return $headers;
        }
 
        protected function doCreateInternal( array $params ) {
@@ -256,67 +216,44 @@ class SwiftFileBackend extends FileBackendStore {
                        return $status;
                }
 
-               // (a) Check the destination container and object
-               try {
-                       $dContObj = $this->getContainer( $dstCont );
-               } catch ( NoSuchContainerException $e ) {
-                       $status->fatal( 'backend-fail-create', $params['dst'] );
-
-                       return $status;
-               } catch ( CloudFilesException $e ) { // some other exception?
-                       $this->handleException( $e, $status, __METHOD__, $params );
-
-                       return $status;
-               }
-
-               // (b) Get a SHA-1 hash of the object
                $sha1Hash = wfBaseConvert( sha1( $params['content'] ), 16, 36, 31 );
-
-               // (c) Actually create the object
-               try {
-                       // Create a fresh CF_Object with no fields preloaded.
-                       // We don't want to preserve headers, metadata, and such.
-                       $obj = new CF_Object( $dContObj, $dstRel, false, false ); // skip HEAD
-                       $obj->setMetadataValues( array( 'Sha1base36' => $sha1Hash ) );
-                       // Manually set the ETag (https://github.com/rackspace/php-cloudfiles/issues/59).
-                       // The MD5 here will be checked within Swift against its own MD5.
-                       $obj->set_etag( md5( $params['content'] ) );
-                       // Use the same content type as StreamFile for security
-                       $obj->content_type = $this->getContentType( $params['dst'], $params['content'], null );
-                       // Set any other custom headers if requested
-                       if ( isset( $params['headers'] ) ) {
-                               $obj->headers += $this->sanitizeHdrs( $params['headers'] );
-                       }
-                       if ( !empty( $params['async'] ) ) { // deferred
-                               $op = $obj->write_async( $params['content'] );
-                               $status->value = new SwiftFileOpHandle( $this, $params, 'Create', $op );
-                               $status->value->affectedObjects[] = $obj;
-                       } else { // actually write the object in Swift
-                               $obj->write( $params['content'] );
-                               $this->purgeCDNCache( array( $obj ) );
+               $contentType = $this->getContentType( $params['dst'], $params['content'], null );
+
+               $reqs = array( array(
+                       'method'  => 'PUT',
+                       'url'     => array( $dstCont, $dstRel ),
+                       'headers' => array(
+                               'content-length'           => strlen( $params['content'] ),
+                               'etag'                     => md5( $params['content'] ),
+                               'content-type'             => $contentType,
+                               'x-object-meta-sha1base36' => $sha1Hash
+                       ) + $this->sanitizeHdrs( $params ),
+                       'body'    => $params['content']
+               ) );
+
+               $be = $this;
+               $method = __METHOD__;
+               $handler = function( array $request, Status $status ) use ( $be, $method, $params ) {
+                       list( $rcode, $rdesc, $rhdrs, $rbody, $rerr ) = $request['response'];
+                       if ( $rcode === 201 ) {
+                               // good
+                       } elseif ( $rcode === 412 ) {
+                               $status->fatal( 'backend-fail-contenttype', $params['dst'] );
+                       } else {
+                               $be->onError( $status, $method, $params, $rerr, $rcode, $rdesc );
                        }
-               } catch ( CDNNotEnabledException $e ) {
-                       // CDN not enabled; nothing to see here
-               } catch ( BadContentTypeException $e ) {
-                       $status->fatal( 'backend-fail-contenttype', $params['dst'] );
-               } catch ( CloudFilesException $e ) { // some other exception?
-                       $this->handleException( $e, $status, __METHOD__, $params );
+               };
+
+               $opHandle = new SwiftFileOpHandle( $this, $handler, $reqs );
+               if ( !empty( $params['async'] ) ) { // deferred
+                       $status->value = $opHandle;
+               } else { // actually write the object in Swift
+                       $status->merge( current( $this->doExecuteOpHandlesInternal( array( $opHandle ) ) ) );
                }
 
                return $status;
        }
 
-       /**
-        * @see SwiftFileBackend::doExecuteOpHandlesInternal()
-        */
-       protected function getResponseCreate( CF_Async_Op $cfOp, Status $status, array $params ) {
-               try {
-                       $cfOp->getLastResponse();
-               } catch ( BadContentTypeException $e ) {
-                       $status->fatal( 'backend-fail-contenttype', $params['dst'] );
-               }
-       }
-
        protected function doStoreInternal( array $params ) {
                $status = Status::newGood();
 
@@ -327,84 +264,57 @@ class SwiftFileBackend extends FileBackendStore {
                        return $status;
                }
 
-               // (a) Check the destination container and object
-               try {
-                       $dContObj = $this->getContainer( $dstCont );
-               } catch ( NoSuchContainerException $e ) {
-                       $status->fatal( 'backend-fail-copy', $params['src'], $params['dst'] );
-
-                       return $status;
-               } catch ( CloudFilesException $e ) { // some other exception?
-                       $this->handleException( $e, $status, __METHOD__, $params );
-
-                       return $status;
-               }
-
-               // (b) Get a SHA-1 hash of the object
                wfSuppressWarnings();
                $sha1Hash = sha1_file( $params['src'] );
                wfRestoreWarnings();
                if ( $sha1Hash === false ) { // source doesn't exist?
-                       $status->fatal( 'backend-fail-copy', $params['src'], $params['dst'] );
+                       $status->fatal( 'backend-fail-store', $params['src'], $params['dst'] );
 
                        return $status;
                }
                $sha1Hash = wfBaseConvert( $sha1Hash, 16, 36, 31 );
+               $contentType = $this->getContentType( $params['dst'], null, $params['src'] );
 
-               // (c) Actually store the object
-               try {
-                       // Create a fresh CF_Object with no fields preloaded.
-                       // We don't want to preserve headers, metadata, and such.
-                       $obj = new CF_Object( $dContObj, $dstRel, false, false ); // skip HEAD
-                       $obj->setMetadataValues( array( 'Sha1base36' => $sha1Hash ) );
-                       // The MD5 here will be checked within Swift against its own MD5.
-                       $obj->set_etag( md5_file( $params['src'] ) );
-                       // Use the same content type as StreamFile for security
-                       $obj->content_type = $this->getContentType( $params['dst'], null, $params['src'] );
-                       // Set any other custom headers if requested
-                       if ( isset( $params['headers'] ) ) {
-                               $obj->headers += $this->sanitizeHdrs( $params['headers'] );
-                       }
-                       if ( !empty( $params['async'] ) ) { // deferred
-                               wfSuppressWarnings();
-                               $fp = fopen( $params['src'], 'rb' );
-                               wfRestoreWarnings();
-                               if ( !$fp ) {
-                                       $status->fatal( 'backend-fail-copy', $params['src'], $params['dst'] );
-                               } else {
-                                       $op = $obj->write_async( $fp, filesize( $params['src'] ), true );
-                                       $status->value = new SwiftFileOpHandle( $this, $params, 'Store', $op );
-                                       $status->value->resourcesToClose[] = $fp;
-                                       $status->value->affectedObjects[] = $obj;
-                               }
-                       } else { // actually write the object in Swift
-                               $obj->load_from_filename( $params['src'], true ); // calls $obj->write()
-                               $this->purgeCDNCache( array( $obj ) );
-                       }
-               } catch ( CDNNotEnabledException $e ) {
-                       // CDN not enabled; nothing to see here
-               } catch ( BadContentTypeException $e ) {
-                       $status->fatal( 'backend-fail-contenttype', $params['dst'] );
-               } catch ( IOException $e ) {
-                       $status->fatal( 'backend-fail-copy', $params['src'], $params['dst'] );
-               } catch ( CloudFilesException $e ) { // some other exception?
-                       $this->handleException( $e, $status, __METHOD__, $params );
+               $handle = fopen( $params['src'], 'rb+' );
+               if ( $handle === false ) { // source doesn't exist?
+                       $status->fatal( 'backend-fail-store', $params['src'], $params['dst'] );
+
+                       return $status;
                }
 
-               return $status;
-       }
+               $reqs = array( array(
+                       'method'  => 'PUT',
+                       'url'     => array( $dstCont, $dstRel ),
+                       'headers' => array(
+                               'content-length'           => filesize( $params['src'] ),
+                               'etag'                     => md5_file( $params['src'] ),
+                               'content-type'             => $contentType,
+                               'x-object-meta-sha1base36' => $sha1Hash
+                       ) + $this->sanitizeHdrs( $params ),
+                       'body'    => $handle // resource
+               ) );
+
+               $be = $this;
+               $method = __METHOD__;
+               $handler = function( array $request, Status $status ) use ( $be, $method, $params ) {
+                       list( $rcode, $rdesc, $rhdrs, $rbody, $rerr ) = $request['response'];
+                       if ( $rcode === 201 ) {
+                               // good
+                       } elseif ( $rcode === 412 ) {
+                               $status->fatal( 'backend-fail-contenttype', $params['dst'] );
+                       } else {
+                               $be->onError( $status, $method, $params, $rerr, $rcode, $rdesc );
+                       }
+               };
 
-       /**
-        * @see SwiftFileBackend::doExecuteOpHandlesInternal()
-        */
-       protected function getResponseStore( CF_Async_Op $cfOp, Status $status, array $params ) {
-               try {
-                       $cfOp->getLastResponse();
-               } catch ( BadContentTypeException $e ) {
-                       $status->fatal( 'backend-fail-contenttype', $params['dst'] );
-               } catch ( IOException $e ) {
-                       $status->fatal( 'backend-fail-copy', $params['src'], $params['dst'] );
+               $opHandle = new SwiftFileOpHandle( $this, $handler, $reqs );
+               if ( !empty( $params['async'] ) ) { // deferred
+                       $status->value = $opHandle;
+               } else { // actually write the object in Swift
+                       $status->merge( current( $this->doExecuteOpHandlesInternal( array( $opHandle ) ) ) );
                }
+
+               return $status;
        }
 
        protected function doCopyInternal( array $params ) {
@@ -424,62 +334,38 @@ class SwiftFileBackend extends FileBackendStore {
                        return $status;
                }
 
-               // (a) Check the source/destination containers and destination object
-               try {
-                       $sContObj = $this->getContainer( $srcCont );
-                       $dContObj = $this->getContainer( $dstCont );
-               } catch ( NoSuchContainerException $e ) {
-                       if ( empty( $params['ignoreMissingSource'] ) || isset( $sContObj ) ) {
+               $reqs = array( array(
+                       'method'  => 'PUT',
+                       'url'     => array( $dstCont, $dstRel ),
+                       'headers' => array(
+                               'x-copy-from' => '/' . rawurlencode( $srcCont ) .
+                                       '/' . str_replace( "%2F", "/", rawurlencode( $srcRel ) )
+                       ) + $this->sanitizeHdrs( $params ), // extra headers merged into object
+               ) );
+
+               $be = $this;
+               $method = __METHOD__;
+               $handler = function( array $request, Status $status ) use ( $be, $method, $params ) {
+                       list( $rcode, $rdesc, $rhdrs, $rbody, $rerr ) = $request['response'];
+                       if ( $rcode === 201 ) {
+                               // good
+                       } elseif ( $rcode === 404 ) {
                                $status->fatal( 'backend-fail-copy', $params['src'], $params['dst'] );
+                       } else {
+                               $be->onError( $status, $method, $params, $rerr, $rcode, $rdesc );
                        }
+               };
 
-                       return $status;
-               } catch ( CloudFilesException $e ) { // some other exception?
-                       $this->handleException( $e, $status, __METHOD__, $params );
-
-                       return $status;
-               }
-
-               // (b) Actually copy the file to the destination
-               try {
-                       $dstObj = new CF_Object( $dContObj, $dstRel, false, false ); // skip HEAD
-                       $hdrs = array(); // source file headers to override with new values
-                       // Set any other custom headers if requested
-                       if ( isset( $params['headers'] ) ) {
-                               $hdrs += $this->sanitizeHdrs( $params['headers'] );
-                       }
-                       if ( !empty( $params['async'] ) ) { // deferred
-                               $op = $sContObj->copy_object_to_async( $srcRel, $dContObj, $dstRel, null, $hdrs );
-                               $status->value = new SwiftFileOpHandle( $this, $params, 'Copy', $op );
-                               $status->value->affectedObjects[] = $dstObj;
-                       } else { // actually write the object in Swift
-                               $sContObj->copy_object_to( $srcRel, $dContObj, $dstRel, null, $hdrs );
-                               $this->purgeCDNCache( array( $dstObj ) );
-                       }
-               } catch ( CDNNotEnabledException $e ) {
-                       // CDN not enabled; nothing to see here
-               } catch ( NoSuchObjectException $e ) { // source object does not exist
-                       if ( empty( $params['ignoreMissingSource'] ) ) {
-                               $status->fatal( 'backend-fail-copy', $params['src'], $params['dst'] );
-                       }
-               } catch ( CloudFilesException $e ) { // some other exception?
-                       $this->handleException( $e, $status, __METHOD__, $params );
+               $opHandle = new SwiftFileOpHandle( $this, $handler, $reqs );
+               if ( !empty( $params['async'] ) ) { // deferred
+                       $status->value = $opHandle;
+               } else { // actually write the object in Swift
+                       $status->merge( current( $this->doExecuteOpHandlesInternal( array( $opHandle ) ) ) );
                }
 
                return $status;
        }
 
-       /**
-        * @see SwiftFileBackend::doExecuteOpHandlesInternal()
-        */
-       protected function getResponseCopy( CF_Async_Op $cfOp, Status $status, array $params ) {
-               try {
-                       $cfOp->getLastResponse();
-               } catch ( NoSuchObjectException $e ) { // source object does not exist
-                       $status->fatal( 'backend-fail-copy', $params['src'], $params['dst'] );
-               }
-       }
-
        protected function doMoveInternal( array $params ) {
                $status = Status::newGood();
 
@@ -497,65 +383,49 @@ class SwiftFileBackend extends FileBackendStore {
                        return $status;
                }
 
-               // (a) Check the source/destination containers and destination object
-               try {
-                       $sContObj = $this->getContainer( $srcCont );
-                       $dContObj = $this->getContainer( $dstCont );
-               } catch ( NoSuchContainerException $e ) {
-                       if ( empty( $params['ignoreMissingSource'] ) || isset( $sContObj ) ) {
-                               $status->fatal( 'backend-fail-move', $params['src'], $params['dst'] );
-                       }
-
-                       return $status;
-               } catch ( CloudFilesException $e ) { // some other exception?
-                       $this->handleException( $e, $status, __METHOD__, $params );
-
-                       return $status;
+               $reqs = array(
+                       array(
+                               'method'  => 'PUT',
+                               'url'     => array( $dstCont, $dstRel ),
+                               'headers' => array(
+                                       'x-copy-from' => '/' . rawurlencode( $srcCont ) .
+                                               '/' . str_replace( "%2F", "/", rawurlencode( $srcRel ) )
+                               ) + $this->sanitizeHdrs( $params ) // extra headers merged into object
+                       )
+               );
+               if ( "{$srcCont}/{$srcRel}" !== "{$dstCont}/{$dstRel}" ) {
+                       $reqs[] = array(
+                               'method'  => 'DELETE',
+                               'url'     => array( $srcCont, $srcRel ),
+                               'headers' => array()
+                       );
                }
 
-               // (b) Actually move the file to the destination
-               try {
-                       $srcObj = new CF_Object( $sContObj, $srcRel, false, false ); // skip HEAD
-                       $dstObj = new CF_Object( $dContObj, $dstRel, false, false ); // skip HEAD
-                       $hdrs = array(); // source file headers to override with new values
-                       // Set any other custom headers if requested
-                       if ( isset( $params['headers'] ) ) {
-                               $hdrs += $this->sanitizeHdrs( $params['headers'] );
-                       }
-                       if ( !empty( $params['async'] ) ) { // deferred
-                               $op = $sContObj->move_object_to_async( $srcRel, $dContObj, $dstRel, null, $hdrs );
-                               $status->value = new SwiftFileOpHandle( $this, $params, 'Move', $op );
-                               $status->value->affectedObjects[] = $srcObj;
-                               $status->value->affectedObjects[] = $dstObj;
-                       } else { // actually write the object in Swift
-                               $sContObj->move_object_to( $srcRel, $dContObj, $dstRel, null, $hdrs );
-                               $this->purgeCDNCache( array( $srcObj ) );
-                               $this->purgeCDNCache( array( $dstObj ) );
-                       }
-               } catch ( CDNNotEnabledException $e ) {
-                       // CDN not enabled; nothing to see here
-               } catch ( NoSuchObjectException $e ) { // source object does not exist
-                       if ( empty( $params['ignoreMissingSource'] ) ) {
+               $be = $this;
+               $method = __METHOD__;
+               $handler = function( array $request, Status $status ) use ( $be, $method, $params ) {
+                       list( $rcode, $rdesc, $rhdrs, $rbody, $rerr ) = $request['response'];
+                       if ( $request['method'] === 'PUT' && $rcode === 201 ) {
+                               // good
+                       } elseif ( $request['method'] === 'DELETE' && $rcode === 204 ) {
+                               // good
+                       } elseif ( $rcode === 404 ) {
                                $status->fatal( 'backend-fail-move', $params['src'], $params['dst'] );
+                       } else {
+                               $be->onError( $status, $method, $params, $rerr, $rcode, $rdesc );
                        }
-               } catch ( CloudFilesException $e ) { // some other exception?
-                       $this->handleException( $e, $status, __METHOD__, $params );
+               };
+
+               $opHandle = new SwiftFileOpHandle( $this, $handler, $reqs );
+               if ( !empty( $params['async'] ) ) { // deferred
+                       $status->value = $opHandle;
+               } else { // actually move the object in Swift
+                       $status->merge( current( $this->doExecuteOpHandlesInternal( array( $opHandle ) ) ) );
                }
 
                return $status;
        }
 
-       /**
-        * @see SwiftFileBackend::doExecuteOpHandlesInternal()
-        */
-       protected function getResponseMove( CF_Async_Op $cfOp, Status $status, array $params ) {
-               try {
-                       $cfOp->getLastResponse();
-               } catch ( NoSuchObjectException $e ) { // source object does not exist
-                       $status->fatal( 'backend-fail-move', $params['src'], $params['dst'] );
-               }
-       }
-
        protected function doDeleteInternal( array $params ) {
                $status = Status::newGood();
 
@@ -566,49 +436,38 @@ class SwiftFileBackend extends FileBackendStore {
                        return $status;
                }
 
-               try {
-                       $sContObj = $this->getContainer( $srcCont );
-                       $srcObj = new CF_Object( $sContObj, $srcRel, false, false ); // skip HEAD
-                       if ( !empty( $params['async'] ) ) { // deferred
-                               $op = $sContObj->delete_object_async( $srcRel );
-                               $status->value = new SwiftFileOpHandle( $this, $params, 'Delete', $op );
-                               $status->value->affectedObjects[] = $srcObj;
-                       } else { // actually write the object in Swift
-                               $sContObj->delete_object( $srcRel );
-                               $this->purgeCDNCache( array( $srcObj ) );
-                       }
-               } catch ( CDNNotEnabledException $e ) {
-                       // CDN not enabled; nothing to see here
-               } catch ( NoSuchContainerException $e ) {
-                       if ( empty( $params['ignoreMissingSource'] ) ) {
-                               $status->fatal( 'backend-fail-delete', $params['src'] );
-                       }
-               } catch ( NoSuchObjectException $e ) {
-                       if ( empty( $params['ignoreMissingSource'] ) ) {
-                               $status->fatal( 'backend-fail-delete', $params['src'] );
+               $reqs = array(
+                       array(
+                               'method'  => 'DELETE',
+                               'url'     => array( $srcCont, $srcRel ),
+                               'headers' => array()
+               ) );
+
+               $be = $this;
+               $method = __METHOD__;
+               $handler = function( array $request, Status $status ) use ( $be, $method, $params ) {
+                       list( $rcode, $rdesc, $rhdrs, $rbody, $rerr ) = $request['response'];
+                       if ( $rcode === 204 ) {
+                               // good
+                       } elseif ( $rcode === 404 ) {
+                               if ( empty( $params['ignoreMissingSource'] ) ) {
+                                       $status->fatal( 'backend-fail-delete', $params['src'] );
+                               }
+                       } else {
+                               $be->onError( $status, $method, $params, $rerr, $rcode, $rdesc );
                        }
-               } catch ( CloudFilesException $e ) { // some other exception?
-                       $this->handleException( $e, $status, __METHOD__, $params );
+               };
+
+               $opHandle = new SwiftFileOpHandle( $this, $handler, $reqs );
+               if ( !empty( $params['async'] ) ) { // deferred
+                       $status->value = $opHandle;
+               } else { // actually delete the object in Swift
+                       $status->merge( current( $this->doExecuteOpHandlesInternal( array( $opHandle ) ) ) );
                }
 
                return $status;
        }
 
-       /**
-        * @see SwiftFileBackend::doExecuteOpHandlesInternal()
-        */
-       protected function getResponseDelete( CF_Async_Op $cfOp, Status $status, array $params ) {
-               try {
-                       $cfOp->getLastResponse();
-               } catch ( NoSuchContainerException $e ) {
-                       $status->fatal( 'backend-fail-delete', $params['src'] );
-               } catch ( NoSuchObjectException $e ) {
-                       if ( empty( $params['ignoreMissingSource'] ) ) {
-                               $status->fatal( 'backend-fail-delete', $params['src'] );
-                       }
-               }
-       }
-
        protected function doDescribeInternal( array $params ) {
                $status = Status::newGood();
 
@@ -619,25 +478,48 @@ class SwiftFileBackend extends FileBackendStore {
                        return $status;
                }
 
-               try {
-                       $sContObj = $this->getContainer( $srcCont );
-                       // Get the latest version of the current metadata
-                       $srcObj = $sContObj->get_object( $srcRel,
-                               $this->headersFromParams( array( 'latest' => true ) ) );
-                       // Merge in the metadata updates...
-                       if ( isset( $params['headers'] ) ) {
-                               $srcObj->headers = $this->sanitizeHdrs( $params['headers'] ) + $srcObj->headers;
-                       }
-                       $srcObj->sync_metadata(); // save to Swift
-                       $this->purgeCDNCache( array( $srcObj ) );
-               } catch ( CDNNotEnabledException $e ) {
-                       // CDN not enabled; nothing to see here
-               } catch ( NoSuchContainerException $e ) {
-                       $status->fatal( 'backend-fail-describe', $params['src'] );
-               } catch ( NoSuchObjectException $e ) {
+               // Fetch the old object headers/metadata...this should be in stat cache by now
+               $stat = $this->getFileStat( array( 'src' => $params['src'], 'latest' => 1 ) );
+               if ( $stat && !isset( $stat['xattr'] ) ) { // older cache entry
+                       $stat = $this->doGetFileStat( array( 'src' => $params['src'], 'latest' => 1 ) );
+               }
+               if ( !$stat ) {
                        $status->fatal( 'backend-fail-describe', $params['src'] );
-               } catch ( CloudFilesException $e ) { // some other exception?
-                       $this->handleException( $e, $status, __METHOD__, $params );
+
+                       return $status;
+               }
+
+               // POST clears prior headers, so we need to merge the changes in to the old ones
+               $metaHdrs = array();
+               foreach ( $stat['xattr']['metadata'] as $name => $value ) {
+                       $metaHdrs["x-object-meta-$name"] = $value;
+               }
+               $customHdrs = $this->sanitizeHdrs( $params ) + $stat['xattr']['headers'];
+
+               $reqs = array( array(
+                       'method'  => 'POST',
+                       'url'     => array( $srcCont, $srcRel ),
+                       'headers' => $metaHdrs + $customHdrs
+               ) );
+
+               $be = $this;
+               $method = __METHOD__;
+               $handler = function( array $request, Status $status ) use ( $be, $method, $params ) {
+                       list( $rcode, $rdesc, $rhdrs, $rbody, $rerr ) = $request['response'];
+                       if ( $rcode === 202 ) {
+                               // good
+                       } elseif ( $rcode === 404 ) {
+                               $status->fatal( 'backend-fail-describe', $params['src'] );
+                       } else {
+                               $be->onError( $status, $method, $params, $rerr, $rcode, $rdesc );
+                       }
+               };
+
+               $opHandle = new SwiftFileOpHandle( $this, $handler, $reqs );
+               if ( !empty( $params['async'] ) ) { // deferred
+                       $status->value = $opHandle;
+               } else { // actually change the object in Swift
+                       $status->merge( current( $this->doExecuteOpHandlesInternal( array( $opHandle ) ) ) );
                }
 
                return $status;
@@ -647,119 +529,61 @@ class SwiftFileBackend extends FileBackendStore {
                $status = Status::newGood();
 
                // (a) Check if container already exists
-               try {
-                       $this->getContainer( $fullCont );
-
-                       // NoSuchContainerException not thrown: container must exist
-                       return $status; // already exists
-               } catch ( NoSuchContainerException $e ) {
-                       // NoSuchContainerException thrown: container does not exist
-               } catch ( CloudFilesException $e ) { // some other exception?
-                       $this->handleException( $e, $status, __METHOD__, $params );
-
+               $stat = $this->getContainerStat( $fullCont );
+               if ( is_array( $stat ) ) {
+                       return $status; // already there
+               } elseif ( $stat === null ) {
+                       $status->fatal( 'backend-fail-internal', $this->name );
                        return $status;
                }
 
-               // (b) Create container as needed
-               try {
-                       $contObj = $this->createContainer( $fullCont );
-                       if ( !empty( $params['noAccess'] ) ) {
-                               // Make container private to end-users...
-                               $status->merge( $this->doSecureInternal( $fullCont, $dir, $params ) );
-                       } else {
-                               // Make container public to end-users...
-                               $status->merge( $this->doPublishInternal( $fullCont, $dir, $params ) );
-                       }
-                       if ( $this->swiftUseCDN ) { // Rackspace style CDN
-                               $contObj->make_public( $this->swiftCDNExpiry );
-                       }
-               } catch ( CDNNotEnabledException $e ) {
-                       // CDN not enabled; nothing to see here
-               } catch ( CloudFilesException $e ) { // some other exception?
-                       $this->handleException( $e, $status, __METHOD__, $params );
-
-                       return $status;
+               // (b) Create container as needed with proper ACLs
+               if ( $stat === false ) {
+                       $params['op'] = 'prepare';
+                       $status->merge( $this->createContainer( $fullCont, $params ) );
                }
 
                return $status;
        }
 
-       /**
-        * @see FileBackendStore::doSecureInternal()
-        * @param string $fullCont
-        * @param string $dir
-        * @param array $params
-        * @return Status
-        */
        protected function doSecureInternal( $fullCont, $dir, array $params ) {
                $status = Status::newGood();
                if ( empty( $params['noAccess'] ) ) {
                        return $status; // nothing to do
                }
 
-               // Restrict container from end-users...
-               try {
-                       // doPrepareInternal() should have been called,
-                       // so the Swift container should already exist...
-                       $contObj = $this->getContainer( $fullCont ); // normally a cache hit
-                       // NoSuchContainerException not thrown: container must exist
-
+               $stat = $this->getContainerStat( $fullCont );
+               if ( is_array( $stat ) ) {
                        // Make container private to end-users...
                        $status->merge( $this->setContainerAccess(
-                               $contObj,
-                               array( $this->auth->username ), // read
-                               array( $this->auth->username ) // write
+                               $fullCont,
+                               array( $this->swiftUser ), // read
+                               array( $this->swiftUser ) // write
                        ) );
-                       if ( $this->swiftUseCDN && $contObj->is_public() ) { // Rackspace style CDN
-                               $contObj->make_private();
-                       }
-               } catch ( CDNNotEnabledException $e ) {
-                       // CDN not enabled; nothing to see here
-               } catch ( CloudFilesException $e ) { // some other exception?
-                       $this->handleException( $e, $status, __METHOD__, $params );
+               } elseif ( $stat === false ) {
+                       $status->fatal( 'backend-fail-usable', $params['dir'] );
+               } else {
+                       $status->fatal( 'backend-fail-internal', $this->name );
                }
 
                return $status;
        }
 
-       /**
-        * @see FileBackendStore::doPublishInternal()
-        * @param string $fullCont
-        * @param string $dir
-        * @param array $params
-        * @return Status
-        */
        protected function doPublishInternal( $fullCont, $dir, array $params ) {
                $status = Status::newGood();
 
-               // Unrestrict container from end-users...
-               try {
-                       // doPrepareInternal() should have been called,
-                       // so the Swift container should already exist...
-                       $contObj = $this->getContainer( $fullCont ); // normally a cache hit
-                       // NoSuchContainerException not thrown: container must exist
-
+               $stat = $this->getContainerStat( $fullCont );
+               if ( is_array( $stat ) ) {
                        // Make container public to end-users...
-                       if ( $this->swiftAnonUser != '' ) {
-                               $status->merge( $this->setContainerAccess(
-                                       $contObj,
-                                       array( $this->auth->username, $this->swiftAnonUser ), // read
-                                       array( $this->auth->username, $this->swiftAnonUser ) // write
-                               ) );
-                       } else {
-                               $status->merge( $this->setContainerAccess(
-                                       $contObj,
-                                       array( $this->auth->username, '.r:*' ), // read
-                                       array( $this->auth->username ) // write
-                               ) );
-                       }
-                       if ( $this->swiftUseCDN && !$contObj->is_public() ) { // Rackspace style CDN
-                               $contObj->make_public();
-                       }
-               } catch ( CDNNotEnabledException $e ) {
-                       // CDN not enabled; nothing to see here
-               } catch ( CloudFilesException $e ) { // some other exception?
-                       $this->handleException( $e, $status, __METHOD__, $params );
+                       $status->merge( $this->setContainerAccess(
+                               $fullCont,
+                               array( $this->swiftUser, '.r:*' ), // read
+                               array( $this->swiftUser ) // write
+                       ) );
+               } elseif ( $stat === false ) {
+                       $status->fatal( 'backend-fail-usable', $params['dir'] );
+               } else {
+                       $status->fatal( 'backend-fail-internal', $this->name );
                }
 
                return $status;
@@ -774,29 +598,18 @@ class SwiftFileBackend extends FileBackendStore {
                }
 
                // (a) Check the container
-               try {
-                       $contObj = $this->getContainer( $fullCont, true );
-               } catch ( NoSuchContainerException $e ) {
+               $stat = $this->getContainerStat( $fullCont, true );
+               if ( $stat === false ) {
                        return $status; // ok, nothing to do
-               } catch ( CloudFilesException $e ) { // some other exception?
-                       $this->handleException( $e, $status, __METHOD__, $params );
-
+               } elseif ( !is_array( $stat ) ) {
+                       $status->fatal( 'backend-fail-internal', $this->name );
                        return $status;
                }
 
                // (b) Delete the container if empty
-               if ( $contObj->object_count == 0 ) {
-                       try {
-                               $this->deleteContainer( $fullCont );
-                       } catch ( NoSuchContainerException $e ) {
-                               return $status; // race?
-                       } catch ( NonEmptyContainerException $e ) {
-                               return $status; // race? consistency delay?
-                       } catch ( CloudFilesException $e ) { // some other exception?
-                               $this->handleException( $e, $status, __METHOD__, $params );
-
-                               return $status;
-                       }
+               if ( $stat['count'] == 0 ) {
+                       $params['op'] = 'clean';
+                       $status->merge( $this->deleteContainer( $fullCont, $params ) );
                }
 
                return $status;
@@ -808,22 +621,51 @@ class SwiftFileBackend extends FileBackendStore {
                        return false; // invalid storage path
                }
 
-               $stat = false;
-               try {
-                       $contObj = $this->getContainer( $srcCont );
-                       $srcObj = $contObj->get_object( $srcRel, $this->headersFromParams( $params ) );
-                       $this->addMissingMetadata( $srcObj, $params['src'] );
+               $auth = $this->getAuthentication();
+               if ( !$auth ) {
+                       return null;
+               }
+
+               // (a) Check the container
+               $cstat = $this->getContainerStat( $srcCont, true );
+               if ( $cstat === false ) {
+                       return false; // ok, nothing to do
+               } elseif ( !is_array( $cstat ) ) {
+                       return null;
+               }
+
+               // (b) Check the file
+               list( $rcode, $rdesc, $rhdrs, $rbody, $rerr ) = $this->http->run( array(
+                       'method'  => 'HEAD',
+                       'url'     => $this->storageUrl( $auth, $srcCont, $srcRel ),
+                       'headers' => $this->authTokenHeaders( $auth )
+               ) );
+               if ( $rcode === 200 || $rcode === 204 ) {
+                       // Update the object if it is missing some headers
+                       $rhdrs = $this->addMissingMetadata( $rhdrs, $params['src'] );
+                       // Fetch all of the custom metadata headers
+                       $metadata = array();
+                       foreach ( $rhdrs as $name => $value ) {
+                               if ( strpos( $name, 'x-object-meta-' ) === 0 ) {
+                                       $metadata[substr( $name, strlen( 'x-object-meta-' ) )] = $value;
+                               }
+                       }
+                       // Fetch all of the custom raw HTTP headers
+                       $headers = $this->sanitizeHdrs( array( 'headers' => $rhdrs ) );
                        $stat = array(
                                // Convert various random Swift dates to TS_MW
-                               'mtime' => $this->convertSwiftDate( $srcObj->last_modified, TS_MW ),
-                               'size' => (int)$srcObj->content_length,
-                               'sha1' => $srcObj->getMetadataValue( 'Sha1base36' )
+                               'mtime' => $this->convertSwiftDate( $rhdrs['last-modified'], TS_MW ),
+                               // Empty objects actually return no content-length header in Ceph
+                               'size'  => isset( $rhdrs['content-length'] ) ? (int)$rhdrs['content-length'] : 0,
+                               'sha1'  => $rhdrs[ 'x-object-meta-sha1base36'],
+                               'md5'   => ctype_xdigit( $rhdrs['etag'] ) ? $rhdrs['etag'] : null,
+                               'xattr' => array( 'metadata' => $metadata, 'headers' => $headers )
                        );
-               } catch ( NoSuchContainerException $e ) {
-               } catch ( NoSuchObjectException $e ) {
-               } catch ( CloudFilesException $e ) { // some other exception?
+               } elseif ( $rcode === 404 ) {
+                       $stat = false;
+               } else {
                        $stat = null;
-                       $this->handleException( $e, null, __METHOD__, $params );
+                       $this->onError( null, __METHOD__, $params, $rerr, $rcode, $rdesc );
                }
 
                return $stat;
@@ -851,17 +693,24 @@ class SwiftFileBackend extends FileBackendStore {
        /**
         * Fill in any missing object metadata and save it to Swift
         *
-        * @param CF_Object $obj
+        * @param array $objHdrs Object response headers
         * @param string $path Storage path to object
-        * @return bool Success
-        * @throws Exception cloudfiles exceptions
+        * @return array New headers
         */
-       protected function addMissingMetadata( CF_Object $obj, $path ) {
-               if ( $obj->getMetadataValue( 'Sha1base36' ) !== null ) {
-                       return true; // nothing to do
+       protected function addMissingMetadata( array $objHdrs, $path ) {
+               if ( isset( $objHdrs['x-object-meta-sha1base36'] ) ) {
+                       return $objHdrs; // nothing to do
                }
-               wfProfileIn( __METHOD__ );
+
+               $section = new ProfileSection( __METHOD__ );
                trigger_error( "$path was not stored with SHA-1 metadata.", E_USER_WARNING );
+
+               $auth = $this->getAuthentication();
+               if ( !$auth ) {
+                       $objHdrs['x-object-meta-sha1base36'] = false;
+                       return false; // failed
+               }
+
                $status = Status::newGood();
                $scopeLockS = $this->getScopedFileLocks( array( $path ), LockManager::LOCK_UW, $status );
                if ( $status->isOK() ) {
@@ -869,17 +718,21 @@ class SwiftFileBackend extends FileBackendStore {
                        if ( $tmpFile ) {
                                $hash = $tmpFile->getSha1Base36();
                                if ( $hash !== false ) {
-                                       $obj->setMetadataValues( array( 'Sha1base36' => $hash ) );
-                                       $obj->sync_metadata(); // save to Swift
-                                       wfProfileOut( __METHOD__ );
-
-                                       return true; // success
+                                       $objHdrs['x-object-meta-sha1base36'] = $hash;
+                                       list( $srcCont, $srcRel ) = $this->resolveStoragePathReal( $path );
+                                       list( $rcode, $rdesc, $rhdrs, $rbody, $rerr ) = $this->http->run( array(
+                                               'method'  => 'POST',
+                                               'url'     => $this->storageUrl( $auth, $srcCont, $srcRel ),
+                                               'headers' => $this->authTokenHeaders( $auth ) + $objHdrs
+                                       ) );
+                                       if ( $rcode >= 200 && $rcode <= 299 ) {
+                                               return true; // success
+                                       }
                                }
                        }
                }
                trigger_error( "Unable to set SHA-1 metadata for $path", E_USER_WARNING );
-               $obj->setMetadataValues( array( 'Sha1base36' => false ) );
-               wfProfileOut( __METHOD__ );
+               $objHdrs['x-object-meta-sha1base36'] = false;
 
                return false; // failed
        }
@@ -887,91 +740,62 @@ class SwiftFileBackend extends FileBackendStore {
        protected function doGetFileContentsMulti( array $params ) {
                $contents = array();
 
+               $auth = $this->getAuthentication();
+
                $ep = array_diff_key( $params, array( 'srcs' => 1 ) ); // for error logging
                // Blindly create tmp files and stream to them, catching any exception if the file does
                // not exist. Doing stats here is useless and will loop infinitely in addMissingMetadata().
                foreach ( array_chunk( $params['srcs'], $params['concurrency'] ) as $pathBatch ) {
-                       $cfOps = array(); // (path => CF_Async_Op)
+                       $reqs = array(); // (path => op)
 
                        foreach ( $pathBatch as $path ) { // each path in this concurrent batch
                                list( $srcCont, $srcRel ) = $this->resolveStoragePathReal( $path );
-                               if ( $srcRel === null ) {
+                               if ( $srcRel === null || !$auth ) {
                                        $contents[$path] = false;
                                        continue;
                                }
                                $data = false;
-                               try {
-                                       $sContObj = $this->getContainer( $srcCont );
-                                       $obj = new CF_Object( $sContObj, $srcRel, false, false ); // skip HEAD
-                                       // Create a new temporary memory file...
-                                       $handle = fopen( 'php://temp', 'wb' );
-                                       if ( $handle ) {
-                                               $headers = $this->headersFromParams( $params );
-                                               if ( count( $pathBatch ) > 1 ) {
-                                                       $cfOps[$path] = $obj->stream_async( $handle, $headers );
-                                                       $cfOps[$path]->_file_handle = $handle; // close this later
-                                               } else {
-                                                       $obj->stream( $handle, $headers );
-                                                       rewind( $handle ); // start from the beginning
-                                                       $data = stream_get_contents( $handle );
-                                                       fclose( $handle );
-                                               }
-                                       } else {
-                                               $data = false;
-                                       }
-                               } catch ( NoSuchContainerException $e ) {
-                                       $data = false;
-                               } catch ( NoSuchObjectException $e ) {
-                                       $data = false;
-                               } catch ( CloudFilesException $e ) { // some other exception?
+                               // Create a new temporary memory file...
+                               $handle = fopen( 'php://temp', 'wb' );
+                               if ( $handle ) {
+                                       $reqs[$path] = array(
+                                               'method'  => 'GET',
+                                               'url'     => $this->storageUrl( $auth, $srcCont, $srcRel ),
+                                               'headers' => $this->authTokenHeaders( $auth )
+                                                       + $this->headersFromParams( $params ),
+                                               'stream'  => $handle,
+                                       );
+                               } else {
                                        $data = false;
-                                       $this->handleException( $e, null, __METHOD__, array( 'src' => $path ) + $ep );
                                }
                                $contents[$path] = $data;
                        }
 
-                       $batch = new CF_Async_Op_Batch( $cfOps );
-                       $cfOps = $batch->execute();
-                       foreach ( $cfOps as $path => $cfOp ) {
-                               try {
-                                       $cfOp->getLastResponse();
-                                       rewind( $cfOp->_file_handle ); // start from the beginning
-                                       $contents[$path] = stream_get_contents( $cfOp->_file_handle );
-                               } catch ( NoSuchContainerException $e ) {
-                                       $contents[$path] = false;
-                               } catch ( NoSuchObjectException $e ) {
+                       $reqs = $this->http->runMulti( $reqs );
+                       foreach ( $reqs as $path => $op ) {
+                               list( $rcode, $rdesc, $rhdrs, $rbody, $rerr ) = $op['response'];
+                               if ( $rcode >= 200 && $rcode <= 299 ) {
+                                       rewind( $op['stream'] ); // start from the beginning
+                                       $contents[$path] = stream_get_contents( $op['stream'] );
+                               } elseif ( $rcode === 404 ) {
                                        $contents[$path] = false;
-                               } catch ( CloudFilesException $e ) { // some other exception?
-                                       $contents[$path] = false;
-                                       $this->handleException( $e, null, __METHOD__, array( 'src' => $path ) + $ep );
+                               } else {
+                                       $this->onError( null, __METHOD__,
+                                               array( 'src' => $path ) + $ep, $rerr, $rcode, $rdesc );
                                }
-                               fclose( $cfOp->_file_handle ); // close open handle
+                               fclose( $op['stream'] ); // close open handle
                        }
                }
 
                return $contents;
        }
 
-       /**
-        * @see FileBackendStore::doDirectoryExists()
-        * @param string $fullCont
-        * @param string $dir
-        * @param array $params
-        * @return bool|null
-        */
        protected function doDirectoryExists( $fullCont, $dir, array $params ) {
-               try {
-                       $container = $this->getContainer( $fullCont );
-                       $prefix = ( $dir == '' ) ? null : "{$dir}/";
-
-                       return ( count( $container->list_objects( 1, null, $prefix ) ) > 0 );
-               } catch ( NoSuchContainerException $e ) {
-                       return false;
-               } catch ( CloudFilesException $e ) { // some other exception?
-                       $this->handleException( $e, null, __METHOD__,
-                               array( 'cont' => $fullCont, 'dir' => $dir ) );
+               $prefix = ( $dir == '' ) ? null : "{$dir}/";
+               $status = $this->objectListing( $fullCont, 'names', 1, null, $prefix );
+               if ( $status->isOk() ) {
+                       return ( count( $status->value ) );
                }
-
                return null; // error
        }
 
@@ -1015,63 +839,63 @@ class SwiftFileBackend extends FileBackendStore {
                }
 
                $section = new ProfileSection( __METHOD__ . '-' . $this->name );
-               try {
-                       $container = $this->getContainer( $fullCont );
-                       $prefix = ( $dir == '' ) ? null : "{$dir}/";
-                       // Non-recursive: only list dirs right under $dir
-                       if ( !empty( $params['topOnly'] ) ) {
-                               $objects = $container->list_objects( $limit, $after, $prefix, null, '/' );
-                               foreach ( $objects as $object ) { // files and directories
-                                       if ( substr( $object, -1 ) === '/' ) {
-                                               $dirs[] = $object; // directories end in '/'
-                                       }
+
+               $prefix = ( $dir == '' ) ? null : "{$dir}/";
+               // Non-recursive: only list dirs right under $dir
+               if ( !empty( $params['topOnly'] ) ) {
+                       $status = $this->objectListing( $fullCont, 'names', $limit, $after, $prefix, '/' );
+                       if ( !$status->isOk() ) {
+                               return $dirs; // error
+                       }
+                       $objects = $status->value;
+                       foreach ( $objects as $object ) { // files and directories
+                               if ( substr( $object, -1 ) === '/' ) {
+                                       $dirs[] = $object; // directories end in '/'
                                }
-                       // Recursive: list all dirs under $dir and its subdirs
-                       } else {
-                               // Get directory from last item of prior page
-                               $lastDir = $this->getParentDir( $after ); // must be first page
-                               $objects = $container->list_objects( $limit, $after, $prefix );
-                               foreach ( $objects as $object ) { // files
-                                       $objectDir = $this->getParentDir( $object ); // directory of object
-                                       if ( $objectDir !== false && $objectDir !== $dir ) {
-                                               // Swift stores paths in UTF-8, using binary sorting.
-                                               // See function "create_container_table" in common/db.py.
-                                               // If a directory is not "greater" than the last one,
-                                               // then it was already listed by the calling iterator.
-                                               if ( strcmp( $objectDir, $lastDir ) > 0 ) {
-                                                       $pDir = $objectDir;
-                                                       do { // add dir and all its parent dirs
-                                                               $dirs[] = "{$pDir}/";
-                                                               $pDir = $this->getParentDir( $pDir );
-                                                       } while ( $pDir !== false // sanity
-                                                               && strcmp( $pDir, $lastDir ) > 0 // not done already
-                                                               && strlen( $pDir ) > strlen( $dir ) // within $dir
-                                                       );
-                                               }
-                                               $lastDir = $objectDir;
+                       }
+               // Recursive: list all dirs under $dir and its subdirs
+               } else {
+                       $getParentDir = function( $path ) {
+                               return ( strpos( $path, '/' ) !== false ) ? dirname( $path ) : false;
+                       };
+                       // Get directory from last item of prior page
+                       $lastDir = $getParentDir( $after ); // must be first page
+                       $status = $this->objectListing( $fullCont, 'names', $limit, $after, $prefix );
+                       if ( !$status->isOk() ) {
+                               return $dirs; // error
+                       }
+                       $objects = $status->value;
+                       foreach ( $objects as $object ) { // files
+                               $objectDir = $getParentDir( $object ); // directory of object
+                               if ( $objectDir !== false && $objectDir !== $dir ) {
+                                       // Swift stores paths in UTF-8, using binary sorting.
+                                       // See function "create_container_table" in common/db.py.
+                                       // If a directory is not "greater" than the last one,
+                                       // then it was already listed by the calling iterator.
+                                       if ( strcmp( $objectDir, $lastDir ) > 0 ) {
+                                               $pDir = $objectDir;
+                                               do { // add dir and all its parent dirs
+                                                       $dirs[] = "{$pDir}/";
+                                                       $pDir = $getParentDir( $pDir );
+                                               } while ( $pDir !== false // sanity
+                                                       && strcmp( $pDir, $lastDir ) > 0 // not done already
+                                                       && strlen( $pDir ) > strlen( $dir ) // within $dir
+                                               );
                                        }
+                                       $lastDir = $objectDir;
                                }
                        }
-                       // Page on the unfiltered directory listing (what is returned may be filtered)
-                       if ( count( $objects ) < $limit ) {
-                               $after = INF; // avoid a second RTT
-                       } else {
-                               $after = end( $objects ); // update last item
-                       }
-               } catch ( NoSuchContainerException $e ) {
-               } catch ( CloudFilesException $e ) { // some other exception?
-                       $this->handleException( $e, null, __METHOD__,
-                               array( 'cont' => $fullCont, 'dir' => $dir ) );
-                       throw new FileBackendError( "Got " . get_class( $e ) . " exception." );
+               }
+               // Page on the unfiltered directory listing (what is returned may be filtered)
+               if ( count( $objects ) < $limit ) {
+                       $after = INF; // avoid a second RTT
+               } else {
+                       $after = end( $objects ); // update last item
                }
 
                return $dirs;
        }
 
-       protected function getParentDir( $path ) {
-               return ( strpos( $path, '/' ) !== false ) ? dirname( $path ) : false;
-       }
-
        /**
         * Do not call this function outside of SwiftFileBackendFileList
         *
@@ -1090,43 +914,36 @@ class SwiftFileBackend extends FileBackendStore {
                }
 
                $section = new ProfileSection( __METHOD__ . '-' . $this->name );
-               try {
-                       $container = $this->getContainer( $fullCont );
-                       $prefix = ( $dir == '' ) ? null : "{$dir}/";
-
-                       // $objects will contain a list of unfiltered names or CF_Object items
-                       // Non-recursive: only list files right under $dir
-                       if ( !empty( $params['topOnly'] ) ) {
-                               if ( !empty( $params['adviseStat'] ) ) {
-                                       // Note: get_objects() does not include directories
-                                       $objects = $container->get_objects( $limit, $after, $prefix, null, '/' );
-                               } else {
-                                       // Note: list_objects() includes directories here
-                                       $objects = $container->list_objects( $limit, $after, $prefix, null, '/' );
-                               }
-                               $files = $this->buildFileObjectListing( $params, $dir, $objects );
-                       // Recursive: list all files under $dir and its subdirs
+
+               $prefix = ( $dir == '' ) ? null : "{$dir}/";
+               // $objects will contain a list of unfiltered names or CF_Object items
+               // Non-recursive: only list files right under $dir
+               if ( !empty( $params['topOnly'] ) ) {
+                       if ( !empty( $params['adviseStat'] ) ) {
+                               $status = $this->objectListing( $fullCont, 'info', $limit, $after, $prefix, '/' );
                        } else {
-                               // Note: get_objects()/list_objects() here only return file objects
-                               if ( !empty( $params['adviseStat'] ) ) {
-                                       $objects = $container->get_objects( $limit, $after, $prefix );
-                               } else {
-                                       $objects = $container->list_objects( $limit, $after, $prefix );
-                               }
-                               $files = $this->buildFileObjectListing( $params, $dir, $objects );
+                               $status = $this->objectListing( $fullCont, 'names', $limit, $after, $prefix, '/' );
                        }
-                       // Page on the unfiltered object listing (what is returned may be filtered)
-                       if ( count( $objects ) < $limit ) {
-                               $after = INF; // avoid a second RTT
+               // Recursive: list all files under $dir and its subdirs
+               } else {
+                       if ( !empty( $params['adviseStat'] ) ) {
+                               $status = $this->objectListing( $fullCont, 'info', $limit, $after, $prefix );
                        } else {
-                               $after = end( $objects ); // update last item
-                               $after = is_object( $after ) ? $after->name : $after;
+                               $status = $this->objectListing( $fullCont, 'names', $limit, $after, $prefix );
                        }
-               } catch ( NoSuchContainerException $e ) {
-               } catch ( CloudFilesException $e ) { // some other exception?
-                       $this->handleException( $e, null, __METHOD__,
-                               array( 'cont' => $fullCont, 'dir' => $dir ) );
-                       throw new FileBackendError( "Got " . get_class( $e ) . " exception." );
+               }
+               // Reformat this list into a list of (name, stat array or null) entries
+               if ( !$status->isOk() ) {
+                       return $files; // error
+               }
+               $objects = $status->value;
+               $files = $this->buildFileObjectListing( $params, $dir, $objects );
+               // Page on the unfiltered object listing (what is returned may be filtered)
+               if ( count( $objects ) < $limit ) {
+                       $after = INF; // avoid a second RTT
+               } else {
+                       $after = end( $objects ); // update last item
+                       $after = is_object( $after ) ? $after->name : $after;
                }
 
                return $files;
@@ -1145,10 +962,14 @@ class SwiftFileBackend extends FileBackendStore {
                $names = array();
                foreach ( $objects as $object ) {
                        if ( is_object( $object ) ) {
+                               if ( isset( $object->subdir ) || !isset( $object->name ) ) {
+                                       continue; // virtual directory entry; ignore
+                               }
                                $stat = array(
                                        // Convert various random Swift dates to TS_MW
-                                       'mtime' => $this->convertSwiftDate( $object->last_modified, TS_MW ),
-                                       'size' => (int)$object->content_length,
+                                       'mtime'  => $this->convertSwiftDate( $object->last_modified, TS_MW ),
+                                       'size'   => (int)$object->bytes,
+                                       'md5'    => ctype_xdigit( $object->hash ) ? $object->hash : null,
                                        'latest' => false // eventually consistent
                                );
                                $names[] = array( $object->name, $stat );
@@ -1171,6 +992,20 @@ class SwiftFileBackend extends FileBackendStore {
                $this->cheapCache->set( $path, 'stat', $val );
        }
 
+       protected function doGetFileXAttributes( array $params ) {
+               $stat = $this->getFileStat( $params );
+               if ( $stat ) {
+                       if ( !isset( $stat['xattr'] ) ) {
+                               // Stat entries filled by file listings don't include metadata/headers
+                               $this->clearCache( array( $params['src'] ) );
+                               $stat = $this->getFileStat( $params );
+                       }
+                       return $stat['xattr'];
+               } else {
+                       return false;
+               }
+       }
+
        protected function doGetFileSha1base36( array $params ) {
                $stat = $this->getFileStat( $params );
                if ( $stat ) {
@@ -1194,26 +1029,28 @@ class SwiftFileBackend extends FileBackendStore {
                        $status->fatal( 'backend-fail-invalidpath', $params['src'] );
                }
 
-               try {
-                       $cont = $this->getContainer( $srcCont );
-               } catch ( NoSuchContainerException $e ) {
+               $auth = $this->getAuthentication();
+               if ( !$auth || !is_array( $this->getContainerStat( $srcCont ) ) ) {
                        $status->fatal( 'backend-fail-stream', $params['src'] );
-
-                       return $status;
-               } catch ( CloudFilesException $e ) { // some other exception?
-                       $this->handleException( $e, $status, __METHOD__, $params );
-
                        return $status;
                }
 
-               try {
-                       $output = fopen( 'php://output', 'wb' );
-                       $obj = new CF_Object( $cont, $srcRel, false, false ); // skip HEAD
-                       $obj->stream( $output, $this->headersFromParams( $params ) );
-               } catch ( NoSuchObjectException $e ) {
+               $handle = fopen( 'php://output', 'wb' );
+
+               list( $rcode, $rdesc, $rhdrs, $rbody, $rerr ) = $this->http->run( array(
+                       'method'  => 'GET',
+                       'url'     => $this->storageUrl( $auth, $srcCont, $srcRel ),
+                       'headers' => $this->authTokenHeaders( $auth )
+                               + $this->headersFromParams( $params ),
+                       'stream'  => $handle,
+               ) );
+
+               if ( $rcode >= 200 && $rcode <= 299 ) {
+                       // good
+               } elseif ( $rcode === 404 ) {
                        $status->fatal( 'backend-fail-stream', $params['src'] );
-               } catch ( CloudFilesException $e ) { // some other exception?
-                       $this->handleException( $e, $status, __METHOD__, $params );
+               } else {
+                       $this->onError( $status, __METHOD__, $params, $rerr, $rcode, $rdesc );
                }
 
                return $status;
@@ -1222,66 +1059,58 @@ class SwiftFileBackend extends FileBackendStore {
        protected function doGetLocalCopyMulti( array $params ) {
                $tmpFiles = array();
 
+               $auth = $this->getAuthentication();
+
                $ep = array_diff_key( $params, array( 'srcs' => 1 ) ); // for error logging
                // Blindly create tmp files and stream to them, catching any exception if the file does
                // not exist. Doing a stat here is useless causes infinite loops in addMissingMetadata().
                foreach ( array_chunk( $params['srcs'], $params['concurrency'] ) as $pathBatch ) {
-                       $cfOps = array(); // (path => CF_Async_Op)
+                       $reqs = array(); // (path => op)
 
                        foreach ( $pathBatch as $path ) { // each path in this concurrent batch
                                list( $srcCont, $srcRel ) = $this->resolveStoragePathReal( $path );
-                               if ( $srcRel === null ) {
+                               if ( $srcRel === null || !$auth ) {
                                        $tmpFiles[$path] = null;
                                        continue;
                                }
                                $tmpFile = null;
-                               try {
-                                       $sContObj = $this->getContainer( $srcCont );
-                                       $obj = new CF_Object( $sContObj, $srcRel, false, false ); // skip HEAD
-                                       // Get source file extension
-                                       $ext = FileBackend::extensionFromPath( $path );
-                                       // Create a new temporary file...
-                                       $tmpFile = TempFSFile::factory( 'localcopy_', $ext );
-                                       if ( $tmpFile ) {
-                                               $handle = fopen( $tmpFile->getPath(), 'wb' );
-                                               if ( $handle ) {
-                                                       $headers = $this->headersFromParams( $params );
-                                                       if ( count( $pathBatch ) > 1 ) {
-                                                               $cfOps[$path] = $obj->stream_async( $handle, $headers );
-                                                               $cfOps[$path]->_file_handle = $handle; // close this later
-                                                       } else {
-                                                               $obj->stream( $handle, $headers );
-                                                               fclose( $handle );
-                                                       }
-                                               } else {
-                                                       $tmpFile = null;
-                                               }
+                               // Get source file extension
+                               $ext = FileBackend::extensionFromPath( $path );
+                               // Create a new temporary file...
+                               $tmpFile = TempFSFile::factory( 'localcopy_', $ext );
+                               if ( $tmpFile ) {
+                                       $handle = fopen( $tmpFile->getPath(), 'wb' );
+                                       if ( $handle ) {
+                                               $reqs[$path] = array(
+                                                       'method'  => 'GET',
+                                                       'url'     => $this->storageUrl( $auth, $srcCont, $srcRel ),
+                                                       'headers' => $this->authTokenHeaders( $auth )
+                                                               + $this->headersFromParams( $params ),
+                                                       'stream'  => $handle,
+                                               );
+                                       } else {
+                                               $tmpFile = null;
                                        }
-                               } catch ( NoSuchContainerException $e ) {
-                                       $tmpFile = null;
-                               } catch ( NoSuchObjectException $e ) {
-                                       $tmpFile = null;
-                               } catch ( CloudFilesException $e ) { // some other exception?
-                                       $tmpFile = null;
-                                       $this->handleException( $e, null, __METHOD__, array( 'src' => $path ) + $ep );
                                }
                                $tmpFiles[$path] = $tmpFile;
                        }
 
-                       $batch = new CF_Async_Op_Batch( $cfOps );
-                       $cfOps = $batch->execute();
-                       foreach ( $cfOps as $path => $cfOp ) {
-                               try {
-                                       $cfOp->getLastResponse();
-                               } catch ( NoSuchContainerException $e ) {
-                                       $tmpFiles[$path] = null;
-                               } catch ( NoSuchObjectException $e ) {
-                                       $tmpFiles[$path] = null;
-                               } catch ( CloudFilesException $e ) { // some other exception?
+                       $reqs = $this->http->runMulti( $reqs );
+                       foreach ( $reqs as $path => $op ) {
+                               list( $rcode, $rdesc, $rhdrs, $rbody, $rerr ) = $op['response'];
+                               fclose( $op['stream'] ); // close open handle
+                               if ( $rcode >= 200 && $rcode <= 299
+                                       // double check that the disk is not full/broken
+                                       && $tmpFile->getSize() == $rhdrs['content-length']
+                               ) {
+                                       // good
+                               } elseif ( $rcode === 404 ) {
+                                       $tmpFiles[$path] = false;
+                               } else {
                                        $tmpFiles[$path] = null;
-                                       $this->handleException( $e, null, __METHOD__, array( 'src' => $path ) + $ep );
+                                       $this->onError( null, __METHOD__,
+                                               array( 'src' => $path ) + $ep, $rerr, $rcode, $rdesc );
                                }
-                               fclose( $cfOp->_file_handle ); // close open handle
                        }
                }
 
@@ -1296,39 +1125,43 @@ class SwiftFileBackend extends FileBackendStore {
                        if ( $srcRel === null ) {
                                return null; // invalid path
                        }
-                       try {
-                               $ttl = isset( $params['ttl'] ) ? $params['ttl'] : 86400;
-                               $sContObj = $this->getContainer( $srcCont );
-                               $obj = new CF_Object( $sContObj, $srcRel, false, false ); // skip HEAD
-                               if ( $this->swiftTempUrlKey != '' ) {
-                                       return $obj->get_temp_url( $this->swiftTempUrlKey, $ttl, "GET" );
-                               } else { // give S3 API URL for rgw
-                                       $expires = time() + $ttl;
-                                       // Path for signature starts with the bucket
-                                       $spath = '/' . rawurlencode( $srcCont ) . '/' .
-                                               str_replace( '%2F', '/', rawurlencode( $srcRel ) );
-                                       // Calculate the hash
-                                       $signature = base64_encode( hash_hmac(
-                                               'sha1',
-                                               "GET\n\n\n{$expires}\n{$spath}",
-                                               $this->rgwS3SecretKey,
-                                               true // raw
-                                       ) );
 
-                                       // See http://s3.amazonaws.com/doc/s3-developer-guide/RESTAuthentication.html.
-                                       // Note: adding a newline for empty CanonicalizedAmzHeaders does not work.
-                                       return wfAppendQuery(
-                                               str_replace( '/swift/v1', '', // S3 API is the rgw default
-                                                       $sContObj->cfs_http->getStorageUrl() . $spath ),
-                                               array(
-                                                       'Signature' => $signature,
-                                                       'Expires' => $expires,
-                                                       'AWSAccessKeyId' => $this->rgwS3AccessKey )
-                                       );
-                               }
-                       } catch ( NoSuchContainerException $e ) {
-                       } catch ( CloudFilesException $e ) { // some other exception?
-                               $this->handleException( $e, null, __METHOD__, $params );
+                       $auth = $this->getAuthentication();
+                       if ( !$auth ) {
+                               return null;
+                       }
+
+                       $ttl = isset( $params['ttl'] ) ? $params['ttl'] : 86400;
+                       $expires = time() + $ttl;
+
+                       if ( $this->swiftTempUrlKey != '' ) {
+                               $url = $this->storageUrl( $auth, $srcCont, $srcRel );
+                               $signature = hash_hmac( 'sha1',
+                                       "GET\n{$expires}\n" . parse_url( $url, PHP_URL_PATH ),
+                                       $this->swiftTempUrlKey
+                               );
+                               return "{$url}?temp_url_sig={$signature}&temp_url_expires={$expires}";
+                       } else { // give S3 API URL for rgw
+                               // Path for signature starts with the bucket
+                               $spath = '/' . rawurlencode( $srcCont ) . '/' .
+                                       str_replace( '%2F', '/', rawurlencode( $srcRel ) );
+                               // Calculate the hash
+                               $signature = base64_encode( hash_hmac(
+                                       'sha1',
+                                       "GET\n\n\n{$expires}\n{$spath}",
+                                       $this->rgwS3SecretKey,
+                                       true // raw
+                               ) );
+                               // See http://s3.amazonaws.com/doc/s3-developer-guide/RESTAuthentication.html.
+                               // Note: adding a newline for empty CanonicalizedAmzHeaders does not work.
+                               return wfAppendQuery(
+                                       str_replace( '/swift/v1', '', // S3 API is the rgw default
+                                               $this->storageUrl( $auth ) . $spath ),
+                                       array(
+                                               'Signature' => $signature,
+                                               'Expires' => $expires,
+                                               'AWSAccessKeyId' => $this->rgwS3AccessKey )
+                               );
                        }
                }
 
@@ -1359,24 +1192,45 @@ class SwiftFileBackend extends FileBackendStore {
        protected function doExecuteOpHandlesInternal( array $fileOpHandles ) {
                $statuses = array();
 
-               $cfOps = array(); // list of CF_Async_Op objects
+               $auth = $this->getAuthentication();
+               if ( !$auth ) {
+                       foreach ( $fileOpHandles as $index => $fileOpHandle ) {
+                               $statuses[$index] = Status::newFatal( 'backend-fail-connect', $this->name );
+                       }
+                       return $statuses;
+               }
+
+               // Split the HTTP requests into stages that can be done concurrently
+               $httpReqsByStage = array(); // map of (stage => index => HTTP request)
                foreach ( $fileOpHandles as $index => $fileOpHandle ) {
-                       $cfOps[$index] = $fileOpHandle->cfOp;
-               }
-               $batch = new CF_Async_Op_Batch( $cfOps );
-
-               $cfOps = $batch->execute();
-               foreach ( $cfOps as $index => $cfOp ) {
-                       $status = Status::newGood();
-                       $function = 'getResponse' . $fileOpHandles[$index]->call;
-                       try { // catch exceptions; update status
-                               $this->$function( $cfOp, $status, $fileOpHandles[$index]->params );
-                               $this->purgeCDNCache( $fileOpHandles[$index]->affectedObjects );
-                       } catch ( CloudFilesException $e ) { // some other exception?
-                               $this->handleException( $e, $status,
-                                       __CLASS__ . ":$function", $fileOpHandles[$index]->params );
+                       $reqs = $fileOpHandle->httpOp;
+                       // Convert the 'url' parameter to an actual URL using $auth
+                       foreach ( $reqs as $stage => &$req ) {
+                               list( $container, $relPath ) = $req['url'];
+                               $req['url'] = $this->storageUrl( $auth, $container, $relPath );
+                               $req['headers'] = isset( $req['headers'] ) ? $req['headers'] : array();
+                               $req['headers'] = $this->authTokenHeaders( $auth ) + $req['headers'];
+                               $httpReqsByStage[$stage][$index] = $req;
+                       }
+                       $statuses[$index] = Status::newGood();
+               }
+
+               // Run all requests for the first stage, then the next, and so on
+               for ( $stage = 0; $stage < count( $httpReqsByStage ); ++$stage ) {
+                       $httpReqs = $this->http->runMulti( $httpReqsByStage[$stage] );
+                       foreach ( $httpReqs as $index => $httpReq ) {
+                               // Run the callback for each request of this operation
+                               $callback = $fileOpHandles[$index]->callback;
+                               call_user_func_array( $callback, array( $httpReq, $statuses[$index] ) );
+                               // On failure, abort all remaining requests for this operation
+                               // (e.g. abort the DELETE request if the COPY request fails for a move)
+                               if ( !$statuses[$index]->isOK() ) {
+                                       $stages = count( $fileOpHandles[$index]->httpOp );
+                                       for ( $s = ( $stage + 1 ); $s < $stages; ++$s ) {
+                                               unset( $httpReqsByStage[$s][$index] );
+                                       }
+                               }
                        }
-                       $statuses[$index] = $status;
                }
 
                return $statuses;
@@ -1390,7 +1244,7 @@ class SwiftFileBackend extends FileBackendStore {
         * In general, we don't allow listings to end-users. It's not useful, isn't well-defined
         * (lists are truncated to 10000 item with no way to page), and is just a performance risk.
         *
-        * @param CF_Container $contObj Swift container
+        * @param string $container Resolved Swift container
         * @param array $readGrps List of the possible criteria for a request to have
         * access to read a container. Each item is one of the following formats:
         *   - account:user        : Grants access if the request is by the given user
@@ -1404,210 +1258,333 @@ class SwiftFileBackend extends FileBackendStore {
         *   - account:user       : Grants access if the request is by the given user
         * @return Status
         */
-       protected function setContainerAccess(
-               CF_Container $contObj, array $readGrps, array $writeGrps
-       ) {
-               $creds = $contObj->cfs_auth->export_credentials();
+       protected function setContainerAccess( $container, array $readGrps, array $writeGrps ) {
+               $status = Status::newGood();
 
-               $url = $creds['storage_url'] . '/' . rawurlencode( $contObj->name );
+               $auth = $this->getAuthentication();
+               if ( !$auth ) {
+                       $status->fatal( 'backend-fail-connect', $this->name );
+                       return $status;
+               }
 
-               // Note: 10 second timeout consistent with php-cloudfiles
-               $req = MWHttpRequest::factory( $url, array( 'method' => 'POST', 'timeout' => 10 ) );
-               $req->setHeader( 'X-Auth-Token', $creds['auth_token'] );
-               $req->setHeader( 'X-Container-Read', implode( ',', $readGrps ) );
-               $req->setHeader( 'X-Container-Write', implode( ',', $writeGrps ) );
+               list( $rcode, $rdesc, $rhdrs, $rbody, $rerr ) = $this->http->run( array(
+                       'method'  => 'POST',
+                       'url'     => $this->storageUrl( $auth, $container ),
+                       'headers' => $this->authTokenHeaders( $auth ) + array(
+                               'x-container-read'  => implode( ',', $readGrps ),
+                               'x-container-write' => implode( ',', $writeGrps )
+                       )
+               ) );
 
-               return $req->execute(); // should return 204
+               if ( $rcode != 204 && $rcode !== 202 ) {
+                       $status->fatal( 'backend-fail-internal', $this->name );
+               }
+
+               return $status;
        }
 
        /**
-        * Purge the CDN cache of affected objects if CDN caching is enabled.
-        * This is for Rackspace/Akamai CDNs.
+        * Get a Swift container stat array, possibly from process cache.
+        * Use $reCache if the file count or byte count is needed.
         *
-        * @param array $objects List of CF_Object items
+        * @param string $container Container name
+        * @param bool $bypassCache Bypass all caches and load from Swift
+        * @return array|bool|null False on 404, null on failure
         */
-       public function purgeCDNCache( array $objects ) {
-               if ( $this->swiftUseCDN && $this->swiftCDNPurgable ) {
-                       foreach ( $objects as $object ) {
-                               try {
-                                       $object->purge_from_cdn();
-                               } catch ( CDNNotEnabledException $e ) {
-                                       // CDN not enabled; nothing to see here
-                               } catch ( CloudFilesException $e ) {
-                                       $this->handleException( $e, null, __METHOD__,
-                                               array( 'cont' => $object->container->name, 'obj' => $object->name ) );
+       protected function getContainerStat( $container, $bypassCache = false ) {
+               if ( $bypassCache ) { // purge cache
+                       $this->containerStatCache->clear( $container );
+               } elseif ( !$this->containerStatCache->has( $container, 'stat' ) ) {
+                       $this->primeContainerCache( array( $container ) ); // check persistent cache
+               }
+               if ( !$this->containerStatCache->has( $container, 'stat' ) ) {
+                       $auth = $this->getAuthentication();
+                       if ( !$auth ) {
+                               return null;
+                       }
+
+                       list( $rcode, $rdesc, $rhdrs, $rbody, $rerr ) = $this->http->run( array(
+                               'method'  => 'HEAD',
+                               'url'     => $this->storageUrl( $auth, $container ),
+                               'headers' => $this->authTokenHeaders( $auth )
+                       ) );
+
+                       if ( $rcode === 204 ) {
+                               $stat = array(
+                                       'count' => $rhdrs['x-container-object-count'],
+                                       'bytes' => $rhdrs['x-container-bytes-used']
+                               );
+                               if ( $bypassCache ) {
+                                       return $stat;
+                               } else {
+                                       $this->containerStatCache->set( $container, 'stat', $stat ); // cache it
                                }
+                       } elseif ( $rcode === 404 ) {
+                               return false;
+                       } else {
+                               $this->onError( null, __METHOD__,
+                                       array( 'cont' => $container ), $rerr, $rcode, $rdesc );
+                               return null;
                        }
                }
+
+               return $this->containerStatCache->get( $container, 'stat' );
        }
 
        /**
-        * Get an authenticated connection handle to the Swift proxy
+        * Create a Swift container
         *
-        * @throws CloudFilesException
-        * @throws CloudFilesException|Exception
-        * @return CF_Connection|bool False on failure
+        * @param string $container Container name
+        * @param array $params
+        * @return Status
         */
-       protected function getConnection() {
-               if ( $this->connException instanceof CloudFilesException ) {
-                       if ( ( time() - $this->connErrorTime ) < 60 ) {
-                               throw $this->connException; // failed last attempt; don't bother
-                       } else { // actually retry this time
-                               $this->connException = null;
-                               $this->connErrorTime = 0;
-                       }
+       protected function createContainer( $container, array $params ) {
+               $status = Status::newGood();
+
+               $auth = $this->getAuthentication();
+               if ( !$auth ) {
+                       $status->fatal( 'backend-fail-connect', $this->name );
+                       return $status;
                }
-               // Session keys expire after a while, so we renew them periodically
-               $reAuth = ( ( time() - $this->sessionStarted ) > $this->authTTL );
-               // Authenticate with proxy and get a session key...
-               if ( !$this->conn || $reAuth ) {
-                       $this->sessionStarted = 0;
-                       $this->connContainerCache->clear();
-                       $cacheKey = $this->getCredsCacheKey( $this->auth->username );
-                       $creds = $this->srvCache->get( $cacheKey ); // credentials
-                       if ( is_array( $creds ) ) { // cache hit
-                               $this->auth->load_cached_credentials(
-                                       $creds['auth_token'], $creds['storage_url'], $creds['cdnm_url'] );
-                               $this->sessionStarted = time() - ceil( $this->authTTL / 2 ); // skew for worst case
-                       } else { // cache miss
-                               try {
-                                       $this->auth->authenticate();
-                                       $creds = $this->auth->export_credentials();
-                                       $this->srvCache->add( $cacheKey, $creds, ceil( $this->authTTL / 2 ) ); // cache
-                                       $this->sessionStarted = time();
-                               } catch ( CloudFilesException $e ) {
-                                       $this->connException = $e; // don't keep re-trying
-                                       $this->connErrorTime = time();
-                                       throw $e; // throw it back
-                               }
-                       }
-                       if ( $this->conn ) { // re-authorizing?
-                               $this->conn->close(); // close active cURL handles in CF_Http object
-                       }
-                       $this->conn = new CF_Connection( $this->auth );
+
+               // @see SwiftFileBackend::setContainerAccess()
+               if ( empty( $params['noAccess'] ) ) {
+                       $readGrps = array( '.r:*', $this->swiftUser ); // public
+               } else {
+                       $readGrps = array( $this->swiftUser ); // private
+               }
+               $writeGrps = array( $this->swiftUser ); // sanity
+
+               list( $rcode, $rdesc, $rhdrs, $rbody, $rerr ) = $this->http->run( array(
+                       'method'  => 'PUT',
+                       'url'     => $this->storageUrl( $auth, $container ),
+                       'headers' => $this->authTokenHeaders( $auth ) + array(
+                               'x-container-read'  => implode( ',', $readGrps ),
+                               'x-container-write' => implode( ',', $writeGrps )
+                       )
+               ) );
+
+               if ( $rcode === 201 ) { // new
+                       // good
+               } elseif ( $rcode === 202 ) { // already there
+                       // this shouldn't really happen, but is OK
+               } else {
+                       $this->onError( $status, __METHOD__, $params, $rerr, $rcode, $rdesc );
                }
 
-               return $this->conn;
+               return $status;
        }
 
        /**
-        * Close the connection to the Swift proxy
+        * Delete a Swift container
+        *
+        * @param string $container Container name
+        * @param array $params
+        * @return Status
         */
-       protected function closeConnection() {
-               if ( $this->conn ) {
-                       $this->conn->close(); // close active cURL handles in CF_Http object
-                       $this->conn = null;
-                       $this->sessionStarted = 0;
-                       $this->connContainerCache->clear();
+       protected function deleteContainer( $container, array $params ) {
+               $status = Status::newGood();
+
+               $auth = $this->getAuthentication();
+               if ( !$auth ) {
+                       $status->fatal( 'backend-fail-connect', $this->name );
+                       return $status;
+               }
+
+               list( $rcode, $rdesc, $rhdrs, $rbody, $rerr ) = $this->http->run( array(
+                       'method'  => 'DELETE',
+                       'url'     => $this->storageUrl( $auth, $container ),
+                       'headers' => $this->authTokenHeaders( $auth )
+               ) );
+
+               if ( $rcode >= 200 && $rcode <= 299 ) { // deleted
+                       $this->containerStatCache->clear( $container ); // purge
+               } elseif ( $rcode === 404 ) { // not there
+                       // this shouldn't really happen, but is OK
+               } elseif ( $rcode === 409 ) { // not empty
+                       $this->onError( $status, __METHOD__, $params, $rerr, $rcode, $rdesc ); // race?
+               } else {
+                       $this->onError( $status, __METHOD__, $params, $rerr, $rcode, $rdesc );
                }
+
+               return $status;
        }
 
        /**
-        * Get the cache key for a container
+        * Get a list of objects under a container.
+        * Either just the names or a list of stdClass objects with details can be returned.
         *
-        * @param string $username
-        * @return string
+        * @param string $fullCont
+        * @param string $type ('info' for a list of object detail maps, 'names' for names only)
+        * @param integer $limit
+        * @param string|null $after
+        * @param string|null $prefix
+        * @param string|null $delim
+        * @return Status With the list as value
         */
-       private function getCredsCacheKey( $username ) {
-               return wfMemcKey( 'backend', $this->getName(), 'usercreds', $username );
+       private function objectListing(
+               $fullCont, $type, $limit, $after = null, $prefix = null, $delim = null
+       ) {
+               $status = Status::newGood();
+
+               $auth = $this->getAuthentication();
+               if ( !$auth ) {
+                       $status->fatal( 'backend-fail-connect', $this->name );
+                       return $status;
+               }
+
+               $query = array( 'limit' => $limit );
+               if ( $type === 'info' ) {
+                       $query['format'] = 'json';
+               }
+               if ( $after !== null ) {
+                       $query['marker'] = $after;
+               }
+               if ( $prefix !== null ) {
+                       $query['prefix'] = $prefix;
+               }
+               if ( $delim !== null ) {
+                       $query['delimiter'] = $delim;
+               }
+
+               list( $rcode, $rdesc, $rhdrs, $rbody, $rerr ) = $this->http->run( array(
+                       'method'  => 'GET',
+                       'url'     => $this->storageUrl( $auth, $fullCont ),
+                       'query'   => $query,
+                       'headers' => $this->authTokenHeaders( $auth )
+               ) );
+
+               $params = array( 'cont' => $fullCont, 'prefix' => $prefix, 'delim' => $delim );
+               if ( $rcode === 200 ) { // good
+                       if ( $type === 'info' ) {
+                               $status->value = FormatJson::decode( trim( $rbody ) );
+                       } else {
+                               $status->value = explode( "\n", trim( $rbody ) );
+                       }
+               } elseif ( $rcode === 204 ) {
+                       $status->value = array(); // empty container
+               } elseif ( $rcode === 404 ) {
+                       $status->value = array(); // no container
+               } else {
+                       $this->onError( $status, __METHOD__, $params, $rerr, $rcode, $rdesc );
+               }
+
+               return $status;
+       }
+
+       protected function doPrimeContainerCache( array $containerInfo ) {
+               foreach ( $containerInfo as $container => $info ) {
+                       $this->containerStatCache->set( $container, 'stat', $info );
+               }
        }
 
        /**
-        * Get a Swift container object, possibly from process cache.
-        * Use $reCache if the file count or byte count is needed.
-        *
-        * @param string $container Container name
-        * @param bool $bypassCache Bypass all caches and load from Swift
-        * @return CF_Container
-        * @throws CloudFilesException
+        * @return array|null Credential map
         */
-       protected function getContainer( $container, $bypassCache = false ) {
-               $conn = $this->getConnection(); // Swift proxy connection
-               if ( $bypassCache ) { // purge cache
-                       $this->connContainerCache->clear( $container );
-               } elseif ( !$this->connContainerCache->has( $container, 'obj' ) ) {
-                       $this->primeContainerCache( array( $container ) ); // check persistent cache
-               }
-               if ( !$this->connContainerCache->has( $container, 'obj' ) ) {
-                       $contObj = $conn->get_container( $container );
-                       // NoSuchContainerException not thrown: container must exist
-                       $this->connContainerCache->set( $container, 'obj', $contObj ); // cache it
-                       if ( !$bypassCache ) {
-                               $this->setContainerCache( $container, // update persistent cache
-                                       array( 'bytes' => $contObj->bytes_used, 'count' => $contObj->object_count )
-                               );
+       protected function getAuthentication() {
+               if ( $this->authErrorTimestamp !== null ) {
+                       if ( ( time() - $this->authErrorTimestamp ) < 60 ) {
+                               return null; // failed last attempt; don't bother
+                       } else { // actually retry this time
+                               $this->authErrorTimestamp = null;
                        }
                }
+               // Session keys expire after a while, so we renew them periodically
+               $reAuth = ( ( time() - $this->authSessionTimestamp ) > $this->authTTL );
+               // Authenticate with proxy and get a session key...
+               if ( !$this->authCreds || $reAuth ) {
+                       $this->authSessionTimestamp = 0;
+                       $cacheKey = $this->getCredsCacheKey( $this->swiftUser );
+                       $creds = $this->srvCache->get( $cacheKey ); // credentials
+                       // Try to use the credential cache
+                       if ( isset( $creds['auth_token'] ) && isset( $creds['storage_url'] ) ) {
+                               $this->authCreds = $creds;
+                               // Skew the timestamp for worst case to avoid using stale credentials
+                               $this->authSessionTimestamp = time() - ceil( $this->authTTL / 2 );
+                       } else { // cache miss
+                               list( $rcode, $rdesc, $rhdrs, $rbody, $rerr ) = $this->http->run( array(
+                                       'method'  => 'GET',
+                                       'url'     => "{$this->swiftAuthUrl}/v1.0",
+                                       'headers' => array(
+                                               'x-auth-user' => $this->swiftUser, 'x-auth-key' => $this->swiftKey )
+                               ) );
 
-               return $this->connContainerCache->get( $container, 'obj' );
+                               if ( $rcode >= 200 && $rcode <= 299 ) { // OK
+                                       $this->authCreds = array(
+                                               'auth_token'  => $rhdrs['x-auth-token'],
+                                               'storage_url' => $rhdrs['x-storage-url']
+                                       );
+                                       $this->authSessionTimestamp = time();
+                               } elseif ( $rcode === 401 ) {
+                                       $this->onError( null, __METHOD__, array(), "Authentication failed.", $rcode );
+                                       $this->authErrorTimestamp = time();
+                                       return null;
+                               } else {
+                                       $this->onError( null, __METHOD__, array(), "HTTP return code: $rcode", $rcode );
+                                       $this->authErrorTimestamp = time();
+                                       return null;
+                               }
+                       }
+               }
+               return $this->authCreds;
        }
 
        /**
-        * Create a Swift container
-        *
-        * @param string $container Container name
-        * @return CF_Container
-        * @throws CloudFilesException
+        * @param array $creds From getAuthentication()
+        * @param string $container
+        * @param string $object
+        * @return array
         */
-       protected function createContainer( $container ) {
-               $conn = $this->getConnection(); // Swift proxy connection
-               $contObj = $conn->create_container( $container );
-               $this->connContainerCache->set( $container, 'obj', $contObj ); // cache
-               return $contObj;
+       protected function storageUrl( array $creds, $container = null, $object = null ) {
+               $parts = array( $creds['storage_url'] );
+               if ( strlen( $container ) ) {
+                       $parts[] = rawurlencode( $container );
+               }
+               if ( strlen( $object ) ) {
+                       $parts[] = str_replace( "%2F", "/", rawurlencode( $object ) );
+               }
+               return implode( '/', $parts );
        }
 
        /**
-        * Delete a Swift container
-        *
-        * @param string $container Container name
-        * @throws CloudFilesException
+        * @param array $creds From getAuthentication()
+        * @return array
         */
-       protected function deleteContainer( $container ) {
-               $conn = $this->getConnection(); // Swift proxy connection
-               $this->connContainerCache->clear( $container ); // purge
-               $conn->delete_container( $container );
+       protected function authTokenHeaders( array $creds ) {
+               return array( 'x-auth-token' => $creds['auth_token'] );
        }
 
-       protected function doPrimeContainerCache( array $containerInfo ) {
-               try {
-                       $conn = $this->getConnection(); // Swift proxy connection
-                       foreach ( $containerInfo as $container => $info ) {
-                               $contObj = new CF_Container( $conn->cfs_auth, $conn->cfs_http,
-                                       $container, $info['count'], $info['bytes'] );
-                               $this->connContainerCache->set( $container, 'obj', $contObj );
-                       }
-               } catch ( CloudFilesException $e ) { // some other exception?
-                       $this->handleException( $e, null, __METHOD__, array() );
-               }
+       /**
+        * Get the cache key for a container
+        *
+        * @param string $username
+        * @return string
+        */
+       private function getCredsCacheKey( $username ) {
+               return wfMemcKey( 'backend', $this->getName(), 'usercreds', $username );
        }
 
        /**
         * Log an unexpected exception for this backend.
         * This also sets the Status object to have a fatal error.
         *
-        * @param Exception $e
-        * @param Status $status null
+        * @param Status $code null
         * @param string $func
         * @param array $params
+        * @param string $err Error string
+        * @param integer $status HTTP status
+        * @param string $desc HTTP status description
         */
-       protected function handleException( Exception $e, $status, $func, array $params ) {
+       public function onError( $status, $func, array $params, $err = '', $code = 0, $desc = '' ) {
                if ( $status instanceof Status ) {
-                       if ( $e instanceof AuthenticationException ) {
-                               $status->fatal( 'backend-fail-connect', $this->name );
-                       } else {
-                               $status->fatal( 'backend-fail-internal', $this->name );
-                       }
+                       $status->fatal( 'backend-fail-internal', $this->name );
                }
-               if ( $e->getMessage() ) {
-                       trigger_error( "$func: " . $e->getMessage(), E_USER_WARNING );
-               }
-               if ( $e instanceof InvalidResponseException ) { // possibly a stale token
-                       $this->srvCache->delete( $this->getCredsCacheKey( $this->auth->username ) );
-                       $this->closeConnection(); // force a re-connect and re-auth next time
+               if ( $code == 401 ) { // possibly a stale token
+                       $this->srvCache->delete( $this->getCredsCacheKey( $this->swiftUser ) );
                }
                wfDebugLog( 'SwiftBackend',
-                       get_class( $e ) . " in '{$func}' (given '" . FormatJson::encode( $params ) . "')" .
-                       ( $e->getMessage() ? ": {$e->getMessage()}" : "" )
+                       "HTTP $code ($desc) in '{$func}' (given '" . FormatJson::encode( $params ) . "')" .
+                       ( $err ? ": $err" : "" )
                );
        }
 }
@@ -1616,25 +1593,20 @@ class SwiftFileBackend extends FileBackendStore {
  * @see FileBackendStoreOpHandle
  */
 class SwiftFileOpHandle extends FileBackendStoreOpHandle {
-       /** @var CF_Async_Op */
-       public $cfOp;
-
-       /** @var array */
-       public $affectedObjects = array();
+       /** @var array List of Requests for MultiHttpClient */
+       public $httpOp;
+       /** @var Closure */
+       public $callback;
 
        /**
         * @param SwiftFileBackend $backend
-        * @param array $params
-        * @param string $call
-        * @param CF_Async_Op $cfOp
+        * @param Closure $callback Function that takes (HTTP request array, status)
+        * @param array $httpOp MultiHttpClient op
         */
-       public function __construct(
-               SwiftFileBackend $backend, array $params, $call, CF_Async_Op $cfOp
-       ) {
+       public function __construct( SwiftFileBackend $backend, Closure $callback, array $httpOp ) {
                $this->backend = $backend;
-               $this->params = $params;
-               $this->call = $call;
-               $this->cfOp = $cfOp;
+               $this->callback = $callback;
+               $this->httpOp = $httpOp;
        }
 }
 
@@ -1765,15 +1737,6 @@ class SwiftFileBackendDirList extends SwiftFileBackendList {
                return substr( current( $this->bufferIter ), $this->suffixStart, -1 );
        }
 
-       /**
-        * @see SwiftFileBackendList::pageFromList()
-        * @param string $container
-        * @param string $dir
-        * @param string $after
-        * @param int $limit
-        * @param array $params
-        * @return array
-        */
        protected function pageFromList( $container, $dir, &$after, $limit, array $params ) {
                return $this->backend->getDirListPageInternal( $container, $dir, $after, $limit, $params );
        }
@@ -1798,15 +1761,6 @@ class SwiftFileBackendFileList extends SwiftFileBackendList {
                return $relPath;
        }
 
-       /**
-        * @see SwiftFileBackendList::pageFromList()
-        * @param string $container
-        * @param string $dir
-        * @param string $after
-        * @param int $limit
-        * @param array $params
-        * @return array
-        */
        protected function pageFromList( $container, $dir, &$after, $limit, array $params ) {
                return $this->backend->getFileListPageInternal( $container, $dir, $after, $limit, $params );
        }
index dc35016..c9e435e 100644 (file)
@@ -583,6 +583,9 @@ abstract class File {
        public function getCommonMetaArray() {
                $handler = $this->getHandler();
 
+               if ( !$handler ) {
+                       return false;
+               }
                return $handler->getCommonMetaArray( $this );
        }
 
index 5206447..687c549 100644 (file)
@@ -1458,17 +1458,6 @@ class LocalFile extends File {
                        LinksUpdate::queueRecursiveJobsForTable( $this->getTitle(), 'imagelinks' );
                }
 
-               # Invalidate cache for all pages that redirects on this page
-               $redirs = $this->getTitle()->getRedirectsHere();
-
-               foreach ( $redirs as $redir ) {
-                       if ( !$reupload && $redir->getNamespace() === NS_FILE ) {
-                               LinksUpdate::queueRecursiveJobsForTable( $redir, 'imagelinks' );
-                       }
-                       $update = new HTMLCacheUpdate( $redir, 'imagelinks' );
-                       $update->doUpdate();
-               }
-
                wfProfileOut( __METHOD__ );
 
                return true;
index 68dd216..3ba91d4 100644 (file)
@@ -100,9 +100,8 @@ You should [//www.mediawiki.org/wiki/Unicode_normalization_considerations upgrad
        'config-no-db'                    => 'Could not find a suitable database driver! You need to install a database driver for PHP.
 The following database types are supported: $1.
 
-If you are on shared hosting, ask your hosting provider to install a suitable database driver.
-If you compiled PHP yourself, reconfigure it with a database client enabled, for example using <code>./configure --with-mysql</code>.
-If you installed PHP from a Debian or Ubuntu package, then you also need install the php5-mysql module.',
+If you compiled PHP yourself, reconfigure it with a database client enabled, for example, using <code>./configure --with-mysqli</code>.
+If you installed PHP from a Debian or Ubuntu package, then you also need to install, for example, the <code>php5-mysql</code> package.',
        'config-outdated-sqlite'          => "'''Warning:''' you have SQLite $1, which is lower than minimum required version $2. SQLite will be unavailable.",
        'config-no-fts3'                  => "'''Warning:''' SQLite is compiled without the [//sqlite.org/fts3.html FTS3 module], search features will be unavailable on this backend.",
        'config-register-globals'         => "'''Warning: PHP's <code>[http://php.net/register_globals register_globals]</code> option is enabled.'''
@@ -243,7 +242,7 @@ That includes raw user data (email addresses, hashed passwords) as well as delet
 Consider putting the database somewhere else altogether, for example in <code>/var/lib/mediawiki/yourwiki</code>.",
        'config-oracle-def-ts'            => 'Default tablespace:',
        'config-oracle-temp-ts'           => 'Temporary tablespace:',
-       'config-type-mysql'               => 'MySQL',
+       'config-type-mysql'               => 'MySQL (or compatible)',
        'config-type-postgres'            => 'PostgreSQL',
        'config-type-sqlite'              => 'SQLite',
        'config-type-oracle'              => 'Oracle',
@@ -252,10 +251,10 @@ Consider putting the database somewhere else altogether, for example in <code>/v
 $1
 
 If you do not see the database system you are trying to use listed below, then follow the instructions linked above to enable support.',
-       'config-support-mysql'            => '* $1 is the primary target for MediaWiki and is best supported ([http://www.php.net/manual/en/mysql.installation.php how to compile PHP with MySQL support])',
-       'config-support-postgres'         => '* $1 is a popular open source database system as an alternative to MySQL ([http://www.php.net/manual/en/pgsql.installation.php how to compile PHP with PostgreSQL support]). There may be some minor outstanding bugs, and it is not recommended for use in a production environment.',
-       'config-support-sqlite'           => '* $1 is a lightweight database system which is very well supported. ([http://www.php.net/manual/en/pdo.installation.php How to compile PHP with SQLite support], uses PDO)',
-       'config-support-oracle'           => '* $1 is a commercial enterprise database. ([http://www.php.net/manual/en/oci8.installation.php How to compile PHP with OCI8 support])',
+       'config-dbsupport-mysql'          => '* [{{int:version-db-mysql-url}} MySQL] is the primary target for MediaWiki and is best supported. MediaWiki also works with [{{int:version-db-mariadb-url}} MariaDB] and [{{int:version-db-percona-url}} Percona Server], which are MySQL compatible. ([http://www.php.net/manual/en/mysqli.installation.php How to compile PHP with MySQL support])',
+       'config-dbsupport-postgres'       => '* [{{int:version-db-postgres-url}} PostgreSQL] is a popular open source database system as an alternative to MySQL. There may be some minor outstanding bugs, and it is not recommended for use in a production environment. ([http://www.php.net/manual/en/pgsql.installation.php How to compile PHP with PostgreSQL support])',
+       'config-dbsupport-sqlite'         => '* [{{int:version-db-sqlite-url}} SQLite] is a lightweight database system that is very well supported. ([http://www.php.net/manual/en/pdo.installation.php How to compile PHP with SQLite support], uses PDO)',
+       'config-dbsupport-oracle'         => '* [{{int:version-db-oracle-url}} Oracle] is a commercial enterprise database. ([http://www.php.net/manual/en/oci8.installation.php How to compile PHP with OCI8 support])',
        'config-header-mysql'             => 'MySQL settings',
        'config-header-postgres'          => 'PostgreSQL settings',
        'config-header-sqlite'            => 'SQLite settings',
@@ -640,7 +639,7 @@ See also:
 * {{msg-mw|config-env-php}}',
        'config-unicode-pure-php-warning' => 'PECL is the name of a group producing standard pieces of software for PHP, and intl is the name of their library handling some aspects of internationalization.',
        'config-unicode-update-warning' => "ICU is a body producing standard software tools for support of Unicode and other internationalization aspects. This message warns the system administrator installing MediaWiki that the server's software is not up-to-date and MediaWiki will have problems handling some characters.",
-       'config-no-db' => '{{doc-important|Do not translate "<code>./configure --with-mysql</code>" and "<code>php5-mysql</code>".}}
+       'config-no-db' => '{{doc-important|Do not translate "<code>./configure --with-mysqli</code>" and "<code>php5-mysql</code>".}}
 Parameters:
 * $1 is comma separated list of database types supported by MediaWiki.',
        'config-outdated-sqlite' => 'Used as warning. Parameters:
@@ -704,12 +703,12 @@ Message shown when PHP parameter <code>suhosin.get.max_value_length</code> is be
 * $2 - error message',
        'config-sqlite-dir-help' => '{{doc-important|Do not translate <code>.htaccess</code> and <code>/var/lib/mediawiki/yourwiki</code>.}}
 Used in help box.',
-       'config-type-mysql' => '{{optional}}',
+       'config-type-mysql' => '"Or compatible" refers to several database systems that are compatible with MySQL, as explained in {{msg-mw|config-dbsupport-mysql}}, and thus also work with this choice of database type.',
        'config-type-postgres' => '{{optional}}',
        'config-type-sqlite' => '{{optional}}',
        'config-type-oracle' => '{{optional}}',
        'config-support-info' => 'Parameters:
-* $1 - a list of DBMSs that MediaWiki supports, composed with other config-type-* and config-support-* messages.',
+* $1 - a list of DBMSs that MediaWiki supports, composed with config-dbsupport-* messages.',
        'config-support-mysql' => 'Parameters:
 * $1 - a link to the MySQL home page having the anchor text "MySQL".',
        'config-support-postgres' => 'Parameters:
@@ -718,6 +717,10 @@ Used in help box.',
 * $1 - a link to the SQLite home page having the anchor text "SQLite".',
        'config-support-oracle' => 'Parameters:
 * $1 - a link to the Oracle home page, the anchor text of which is "Oracle".',
+       'config-dbsupport-mysql' => 'Used in {{msg-mw|config-support-info}}.',
+       'config-dbsupport-postgres' => 'Used in {{msg-mw|config-support-info}}.',
+       'config-dbsupport-sqlite' => 'Used in {{msg-mw|config-support-info}}.',
+       'config-dbsupport-oracle' => 'Used in {{msg-mw|config-support-info}}.',
        'config-invalid-db-server-oracle' => 'Used as error message. Parameters:
 * $1 - database server name
 See also:
index 113dce6..9e692ea 100644 (file)
@@ -91,12 +91,12 @@ class OracleInstaller extends DatabaseInstaller {
 
        public function submitConnectForm() {
                // Get variables from the request
-               $newValues = $this->setVarsFromRequest(
+               $newValues = $this->setVarsFromRequest( array(
                        'wgDBserver',
                        'wgDBprefix',
                        'wgDBuser',
                        'wgDBpassword'
-               );
+               ) );
                $this->parent->setVar( 'wgDBname', $this->getVar( 'wgDBuser' ) );
 
                // Validate them
index aa324de..d4b3d65 100644 (file)
@@ -481,12 +481,11 @@ class WebInstaller_DBConnect extends WebInstallerPage {
                $settings = '';
                $defaultType = $this->getVar( 'wgDBtype' );
 
-               // Messages: config-support-mysql, config-support-postgres, config-support-oracle,
-               // config-support-sqlite
+               // Messages: config-dbsupport-mysql, config-dbsupport-postgres, config-dbsupport-oracle,
+               // config-dbsupport-sqlite
                $dbSupport = '';
-               foreach ( $this->parent->getDBTypes() as $type ) {
-                       $link = DatabaseBase::factory( $type )->getSoftwareLink();
-                       $dbSupport .= wfMessage( "config-support-$type", $link )->plain() . "\n";
+               foreach ( Installer::getDBTypes() as $type ) {
+                       $dbSupport .= wfMessage( "config-dbsupport-$type" )->plain() . "\n";
                }
                $this->addHTML( $this->parent->getInfoBox(
                        wfMessage( 'config-support-info', trim( $dbSupport ) )->text() ) );
diff --git a/includes/libs/HashRing.php b/includes/libs/HashRing.php
new file mode 100644 (file)
index 0000000..6925c7f
--- /dev/null
@@ -0,0 +1,147 @@
+<?php
+/**
+ * Convenience class for weighted consistent hash rings.
+ *
+ * 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
+ * @author Aaron Schulz
+ */
+
+/**
+ * Convenience class for weighted consistent hash rings
+ *
+ * @since 1.22
+ */
+class HashRing {
+       /** @var Array (location => weight) */
+       protected $sourceMap = array();
+       /** @var Array (location => (start, end)) */
+       protected $ring = array();
+
+       const RING_SIZE = 268435456; // 2^28
+
+       /**
+        * @param array $map (location => weight)
+        */
+       public function __construct( array $map ) {
+               $map = array_filter( $map, function ( $w ) {
+                       return $w > 0;
+               } );
+               if ( !count( $map ) ) {
+                       throw new UnexpectedValueException( "Ring is empty or all weights are zero." );
+               }
+               $this->sourceMap = $map;
+               // Sort the locations based on the hash of their names
+               $hashes = array();
+               foreach ( $map as $location => $weight ) {
+                       $hashes[$location] = sha1( $location );
+               }
+               uksort( $map, function ( $a, $b ) use ( $hashes ) {
+                       return strcmp( $hashes[$a], $hashes[$b] );
+               } );
+               // Fit the map to weight-proportionate one with a space of size RING_SIZE
+               $sum = array_sum( $map );
+               $standardMap = array();
+               foreach ( $map as $location => $weight ) {
+                       $standardMap[$location] = (int)floor( $weight / $sum * self::RING_SIZE );
+               }
+               // Build a ring of RING_SIZE spots, with each location at a spot in location hash order
+               $index = 0;
+               foreach ( $standardMap as $location => $weight ) {
+                       // Location covers half-closed interval [$index,$index + $weight)
+                       $this->ring[$location] = array( $index, $index + $weight );
+                       $index += $weight;
+               }
+               // Make sure the last location covers what is left
+               end( $this->ring );
+               $this->ring[key( $this->ring )][1] = self::RING_SIZE;
+       }
+
+       /**
+        * Get the location of an item on the ring
+        *
+        * @param string $item
+        * @return string Location
+        */
+       public function getLocation( $item ) {
+               $locations = $this->getLocations( $item, 1 );
+
+               return $locations[0];
+       }
+
+       /**
+        * Get the location of an item on the ring, as well as the next clockwise locations
+        *
+        * @param string $item
+        * @param integer $limit Maximum number of locations to return
+        * @return array List of locations
+        */
+       public function getLocations( $item, $limit ) {
+               $locations = array();
+               $primaryLocation = null;
+               $spot = hexdec( substr( sha1( $item ), 0, 7 ) ); // first 28 bits
+               foreach ( $this->ring as $location => $range ) {
+                       if ( count( $locations ) >= $limit ) {
+                               break;
+                       }
+                       // The $primaryLocation is the location the item spot is in.
+                       // After that is reached, keep appending the next locations.
+                       if ( ( $range[0] <= $spot && $spot < $range[1] ) || $primaryLocation !== null ) {
+                               if ( $primaryLocation === null ) {
+                                       $primaryLocation = $location;
+                               }
+                               $locations[] = $location;
+                       }
+               }
+               // If more locations are requested, wrap-around and keep adding them
+               reset( $this->ring );
+               while ( count( $locations ) < $limit ) {
+                       list( $location, ) = each( $this->ring );
+                       if ( $location === $primaryLocation ) {
+                               break; // don't go in circles
+                       }
+                       $locations[] = $location;
+               }
+
+               return $locations;
+       }
+
+       /**
+        * Get the map of locations to weight (ignores 0-weight items)
+        *
+        * @return array
+        */
+       public function getLocationWeights() {
+               return $this->sourceMap;
+       }
+
+       /**
+        * Get a new hash ring with a location removed from the ring
+        *
+        * @param string $location
+        * @return HashRing|bool Returns false if no non-zero weighted spots are left
+        */
+       public function newWithoutLocation( $location ) {
+               $map = $this->sourceMap;
+               unset( $map[$location] );
+               if ( count( $map ) ) {
+                       return new self( $map );
+               }
+
+               return false;
+       }
+}
diff --git a/includes/libs/MappedIterator.php b/includes/libs/MappedIterator.php
new file mode 100644 (file)
index 0000000..7fdde8a
--- /dev/null
@@ -0,0 +1,117 @@
+<?php
+/**
+ * Convenience class for generating iterators from iterators.
+ *
+ * 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
+ * @author Aaron Schulz
+ */
+
+/**
+ * Convenience class for generating iterators from iterators.
+ *
+ * @since 1.21
+ */
+class MappedIterator extends FilterIterator {
+       /** @var callable */
+       protected $vCallback;
+       /** @var callable */
+       protected $aCallback;
+       /** @var array */
+       protected $cache = array();
+
+       protected $rewound = false; // boolean; whether rewind() has been called
+
+       /**
+        * Build an new iterator from a base iterator by having the former wrap the
+        * later, returning the result of "value" callback for each current() invocation.
+        * The callback takes the result of current() on the base iterator as an argument.
+        * The keys of the base iterator are reused verbatim.
+        *
+        * An "accept" callback can also be provided which will be called for each value in
+        * the base iterator (post-callback) and will return true if that value should be
+        * included in iteration of the MappedIterator (otherwise it will be filtered out).
+        *
+        * @param Iterator|Array $iter
+        * @param callable $vCallback Value transformation callback
+        * @param array $options Options map (includes "accept") (since 1.22)
+        * @throws UnexpectedValueException
+        */
+       public function __construct( $iter, $vCallback, array $options = array() ) {
+               if ( is_array( $iter ) ) {
+                       $baseIterator = new ArrayIterator( $iter );
+               } elseif ( $iter instanceof Iterator ) {
+                       $baseIterator = $iter;
+               } else {
+                       throw new UnexpectedValueException( "Invalid base iterator provided." );
+               }
+               parent::__construct( $baseIterator );
+               $this->vCallback = $vCallback;
+               $this->aCallback = isset( $options['accept'] ) ? $options['accept'] : null;
+       }
+
+       public function next() {
+               $this->cache = array();
+               parent::next();
+       }
+
+       public function rewind() {
+               $this->rewound = true;
+               $this->cache = array();
+               parent::rewind();
+       }
+
+       public function accept() {
+               $value = call_user_func( $this->vCallback, $this->getInnerIterator()->current() );
+               $ok = ( $this->aCallback ) ? call_user_func( $this->aCallback, $value ) : true;
+               if ( $ok ) {
+                       $this->cache['current'] = $value;
+               }
+
+               return $ok;
+       }
+
+       public function key() {
+               $this->init();
+
+               return parent::key();
+       }
+
+       public function valid() {
+               $this->init();
+
+               return parent::valid();
+       }
+
+       public function current() {
+               $this->init();
+               if ( parent::valid() ) {
+                       return $this->cache['current'];
+               } else {
+                       return null; // out of range
+               }
+       }
+
+       /**
+        * Obviate the usual need for rewind() before using a FilterIterator in a manual loop
+        */
+       protected function init() {
+               if ( !$this->rewound ) {
+                       $this->rewind();
+               }
+       }
+}
diff --git a/includes/libs/MultiHttpClient.php b/includes/libs/MultiHttpClient.php
new file mode 100644 (file)
index 0000000..0675b38
--- /dev/null
@@ -0,0 +1,303 @@
+<?php
+
+/**
+ * Class to handle concurrent HTTP requests
+ *
+ * HTTP request maps use the following format:
+ *   - method   : GET/HEAD/PUT/POST/DELETE
+ *   - url      : HTTP/HTTPS URL
+ *   - query    : <query parameter field/value associative array> (uses RFC 3986)
+ *   - headers  : <header name/value associative array>
+ *   - body     : source to get the HTTP request body from;
+ *                this can simply be a string (always), a resource for
+ *                PUT requests, and a field/value array for POST request;
+ *                array bodies are encoded as multipart/form-data and strings
+ *                use application/x-www-form-urlencoded (headers sent automatically)
+ *   - stream   : resource to stream the HTTP response body to
+ *
+ * @author Aaron Schulz
+ * @since 1.23
+ */
+class MultiHttpClient {
+       /** @var resource */
+       protected $multiHandle = null; // curl_multi handle
+       /** @var string|null SSL certificates path  */
+       protected $caBundlePath;
+       /** @var integer */
+       protected $connTimeout;
+       /** @var integer */
+       protected $reqTimeout;
+
+       /**
+        * @param array $options
+        */
+       public function __construct( array $options ) {
+               if ( isset( $options['caBundlePath'] ) ) {
+                       $this->caBundlePath = $options['caBundlePath'];
+                       if ( !file_exists( $this->caBundlePath ) ) {
+                               throw new Exception( "Cannot find CA bundle: " . $this->caBundlePath );
+                       }
+               }
+               static $defaults = array( 'connTimeout' => 10, 'reqTimeout' => 300 );
+               foreach ( $defaults as $key => $default ) {
+                       $this->$key = isset( $options[$key] ) ? $options[$key] : $default;
+               }
+       }
+
+       /**
+        * Execute an HTTP(S) request
+        *
+        * This method returns a response map of:
+        *   - code    : HTTP response code or 0 if there was a serious cURL error
+        *   - reason  : HTTP response reason (empty if there was a serious cURL error)
+        *   - headers : <header name/value associative array>
+        *   - body    : HTTP response body or resource (if "stream" was set)
+        *   - err     : Any cURL error string
+        * The map also stores integer-indexed copies of these values. This lets callers do:
+        *      <code>
+        *              list( $rcode, $rdesc, $rhdrs, $rbody, $rerr ) = $req;
+        *  </code>
+        * @param array $req HTTP request array
+        * @return array Response array for request
+        */
+       public function run( array $req ) {
+               $req = $this->runMulti( array( $req ) );
+               return $req[0]['response'];
+       }
+
+       /**
+        * Execute a set of HTTP(S) request concurrently
+        *
+        * The maps are returned by this method with the 'response' field set to a map of:
+        *   - code    : HTTP response code or 0 if there was a serious cURL error
+        *   - reason  : HTTP response reason (empty if there was a serious cURL error)
+        *   - headers : <header name/value associative array>
+        *   - body    : HTTP response body or resource (if "stream" was set)
+        *   - err     : Any cURL error string
+        * The map also stores integer-indexed copies of these values. This lets callers do:
+        *      <code>
+        *              list( $rcode, $rdesc, $rhdrs, $rbody, $rerr ) = $req;
+        *  </code>
+        * All headers in the 'headers' field are normalized to use lower case names.
+        * This is true for the request headers and the response headers.
+        *
+        * @param array $req Map of HTTP request arrays
+        * @return array $reqs With response array populated for each
+        */
+       public function runMulti( array $reqs ) {
+               $multiHandle = $this->getCurlMulti();
+
+               // Normalize $reqs and add all of the required cURL handles...
+               $handles = array();
+               foreach ( $reqs as $index => &$req ) {
+                       $req['response'] = array(
+                               'code'     => 0,
+                               'reason'   => '',
+                               'headers'  => array(),
+                               'body'     => '',
+                               'error'    => ''
+                       );
+                       if ( !isset( $req['method'] ) ) {
+                               throw new Exception( "Request has no 'method' field set." );
+                       } elseif ( !isset( $req['url'] ) ) {
+                               throw new Exception( "Request has no 'url' field set." );
+                       }
+                       $req['query'] = isset( $req['query'] ) ? $req['query'] : array();
+                       $headers = array(); // normalized headers
+                       if ( isset( $req['headers'] ) ) {
+                               foreach ( $req['headers'] as $name => $value ) {
+                                       $headers[strtolower( $name )] = $value;
+                               }
+                       }
+                       $req['headers'] = $headers;
+                       if ( !isset( $req['body'] ) ) {
+                               $req['body'] = '';
+                               $req['headers']['content-length'] = 0;
+                       }
+                       $handles[$index] = $this->getCurlHandle( $req );
+                       if ( count( $reqs ) > 1 ) {
+                               // https://github.com/guzzle/guzzle/issues/349
+                               curl_setopt( $handles[$index], CURLOPT_FORBID_REUSE, true );
+                       }
+                       curl_multi_add_handle( $multiHandle, $handles[$index] );
+               }
+
+               // Execute the cURL handles concurrently...
+               $active = null; // handles still being processed
+               do {
+                       // Do any available work...
+                       do {
+                               $mrc = curl_multi_exec( $multiHandle, $active );
+                       } while ( $mrc == CURLM_CALL_MULTI_PERFORM );
+                       // Wait (if possible) for available work...
+                       if ( $active > 0 && $mrc == CURLM_OK ) {
+                               if ( curl_multi_select( $multiHandle, 10 ) == -1 ) {
+                                       // PHP bug 63411; http://curl.haxx.se/libcurl/c/curl_multi_fdset.html
+                                       usleep( 5000 ); // 5ms
+                               }
+                       }
+               } while ( $active > 0 && $mrc == CURLM_OK );
+
+               // Remove all of the added cURL handles and check for errors...
+               foreach ( $reqs as $index => &$req ) {
+                       $ch = $handles[$index];
+                       curl_multi_remove_handle( $multiHandle, $ch );
+                       if ( curl_errno( $ch ) !== 0 ) {
+                               $req['error'] = "(curl error: " . curl_errno( $ch ) . ") " . curl_error( $ch );
+                       }
+                       // For convenience with the list() operator
+                       $req['response'][0] = $req['response']['code'];
+                       $req['response'][1] = $req['response']['reason'];
+                       $req['response'][2] = $req['response']['headers'];
+                       $req['response'][3] = $req['response']['body'];
+                       $req['response'][4] = $req['response']['error'];
+                       curl_close( $ch );
+                       // Close any string wrapper file handles
+                       if ( isset( $req['_closeHandle'] ) ) {
+                               fclose( $req['_closeHandle'] );
+                               unset( $req['_closeHandle'] );
+                       }
+               }
+
+               return $reqs;
+       }
+
+       /**
+        * @param array $req HTTP request map
+        * @return resource
+        */
+       protected function getCurlHandle( array &$req ) {
+               $ch = curl_init();
+
+               curl_setopt( $ch, CURLOPT_CONNECTTIMEOUT, $this->connTimeout );
+               curl_setopt( $ch, CURLOPT_TIMEOUT, $this->reqTimeout );
+               curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, 1 );
+               curl_setopt( $ch, CURLOPT_MAXREDIRS, 4 );
+               curl_setopt( $ch, CURLOPT_HEADER, 0 );
+               if ( !is_null( $this->caBundlePath ) ) {
+                       curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, true );
+                       curl_setopt( $ch, CURLOPT_CAINFO, $this->caBundlePath );
+               }
+               curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 );
+
+               $url = $req['url'];
+               // PHP_QUERY_RFC3986 is PHP 5.4+ only
+               $query = str_replace(
+                       array( '+', '%7E' ),
+                       array( '%20', '~' ),
+                       http_build_query( $req['query'], '', '&' )
+               );
+               if ( $query != '' ) {
+                       $url .= strpos( $req['url'], '?' ) === false ? "?$query" : "&$query";
+               }
+               curl_setopt( $ch, CURLOPT_URL, $url );
+
+               curl_setopt( $ch, CURLOPT_CUSTOMREQUEST, $req['method'] );
+               if ( $req['method'] === 'HEAD' ) {
+                       curl_setopt( $ch, CURLOPT_NOBODY, 1 );
+               }
+
+               if ( $req['method'] === 'PUT' ) {
+                       curl_setopt( $ch, CURLOPT_PUT, 1 );
+                       if ( is_resource( $req['body'] ) ) {
+                               curl_setopt( $ch, CURLOPT_INFILE, $req['body'] );
+                               if ( isset( $req['headers']['content-length'] ) ) {
+                                       curl_setopt( $ch, CURLOPT_INFILESIZE, $req['headers']['content-length'] );
+                               } elseif ( isset( $req['headers']['transfer-encoding'] ) &&
+                                       $req['headers']['transfer-encoding'] === 'chunks'
+                               ) {
+                                       curl_setopt( $ch, CURLOPT_UPLOAD, true );
+                               } else {
+                                       throw new Exception( "Missing 'Content-Length' or 'Transfer-Encoding' header." );
+                               }
+                       } elseif ( $req['body'] !== '' ) {
+                               $fp = fopen( "php://temp", "wb+" );
+                               fwrite( $fp, $req['body'], strlen( $req['body'] ) );
+                               rewind( $fp );
+                               curl_setopt( $ch, CURLOPT_INFILE, $fp );
+                               curl_setopt( $ch, CURLOPT_INFILESIZE, strlen( $req['body'] ) );
+                               $req['_closeHandle'] = $fp; // remember to close this later
+                       } else {
+                               curl_setopt( $ch, CURLOPT_INFILESIZE, 0 );
+                       }
+                       curl_setopt( $ch, CURLOPT_READFUNCTION,
+                               function ( $ch, $fd, $length ) {
+                                       $data = fread( $fd, $length );
+                                       $len = strlen( $data );
+                                       return $data;
+                               }
+                       );
+               } elseif ( $req['method'] === 'POST' ) {
+                       curl_setopt( $ch, CURLOPT_POST, 1 );
+                       curl_setopt( $ch, CURLOPT_POSTFIELDS, $req['body'] );
+               } else {
+                       if ( is_resource( $req['body'] ) || $req['body'] !== '' ) {
+                               throw new Exception( "HTTP body specified for a non PUT/POST request." );
+                       }
+                       $req['headers']['content-length'] = 0;
+               }
+
+               $headers = array();
+               foreach ( $req['headers'] as $name => $value ) {
+                       if ( strpos( $name, ': ' ) ) {
+                               throw new Exception( "Headers cannot have ':' in the name." );
+                       }
+                       $headers[] = $name . ': ' . trim( $value );
+               }
+               curl_setopt( $ch, CURLOPT_HTTPHEADER, $headers );
+
+               curl_setopt( $ch, CURLOPT_HEADERFUNCTION,
+                       function ( $ch, $header ) use ( &$req ) {
+                               $length = strlen( $header );
+                               $matches = array();
+                               if ( preg_match( "/^(HTTP\/1\.[01]) (\d{3}) (.*)/", $header, $matches ) ) {
+                                       $req['response']['code'] = (int)$matches[2];
+                                       $req['response']['reason'] = trim( $matches[3] );
+                                       return $length;
+                               }
+                               if ( strpos( $header, ":" ) === false ) {
+                                       return $length;
+                               }
+                               list( $name, $value ) = explode( ":", $header, 2 );
+                               $req['response']['headers'][strtolower( $name )] = trim( $value );
+                               return $length;
+                       }
+               );
+
+               if ( isset( $req['stream'] ) ) {
+                       // Don't just use CURLOPT_FILE as that might give:
+                       // curl_setopt(): cannot represent a stream of type Output as a STDIO FILE*
+                       // The callback here handles both normal files and php://temp handles.
+                       curl_setopt( $ch, CURLOPT_WRITEFUNCTION,
+                               function ( $ch, $data ) use ( &$req ) {
+                                       return fwrite( $req['stream'], $data );
+                               }
+                       );
+               } else {
+                       curl_setopt( $ch, CURLOPT_WRITEFUNCTION,
+                               function ( $ch, $data ) use ( &$req ) {
+                                       $req['response']['body'] .= $data;
+                                       return strlen( $data );
+                               }
+                       );
+               }
+
+               return $ch;
+       }
+
+       /**
+        * @return resource
+        */
+       protected function getCurlMulti() {
+               if ( !$this->multiHandle ) {
+                       $this->multiHandle = curl_multi_init();
+               }
+               return $this->multiHandle;
+       }
+
+       function __destruct() {
+               if ( $this->multiHandle ) {
+                       curl_multi_close( $this->multiHandle );
+               }
+       }
+}
diff --git a/includes/normal/.gitignore b/includes/normal/.gitignore
new file mode 100644 (file)
index 0000000..0dea457
--- /dev/null
@@ -0,0 +1,7 @@
+/CompositionExclusions.txt
+/DerivedNormalizationProps.txt
+/NormalizationCorrections.txt
+/NormalizationTest.txt
+/UTF-8-test.txt
+/UnicodeData.txt
+/testdata
index 66348ee..76cb68b 100644 (file)
@@ -16,14 +16,11 @@ PHP=php
 FETCH=wget
 #FETCH=fetch
 
-all : UtfNormalData.inc Utf8Case.php
+all : UtfNormalData.inc
 
 UtfNormalData.inc : UtfNormalGenerate.php UtfNormalUtil.php UnicodeData.txt CompositionExclusions.txt NormalizationCorrections.txt DerivedNormalizationProps.txt
        $(PHP) UtfNormalGenerate.php
 
-Utf8Case.php : Utf8CaseGenerate.php UtfNormalUtil.php UnicodeData.txt
-       $(PHP) Utf8CaseGenerate.php
-
 test : testutf8 UtfNormalTest.php UtfNormalData.inc NormalizationTest.txt
        $(PHP) UtfNormalTest.php
 
diff --git a/includes/normal/Utf8Case.php b/includes/normal/Utf8Case.php
deleted file mode 100644 (file)
index abc56e4..0000000
+++ /dev/null
@@ -1,2109 +0,0 @@
-<?php
-/**
- * Simple 1:1 upper/lowercase switching arrays for utf-8 text.
- * Won't get context-sensitive things yet.
- *
- * Hack for bugs in ucfirst() and company
- *
- * These are pulled from memcached if possible, as this is faster than filling
- * up a big array manually.
- *
- * @file
- * @ingroup Language
- */
-
-/**
- * Translation array to get upper case character
- */
-$wikiUpperChars = array(
-       'a' => 'A',
-       'b' => 'B',
-       'c' => 'C',
-       'd' => 'D',
-       'e' => 'E',
-       'f' => 'F',
-       'g' => 'G',
-       'h' => 'H',
-       'i' => 'I',
-       'j' => 'J',
-       'k' => 'K',
-       'l' => 'L',
-       'm' => 'M',
-       'n' => 'N',
-       'o' => 'O',
-       'p' => 'P',
-       'q' => 'Q',
-       'r' => 'R',
-       's' => 'S',
-       't' => 'T',
-       'u' => 'U',
-       'v' => 'V',
-       'w' => 'W',
-       'x' => 'X',
-       'y' => 'Y',
-       'z' => 'Z',
-       'µ' => 'Μ',
-       'à' => 'À',
-       'á' => 'Á',
-       'â' => 'Â',
-       'ã' => 'Ã',
-       'ä' => 'Ä',
-       'å' => 'Å',
-       'æ' => 'Æ',
-       'ç' => 'Ç',
-       'è' => 'È',
-       'é' => 'É',
-       'ê' => 'Ê',
-       'ë' => 'Ë',
-       'ì' => 'Ì',
-       'í' => 'Í',
-       'î' => 'Î',
-       'ï' => 'Ï',
-       'ð' => 'Ð',
-       'ñ' => 'Ñ',
-       'ò' => 'Ò',
-       'ó' => 'Ó',
-       'ô' => 'Ô',
-       'õ' => 'Õ',
-       'ö' => 'Ö',
-       'ø' => 'Ø',
-       'ù' => 'Ù',
-       'ú' => 'Ú',
-       'û' => 'Û',
-       'ü' => 'Ü',
-       'ý' => 'Ý',
-       'þ' => 'Þ',
-       'ÿ' => 'Ÿ',
-       'ā' => 'Ā',
-       'ă' => 'Ă',
-       'ą' => 'Ą',
-       'ć' => 'Ć',
-       'ĉ' => 'Ĉ',
-       'ċ' => 'Ċ',
-       'č' => 'Č',
-       'ď' => 'Ď',
-       'đ' => 'Đ',
-       'ē' => 'Ē',
-       'ĕ' => 'Ĕ',
-       'ė' => 'Ė',
-       'ę' => 'Ę',
-       'ě' => 'Ě',
-       'ĝ' => 'Ĝ',
-       'ğ' => 'Ğ',
-       'ġ' => 'Ġ',
-       'ģ' => 'Ģ',
-       'ĥ' => 'Ĥ',
-       'ħ' => 'Ħ',
-       'ĩ' => 'Ĩ',
-       'ī' => 'Ī',
-       'ĭ' => 'Ĭ',
-       'į' => 'Į',
-       'ı' => 'I',
-       'ij' => 'IJ',
-       'ĵ' => 'Ĵ',
-       'ķ' => 'Ķ',
-       'ĺ' => 'Ĺ',
-       'ļ' => 'Ļ',
-       'ľ' => 'Ľ',
-       'ŀ' => 'Ŀ',
-       'ł' => 'Ł',
-       'ń' => 'Ń',
-       'ņ' => 'Ņ',
-       'ň' => 'Ň',
-       'ŋ' => 'Ŋ',
-       'ō' => 'Ō',
-       'ŏ' => 'Ŏ',
-       'ő' => 'Ő',
-       'œ' => 'Œ',
-       'ŕ' => 'Ŕ',
-       'ŗ' => 'Ŗ',
-       'ř' => 'Ř',
-       'ś' => 'Ś',
-       'ŝ' => 'Ŝ',
-       'ş' => 'Ş',
-       'š' => 'Š',
-       'ţ' => 'Ţ',
-       'ť' => 'Ť',
-       'ŧ' => 'Ŧ',
-       'ũ' => 'Ũ',
-       'ū' => 'Ū',
-       'ŭ' => 'Ŭ',
-       'ů' => 'Ů',
-       'ű' => 'Ű',
-       'ų' => 'Ų',
-       'ŵ' => 'Ŵ',
-       'ŷ' => 'Ŷ',
-       'ź' => 'Ź',
-       'ż' => 'Ż',
-       'ž' => 'Ž',
-       'ſ' => 'S',
-       'ƀ' => 'Ƀ',
-       'ƃ' => 'Ƃ',
-       'ƅ' => 'Ƅ',
-       'ƈ' => 'Ƈ',
-       'ƌ' => 'Ƌ',
-       'ƒ' => 'Ƒ',
-       'ƕ' => 'Ƕ',
-       'ƙ' => 'Ƙ',
-       'ƚ' => 'Ƚ',
-       'ƞ' => 'Ƞ',
-       'ơ' => 'Ơ',
-       'ƣ' => 'Ƣ',
-       'ƥ' => 'Ƥ',
-       'ƨ' => 'Ƨ',
-       'ƭ' => 'Ƭ',
-       'ư' => 'Ư',
-       'ƴ' => 'Ƴ',
-       'ƶ' => 'Ƶ',
-       'ƹ' => 'Ƹ',
-       'ƽ' => 'Ƽ',
-       'ƿ' => 'Ƿ',
-       'Dž' => 'DŽ',
-       'dž' => 'DŽ',
-       'Lj' => 'LJ',
-       'lj' => 'LJ',
-       'Nj' => 'NJ',
-       'nj' => 'NJ',
-       'ǎ' => 'Ǎ',
-       'ǐ' => 'Ǐ',
-       'ǒ' => 'Ǒ',
-       'ǔ' => 'Ǔ',
-       'ǖ' => 'Ǖ',
-       'ǘ' => 'Ǘ',
-       'ǚ' => 'Ǚ',
-       'ǜ' => 'Ǜ',
-       'ǝ' => 'Ǝ',
-       'ǟ' => 'Ǟ',
-       'ǡ' => 'Ǡ',
-       'ǣ' => 'Ǣ',
-       'ǥ' => 'Ǥ',
-       'ǧ' => 'Ǧ',
-       'ǩ' => 'Ǩ',
-       'ǫ' => 'Ǫ',
-       'ǭ' => 'Ǭ',
-       'ǯ' => 'Ǯ',
-       'Dz' => 'DZ',
-       'dz' => 'DZ',
-       'ǵ' => 'Ǵ',
-       'ǹ' => 'Ǹ',
-       'ǻ' => 'Ǻ',
-       'ǽ' => 'Ǽ',
-       'ǿ' => 'Ǿ',
-       'ȁ' => 'Ȁ',
-       'ȃ' => 'Ȃ',
-       'ȅ' => 'Ȅ',
-       'ȇ' => 'Ȇ',
-       'ȉ' => 'Ȉ',
-       'ȋ' => 'Ȋ',
-       'ȍ' => 'Ȍ',
-       'ȏ' => 'Ȏ',
-       'ȑ' => 'Ȑ',
-       'ȓ' => 'Ȓ',
-       'ȕ' => 'Ȕ',
-       'ȗ' => 'Ȗ',
-       'ș' => 'Ș',
-       'ț' => 'Ț',
-       'ȝ' => 'Ȝ',
-       'ȟ' => 'Ȟ',
-       'ȣ' => 'Ȣ',
-       'ȥ' => 'Ȥ',
-       'ȧ' => 'Ȧ',
-       'ȩ' => 'Ȩ',
-       'ȫ' => 'Ȫ',
-       'ȭ' => 'Ȭ',
-       'ȯ' => 'Ȯ',
-       'ȱ' => 'Ȱ',
-       'ȳ' => 'Ȳ',
-       'ȼ' => 'Ȼ',
-       'ȿ' => 'Ȿ',
-       'ɀ' => 'Ɀ',
-       'ɂ' => 'Ɂ',
-       'ɇ' => 'Ɇ',
-       'ɉ' => 'Ɉ',
-       'ɋ' => 'Ɋ',
-       'ɍ' => 'Ɍ',
-       'ɏ' => 'Ɏ',
-       'ɐ' => 'Ɐ',
-       'ɑ' => 'Ɑ',
-       'ɒ' => 'Ɒ',
-       'ɓ' => 'Ɓ',
-       'ɔ' => 'Ɔ',
-       'ɖ' => 'Ɖ',
-       'ɗ' => 'Ɗ',
-       'ə' => 'Ə',
-       'ɛ' => 'Ɛ',
-       'ɠ' => 'Ɠ',
-       'ɣ' => 'Ɣ',
-       'ɥ' => 'Ɥ',
-       'ɨ' => 'Ɨ',
-       'ɩ' => 'Ɩ',
-       'ɫ' => 'Ɫ',
-       'ɯ' => 'Ɯ',
-       'ɱ' => 'Ɱ',
-       'ɲ' => 'Ɲ',
-       'ɵ' => 'Ɵ',
-       'ɽ' => 'Ɽ',
-       'ʀ' => 'Ʀ',
-       'ʃ' => 'Ʃ',
-       'ʈ' => 'Ʈ',
-       'ʉ' => 'Ʉ',
-       'ʊ' => 'Ʊ',
-       'ʋ' => 'Ʋ',
-       'ʌ' => 'Ʌ',
-       'ʒ' => 'Ʒ',
-       'ͅ' => 'Ι',
-       'ͱ' => 'Ͱ',
-       'ͳ' => 'Ͳ',
-       'ͷ' => 'Ͷ',
-       'ͻ' => 'Ͻ',
-       'ͼ' => 'Ͼ',
-       'ͽ' => 'Ͽ',
-       'ά' => 'Ά',
-       'έ' => 'Έ',
-       'ή' => 'Ή',
-       'ί' => 'Ί',
-       'α' => 'Α',
-       'β' => 'Β',
-       'γ' => 'Γ',
-       'δ' => 'Δ',
-       'ε' => 'Ε',
-       'ζ' => 'Ζ',
-       'η' => 'Η',
-       'θ' => 'Θ',
-       'ι' => 'Ι',
-       'κ' => 'Κ',
-       'λ' => 'Λ',
-       'μ' => 'Μ',
-       'ν' => 'Ν',
-       'ξ' => 'Ξ',
-       'ο' => 'Ο',
-       'π' => 'Π',
-       'ρ' => 'Ρ',
-       'ς' => 'Σ',
-       'σ' => 'Σ',
-       'τ' => 'Τ',
-       'υ' => 'Υ',
-       'φ' => 'Φ',
-       'χ' => 'Χ',
-       'ψ' => 'Ψ',
-       'ω' => 'Ω',
-       'ϊ' => 'Ϊ',
-       'ϋ' => 'Ϋ',
-       'ό' => 'Ό',
-       'ύ' => 'Ύ',
-       'ώ' => 'Ώ',
-       'ϐ' => 'Β',
-       'ϑ' => 'Θ',
-       'ϕ' => 'Φ',
-       'ϖ' => 'Π',
-       'ϗ' => 'Ϗ',
-       'ϙ' => 'Ϙ',
-       'ϛ' => 'Ϛ',
-       'ϝ' => 'Ϝ',
-       'ϟ' => 'Ϟ',
-       'ϡ' => 'Ϡ',
-       'ϣ' => 'Ϣ',
-       'ϥ' => 'Ϥ',
-       'ϧ' => 'Ϧ',
-       'ϩ' => 'Ϩ',
-       'ϫ' => 'Ϫ',
-       'ϭ' => 'Ϭ',
-       'ϯ' => 'Ϯ',
-       'ϰ' => 'Κ',
-       'ϱ' => 'Ρ',
-       'ϲ' => 'Ϲ',
-       'ϵ' => 'Ε',
-       'ϸ' => 'Ϸ',
-       'ϻ' => 'Ϻ',
-       'а' => 'А',
-       'б' => 'Б',
-       'в' => 'В',
-       'г' => 'Г',
-       'д' => 'Д',
-       'е' => 'Е',
-       'ж' => 'Ж',
-       'з' => 'З',
-       'и' => 'И',
-       'й' => 'Й',
-       'к' => 'К',
-       'л' => 'Л',
-       'м' => 'М',
-       'н' => 'Н',
-       'о' => 'О',
-       'п' => 'П',
-       'р' => 'Р',
-       'с' => 'С',
-       'т' => 'Т',
-       'у' => 'У',
-       'ф' => 'Ф',
-       'х' => 'Х',
-       'ц' => 'Ц',
-       'ч' => 'Ч',
-       'ш' => 'Ш',
-       'щ' => 'Щ',
-       'ъ' => 'Ъ',
-       'ы' => 'Ы',
-       'ь' => 'Ь',
-       'э' => 'Э',
-       'ю' => 'Ю',
-       'я' => 'Я',
-       'ѐ' => 'Ѐ',
-       'ё' => 'Ё',
-       'ђ' => 'Ђ',
-       'ѓ' => 'Ѓ',
-       'є' => 'Є',
-       'ѕ' => 'Ѕ',
-       'і' => 'І',
-       'ї' => 'Ї',
-       'ј' => 'Ј',
-       'љ' => 'Љ',
-       'њ' => 'Њ',
-       'ћ' => 'Ћ',
-       'ќ' => 'Ќ',
-       'ѝ' => 'Ѝ',
-       'ў' => 'Ў',
-       'џ' => 'Џ',
-       'ѡ' => 'Ѡ',
-       'ѣ' => 'Ѣ',
-       'ѥ' => 'Ѥ',
-       'ѧ' => 'Ѧ',
-       'ѩ' => 'Ѩ',
-       'ѫ' => 'Ѫ',
-       'ѭ' => 'Ѭ',
-       'ѯ' => 'Ѯ',
-       'ѱ' => 'Ѱ',
-       'ѳ' => 'Ѳ',
-       'ѵ' => 'Ѵ',
-       'ѷ' => 'Ѷ',
-       'ѹ' => 'Ѹ',
-       'ѻ' => 'Ѻ',
-       'ѽ' => 'Ѽ',
-       'ѿ' => 'Ѿ',
-       'ҁ' => 'Ҁ',
-       'ҋ' => 'Ҋ',
-       'ҍ' => 'Ҍ',
-       'ҏ' => 'Ҏ',
-       'ґ' => 'Ґ',
-       'ғ' => 'Ғ',
-       'ҕ' => 'Ҕ',
-       'җ' => 'Җ',
-       'ҙ' => 'Ҙ',
-       'қ' => 'Қ',
-       'ҝ' => 'Ҝ',
-       'ҟ' => 'Ҟ',
-       'ҡ' => 'Ҡ',
-       'ң' => 'Ң',
-       'ҥ' => 'Ҥ',
-       'ҧ' => 'Ҧ',
-       'ҩ' => 'Ҩ',
-       'ҫ' => 'Ҫ',
-       'ҭ' => 'Ҭ',
-       'ү' => 'Ү',
-       'ұ' => 'Ұ',
-       'ҳ' => 'Ҳ',
-       'ҵ' => 'Ҵ',
-       'ҷ' => 'Ҷ',
-       'ҹ' => 'Ҹ',
-       'һ' => 'Һ',
-       'ҽ' => 'Ҽ',
-       'ҿ' => 'Ҿ',
-       'ӂ' => 'Ӂ',
-       'ӄ' => 'Ӄ',
-       'ӆ' => 'Ӆ',
-       'ӈ' => 'Ӈ',
-       'ӊ' => 'Ӊ',
-       'ӌ' => 'Ӌ',
-       'ӎ' => 'Ӎ',
-       'ӏ' => 'Ӏ',
-       'ӑ' => 'Ӑ',
-       'ӓ' => 'Ӓ',
-       'ӕ' => 'Ӕ',
-       'ӗ' => 'Ӗ',
-       'ә' => 'Ә',
-       'ӛ' => 'Ӛ',
-       'ӝ' => 'Ӝ',
-       'ӟ' => 'Ӟ',
-       'ӡ' => 'Ӡ',
-       'ӣ' => 'Ӣ',
-       'ӥ' => 'Ӥ',
-       'ӧ' => 'Ӧ',
-       'ө' => 'Ө',
-       'ӫ' => 'Ӫ',
-       'ӭ' => 'Ӭ',
-       'ӯ' => 'Ӯ',
-       'ӱ' => 'Ӱ',
-       'ӳ' => 'Ӳ',
-       'ӵ' => 'Ӵ',
-       'ӷ' => 'Ӷ',
-       'ӹ' => 'Ӹ',
-       'ӻ' => 'Ӻ',
-       'ӽ' => 'Ӽ',
-       'ӿ' => 'Ӿ',
-       'ԁ' => 'Ԁ',
-       'ԃ' => 'Ԃ',
-       'ԅ' => 'Ԅ',
-       'ԇ' => 'Ԇ',
-       'ԉ' => 'Ԉ',
-       'ԋ' => 'Ԋ',
-       'ԍ' => 'Ԍ',
-       'ԏ' => 'Ԏ',
-       'ԑ' => 'Ԑ',
-       'ԓ' => 'Ԓ',
-       'ԕ' => 'Ԕ',
-       'ԗ' => 'Ԗ',
-       'ԙ' => 'Ԙ',
-       'ԛ' => 'Ԛ',
-       'ԝ' => 'Ԝ',
-       'ԟ' => 'Ԟ',
-       'ԡ' => 'Ԡ',
-       'ԣ' => 'Ԣ',
-       'ԥ' => 'Ԥ',
-       'ԧ' => 'Ԧ',
-       'ա' => 'Ա',
-       'բ' => 'Բ',
-       'գ' => 'Գ',
-       'դ' => 'Դ',
-       'ե' => 'Ե',
-       'զ' => 'Զ',
-       'է' => 'Է',
-       'ը' => 'Ը',
-       'թ' => 'Թ',
-       'ժ' => 'Ժ',
-       'ի' => 'Ի',
-       'լ' => 'Լ',
-       'խ' => 'Խ',
-       'ծ' => 'Ծ',
-       'կ' => 'Կ',
-       'հ' => 'Հ',
-       'ձ' => 'Ձ',
-       'ղ' => 'Ղ',
-       'ճ' => 'Ճ',
-       'մ' => 'Մ',
-       'յ' => 'Յ',
-       'ն' => 'Ն',
-       'շ' => 'Շ',
-       'ո' => 'Ո',
-       'չ' => 'Չ',
-       'պ' => 'Պ',
-       'ջ' => 'Ջ',
-       'ռ' => 'Ռ',
-       'ս' => 'Ս',
-       'վ' => 'Վ',
-       'տ' => 'Տ',
-       'ր' => 'Ր',
-       'ց' => 'Ց',
-       'ւ' => 'Ւ',
-       'փ' => 'Փ',
-       'ք' => 'Ք',
-       'օ' => 'Օ',
-       'ֆ' => 'Ֆ',
-       'ᵹ' => 'Ᵹ',
-       'ᵽ' => 'Ᵽ',
-       'ḁ' => 'Ḁ',
-       'ḃ' => 'Ḃ',
-       'ḅ' => 'Ḅ',
-       'ḇ' => 'Ḇ',
-       'ḉ' => 'Ḉ',
-       'ḋ' => 'Ḋ',
-       'ḍ' => 'Ḍ',
-       'ḏ' => 'Ḏ',
-       'ḑ' => 'Ḑ',
-       'ḓ' => 'Ḓ',
-       'ḕ' => 'Ḕ',
-       'ḗ' => 'Ḗ',
-       'ḙ' => 'Ḙ',
-       'ḛ' => 'Ḛ',
-       'ḝ' => 'Ḝ',
-       'ḟ' => 'Ḟ',
-       'ḡ' => 'Ḡ',
-       'ḣ' => 'Ḣ',
-       'ḥ' => 'Ḥ',
-       'ḧ' => 'Ḧ',
-       'ḩ' => 'Ḩ',
-       'ḫ' => 'Ḫ',
-       'ḭ' => 'Ḭ',
-       'ḯ' => 'Ḯ',
-       'ḱ' => 'Ḱ',
-       'ḳ' => 'Ḳ',
-       'ḵ' => 'Ḵ',
-       'ḷ' => 'Ḷ',
-       'ḹ' => 'Ḹ',
-       'ḻ' => 'Ḻ',
-       'ḽ' => 'Ḽ',
-       'ḿ' => 'Ḿ',
-       'ṁ' => 'Ṁ',
-       'ṃ' => 'Ṃ',
-       'ṅ' => 'Ṅ',
-       'ṇ' => 'Ṇ',
-       'ṉ' => 'Ṉ',
-       'ṋ' => 'Ṋ',
-       'ṍ' => 'Ṍ',
-       'ṏ' => 'Ṏ',
-       'ṑ' => 'Ṑ',
-       'ṓ' => 'Ṓ',
-       'ṕ' => 'Ṕ',
-       'ṗ' => 'Ṗ',
-       'ṙ' => 'Ṙ',
-       'ṛ' => 'Ṛ',
-       'ṝ' => 'Ṝ',
-       'ṟ' => 'Ṟ',
-       'ṡ' => 'Ṡ',
-       'ṣ' => 'Ṣ',
-       'ṥ' => 'Ṥ',
-       'ṧ' => 'Ṧ',
-       'ṩ' => 'Ṩ',
-       'ṫ' => 'Ṫ',
-       'ṭ' => 'Ṭ',
-       'ṯ' => 'Ṯ',
-       'ṱ' => 'Ṱ',
-       'ṳ' => 'Ṳ',
-       'ṵ' => 'Ṵ',
-       'ṷ' => 'Ṷ',
-       'ṹ' => 'Ṹ',
-       'ṻ' => 'Ṻ',
-       'ṽ' => 'Ṽ',
-       'ṿ' => 'Ṿ',
-       'ẁ' => 'Ẁ',
-       'ẃ' => 'Ẃ',
-       'ẅ' => 'Ẅ',
-       'ẇ' => 'Ẇ',
-       'ẉ' => 'Ẉ',
-       'ẋ' => 'Ẋ',
-       'ẍ' => 'Ẍ',
-       'ẏ' => 'Ẏ',
-       'ẑ' => 'Ẑ',
-       'ẓ' => 'Ẓ',
-       'ẕ' => 'Ẕ',
-       'ẛ' => 'Ṡ',
-       'ạ' => 'Ạ',
-       'ả' => 'Ả',
-       'ấ' => 'Ấ',
-       'ầ' => 'Ầ',
-       'ẩ' => 'Ẩ',
-       'ẫ' => 'Ẫ',
-       'ậ' => 'Ậ',
-       'ắ' => 'Ắ',
-       'ằ' => 'Ằ',
-       'ẳ' => 'Ẳ',
-       'ẵ' => 'Ẵ',
-       'ặ' => 'Ặ',
-       'ẹ' => 'Ẹ',
-       'ẻ' => 'Ẻ',
-       'ẽ' => 'Ẽ',
-       'ế' => 'Ế',
-       'ề' => 'Ề',
-       'ể' => 'Ể',
-       'ễ' => 'Ễ',
-       'ệ' => 'Ệ',
-       'ỉ' => 'Ỉ',
-       'ị' => 'Ị',
-       'ọ' => 'Ọ',
-       'ỏ' => 'Ỏ',
-       'ố' => 'Ố',
-       'ồ' => 'Ồ',
-       'ổ' => 'Ổ',
-       'ỗ' => 'Ỗ',
-       'ộ' => 'Ộ',
-       'ớ' => 'Ớ',
-       'ờ' => 'Ờ',
-       'ở' => 'Ở',
-       'ỡ' => 'Ỡ',
-       'ợ' => 'Ợ',
-       'ụ' => 'Ụ',
-       'ủ' => 'Ủ',
-       'ứ' => 'Ứ',
-       'ừ' => 'Ừ',
-       'ử' => 'Ử',
-       'ữ' => 'Ữ',
-       'ự' => 'Ự',
-       'ỳ' => 'Ỳ',
-       'ỵ' => 'Ỵ',
-       'ỷ' => 'Ỷ',
-       'ỹ' => 'Ỹ',
-       'ỻ' => 'Ỻ',
-       'ỽ' => 'Ỽ',
-       'ỿ' => 'Ỿ',
-       'ἀ' => 'Ἀ',
-       'ἁ' => 'Ἁ',
-       'ἂ' => 'Ἂ',
-       'ἃ' => 'Ἃ',
-       'ἄ' => 'Ἄ',
-       'ἅ' => 'Ἅ',
-       'ἆ' => 'Ἆ',
-       'ἇ' => 'Ἇ',
-       'ἐ' => 'Ἐ',
-       'ἑ' => 'Ἑ',
-       'ἒ' => 'Ἒ',
-       'ἓ' => 'Ἓ',
-       'ἔ' => 'Ἔ',
-       'ἕ' => 'Ἕ',
-       'ἠ' => 'Ἠ',
-       'ἡ' => 'Ἡ',
-       'ἢ' => 'Ἢ',
-       'ἣ' => 'Ἣ',
-       'ἤ' => 'Ἤ',
-       'ἥ' => 'Ἥ',
-       'ἦ' => 'Ἦ',
-       'ἧ' => 'Ἧ',
-       'ἰ' => 'Ἰ',
-       'ἱ' => 'Ἱ',
-       'ἲ' => 'Ἲ',
-       'ἳ' => 'Ἳ',
-       'ἴ' => 'Ἴ',
-       'ἵ' => 'Ἵ',
-       'ἶ' => 'Ἶ',
-       'ἷ' => 'Ἷ',
-       'ὀ' => 'Ὀ',
-       'ὁ' => 'Ὁ',
-       'ὂ' => 'Ὂ',
-       'ὃ' => 'Ὃ',
-       'ὄ' => 'Ὄ',
-       'ὅ' => 'Ὅ',
-       'ὑ' => 'Ὑ',
-       'ὓ' => 'Ὓ',
-       'ὕ' => 'Ὕ',
-       'ὗ' => 'Ὗ',
-       'ὠ' => 'Ὠ',
-       'ὡ' => 'Ὡ',
-       'ὢ' => 'Ὢ',
-       'ὣ' => 'Ὣ',
-       'ὤ' => 'Ὤ',
-       'ὥ' => 'Ὥ',
-       'ὦ' => 'Ὦ',
-       'ὧ' => 'Ὧ',
-       'ὰ' => 'Ὰ',
-       'ά' => 'Ά',
-       'ὲ' => 'Ὲ',
-       'έ' => 'Έ',
-       'ὴ' => 'Ὴ',
-       'ή' => 'Ή',
-       'ὶ' => 'Ὶ',
-       'ί' => 'Ί',
-       'ὸ' => 'Ὸ',
-       'ό' => 'Ό',
-       'ὺ' => 'Ὺ',
-       'ύ' => 'Ύ',
-       'ὼ' => 'Ὼ',
-       'ώ' => 'Ώ',
-       'ᾀ' => 'ᾈ',
-       'ᾁ' => 'ᾉ',
-       'ᾂ' => 'ᾊ',
-       'ᾃ' => 'ᾋ',
-       'ᾄ' => 'ᾌ',
-       'ᾅ' => 'ᾍ',
-       'ᾆ' => 'ᾎ',
-       'ᾇ' => 'ᾏ',
-       'ᾐ' => 'ᾘ',
-       'ᾑ' => 'ᾙ',
-       'ᾒ' => 'ᾚ',
-       'ᾓ' => 'ᾛ',
-       'ᾔ' => 'ᾜ',
-       'ᾕ' => 'ᾝ',
-       'ᾖ' => 'ᾞ',
-       'ᾗ' => 'ᾟ',
-       'ᾠ' => 'ᾨ',
-       'ᾡ' => 'ᾩ',
-       'ᾢ' => 'ᾪ',
-       'ᾣ' => 'ᾫ',
-       'ᾤ' => 'ᾬ',
-       'ᾥ' => 'ᾭ',
-       'ᾦ' => 'ᾮ',
-       'ᾧ' => 'ᾯ',
-       'ᾰ' => 'Ᾰ',
-       'ᾱ' => 'Ᾱ',
-       'ᾳ' => 'ᾼ',
-       'ι' => 'Ι',
-       'ῃ' => 'ῌ',
-       'ῐ' => 'Ῐ',
-       'ῑ' => 'Ῑ',
-       'ῠ' => 'Ῠ',
-       'ῡ' => 'Ῡ',
-       'ῥ' => 'Ῥ',
-       'ῳ' => 'ῼ',
-       'ⅎ' => 'Ⅎ',
-       'ⅰ' => 'Ⅰ',
-       'ⅱ' => 'Ⅱ',
-       'ⅲ' => 'Ⅲ',
-       'ⅳ' => 'Ⅳ',
-       'ⅴ' => 'Ⅴ',
-       'ⅵ' => 'Ⅵ',
-       'ⅶ' => 'Ⅶ',
-       'ⅷ' => 'Ⅷ',
-       'ⅸ' => 'Ⅸ',
-       'ⅹ' => 'Ⅹ',
-       'ⅺ' => 'Ⅺ',
-       'ⅻ' => 'Ⅻ',
-       'ⅼ' => 'Ⅼ',
-       'ⅽ' => 'Ⅽ',
-       'ⅾ' => 'Ⅾ',
-       'ⅿ' => 'Ⅿ',
-       'ↄ' => 'Ↄ',
-       'ⓐ' => 'Ⓐ',
-       'ⓑ' => 'Ⓑ',
-       'ⓒ' => 'Ⓒ',
-       'ⓓ' => 'Ⓓ',
-       'ⓔ' => 'Ⓔ',
-       'ⓕ' => 'Ⓕ',
-       'ⓖ' => 'Ⓖ',
-       'ⓗ' => 'Ⓗ',
-       'ⓘ' => 'Ⓘ',
-       'ⓙ' => 'Ⓙ',
-       'ⓚ' => 'Ⓚ',
-       'ⓛ' => 'Ⓛ',
-       'ⓜ' => 'Ⓜ',
-       'ⓝ' => 'Ⓝ',
-       'ⓞ' => 'Ⓞ',
-       'ⓟ' => 'Ⓟ',
-       'ⓠ' => 'Ⓠ',
-       'ⓡ' => 'Ⓡ',
-       'ⓢ' => 'Ⓢ',
-       'ⓣ' => 'Ⓣ',
-       'ⓤ' => 'Ⓤ',
-       'ⓥ' => 'Ⓥ',
-       'ⓦ' => 'Ⓦ',
-       'ⓧ' => 'Ⓧ',
-       'ⓨ' => 'Ⓨ',
-       'ⓩ' => 'Ⓩ',
-       'ⰰ' => 'Ⰰ',
-       'ⰱ' => 'Ⰱ',
-       'ⰲ' => 'Ⰲ',
-       'ⰳ' => 'Ⰳ',
-       'ⰴ' => 'Ⰴ',
-       'ⰵ' => 'Ⰵ',
-       'ⰶ' => 'Ⰶ',
-       'ⰷ' => 'Ⰷ',
-       'ⰸ' => 'Ⰸ',
-       'ⰹ' => 'Ⰹ',
-       'ⰺ' => 'Ⰺ',
-       'ⰻ' => 'Ⰻ',
-       'ⰼ' => 'Ⰼ',
-       'ⰽ' => 'Ⰽ',
-       'ⰾ' => 'Ⰾ',
-       'ⰿ' => 'Ⰿ',
-       'ⱀ' => 'Ⱀ',
-       'ⱁ' => 'Ⱁ',
-       'ⱂ' => 'Ⱂ',
-       'ⱃ' => 'Ⱃ',
-       'ⱄ' => 'Ⱄ',
-       'ⱅ' => 'Ⱅ',
-       'ⱆ' => 'Ⱆ',
-       'ⱇ' => 'Ⱇ',
-       'ⱈ' => 'Ⱈ',
-       'ⱉ' => 'Ⱉ',
-       'ⱊ' => 'Ⱊ',
-       'ⱋ' => 'Ⱋ',
-       'ⱌ' => 'Ⱌ',
-       'ⱍ' => 'Ⱍ',
-       'ⱎ' => 'Ⱎ',
-       'ⱏ' => 'Ⱏ',
-       'ⱐ' => 'Ⱐ',
-       'ⱑ' => 'Ⱑ',
-       'ⱒ' => 'Ⱒ',
-       'ⱓ' => 'Ⱓ',
-       'ⱔ' => 'Ⱔ',
-       'ⱕ' => 'Ⱕ',
-       'ⱖ' => 'Ⱖ',
-       'ⱗ' => 'Ⱗ',
-       'ⱘ' => 'Ⱘ',
-       'ⱙ' => 'Ⱙ',
-       'ⱚ' => 'Ⱚ',
-       'ⱛ' => 'Ⱛ',
-       'ⱜ' => 'Ⱜ',
-       'ⱝ' => 'Ⱝ',
-       'ⱞ' => 'Ⱞ',
-       'ⱡ' => 'Ⱡ',
-       'ⱥ' => 'Ⱥ',
-       'ⱦ' => 'Ⱦ',
-       'ⱨ' => 'Ⱨ',
-       'ⱪ' => 'Ⱪ',
-       'ⱬ' => 'Ⱬ',
-       'ⱳ' => 'Ⱳ',
-       'ⱶ' => 'Ⱶ',
-       'ⲁ' => 'Ⲁ',
-       'ⲃ' => 'Ⲃ',
-       'ⲅ' => 'Ⲅ',
-       'ⲇ' => 'Ⲇ',
-       'ⲉ' => 'Ⲉ',
-       'ⲋ' => 'Ⲋ',
-       'ⲍ' => 'Ⲍ',
-       'ⲏ' => 'Ⲏ',
-       'ⲑ' => 'Ⲑ',
-       'ⲓ' => 'Ⲓ',
-       'ⲕ' => 'Ⲕ',
-       'ⲗ' => 'Ⲗ',
-       'ⲙ' => 'Ⲙ',
-       'ⲛ' => 'Ⲛ',
-       'ⲝ' => 'Ⲝ',
-       'ⲟ' => 'Ⲟ',
-       'ⲡ' => 'Ⲡ',
-       'ⲣ' => 'Ⲣ',
-       'ⲥ' => 'Ⲥ',
-       'ⲧ' => 'Ⲧ',
-       'ⲩ' => 'Ⲩ',
-       'ⲫ' => 'Ⲫ',
-       'ⲭ' => 'Ⲭ',
-       'ⲯ' => 'Ⲯ',
-       'ⲱ' => 'Ⲱ',
-       'ⲳ' => 'Ⲳ',
-       'ⲵ' => 'Ⲵ',
-       'ⲷ' => 'Ⲷ',
-       'ⲹ' => 'Ⲹ',
-       'ⲻ' => 'Ⲻ',
-       'ⲽ' => 'Ⲽ',
-       'ⲿ' => 'Ⲿ',
-       'ⳁ' => 'Ⳁ',
-       'ⳃ' => 'Ⳃ',
-       'ⳅ' => 'Ⳅ',
-       'ⳇ' => 'Ⳇ',
-       'ⳉ' => 'Ⳉ',
-       'ⳋ' => 'Ⳋ',
-       'ⳍ' => 'Ⳍ',
-       'ⳏ' => 'Ⳏ',
-       'ⳑ' => 'Ⳑ',
-       'ⳓ' => 'Ⳓ',
-       'ⳕ' => 'Ⳕ',
-       'ⳗ' => 'Ⳗ',
-       'ⳙ' => 'Ⳙ',
-       'ⳛ' => 'Ⳛ',
-       'ⳝ' => 'Ⳝ',
-       'ⳟ' => 'Ⳟ',
-       'ⳡ' => 'Ⳡ',
-       'ⳣ' => 'Ⳣ',
-       'ⳬ' => 'Ⳬ',
-       'ⳮ' => 'Ⳮ',
-       'ⴀ' => 'Ⴀ',
-       'ⴁ' => 'Ⴁ',
-       'ⴂ' => 'Ⴂ',
-       'ⴃ' => 'Ⴃ',
-       'ⴄ' => 'Ⴄ',
-       'ⴅ' => 'Ⴅ',
-       'ⴆ' => 'Ⴆ',
-       'ⴇ' => 'Ⴇ',
-       'ⴈ' => 'Ⴈ',
-       'ⴉ' => 'Ⴉ',
-       'ⴊ' => 'Ⴊ',
-       'ⴋ' => 'Ⴋ',
-       'ⴌ' => 'Ⴌ',
-       'ⴍ' => 'Ⴍ',
-       'ⴎ' => 'Ⴎ',
-       'ⴏ' => 'Ⴏ',
-       'ⴐ' => 'Ⴐ',
-       'ⴑ' => 'Ⴑ',
-       'ⴒ' => 'Ⴒ',
-       'ⴓ' => 'Ⴓ',
-       'ⴔ' => 'Ⴔ',
-       'ⴕ' => 'Ⴕ',
-       'ⴖ' => 'Ⴖ',
-       'ⴗ' => 'Ⴗ',
-       'ⴘ' => 'Ⴘ',
-       'ⴙ' => 'Ⴙ',
-       'ⴚ' => 'Ⴚ',
-       'ⴛ' => 'Ⴛ',
-       'ⴜ' => 'Ⴜ',
-       'ⴝ' => 'Ⴝ',
-       'ⴞ' => 'Ⴞ',
-       'ⴟ' => 'Ⴟ',
-       'ⴠ' => 'Ⴠ',
-       'ⴡ' => 'Ⴡ',
-       'ⴢ' => 'Ⴢ',
-       'ⴣ' => 'Ⴣ',
-       'ⴤ' => 'Ⴤ',
-       'ⴥ' => 'Ⴥ',
-       'ꙁ' => 'Ꙁ',
-       'ꙃ' => 'Ꙃ',
-       'ꙅ' => 'Ꙅ',
-       'ꙇ' => 'Ꙇ',
-       'ꙉ' => 'Ꙉ',
-       'ꙋ' => 'Ꙋ',
-       'ꙍ' => 'Ꙍ',
-       'ꙏ' => 'Ꙏ',
-       'ꙑ' => 'Ꙑ',
-       'ꙓ' => 'Ꙓ',
-       'ꙕ' => 'Ꙕ',
-       'ꙗ' => 'Ꙗ',
-       'ꙙ' => 'Ꙙ',
-       'ꙛ' => 'Ꙛ',
-       'ꙝ' => 'Ꙝ',
-       'ꙟ' => 'Ꙟ',
-       'ꙡ' => 'Ꙡ',
-       'ꙣ' => 'Ꙣ',
-       'ꙥ' => 'Ꙥ',
-       'ꙧ' => 'Ꙧ',
-       'ꙩ' => 'Ꙩ',
-       'ꙫ' => 'Ꙫ',
-       'ꙭ' => 'Ꙭ',
-       'ꚁ' => 'Ꚁ',
-       'ꚃ' => 'Ꚃ',
-       'ꚅ' => 'Ꚅ',
-       'ꚇ' => 'Ꚇ',
-       'ꚉ' => 'Ꚉ',
-       'ꚋ' => 'Ꚋ',
-       'ꚍ' => 'Ꚍ',
-       'ꚏ' => 'Ꚏ',
-       'ꚑ' => 'Ꚑ',
-       'ꚓ' => 'Ꚓ',
-       'ꚕ' => 'Ꚕ',
-       'ꚗ' => 'Ꚗ',
-       'ꜣ' => 'Ꜣ',
-       'ꜥ' => 'Ꜥ',
-       'ꜧ' => 'Ꜧ',
-       'ꜩ' => 'Ꜩ',
-       'ꜫ' => 'Ꜫ',
-       'ꜭ' => 'Ꜭ',
-       'ꜯ' => 'Ꜯ',
-       'ꜳ' => 'Ꜳ',
-       'ꜵ' => 'Ꜵ',
-       'ꜷ' => 'Ꜷ',
-       'ꜹ' => 'Ꜹ',
-       'ꜻ' => 'Ꜻ',
-       'ꜽ' => 'Ꜽ',
-       'ꜿ' => 'Ꜿ',
-       'ꝁ' => 'Ꝁ',
-       'ꝃ' => 'Ꝃ',
-       'ꝅ' => 'Ꝅ',
-       'ꝇ' => 'Ꝇ',
-       'ꝉ' => 'Ꝉ',
-       'ꝋ' => 'Ꝋ',
-       'ꝍ' => 'Ꝍ',
-       'ꝏ' => 'Ꝏ',
-       'ꝑ' => 'Ꝑ',
-       'ꝓ' => 'Ꝓ',
-       'ꝕ' => 'Ꝕ',
-       'ꝗ' => 'Ꝗ',
-       'ꝙ' => 'Ꝙ',
-       'ꝛ' => 'Ꝛ',
-       'ꝝ' => 'Ꝝ',
-       'ꝟ' => 'Ꝟ',
-       'ꝡ' => 'Ꝡ',
-       'ꝣ' => 'Ꝣ',
-       'ꝥ' => 'Ꝥ',
-       'ꝧ' => 'Ꝧ',
-       'ꝩ' => 'Ꝩ',
-       'ꝫ' => 'Ꝫ',
-       'ꝭ' => 'Ꝭ',
-       'ꝯ' => 'Ꝯ',
-       'ꝺ' => 'Ꝺ',
-       'ꝼ' => 'Ꝼ',
-       'ꝿ' => 'Ꝿ',
-       'ꞁ' => 'Ꞁ',
-       'ꞃ' => 'Ꞃ',
-       'ꞅ' => 'Ꞅ',
-       'ꞇ' => 'Ꞇ',
-       'ꞌ' => 'Ꞌ',
-       'ꞑ' => 'Ꞑ',
-       'ꞡ' => 'Ꞡ',
-       'ꞣ' => 'Ꞣ',
-       'ꞥ' => 'Ꞥ',
-       'ꞧ' => 'Ꞧ',
-       'ꞩ' => 'Ꞩ',
-       'a' => 'A',
-       'b' => 'B',
-       'c' => 'C',
-       'd' => 'D',
-       'e' => 'E',
-       'f' => 'F',
-       'g' => 'G',
-       'h' => 'H',
-       'i' => 'I',
-       'j' => 'J',
-       'k' => 'K',
-       'l' => 'L',
-       'm' => 'M',
-       'n' => 'N',
-       'o' => 'O',
-       'p' => 'P',
-       'q' => 'Q',
-       'r' => 'R',
-       's' => 'S',
-       't' => 'T',
-       'u' => 'U',
-       'v' => 'V',
-       'w' => 'W',
-       'x' => 'X',
-       'y' => 'Y',
-       'z' => 'Z',
-       '𐐨' => '𐐀',
-       '𐐩' => '𐐁',
-       '𐐪' => '𐐂',
-       '𐐫' => '𐐃',
-       '𐐬' => '𐐄',
-       '𐐭' => '𐐅',
-       '𐐮' => '𐐆',
-       '𐐯' => '𐐇',
-       '𐐰' => '𐐈',
-       '𐐱' => '𐐉',
-       '𐐲' => '𐐊',
-       '𐐳' => '𐐋',
-       '𐐴' => '𐐌',
-       '𐐵' => '𐐍',
-       '𐐶' => '𐐎',
-       '𐐷' => '𐐏',
-       '𐐸' => '𐐐',
-       '𐐹' => '𐐑',
-       '𐐺' => '𐐒',
-       '𐐻' => '𐐓',
-       '𐐼' => '𐐔',
-       '𐐽' => '𐐕',
-       '𐐾' => '𐐖',
-       '𐐿' => '𐐗',
-       '𐑀' => '𐐘',
-       '𐑁' => '𐐙',
-       '𐑂' => '𐐚',
-       '𐑃' => '𐐛',
-       '𐑄' => '𐐜',
-       '𐑅' => '𐐝',
-       '𐑆' => '𐐞',
-       '𐑇' => '𐐟',
-       '𐑈' => '𐐠',
-       '𐑉' => '𐐡',
-       '𐑊' => '𐐢',
-       '𐑋' => '𐐣',
-       '𐑌' => '𐐤',
-       '𐑍' => '𐐥',
-       '𐑎' => '𐐦',
-       '𐑏' => '𐐧'
-);
-
-/**
- * Translation array to get lower case character
- */
-$wikiLowerChars = array(
-       'A' => 'a',
-       'B' => 'b',
-       'C' => 'c',
-       'D' => 'd',
-       'E' => 'e',
-       'F' => 'f',
-       'G' => 'g',
-       'H' => 'h',
-       'I' => 'i',
-       'J' => 'j',
-       'K' => 'k',
-       'L' => 'l',
-       'M' => 'm',
-       'N' => 'n',
-       'O' => 'o',
-       'P' => 'p',
-       'Q' => 'q',
-       'R' => 'r',
-       'S' => 's',
-       'T' => 't',
-       'U' => 'u',
-       'V' => 'v',
-       'W' => 'w',
-       'X' => 'x',
-       'Y' => 'y',
-       'Z' => 'z',
-       'À' => 'à',
-       'Á' => 'á',
-       'Â' => 'â',
-       'Ã' => 'ã',
-       'Ä' => 'ä',
-       'Å' => 'å',
-       'Æ' => 'æ',
-       'Ç' => 'ç',
-       'È' => 'è',
-       'É' => 'é',
-       'Ê' => 'ê',
-       'Ë' => 'ë',
-       'Ì' => 'ì',
-       'Í' => 'í',
-       'Î' => 'î',
-       'Ï' => 'ï',
-       'Ð' => 'ð',
-       'Ñ' => 'ñ',
-       'Ò' => 'ò',
-       'Ó' => 'ó',
-       'Ô' => 'ô',
-       'Õ' => 'õ',
-       'Ö' => 'ö',
-       'Ø' => 'ø',
-       'Ù' => 'ù',
-       'Ú' => 'ú',
-       'Û' => 'û',
-       'Ü' => 'ü',
-       'Ý' => 'ý',
-       'Þ' => 'þ',
-       'Ā' => 'ā',
-       'Ă' => 'ă',
-       'Ą' => 'ą',
-       'Ć' => 'ć',
-       'Ĉ' => 'ĉ',
-       'Ċ' => 'ċ',
-       'Č' => 'č',
-       'Ď' => 'ď',
-       'Đ' => 'đ',
-       'Ē' => 'ē',
-       'Ĕ' => 'ĕ',
-       'Ė' => 'ė',
-       'Ę' => 'ę',
-       'Ě' => 'ě',
-       'Ĝ' => 'ĝ',
-       'Ğ' => 'ğ',
-       'Ġ' => 'ġ',
-       'Ģ' => 'ģ',
-       'Ĥ' => 'ĥ',
-       'Ħ' => 'ħ',
-       'Ĩ' => 'ĩ',
-       'Ī' => 'ī',
-       'Ĭ' => 'ĭ',
-       'Į' => 'į',
-       'İ' => 'i',
-       'IJ' => 'ij',
-       'Ĵ' => 'ĵ',
-       'Ķ' => 'ķ',
-       'Ĺ' => 'ĺ',
-       'Ļ' => 'ļ',
-       'Ľ' => 'ľ',
-       'Ŀ' => 'ŀ',
-       'Ł' => 'ł',
-       'Ń' => 'ń',
-       'Ņ' => 'ņ',
-       'Ň' => 'ň',
-       'Ŋ' => 'ŋ',
-       'Ō' => 'ō',
-       'Ŏ' => 'ŏ',
-       'Ő' => 'ő',
-       'Œ' => 'œ',
-       'Ŕ' => 'ŕ',
-       'Ŗ' => 'ŗ',
-       'Ř' => 'ř',
-       'Ś' => 'ś',
-       'Ŝ' => 'ŝ',
-       'Ş' => 'ş',
-       'Š' => 'š',
-       'Ţ' => 'ţ',
-       'Ť' => 'ť',
-       'Ŧ' => 'ŧ',
-       'Ũ' => 'ũ',
-       'Ū' => 'ū',
-       'Ŭ' => 'ŭ',
-       'Ů' => 'ů',
-       'Ű' => 'ű',
-       'Ų' => 'ų',
-       'Ŵ' => 'ŵ',
-       'Ŷ' => 'ŷ',
-       'Ÿ' => 'ÿ',
-       'Ź' => 'ź',
-       'Ż' => 'ż',
-       'Ž' => 'ž',
-       'Ɓ' => 'ɓ',
-       'Ƃ' => 'ƃ',
-       'Ƅ' => 'ƅ',
-       'Ɔ' => 'ɔ',
-       'Ƈ' => 'ƈ',
-       'Ɖ' => 'ɖ',
-       'Ɗ' => 'ɗ',
-       'Ƌ' => 'ƌ',
-       'Ǝ' => 'ǝ',
-       'Ə' => 'ə',
-       'Ɛ' => 'ɛ',
-       'Ƒ' => 'ƒ',
-       'Ɠ' => 'ɠ',
-       'Ɣ' => 'ɣ',
-       'Ɩ' => 'ɩ',
-       'Ɨ' => 'ɨ',
-       'Ƙ' => 'ƙ',
-       'Ɯ' => 'ɯ',
-       'Ɲ' => 'ɲ',
-       'Ɵ' => 'ɵ',
-       'Ơ' => 'ơ',
-       'Ƣ' => 'ƣ',
-       'Ƥ' => 'ƥ',
-       'Ʀ' => 'ʀ',
-       'Ƨ' => 'ƨ',
-       'Ʃ' => 'ʃ',
-       'Ƭ' => 'ƭ',
-       'Ʈ' => 'ʈ',
-       'Ư' => 'ư',
-       'Ʊ' => 'ʊ',
-       'Ʋ' => 'ʋ',
-       'Ƴ' => 'ƴ',
-       'Ƶ' => 'ƶ',
-       'Ʒ' => 'ʒ',
-       'Ƹ' => 'ƹ',
-       'Ƽ' => 'ƽ',
-       'DŽ' => 'dž',
-       'Dž' => 'dž',
-       'LJ' => 'lj',
-       'Lj' => 'lj',
-       'NJ' => 'nj',
-       'Nj' => 'nj',
-       'Ǎ' => 'ǎ',
-       'Ǐ' => 'ǐ',
-       'Ǒ' => 'ǒ',
-       'Ǔ' => 'ǔ',
-       'Ǖ' => 'ǖ',
-       'Ǘ' => 'ǘ',
-       'Ǚ' => 'ǚ',
-       'Ǜ' => 'ǜ',
-       'Ǟ' => 'ǟ',
-       'Ǡ' => 'ǡ',
-       'Ǣ' => 'ǣ',
-       'Ǥ' => 'ǥ',
-       'Ǧ' => 'ǧ',
-       'Ǩ' => 'ǩ',
-       'Ǫ' => 'ǫ',
-       'Ǭ' => 'ǭ',
-       'Ǯ' => 'ǯ',
-       'DZ' => 'dz',
-       'Dz' => 'dz',
-       'Ǵ' => 'ǵ',
-       'Ƕ' => 'ƕ',
-       'Ƿ' => 'ƿ',
-       'Ǹ' => 'ǹ',
-       'Ǻ' => 'ǻ',
-       'Ǽ' => 'ǽ',
-       'Ǿ' => 'ǿ',
-       'Ȁ' => 'ȁ',
-       'Ȃ' => 'ȃ',
-       'Ȅ' => 'ȅ',
-       'Ȇ' => 'ȇ',
-       'Ȉ' => 'ȉ',
-       'Ȋ' => 'ȋ',
-       'Ȍ' => 'ȍ',
-       'Ȏ' => 'ȏ',
-       'Ȑ' => 'ȑ',
-       'Ȓ' => 'ȓ',
-       'Ȕ' => 'ȕ',
-       'Ȗ' => 'ȗ',
-       'Ș' => 'ș',
-       'Ț' => 'ț',
-       'Ȝ' => 'ȝ',
-       'Ȟ' => 'ȟ',
-       'Ƞ' => 'ƞ',
-       'Ȣ' => 'ȣ',
-       'Ȥ' => 'ȥ',
-       'Ȧ' => 'ȧ',
-       'Ȩ' => 'ȩ',
-       'Ȫ' => 'ȫ',
-       'Ȭ' => 'ȭ',
-       'Ȯ' => 'ȯ',
-       'Ȱ' => 'ȱ',
-       'Ȳ' => 'ȳ',
-       'Ⱥ' => 'ⱥ',
-       'Ȼ' => 'ȼ',
-       'Ƚ' => 'ƚ',
-       'Ⱦ' => 'ⱦ',
-       'Ɂ' => 'ɂ',
-       'Ƀ' => 'ƀ',
-       'Ʉ' => 'ʉ',
-       'Ʌ' => 'ʌ',
-       'Ɇ' => 'ɇ',
-       'Ɉ' => 'ɉ',
-       'Ɋ' => 'ɋ',
-       'Ɍ' => 'ɍ',
-       'Ɏ' => 'ɏ',
-       'Ͱ' => 'ͱ',
-       'Ͳ' => 'ͳ',
-       'Ͷ' => 'ͷ',
-       'Ά' => 'ά',
-       'Έ' => 'έ',
-       'Ή' => 'ή',
-       'Ί' => 'ί',
-       'Ό' => 'ό',
-       'Ύ' => 'ύ',
-       'Ώ' => 'ώ',
-       'Α' => 'α',
-       'Β' => 'β',
-       'Γ' => 'γ',
-       'Δ' => 'δ',
-       'Ε' => 'ε',
-       'Ζ' => 'ζ',
-       'Η' => 'η',
-       'Θ' => 'θ',
-       'Ι' => 'ι',
-       'Κ' => 'κ',
-       'Λ' => 'λ',
-       'Μ' => 'μ',
-       'Ν' => 'ν',
-       'Ξ' => 'ξ',
-       'Ο' => 'ο',
-       'Π' => 'π',
-       'Ρ' => 'ρ',
-       'Σ' => 'σ',
-       'Τ' => 'τ',
-       'Υ' => 'υ',
-       'Φ' => 'φ',
-       'Χ' => 'χ',
-       'Ψ' => 'ψ',
-       'Ω' => 'ω',
-       'Ϊ' => 'ϊ',
-       'Ϋ' => 'ϋ',
-       'Ϗ' => 'ϗ',
-       'Ϙ' => 'ϙ',
-       'Ϛ' => 'ϛ',
-       'Ϝ' => 'ϝ',
-       'Ϟ' => 'ϟ',
-       'Ϡ' => 'ϡ',
-       'Ϣ' => 'ϣ',
-       'Ϥ' => 'ϥ',
-       'Ϧ' => 'ϧ',
-       'Ϩ' => 'ϩ',
-       'Ϫ' => 'ϫ',
-       'Ϭ' => 'ϭ',
-       'Ϯ' => 'ϯ',
-       'ϴ' => 'θ',
-       'Ϸ' => 'ϸ',
-       'Ϲ' => 'ϲ',
-       'Ϻ' => 'ϻ',
-       'Ͻ' => 'ͻ',
-       'Ͼ' => 'ͼ',
-       'Ͽ' => 'ͽ',
-       'Ѐ' => 'ѐ',
-       'Ё' => 'ё',
-       'Ђ' => 'ђ',
-       'Ѓ' => 'ѓ',
-       'Є' => 'є',
-       'Ѕ' => 'ѕ',
-       'І' => 'і',
-       'Ї' => 'ї',
-       'Ј' => 'ј',
-       'Љ' => 'љ',
-       'Њ' => 'њ',
-       'Ћ' => 'ћ',
-       'Ќ' => 'ќ',
-       'Ѝ' => 'ѝ',
-       'Ў' => 'ў',
-       'Џ' => 'џ',
-       'А' => 'а',
-       'Б' => 'б',
-       'В' => 'в',
-       'Г' => 'г',
-       'Д' => 'д',
-       'Е' => 'е',
-       'Ж' => 'ж',
-       'З' => 'з',
-       'И' => 'и',
-       'Й' => 'й',
-       'К' => 'к',
-       'Л' => 'л',
-       'М' => 'м',
-       'Н' => 'н',
-       'О' => 'о',
-       'П' => 'п',
-       'Р' => 'р',
-       'С' => 'с',
-       'Т' => 'т',
-       'У' => 'у',
-       'Ф' => 'ф',
-       'Х' => 'х',
-       'Ц' => 'ц',
-       'Ч' => 'ч',
-       'Ш' => 'ш',
-       'Щ' => 'щ',
-       'Ъ' => 'ъ',
-       'Ы' => 'ы',
-       'Ь' => 'ь',
-       'Э' => 'э',
-       'Ю' => 'ю',
-       'Я' => 'я',
-       'Ѡ' => 'ѡ',
-       'Ѣ' => 'ѣ',
-       'Ѥ' => 'ѥ',
-       'Ѧ' => 'ѧ',
-       'Ѩ' => 'ѩ',
-       'Ѫ' => 'ѫ',
-       'Ѭ' => 'ѭ',
-       'Ѯ' => 'ѯ',
-       'Ѱ' => 'ѱ',
-       'Ѳ' => 'ѳ',
-       'Ѵ' => 'ѵ',
-       'Ѷ' => 'ѷ',
-       'Ѹ' => 'ѹ',
-       'Ѻ' => 'ѻ',
-       'Ѽ' => 'ѽ',
-       'Ѿ' => 'ѿ',
-       'Ҁ' => 'ҁ',
-       'Ҋ' => 'ҋ',
-       'Ҍ' => 'ҍ',
-       'Ҏ' => 'ҏ',
-       'Ґ' => 'ґ',
-       'Ғ' => 'ғ',
-       'Ҕ' => 'ҕ',
-       'Җ' => 'җ',
-       'Ҙ' => 'ҙ',
-       'Қ' => 'қ',
-       'Ҝ' => 'ҝ',
-       'Ҟ' => 'ҟ',
-       'Ҡ' => 'ҡ',
-       'Ң' => 'ң',
-       'Ҥ' => 'ҥ',
-       'Ҧ' => 'ҧ',
-       'Ҩ' => 'ҩ',
-       'Ҫ' => 'ҫ',
-       'Ҭ' => 'ҭ',
-       'Ү' => 'ү',
-       'Ұ' => 'ұ',
-       'Ҳ' => 'ҳ',
-       'Ҵ' => 'ҵ',
-       'Ҷ' => 'ҷ',
-       'Ҹ' => 'ҹ',
-       'Һ' => 'һ',
-       'Ҽ' => 'ҽ',
-       'Ҿ' => 'ҿ',
-       'Ӏ' => 'ӏ',
-       'Ӂ' => 'ӂ',
-       'Ӄ' => 'ӄ',
-       'Ӆ' => 'ӆ',
-       'Ӈ' => 'ӈ',
-       'Ӊ' => 'ӊ',
-       'Ӌ' => 'ӌ',
-       'Ӎ' => 'ӎ',
-       'Ӑ' => 'ӑ',
-       'Ӓ' => 'ӓ',
-       'Ӕ' => 'ӕ',
-       'Ӗ' => 'ӗ',
-       'Ә' => 'ә',
-       'Ӛ' => 'ӛ',
-       'Ӝ' => 'ӝ',
-       'Ӟ' => 'ӟ',
-       'Ӡ' => 'ӡ',
-       'Ӣ' => 'ӣ',
-       'Ӥ' => 'ӥ',
-       'Ӧ' => 'ӧ',
-       'Ө' => 'ө',
-       'Ӫ' => 'ӫ',
-       'Ӭ' => 'ӭ',
-       'Ӯ' => 'ӯ',
-       'Ӱ' => 'ӱ',
-       'Ӳ' => 'ӳ',
-       'Ӵ' => 'ӵ',
-       'Ӷ' => 'ӷ',
-       'Ӹ' => 'ӹ',
-       'Ӻ' => 'ӻ',
-       'Ӽ' => 'ӽ',
-       'Ӿ' => 'ӿ',
-       'Ԁ' => 'ԁ',
-       'Ԃ' => 'ԃ',
-       'Ԅ' => 'ԅ',
-       'Ԇ' => 'ԇ',
-       'Ԉ' => 'ԉ',
-       'Ԋ' => 'ԋ',
-       'Ԍ' => 'ԍ',
-       'Ԏ' => 'ԏ',
-       'Ԑ' => 'ԑ',
-       'Ԓ' => 'ԓ',
-       'Ԕ' => 'ԕ',
-       'Ԗ' => 'ԗ',
-       'Ԙ' => 'ԙ',
-       'Ԛ' => 'ԛ',
-       'Ԝ' => 'ԝ',
-       'Ԟ' => 'ԟ',
-       'Ԡ' => 'ԡ',
-       'Ԣ' => 'ԣ',
-       'Ԥ' => 'ԥ',
-       'Ԧ' => 'ԧ',
-       'Ա' => 'ա',
-       'Բ' => 'բ',
-       'Գ' => 'գ',
-       'Դ' => 'դ',
-       'Ե' => 'ե',
-       'Զ' => 'զ',
-       'Է' => 'է',
-       'Ը' => 'ը',
-       'Թ' => 'թ',
-       'Ժ' => 'ժ',
-       'Ի' => 'ի',
-       'Լ' => 'լ',
-       'Խ' => 'խ',
-       'Ծ' => 'ծ',
-       'Կ' => 'կ',
-       'Հ' => 'հ',
-       'Ձ' => 'ձ',
-       'Ղ' => 'ղ',
-       'Ճ' => 'ճ',
-       'Մ' => 'մ',
-       'Յ' => 'յ',
-       'Ն' => 'ն',
-       'Շ' => 'շ',
-       'Ո' => 'ո',
-       'Չ' => 'չ',
-       'Պ' => 'պ',
-       'Ջ' => 'ջ',
-       'Ռ' => 'ռ',
-       'Ս' => 'ս',
-       'Վ' => 'վ',
-       'Տ' => 'տ',
-       'Ր' => 'ր',
-       'Ց' => 'ց',
-       'Ւ' => 'ւ',
-       'Փ' => 'փ',
-       'Ք' => 'ք',
-       'Օ' => 'օ',
-       'Ֆ' => 'ֆ',
-       'Ⴀ' => 'ⴀ',
-       'Ⴁ' => 'ⴁ',
-       'Ⴂ' => 'ⴂ',
-       'Ⴃ' => 'ⴃ',
-       'Ⴄ' => 'ⴄ',
-       'Ⴅ' => 'ⴅ',
-       'Ⴆ' => 'ⴆ',
-       'Ⴇ' => 'ⴇ',
-       'Ⴈ' => 'ⴈ',
-       'Ⴉ' => 'ⴉ',
-       'Ⴊ' => 'ⴊ',
-       'Ⴋ' => 'ⴋ',
-       'Ⴌ' => 'ⴌ',
-       'Ⴍ' => 'ⴍ',
-       'Ⴎ' => 'ⴎ',
-       'Ⴏ' => 'ⴏ',
-       'Ⴐ' => 'ⴐ',
-       'Ⴑ' => 'ⴑ',
-       'Ⴒ' => 'ⴒ',
-       'Ⴓ' => 'ⴓ',
-       'Ⴔ' => 'ⴔ',
-       'Ⴕ' => 'ⴕ',
-       'Ⴖ' => 'ⴖ',
-       'Ⴗ' => 'ⴗ',
-       'Ⴘ' => 'ⴘ',
-       'Ⴙ' => 'ⴙ',
-       'Ⴚ' => 'ⴚ',
-       'Ⴛ' => 'ⴛ',
-       'Ⴜ' => 'ⴜ',
-       'Ⴝ' => 'ⴝ',
-       'Ⴞ' => 'ⴞ',
-       'Ⴟ' => 'ⴟ',
-       'Ⴠ' => 'ⴠ',
-       'Ⴡ' => 'ⴡ',
-       'Ⴢ' => 'ⴢ',
-       'Ⴣ' => 'ⴣ',
-       'Ⴤ' => 'ⴤ',
-       'Ⴥ' => 'ⴥ',
-       'Ḁ' => 'ḁ',
-       'Ḃ' => 'ḃ',
-       'Ḅ' => 'ḅ',
-       'Ḇ' => 'ḇ',
-       'Ḉ' => 'ḉ',
-       'Ḋ' => 'ḋ',
-       'Ḍ' => 'ḍ',
-       'Ḏ' => 'ḏ',
-       'Ḑ' => 'ḑ',
-       'Ḓ' => 'ḓ',
-       'Ḕ' => 'ḕ',
-       'Ḗ' => 'ḗ',
-       'Ḙ' => 'ḙ',
-       'Ḛ' => 'ḛ',
-       'Ḝ' => 'ḝ',
-       'Ḟ' => 'ḟ',
-       'Ḡ' => 'ḡ',
-       'Ḣ' => 'ḣ',
-       'Ḥ' => 'ḥ',
-       'Ḧ' => 'ḧ',
-       'Ḩ' => 'ḩ',
-       'Ḫ' => 'ḫ',
-       'Ḭ' => 'ḭ',
-       'Ḯ' => 'ḯ',
-       'Ḱ' => 'ḱ',
-       'Ḳ' => 'ḳ',
-       'Ḵ' => 'ḵ',
-       'Ḷ' => 'ḷ',
-       'Ḹ' => 'ḹ',
-       'Ḻ' => 'ḻ',
-       'Ḽ' => 'ḽ',
-       'Ḿ' => 'ḿ',
-       'Ṁ' => 'ṁ',
-       'Ṃ' => 'ṃ',
-       'Ṅ' => 'ṅ',
-       'Ṇ' => 'ṇ',
-       'Ṉ' => 'ṉ',
-       'Ṋ' => 'ṋ',
-       'Ṍ' => 'ṍ',
-       'Ṏ' => 'ṏ',
-       'Ṑ' => 'ṑ',
-       'Ṓ' => 'ṓ',
-       'Ṕ' => 'ṕ',
-       'Ṗ' => 'ṗ',
-       'Ṙ' => 'ṙ',
-       'Ṛ' => 'ṛ',
-       'Ṝ' => 'ṝ',
-       'Ṟ' => 'ṟ',
-       'Ṡ' => 'ṡ',
-       'Ṣ' => 'ṣ',
-       'Ṥ' => 'ṥ',
-       'Ṧ' => 'ṧ',
-       'Ṩ' => 'ṩ',
-       'Ṫ' => 'ṫ',
-       'Ṭ' => 'ṭ',
-       'Ṯ' => 'ṯ',
-       'Ṱ' => 'ṱ',
-       'Ṳ' => 'ṳ',
-       'Ṵ' => 'ṵ',
-       'Ṷ' => 'ṷ',
-       'Ṹ' => 'ṹ',
-       'Ṻ' => 'ṻ',
-       'Ṽ' => 'ṽ',
-       'Ṿ' => 'ṿ',
-       'Ẁ' => 'ẁ',
-       'Ẃ' => 'ẃ',
-       'Ẅ' => 'ẅ',
-       'Ẇ' => 'ẇ',
-       'Ẉ' => 'ẉ',
-       'Ẋ' => 'ẋ',
-       'Ẍ' => 'ẍ',
-       'Ẏ' => 'ẏ',
-       'Ẑ' => 'ẑ',
-       'Ẓ' => 'ẓ',
-       'Ẕ' => 'ẕ',
-       'ẞ' => 'ß',
-       'Ạ' => 'ạ',
-       'Ả' => 'ả',
-       'Ấ' => 'ấ',
-       'Ầ' => 'ầ',
-       'Ẩ' => 'ẩ',
-       'Ẫ' => 'ẫ',
-       'Ậ' => 'ậ',
-       'Ắ' => 'ắ',
-       'Ằ' => 'ằ',
-       'Ẳ' => 'ẳ',
-       'Ẵ' => 'ẵ',
-       'Ặ' => 'ặ',
-       'Ẹ' => 'ẹ',
-       'Ẻ' => 'ẻ',
-       'Ẽ' => 'ẽ',
-       'Ế' => 'ế',
-       'Ề' => 'ề',
-       'Ể' => 'ể',
-       'Ễ' => 'ễ',
-       'Ệ' => 'ệ',
-       'Ỉ' => 'ỉ',
-       'Ị' => 'ị',
-       'Ọ' => 'ọ',
-       'Ỏ' => 'ỏ',
-       'Ố' => 'ố',
-       'Ồ' => 'ồ',
-       'Ổ' => 'ổ',
-       'Ỗ' => 'ỗ',
-       'Ộ' => 'ộ',
-       'Ớ' => 'ớ',
-       'Ờ' => 'ờ',
-       'Ở' => 'ở',
-       'Ỡ' => 'ỡ',
-       'Ợ' => 'ợ',
-       'Ụ' => 'ụ',
-       'Ủ' => 'ủ',
-       'Ứ' => 'ứ',
-       'Ừ' => 'ừ',
-       'Ử' => 'ử',
-       'Ữ' => 'ữ',
-       'Ự' => 'ự',
-       'Ỳ' => 'ỳ',
-       'Ỵ' => 'ỵ',
-       'Ỷ' => 'ỷ',
-       'Ỹ' => 'ỹ',
-       'Ỻ' => 'ỻ',
-       'Ỽ' => 'ỽ',
-       'Ỿ' => 'ỿ',
-       'Ἀ' => 'ἀ',
-       'Ἁ' => 'ἁ',
-       'Ἂ' => 'ἂ',
-       'Ἃ' => 'ἃ',
-       'Ἄ' => 'ἄ',
-       'Ἅ' => 'ἅ',
-       'Ἆ' => 'ἆ',
-       'Ἇ' => 'ἇ',
-       'Ἐ' => 'ἐ',
-       'Ἑ' => 'ἑ',
-       'Ἒ' => 'ἒ',
-       'Ἓ' => 'ἓ',
-       'Ἔ' => 'ἔ',
-       'Ἕ' => 'ἕ',
-       'Ἠ' => 'ἠ',
-       'Ἡ' => 'ἡ',
-       'Ἢ' => 'ἢ',
-       'Ἣ' => 'ἣ',
-       'Ἤ' => 'ἤ',
-       'Ἥ' => 'ἥ',
-       'Ἦ' => 'ἦ',
-       'Ἧ' => 'ἧ',
-       'Ἰ' => 'ἰ',
-       'Ἱ' => 'ἱ',
-       'Ἲ' => 'ἲ',
-       'Ἳ' => 'ἳ',
-       'Ἴ' => 'ἴ',
-       'Ἵ' => 'ἵ',
-       'Ἶ' => 'ἶ',
-       'Ἷ' => 'ἷ',
-       'Ὀ' => 'ὀ',
-       'Ὁ' => 'ὁ',
-       'Ὂ' => 'ὂ',
-       'Ὃ' => 'ὃ',
-       'Ὄ' => 'ὄ',
-       'Ὅ' => 'ὅ',
-       'Ὑ' => 'ὑ',
-       'Ὓ' => 'ὓ',
-       'Ὕ' => 'ὕ',
-       'Ὗ' => 'ὗ',
-       'Ὠ' => 'ὠ',
-       'Ὡ' => 'ὡ',
-       'Ὢ' => 'ὢ',
-       'Ὣ' => 'ὣ',
-       'Ὤ' => 'ὤ',
-       'Ὥ' => 'ὥ',
-       'Ὦ' => 'ὦ',
-       'Ὧ' => 'ὧ',
-       'ᾈ' => 'ᾀ',
-       'ᾉ' => 'ᾁ',
-       'ᾊ' => 'ᾂ',
-       'ᾋ' => 'ᾃ',
-       'ᾌ' => 'ᾄ',
-       'ᾍ' => 'ᾅ',
-       'ᾎ' => 'ᾆ',
-       'ᾏ' => 'ᾇ',
-       'ᾘ' => 'ᾐ',
-       'ᾙ' => 'ᾑ',
-       'ᾚ' => 'ᾒ',
-       'ᾛ' => 'ᾓ',
-       'ᾜ' => 'ᾔ',
-       'ᾝ' => 'ᾕ',
-       'ᾞ' => 'ᾖ',
-       'ᾟ' => 'ᾗ',
-       'ᾨ' => 'ᾠ',
-       'ᾩ' => 'ᾡ',
-       'ᾪ' => 'ᾢ',
-       'ᾫ' => 'ᾣ',
-       'ᾬ' => 'ᾤ',
-       'ᾭ' => 'ᾥ',
-       'ᾮ' => 'ᾦ',
-       'ᾯ' => 'ᾧ',
-       'Ᾰ' => 'ᾰ',
-       'Ᾱ' => 'ᾱ',
-       'Ὰ' => 'ὰ',
-       'Ά' => 'ά',
-       'ᾼ' => 'ᾳ',
-       'Ὲ' => 'ὲ',
-       'Έ' => 'έ',
-       'Ὴ' => 'ὴ',
-       'Ή' => 'ή',
-       'ῌ' => 'ῃ',
-       'Ῐ' => 'ῐ',
-       'Ῑ' => 'ῑ',
-       'Ὶ' => 'ὶ',
-       'Ί' => 'ί',
-       'Ῠ' => 'ῠ',
-       'Ῡ' => 'ῡ',
-       'Ὺ' => 'ὺ',
-       'Ύ' => 'ύ',
-       'Ῥ' => 'ῥ',
-       'Ὸ' => 'ὸ',
-       'Ό' => 'ό',
-       'Ὼ' => 'ὼ',
-       'Ώ' => 'ώ',
-       'ῼ' => 'ῳ',
-       'Ω' => 'ω',
-       'K' => 'k',
-       'Å' => 'å',
-       'Ⅎ' => 'ⅎ',
-       'Ⅰ' => 'ⅰ',
-       'Ⅱ' => 'ⅱ',
-       'Ⅲ' => 'ⅲ',
-       'Ⅳ' => 'ⅳ',
-       'Ⅴ' => 'ⅴ',
-       'Ⅵ' => 'ⅵ',
-       'Ⅶ' => 'ⅶ',
-       'Ⅷ' => 'ⅷ',
-       'Ⅸ' => 'ⅸ',
-       'Ⅹ' => 'ⅹ',
-       'Ⅺ' => 'ⅺ',
-       'Ⅻ' => 'ⅻ',
-       'Ⅼ' => 'ⅼ',
-       'Ⅽ' => 'ⅽ',
-       'Ⅾ' => 'ⅾ',
-       'Ⅿ' => 'ⅿ',
-       'Ↄ' => 'ↄ',
-       'Ⓐ' => 'ⓐ',
-       'Ⓑ' => 'ⓑ',
-       'Ⓒ' => 'ⓒ',
-       'Ⓓ' => 'ⓓ',
-       'Ⓔ' => 'ⓔ',
-       'Ⓕ' => 'ⓕ',
-       'Ⓖ' => 'ⓖ',
-       'Ⓗ' => 'ⓗ',
-       'Ⓘ' => 'ⓘ',
-       'Ⓙ' => 'ⓙ',
-       'Ⓚ' => 'ⓚ',
-       'Ⓛ' => 'ⓛ',
-       'Ⓜ' => 'ⓜ',
-       'Ⓝ' => 'ⓝ',
-       'Ⓞ' => 'ⓞ',
-       'Ⓟ' => 'ⓟ',
-       'Ⓠ' => 'ⓠ',
-       'Ⓡ' => 'ⓡ',
-       'Ⓢ' => 'ⓢ',
-       'Ⓣ' => 'ⓣ',
-       'Ⓤ' => 'ⓤ',
-       'Ⓥ' => 'ⓥ',
-       'Ⓦ' => 'ⓦ',
-       'Ⓧ' => 'ⓧ',
-       'Ⓨ' => 'ⓨ',
-       'Ⓩ' => 'ⓩ',
-       'Ⰰ' => 'ⰰ',
-       'Ⰱ' => 'ⰱ',
-       'Ⰲ' => 'ⰲ',
-       'Ⰳ' => 'ⰳ',
-       'Ⰴ' => 'ⰴ',
-       'Ⰵ' => 'ⰵ',
-       'Ⰶ' => 'ⰶ',
-       'Ⰷ' => 'ⰷ',
-       'Ⰸ' => 'ⰸ',
-       'Ⰹ' => 'ⰹ',
-       'Ⰺ' => 'ⰺ',
-       'Ⰻ' => 'ⰻ',
-       'Ⰼ' => 'ⰼ',
-       'Ⰽ' => 'ⰽ',
-       'Ⰾ' => 'ⰾ',
-       'Ⰿ' => 'ⰿ',
-       'Ⱀ' => 'ⱀ',
-       'Ⱁ' => 'ⱁ',
-       'Ⱂ' => 'ⱂ',
-       'Ⱃ' => 'ⱃ',
-       'Ⱄ' => 'ⱄ',
-       'Ⱅ' => 'ⱅ',
-       'Ⱆ' => 'ⱆ',
-       'Ⱇ' => 'ⱇ',
-       'Ⱈ' => 'ⱈ',
-       'Ⱉ' => 'ⱉ',
-       'Ⱊ' => 'ⱊ',
-       'Ⱋ' => 'ⱋ',
-       'Ⱌ' => 'ⱌ',
-       'Ⱍ' => 'ⱍ',
-       'Ⱎ' => 'ⱎ',
-       'Ⱏ' => 'ⱏ',
-       'Ⱐ' => 'ⱐ',
-       'Ⱑ' => 'ⱑ',
-       'Ⱒ' => 'ⱒ',
-       'Ⱓ' => 'ⱓ',
-       'Ⱔ' => 'ⱔ',
-       'Ⱕ' => 'ⱕ',
-       'Ⱖ' => 'ⱖ',
-       'Ⱗ' => 'ⱗ',
-       'Ⱘ' => 'ⱘ',
-       'Ⱙ' => 'ⱙ',
-       'Ⱚ' => 'ⱚ',
-       'Ⱛ' => 'ⱛ',
-       'Ⱜ' => 'ⱜ',
-       'Ⱝ' => 'ⱝ',
-       'Ⱞ' => 'ⱞ',
-       'Ⱡ' => 'ⱡ',
-       'Ɫ' => 'ɫ',
-       'Ᵽ' => 'ᵽ',
-       'Ɽ' => 'ɽ',
-       'Ⱨ' => 'ⱨ',
-       'Ⱪ' => 'ⱪ',
-       'Ⱬ' => 'ⱬ',
-       'Ɑ' => 'ɑ',
-       'Ɱ' => 'ɱ',
-       'Ɐ' => 'ɐ',
-       'Ɒ' => 'ɒ',
-       'Ⱳ' => 'ⱳ',
-       'Ⱶ' => 'ⱶ',
-       'Ȿ' => 'ȿ',
-       'Ɀ' => 'ɀ',
-       'Ⲁ' => 'ⲁ',
-       'Ⲃ' => 'ⲃ',
-       'Ⲅ' => 'ⲅ',
-       'Ⲇ' => 'ⲇ',
-       'Ⲉ' => 'ⲉ',
-       'Ⲋ' => 'ⲋ',
-       'Ⲍ' => 'ⲍ',
-       'Ⲏ' => 'ⲏ',
-       'Ⲑ' => 'ⲑ',
-       'Ⲓ' => 'ⲓ',
-       'Ⲕ' => 'ⲕ',
-       'Ⲗ' => 'ⲗ',
-       'Ⲙ' => 'ⲙ',
-       'Ⲛ' => 'ⲛ',
-       'Ⲝ' => 'ⲝ',
-       'Ⲟ' => 'ⲟ',
-       'Ⲡ' => 'ⲡ',
-       'Ⲣ' => 'ⲣ',
-       'Ⲥ' => 'ⲥ',
-       'Ⲧ' => 'ⲧ',
-       'Ⲩ' => 'ⲩ',
-       'Ⲫ' => 'ⲫ',
-       'Ⲭ' => 'ⲭ',
-       'Ⲯ' => 'ⲯ',
-       'Ⲱ' => 'ⲱ',
-       'Ⲳ' => 'ⲳ',
-       'Ⲵ' => 'ⲵ',
-       'Ⲷ' => 'ⲷ',
-       'Ⲹ' => 'ⲹ',
-       'Ⲻ' => 'ⲻ',
-       'Ⲽ' => 'ⲽ',
-       'Ⲿ' => 'ⲿ',
-       'Ⳁ' => 'ⳁ',
-       'Ⳃ' => 'ⳃ',
-       'Ⳅ' => 'ⳅ',
-       'Ⳇ' => 'ⳇ',
-       'Ⳉ' => 'ⳉ',
-       'Ⳋ' => 'ⳋ',
-       'Ⳍ' => 'ⳍ',
-       'Ⳏ' => 'ⳏ',
-       'Ⳑ' => 'ⳑ',
-       'Ⳓ' => 'ⳓ',
-       'Ⳕ' => 'ⳕ',
-       'Ⳗ' => 'ⳗ',
-       'Ⳙ' => 'ⳙ',
-       'Ⳛ' => 'ⳛ',
-       'Ⳝ' => 'ⳝ',
-       'Ⳟ' => 'ⳟ',
-       'Ⳡ' => 'ⳡ',
-       'Ⳣ' => 'ⳣ',
-       'Ⳬ' => 'ⳬ',
-       'Ⳮ' => 'ⳮ',
-       'Ꙁ' => 'ꙁ',
-       'Ꙃ' => 'ꙃ',
-       'Ꙅ' => 'ꙅ',
-       'Ꙇ' => 'ꙇ',
-       'Ꙉ' => 'ꙉ',
-       'Ꙋ' => 'ꙋ',
-       'Ꙍ' => 'ꙍ',
-       'Ꙏ' => 'ꙏ',
-       'Ꙑ' => 'ꙑ',
-       'Ꙓ' => 'ꙓ',
-       'Ꙕ' => 'ꙕ',
-       'Ꙗ' => 'ꙗ',
-       'Ꙙ' => 'ꙙ',
-       'Ꙛ' => 'ꙛ',
-       'Ꙝ' => 'ꙝ',
-       'Ꙟ' => 'ꙟ',
-       'Ꙡ' => 'ꙡ',
-       'Ꙣ' => 'ꙣ',
-       'Ꙥ' => 'ꙥ',
-       'Ꙧ' => 'ꙧ',
-       'Ꙩ' => 'ꙩ',
-       'Ꙫ' => 'ꙫ',
-       'Ꙭ' => 'ꙭ',
-       'Ꚁ' => 'ꚁ',
-       'Ꚃ' => 'ꚃ',
-       'Ꚅ' => 'ꚅ',
-       'Ꚇ' => 'ꚇ',
-       'Ꚉ' => 'ꚉ',
-       'Ꚋ' => 'ꚋ',
-       'Ꚍ' => 'ꚍ',
-       'Ꚏ' => 'ꚏ',
-       'Ꚑ' => 'ꚑ',
-       'Ꚓ' => 'ꚓ',
-       'Ꚕ' => 'ꚕ',
-       'Ꚗ' => 'ꚗ',
-       'Ꜣ' => 'ꜣ',
-       'Ꜥ' => 'ꜥ',
-       'Ꜧ' => 'ꜧ',
-       'Ꜩ' => 'ꜩ',
-       'Ꜫ' => 'ꜫ',
-       'Ꜭ' => 'ꜭ',
-       'Ꜯ' => 'ꜯ',
-       'Ꜳ' => 'ꜳ',
-       'Ꜵ' => 'ꜵ',
-       'Ꜷ' => 'ꜷ',
-       'Ꜹ' => 'ꜹ',
-       'Ꜻ' => 'ꜻ',
-       'Ꜽ' => 'ꜽ',
-       'Ꜿ' => 'ꜿ',
-       'Ꝁ' => 'ꝁ',
-       'Ꝃ' => 'ꝃ',
-       'Ꝅ' => 'ꝅ',
-       'Ꝇ' => 'ꝇ',
-       'Ꝉ' => 'ꝉ',
-       'Ꝋ' => 'ꝋ',
-       'Ꝍ' => 'ꝍ',
-       'Ꝏ' => 'ꝏ',
-       'Ꝑ' => 'ꝑ',
-       'Ꝓ' => 'ꝓ',
-       'Ꝕ' => 'ꝕ',
-       'Ꝗ' => 'ꝗ',
-       'Ꝙ' => 'ꝙ',
-       'Ꝛ' => 'ꝛ',
-       'Ꝝ' => 'ꝝ',
-       'Ꝟ' => 'ꝟ',
-       'Ꝡ' => 'ꝡ',
-       'Ꝣ' => 'ꝣ',
-       'Ꝥ' => 'ꝥ',
-       'Ꝧ' => 'ꝧ',
-       'Ꝩ' => 'ꝩ',
-       'Ꝫ' => 'ꝫ',
-       'Ꝭ' => 'ꝭ',
-       'Ꝯ' => 'ꝯ',
-       'Ꝺ' => 'ꝺ',
-       'Ꝼ' => 'ꝼ',
-       'Ᵹ' => 'ᵹ',
-       'Ꝿ' => 'ꝿ',
-       'Ꞁ' => 'ꞁ',
-       'Ꞃ' => 'ꞃ',
-       'Ꞅ' => 'ꞅ',
-       'Ꞇ' => 'ꞇ',
-       'Ꞌ' => 'ꞌ',
-       'Ɥ' => 'ɥ',
-       'Ꞑ' => 'ꞑ',
-       'Ꞡ' => 'ꞡ',
-       'Ꞣ' => 'ꞣ',
-       'Ꞥ' => 'ꞥ',
-       'Ꞧ' => 'ꞧ',
-       'Ꞩ' => 'ꞩ',
-       'A' => 'a',
-       'B' => 'b',
-       'C' => 'c',
-       'D' => 'd',
-       'E' => 'e',
-       'F' => 'f',
-       'G' => 'g',
-       'H' => 'h',
-       'I' => 'i',
-       'J' => 'j',
-       'K' => 'k',
-       'L' => 'l',
-       'M' => 'm',
-       'N' => 'n',
-       'O' => 'o',
-       'P' => 'p',
-       'Q' => 'q',
-       'R' => 'r',
-       'S' => 's',
-       'T' => 't',
-       'U' => 'u',
-       'V' => 'v',
-       'W' => 'w',
-       'X' => 'x',
-       'Y' => 'y',
-       'Z' => 'z',
-       '𐐀' => '𐐨',
-       '𐐁' => '𐐩',
-       '𐐂' => '𐐪',
-       '𐐃' => '𐐫',
-       '𐐄' => '𐐬',
-       '𐐅' => '𐐭',
-       '𐐆' => '𐐮',
-       '𐐇' => '𐐯',
-       '𐐈' => '𐐰',
-       '𐐉' => '𐐱',
-       '𐐊' => '𐐲',
-       '𐐋' => '𐐳',
-       '𐐌' => '𐐴',
-       '𐐍' => '𐐵',
-       '𐐎' => '𐐶',
-       '𐐏' => '𐐷',
-       '𐐐' => '𐐸',
-       '𐐑' => '𐐹',
-       '𐐒' => '𐐺',
-       '𐐓' => '𐐻',
-       '𐐔' => '𐐼',
-       '𐐕' => '𐐽',
-       '𐐖' => '𐐾',
-       '𐐗' => '𐐿',
-       '𐐘' => '𐑀',
-       '𐐙' => '𐑁',
-       '𐐚' => '𐑂',
-       '𐐛' => '𐑃',
-       '𐐜' => '𐑄',
-       '𐐝' => '𐑅',
-       '𐐞' => '𐑆',
-       '𐐟' => '𐑇',
-       '𐐠' => '𐑈',
-       '𐐡' => '𐑉',
-       '𐐢' => '𐑊',
-       '𐐣' => '𐑋',
-       '𐐤' => '𐑌',
-       '𐐥' => '𐑍',
-       '𐐦' => '𐑎',
-       '𐐧' => '𐑏'
-);
diff --git a/includes/normal/Utf8CaseGenerate.php b/includes/normal/Utf8CaseGenerate.php
deleted file mode 100644 (file)
index adc3ef2..0000000
+++ /dev/null
@@ -1,112 +0,0 @@
-<?php
-/**
- * This script generates Utf8Case.php from the Unicode Character Database
- * and supplementary files.
- *
- * Copyright © 2004,2008 Brion Vibber <brion@pobox.com>
- * http://www.mediawiki.org/
- *
- * 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 UtfNormal
- */
-
-if( PHP_SAPI != 'cli' ) {
-       die( "Run me from the command line please.\n" );
-}
-
-require_once 'UtfNormalDefines.php';
-require_once 'UtfNormalUtil.php';
-
-$in = fopen("UnicodeData.txt", "rt" );
-if( !$in ) {
-       print "Can't open UnicodeData.txt for reading.\n";
-       print "If necessary, fetch this file from the internet:\n";
-       print "http://www.unicode.org/Public/UNIDATA/UnicodeData.txt\n";
-       exit(-1);
-}
-$wikiUpperChars = array();
-$wikiLowerChars = array();
-
-print "Reading character definitions...\n";
-while( false !== ($line = fgets( $in ) ) ) {
-       $columns = explode(';', $line);
-       $codepoint = $columns[0];
-       $name = $columns[1];
-       $simpleUpper = $columns[12];
-       $simpleLower = $columns[13];
-
-       $source = codepointToUtf8( hexdec( $codepoint ) );
-       if( $simpleUpper ) {
-               $wikiUpperChars[$source] = codepointToUtf8( hexdec( $simpleUpper ) );
-       }
-       if( $simpleLower ) {
-               $wikiLowerChars[$source] = codepointToUtf8( hexdec( $simpleLower ) );
-       }
-}
-fclose( $in );
-
-$out = fopen( "Utf8Case.php", "wt" );
-if( $out ) {
-       $outUpperChars = escapeArray( $wikiUpperChars );
-       $outLowerChars = escapeArray( $wikiLowerChars );
-       $outdata = "<" . "?php
-/**
- * Simple 1:1 upper/lowercase switching arrays for utf-8 text.
- * Won't get context-sensitive things yet.
- *
- * Hack for bugs in ucfirst() and company
- *
- * These are pulled from memcached if possible, as this is faster than filling
- * up a big array manually.
- *
- * @file
- * @ingroup Language
- */
-
-/**
- * Translation array to get upper case character
- */
-\$wikiUpperChars = $outUpperChars;
-
-/**
- * Translation array to get lower case character
- */
-\$wikiLowerChars = $outLowerChars;\n";
-       fputs( $out, $outdata );
-       fclose( $out );
-       print "Wrote out Utf8Case.php\n";
-} else {
-       print "Can't create file Utf8Case.php\n";
-       exit(-1);
-}
-
-
-function escapeArray( $arr ) {
-       return "array(\n" .
-               implode( ",\n",
-                       array_map( "escapeLine",
-                               array_keys( $arr ),
-                               array_values( $arr ) ) ) .
-               "\n)";
-}
-
-function escapeLine( $key, $val ) {
-       $encKey = escapeSingleString( $key );
-       $encVal = escapeSingleString( $val );
-       return "\t'$encKey' => '$encVal'";
-}
index ca27112..df0f118 100644 (file)
@@ -54,7 +54,7 @@ class CoreParserFunctions {
                        'talkpagename', 'talkpagenamee', 'subjectpagename',
                        'subjectpagenamee', 'pageid', 'revisionid', 'revisionday',
                        'revisionday2', 'revisionmonth', 'revisionmonth1', 'revisionyear',
-                       'revisiontimestamp', 'revisionuser',
+                       'revisiontimestamp', 'revisionuser', 'cascadingsources',
                );
                foreach ( $noHashFunctions as $func ) {
                        $parser->setFunctionHook( $func, array( __CLASS__, $func ), SFH_NO_HASH );
@@ -402,11 +402,12 @@ class CoreParserFunctions {
         * @return boolean true on successful match
         */
        private static function matchAgainstMagicword( $magicword, $value ) {
-               if ( strval( $value ) === '' ) {
+               $value = trim( strval( $value ) );
+               if ( $value === '' ) {
                        return false;
                }
                $mwObject = MagicWord::get( $magicword );
-               return $mwObject->match( $value );
+               return $mwObject->matchStartToEnd( $value );
        }
 
        static function formatRaw( $num, $raw ) {
@@ -1118,4 +1119,32 @@ class CoreParserFunctions {
                $rev = self::getCachedRevisionObject( $parser, $t );
                return $rev ? $rev->getUserText() : '';
        }
+
+       /**
+        * Returns the sources of any cascading protection acting on a specified page.
+        * Pages will not return their own title unless they transclude themselves.
+        * This is an expensive parser function and can't be called too many times per page.
+        *
+        * @param Parser $parser
+        * @param string $title
+        *
+        * @return string
+        * @since 1.23
+        */
+       public static function cascadingsources( $parser, $title = '' ) {
+               $titleObject = Title::newFromText( $title );
+               if ( !( $titleObject instanceof Title ) ) {
+                       $titleObject = $parser->mTitle;
+               }
+               $names = array();
+               if ( $parser->incrementExpensiveFunctionCount() ) {
+                       $sources = $titleObject->getCascadeProtectionSources();
+                       foreach ( $sources[0] as $sourceTitle ) {
+                               $names[] = $sourceTitle->getPrefixedText();
+                       }
+               }
+
+               return implode( $names, '|' );
+       }
+
 }
index d81ad98..cdf5e98 100644 (file)
@@ -3031,6 +3031,9 @@ class Parser {
                        case 'contentlanguage':
                                global $wgLanguageCode;
                                return $wgLanguageCode;
+                       case 'cascadingsources':
+                               $value = CoreParserFunctions::cascadingsources( $this );
+                               break;
                        default:
                                $ret = null;
                                wfRunHooks( 'ParserGetVariableValueSwitch', array( &$this, &$this->mVarCache, &$index, &$ret, &$frame ) );
@@ -3834,12 +3837,7 @@ class Parser {
                if ( $file && !$title->equals( $file->getTitle() ) ) {
                        # Update fetched file title
                        $title = $file->getTitle();
-                       if ( is_null( $file->getRedirectedTitle() ) ) {
-                               # This file was not a redirect, but the title does not match.
-                               # Register under the new name because otherwise the link will
-                               # get lost.
-                               $this->mOutput->addImage( $title->getDBkey(), $time, $sha1 );
-                       }
+                       $this->mOutput->addImage( $title->getDBkey(), $time, $sha1 );
                }
                return array( $file, $title );
        }
index 8393216..c4e9a1c 100644 (file)
@@ -571,7 +571,7 @@ class ParserOptions {
 
                // Give a chance for extensions to modify the hash, if they have
                // extra options or other effects on the parser cache.
-               wfRunHooks( 'PageRenderingHash', array( &$confstr ) );
+               wfRunHooks( 'PageRenderingHash', array( &$confstr, $this->getUser() ) );
 
                // Make it a valid memcached key fragment
                $confstr = str_replace( ' ', '_', $confstr );
diff --git a/includes/profiler/ProfilerMwprof.php b/includes/profiler/ProfilerMwprof.php
new file mode 100644 (file)
index 0000000..e81c6ec
--- /dev/null
@@ -0,0 +1,190 @@
+<?php
+/**
+ * Profiler class for Mwprof.
+ *
+ * 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 Profiler
+ */
+
+/**
+ * Profiler class for Mwprof.
+ *
+ * Mwprof is a high-performance MediaWiki profiling data collector, designed to
+ * collect profiling data from multiple hosts running in tandem. This class
+ * serializes profiling samples into MessagePack arrays and sends them to an
+ * Mwprof instance via UDP.
+ *
+ * @see https://github.com/wikimedia/operations-software-mwprof
+ * @since 1.23
+ */
+class ProfilerMwprof extends Profiler {
+
+       // Message types
+
+       const TYPE_SINGLE  = 1;
+       const TYPE_RUNNING = 2;
+
+       /**
+        * Indicate that this Profiler subclass is persistent.
+        *
+        * Called by Parser::braceSubstitution. If true, the parser will not
+        * generate per-title profiling sections, to avoid overloading the
+        * profiling data collector.
+        *
+        * @return bool true
+        */
+       public function isPersistent() {
+               return true;
+       }
+
+       /**
+        * Start a profiling section.
+        *
+        * Marks the beginning of the function or code-block that should be time
+        * and logged under some specific name.
+        *
+        * @param string $inName Section to start
+        */
+       public function profileIn( $inName ) {
+               $this->mWorkStack[] = array( $inName, count( $this->mWorkStack ),
+                       $this->getTime(), $this->getTime( 'cpu' ) );
+       }
+
+       /**
+        * Produce an empty function report.
+        *
+        * ProfileMwprof does not provide a function report.
+        *
+        * @return string Empty string.
+        */
+       public function getFunctionReport() {
+               return '';
+       }
+
+       /**
+        * Close a profiling section.
+        *
+        * Marks the end of the function or code-block that should be timed and
+        * logged under some specific name.
+        *
+        * @param string $outName Section to close
+        */
+       public function profileOut( $outName ) {
+               list( $inName, $inCount, $inWall, $inCpu ) = array_pop( $this->mWorkStack );
+
+               // Check for unbalanced profileIn / profileOut calls.
+               // Bad entries are logged but not sent.
+               if ( $inName !== $outName ) {
+                       wfDebugLog( 'ProfilerUnbalanced', json_encode( array( $inName, $outName ) ) );
+                       return;
+               }
+
+               $elapsedCpu = $this->getTime( 'cpu' ) - $inCpu;
+               $elapsedWall = $this->getTime() - $inWall;
+               $this->updateEntry( $outName, $elapsedCpu, $elapsedWall );
+               $this->updateTrxProfiling( $outName, $elapsedWall );
+       }
+
+       /**
+        * Update an entry with timing data.
+        *
+        * @param string $name Section name
+        * @param float $elapsedCpu elapsed CPU time
+        * @param float $elapsedWall elapsed wall-clock time
+        */
+       public function updateEntry( $name, $elapsedCpu, $elapsedWall ) {
+               // If this is the first measurement for this entry, store plain values.
+               // Many profiled functions will only be called once per request.
+               if ( !isset( $this->mCollated[$name] ) ) {
+                       $this->mCollated[$name] = array(
+                               'cpu'   => $elapsedCpu,
+                               'wall'  => $elapsedWall,
+                               'count' => 1,
+                       );
+                       return;
+               }
+
+               $entry = &$this->mCollated[$name];
+
+               // If it's the second measurement, convert the plain values to
+               // RunningStat instances, so we can push the incoming values on top.
+               if ( $entry['count'] === 1 ) {
+                       $cpu = new RunningStat();
+                       $cpu->push( $entry['cpu'] );
+                       $entry['cpu'] = $cpu;
+
+                       $wall = new RunningStat();
+                       $wall->push( $entry['wall'] );
+                       $entry['wall'] = $wall;
+               }
+
+               $entry['count']++;
+               $entry['cpu']->push( $elapsedCpu );
+               $entry['wall']->push( $elapsedWall );
+       }
+
+       /**
+        * Serialize profiling data and send to a profiling data aggregator.
+        *
+        * Individual entries are represented as arrays and then encoded using
+        * MessagePack, an efficient binary data-interchange format. Encoded
+        * entries are accumulated into a buffer and sent in batch via UDP to the
+        * profiling data aggregator.
+        */
+       public function logData() {
+               global $wgUDPProfilerHost, $wgUDPProfilerPort;
+
+               $this->close();
+
+               $sock = socket_create( AF_INET, SOCK_DGRAM, SOL_UDP );
+               socket_connect( $sock, $wgUDPProfilerHost, $wgUDPProfilerPort );
+               $bufferLength = 0;
+               $buffer = '';
+               foreach ( $this->mCollated as $name => $entry ) {
+                       $count = $entry['count'];
+                       $cpu = $entry['cpu'];
+                       $wall = $entry['wall'];
+
+                       if ( $count === 1 ) {
+                               $data = array( self::TYPE_SINGLE, $name, $cpu, $wall );
+                       } else {
+                               $data = array( self::TYPE_RUNNING, $name, $count,
+                                       $cpu->m1, $cpu->m2, $cpu->min, $cpu->max,
+                                       $wall->m1, $wall->m2, $wall->min, $wall->max );
+                       }
+
+                       $encoded = MWMessagePack::pack( $data );
+                       $length = strlen( $encoded );
+
+                       // If adding this entry would cause the size of the buffer to
+                       // exceed the standard ethernet MTU size less the UDP header,
+                       // send all pending data and reset the buffer. Otherwise, continue
+                       // accumulating entries into the current buffer.
+                       if ( $length + $bufferLength > 1450 ) {
+                               socket_send( $sock, $buffer, $bufferLength, 0 );
+                               $buffer = '';
+                               $bufferLength = 0;
+                       }
+                       $buffer .= $encoded;
+                       $bufferLength += $length;
+               }
+               if ( $bufferLength !== 0 ) {
+                       socket_send( $sock, $buffer, $bufferLength, 0 );
+               }
+       }
+}
index 063cb90..98d3f02 100644 (file)
  *
  * @since 1.22
  */
+class JSONRCFeedFormatter extends MachineReadableRCFeedFormatter {
 
-class JSONRCFeedFormatter implements RCFeedFormatter {
-       /**
-        * Generates a notification that can be easily interpreted by a machine.
-        * @see RCFeedFormatter::getLine
-        */
-       public function getLine( array $feed, RecentChange $rc, $actionComment ) {
-               global $wgCanonicalServer, $wgScriptPath, $wgDBname;
-               $attrib = $rc->getAttributes();
-
-               $packet = array(
-                       // Usually, RC ID is exposed only for patrolling purposes,
-                       // but there is no real reason not to expose it in other cases,
-                       // and I can see how this may be potentially useful for clients.
-                       'id' => $attrib['rc_id'],
-                       'type' => $attrib['rc_type'],
-                       'namespace' => $rc->getTitle()->getNamespace(),
-                       'title' => $rc->getTitle()->getPrefixedText(),
-                       'comment' => $attrib['rc_comment'],
-                       'timestamp' => (int)wfTimestamp( TS_UNIX, $attrib['rc_timestamp'] ),
-                       'user' => $attrib['rc_user_text'],
-                       'bot' => (bool)$attrib['rc_bot'],
-               );
-
-               if ( isset( $feed['channel'] ) ) {
-                       $packet['channel'] = $feed['channel'];
-               }
-
-               $type = $attrib['rc_type'];
-               if ( $type == RC_EDIT || $type == RC_NEW ) {
-                       global $wgUseRCPatrol, $wgUseNPPatrol;
-
-                       $packet['minor'] = $attrib['rc_minor'];
-                       if ( $wgUseRCPatrol || ( $type == RC_NEW && $wgUseNPPatrol ) ) {
-                               $packet['patrolled'] = $attrib['rc_patrolled'];
-                       }
-               }
-
-               switch ( $type ) {
-                       case RC_EDIT:
-                               $packet['length'] = array( 'old' => $attrib['rc_old_len'], 'new' => $attrib['rc_new_len'] );
-                               $packet['revision'] = array( 'old' => $attrib['rc_last_oldid'], 'new' => $attrib['rc_this_oldid'] );
-                               break;
-
-                       case RC_NEW:
-                               $packet['length'] = array( 'old' => null, 'new' => $attrib['rc_new_len'] );
-                               $packet['revision'] = array( 'old' => null, 'new' => $attrib['rc_this_oldid'] );
-                               break;
-
-                       case RC_LOG:
-                               $packet['log_type'] = $attrib['rc_log_type'];
-                               $packet['log_action'] = $attrib['rc_log_action'];
-                               if ( $attrib['rc_params'] ) {
-                                       wfSuppressWarnings();
-                                       $params = unserialize( $attrib['rc_params'] );
-                                       wfRestoreWarnings();
-                                       if (
-                                               // If it's an actual serialised false...
-                                               $attrib['rc_params'] == serialize( false ) ||
-                                               // Or if we did not get false back when trying to unserialise
-                                               $params !== false
-                                       ) {
-                                               // From ApiQueryLogEvents::addLogParams
-                                               $logParams = array();
-                                               // Keys like "4::paramname" can't be used for output so we change them to "paramname"
-                                               foreach ( $params as $key => $value ) {
-                                                       if ( strpos( $key, ':' ) === false ) {
-                                                               $logParams[$key] = $value;
-                                                               continue;
-                                                       }
-                                                       $logParam = explode( ':', $key, 3 );
-                                                       $logParams[$logParam[2]] = $value;
-                                               }
-                                               $packet['log_params'] = $logParams;
-                                       } else {
-                                               $packet['log_params'] = explode( "\n", $attrib['rc_params'] );
-                                       }
-                               }
-                               $packet['log_action_comment'] = $actionComment;
-                               break;
-               }
-
-               $packet['server_url'] = $wgCanonicalServer;
-               $packet['server_script_path'] = $wgScriptPath ?: '/';
-               $packet['wiki'] = $wgDBname;
-
+       protected function formatArray( array $packet ) {
                return FormatJson::encode( $packet );
        }
 }
diff --git a/includes/rcfeed/MachineReadableRCFeedFormatter.php b/includes/rcfeed/MachineReadableRCFeedFormatter.php
new file mode 100644 (file)
index 0000000..9321f52
--- /dev/null
@@ -0,0 +1,128 @@
+<?php
+
+/**
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+/**
+ * Abstract class so there can be multiple formatters outputting the same data
+ *
+ * @since 1.23
+ */
+abstract class MachineReadableRCFeedFormatter implements RCFeedFormatter {
+
+       /**
+        * Take the packet and return the formatted string
+        * @param array $packet
+        * @return string
+        */
+       abstract protected function formatArray( array $packet );
+
+       /**
+        * Generates a notification that can be easily interpreted by a machine.
+        * @see RCFeedFormatter::getLine
+        */
+       public function getLine( array $feed, RecentChange $rc, $actionComment ) {
+               global $wgCanonicalServer, $wgScriptPath;
+               $attrib = $rc->getAttributes();
+
+               $packet = array(
+                       // Usually, RC ID is exposed only for patrolling purposes,
+                       // but there is no real reason not to expose it in other cases,
+                       // and I can see how this may be potentially useful for clients.
+                       'id' => $attrib['rc_id'],
+                       'type' => $attrib['rc_type'],
+                       'namespace' => $rc->getTitle()->getNamespace(),
+                       'title' => $rc->getTitle()->getPrefixedText(),
+                       'comment' => $attrib['rc_comment'],
+                       'timestamp' => (int)wfTimestamp( TS_UNIX, $attrib['rc_timestamp'] ),
+                       'user' => $attrib['rc_user_text'],
+                       'bot' => (bool)$attrib['rc_bot'],
+               );
+
+               if ( isset( $feed['channel'] ) ) {
+                       $packet['channel'] = $feed['channel'];
+               }
+
+               $type = $attrib['rc_type'];
+               if ( $type == RC_EDIT || $type == RC_NEW ) {
+                       global $wgUseRCPatrol, $wgUseNPPatrol;
+
+                       $packet['minor'] = $attrib['rc_minor'];
+                       if ( $wgUseRCPatrol || ( $type == RC_NEW && $wgUseNPPatrol ) ) {
+                               $packet['patrolled'] = $attrib['rc_patrolled'];
+                       }
+               }
+
+               switch ( $type ) {
+                       case RC_EDIT:
+                               $packet['length'] = array(
+                                       'old' => $attrib['rc_old_len'],
+                                       'new' => $attrib['rc_new_len']
+                               );
+                               $packet['revision'] = array(
+                                       'old' => $attrib['rc_last_oldid'],
+                                       'new' => $attrib['rc_this_oldid']
+                               );
+                               break;
+
+                       case RC_NEW:
+                               $packet['length'] = array( 'old' => null, 'new' => $attrib['rc_new_len'] );
+                               $packet['revision'] = array( 'old' => null, 'new' => $attrib['rc_this_oldid'] );
+                               break;
+
+                       case RC_LOG:
+                               $packet['log_type'] = $attrib['rc_log_type'];
+                               $packet['log_action'] = $attrib['rc_log_action'];
+                               if ( $attrib['rc_params'] ) {
+                                       wfSuppressWarnings();
+                                       $params = unserialize( $attrib['rc_params'] );
+                                       wfRestoreWarnings();
+                                       if (
+                                               // If it's an actual serialised false...
+                                               $attrib['rc_params'] == serialize( false ) ||
+                                               // Or if we did not get false back when trying to unserialise
+                                               $params !== false
+                                       ) {
+                                               // From ApiQueryLogEvents::addLogParams
+                                               $logParams = array();
+                                               // Keys like "4::paramname" can't be used for output so we change them to "paramname"
+                                               foreach ( $params as $key => $value ) {
+                                                       if ( strpos( $key, ':' ) === false ) {
+                                                               $logParams[$key] = $value;
+                                                               continue;
+                                                       }
+                                                       $logParam = explode( ':', $key, 3 );
+                                                       $logParams[$logParam[2]] = $value;
+                                               }
+                                               $packet['log_params'] = $logParams;
+                                       } else {
+                                               $packet['log_params'] = explode( "\n", $attrib['rc_params'] );
+                                       }
+                               }
+                               $packet['log_action_comment'] = $actionComment;
+                               break;
+               }
+
+               $packet['server_url'] = $wgCanonicalServer;
+               $packet['server_script_path'] = $wgScriptPath ?: '/';
+               $packet['wiki'] = wfWikiID();
+
+               return $this->formatArray( $packet );
+       }
+}
diff --git a/includes/rcfeed/XMLRCFeedFormatter.php b/includes/rcfeed/XMLRCFeedFormatter.php
new file mode 100644 (file)
index 0000000..d572426
--- /dev/null
@@ -0,0 +1,30 @@
+<?php
+
+/**
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+/**
+ * @since 1.23
+ */
+class XMLRCFeedFormatter extends MachineReadableRCFeedFormatter {
+
+       protected function formatArray( array $packet ) {
+               return ApiFormatXml::recXmlPrint( 'recentchange', $packet, 0 );
+       }
+}
index 1556961..94d39a5 100644 (file)
@@ -36,6 +36,7 @@ class SearchEngine {
        var $searchTerms = array();
        var $namespaces = array( NS_MAIN );
        var $showRedirects = false;
+       protected $showSuggestion = true;
 
        /// Feature values
        protected $features = array();
@@ -304,6 +305,17 @@ class SearchEngine {
                $this->namespaces = $namespaces;
        }
 
+       /**
+        * Set whether the searcher should try to build a suggestion.  Note: some searchers
+        * don't support building a suggestion in the first place and others don't respect
+        * this flag.
+        *
+        * @param boolean $showSuggestion should the searcher try to build suggestions
+        */
+       function setShowSuggestion( $showSuggestion ) {
+               $this->showSuggestion = $showSuggestion;
+       }
+
        /**
         * Parse some common prefixes: all (search everything)
         * or namespace names
index 7b6cca0..d19968f 100644 (file)
@@ -188,6 +188,6 @@ class SpecialBookSources extends SpecialPage {
        }
 
        protected function getGroupName() {
-               return 'other';
+               return 'wiki';
        }
 }
index 7c7771d..f533234 100644 (file)
@@ -49,36 +49,40 @@ class LonelyPagesPage extends PageQueryPage {
        }
 
        function getQueryInfo() {
-               return array(
-                       'tables' => array(
-                               'page', 'pagelinks',
-                               'templatelinks'
+               $tables = array( 'page', 'pagelinks', 'templatelinks' );
+               $conds = array(
+                       'pl_namespace IS NULL',
+                       'page_namespace' => MWNamespace::getContentNamespaces(),
+                       'page_is_redirect' => 0,
+                       'tl_namespace IS NULL'
+               );
+               $joinConds = array(
+                       'pagelinks' => array(
+                               'LEFT JOIN', array(
+                                       'pl_namespace = page_namespace',
+                                       'pl_title = page_title'
+                               )
                        ),
+                       'templatelinks' => array(
+                               'LEFT JOIN', array(
+                                       'tl_namespace = page_namespace',
+                                       'tl_title = page_title'
+                               )
+                       )
+               );
+
+               // Allow extensions to modify the query
+               wfRunHooks( 'LonelyPagesQuery', array( &$tables, &$conds, &$joinConds ) );
+
+               return array(
+                       'tables' => $tables,
                        'fields' => array(
                                'namespace' => 'page_namespace',
                                'title' => 'page_title',
                                'value' => 'page_title'
                        ),
-                       'conds' => array(
-                               'pl_namespace IS NULL',
-                               'page_namespace' => MWNamespace::getContentNamespaces(),
-                               'page_is_redirect' => 0,
-                               'tl_namespace IS NULL'
-                       ),
-                       'join_conds' => array(
-                               'pagelinks' => array(
-                                       'LEFT JOIN', array(
-                                               'pl_namespace = page_namespace',
-                                               'pl_title = page_title'
-                                       )
-                               ),
-                               'templatelinks' => array(
-                                       'LEFT JOIN', array(
-                                               'tl_namespace = page_namespace',
-                                               'tl_title = page_title'
-                                       )
-                               )
-                       )
+                       'conds' => $conds,
+                       'join_conds' => $joinConds
                );
        }
 
index 8a119f5..a4e0b85 100644 (file)
@@ -87,12 +87,11 @@ class SpecialRecentChanges extends SpecialPage {
                global $wgFeedLimit;
 
                $opts = $this->getDefaultOptions();
-
                foreach ( $this->getCustomFilters() as $key => $params ) {
                        $opts->add( $key, $params['default'] );
                }
 
-               $opts->fetchValuesFromRequest( $this->getRequest() );
+               $opts = $this->fetchOptionsFromRequest( $opts );
 
                // Give precedence to subpage syntax
                if ( $parameters !== null ) {
@@ -104,6 +103,19 @@ class SpecialRecentChanges extends SpecialPage {
                return $opts;
        }
 
+       /**
+        * Fetch values for a FormOptions object from the WebRequest associated with this instance.
+        *
+        * Intended for subclassing, e.g. to add a backwards-compatibility layer.
+        *
+        * @param FormOptions $parameters
+        * @return FormOptions
+        */
+       protected function fetchOptionsFromRequest( $opts ) {
+               $opts->fetchValuesFromRequest( $this->getRequest() );
+               return $opts;
+       }
+
        /**
         * Get custom show/hide filters
         *
index 62eeb40..98ae6f5 100644 (file)
@@ -120,7 +120,7 @@ class SpecialSearch extends SpecialPage {
         */
        public function load() {
                $request = $this->getRequest();
-               list( $this->limit, $this->offset ) = $request->getLimitOffset( 20, 'searchlimit' );
+               list( $this->limit, $this->offset ) = $request->getLimitOffset( 20, '', 500 );
                $this->mPrefix = $request->getVal( 'prefix', '' );
 
                $user = $this->getUser();
@@ -253,6 +253,8 @@ class SpecialSearch extends SpecialPage {
                }
 
                $t = Title::newFromText( $term );
+               $showSuggestion = $t === null || !$t->isKnown();
+               $search->setShowSuggestion( $showSuggestion );
 
                // fetch search results
                $rewritten = $search->replacePrefixes( $term );
@@ -269,7 +271,7 @@ class SpecialSearch extends SpecialPage {
                }
 
                // did you mean... suggestions
-               if ( $textMatches && !$textStatus && $textMatches->hasSuggestion() ) {
+               if ( $showSuggestion && $textMatches && !$textStatus && $textMatches->hasSuggestion() ) {
                        $st = SpecialPage::getTitleFor( 'Search' );
 
                        # mirror Go/Search behavior of original request ..
index 3e67d56..8e5ef58 100644 (file)
@@ -1298,7 +1298,7 @@ class LoginForm extends SpecialPage {
         */
        public static function setLoginToken() {
                global $wgRequest;
-               // Generate a token directly instead of using $user->editToken()
+               // Generate a token directly instead of using $user->getEditToken()
                // because the latter reuses $_SESSION['wsEditToken']
                $wgRequest->setSessionData( 'wsLoginToken', MWCryptRand::generateHex( 32 ) );
        }
index a680bac..c947c78 100644 (file)
@@ -34,6 +34,99 @@ class SpecialWatchlist extends SpecialRecentChanges {
                return false;
        }
 
+       /**
+        * Get a FormOptions object containing the default options
+        *
+        * @return FormOptions
+        */
+       public function getDefaultOptions() {
+               $opts = parent::getDefaultOptions();
+               $user = $this->getUser();
+
+               // Overwrite RC options with Watchlist options
+               // (calling #add() again is okay)
+               $opts->add( 'days', $user->getOption( 'watchlistdays' ), FormOptions::FLOAT );
+               $opts->add( 'hideminor', $user->getBoolOption( 'watchlisthideminor' ) );
+               $opts->add( 'hidebots', $user->getBoolOption( 'watchlisthidebots' ) );
+               $opts->add( 'hideanons', $user->getBoolOption( 'watchlisthideanons' ) );
+               $opts->add( 'hideliu', $user->getBoolOption( 'watchlisthideliu' ) );
+               $opts->add( 'hidepatrolled', $user->getBoolOption( 'watchlisthidepatrolled' ) );
+               $opts->add( 'hidemyself', $user->getBoolOption( 'watchlisthideown' ) );
+
+               // Add new ones
+               $opts->add( 'extended', $user->getBoolOption( 'extendwatchlist' ) );
+
+               return $opts;
+       }
+
+       /**
+        * Fetch values for a FormOptions object from the WebRequest associated with this instance.
+        *
+        * Maps old pre-1.23 request parameters Watchlist used to use (different from Recentchanges' ones)
+        * to the current ones.
+        *
+        * @param FormOptions $parameters
+        * @return FormOptions
+        */
+       protected function fetchOptionsFromRequest( $opts ) {
+               static $compatibilityMap = array(
+                       'hideMinor' => 'hideminor',
+                       'hideBots' => 'hidebots',
+                       'hideAnons' => 'hideanons',
+                       'hideLiu' => 'hideliu',
+                       'hidePatrolled' => 'hidepatrolled',
+                       'hideOwn' => 'hidemyself',
+               );
+
+               $params = $this->getRequest()->getValues();
+               foreach ( $compatibilityMap as $from => $to ) {
+                       if ( isset( $params[$from] ) ) {
+                               $params[$to] = $params[$from];
+                               unset( $params[$from] );
+                       }
+               }
+
+               // Not the prettiest way to achieve this… FormOptions internally depends on data sanitization
+               // methods defined on WebRequest and removing this dependency would cause some code duplication.
+               $request = new DerivativeRequest( $this->getRequest(), $params );
+               $opts->fetchValuesFromRequest( $request );
+               return $opts;
+       }
+
+       /**
+        * Get custom show/hide filters
+        *
+        * @return array Map of filter URL param names to properties (msg/default)
+        */
+       protected function getCustomFilters() {
+               if ( $this->customFilters === null ) {
+                       $this->customFilters = array();
+                       wfRunHooks( 'SpecialWatchlistFilters', array( $this, &$this->customFilters ) );
+               }
+
+               return $this->customFilters;
+       }
+
+       /**
+        * Process $par and put options found if $opts. Not used for Watchlist.
+        *
+        * @param string $par
+        * @param FormOptions $opts
+        */
+       public function parseParameters( $par, FormOptions $opts ) {
+       }
+
+       /**
+        * Get the current FormOptions for this request
+        */
+       public function getOptions() {
+               if ( $this->rcOptions === null ) {
+                       $this->rcOptions = $this->setup( null );
+               }
+
+               return $this->rcOptions;
+       }
+
        /**
         * Execute
         * @param $par Parameter passed to the page
@@ -52,6 +145,33 @@ class SpecialWatchlist extends SpecialRecentChanges {
                // Check permissions
                $this->checkPermissions();
 
+               $request = $this->getRequest();
+               $opts = $this->getOptions();
+
+               $mode = SpecialEditWatchlist::getMode( $request, $par );
+               if ( $mode !== false ) {
+                       if ( $mode === SpecialEditWatchlist::EDIT_RAW ) {
+                               $title = SpecialPage::getTitleFor( 'EditWatchlist', 'raw' );
+                       } else {
+                               $title = SpecialPage::getTitleFor( 'EditWatchlist' );
+                       }
+
+                       $output->redirect( $title->getLocalURL() );
+                       return;
+               }
+
+               if ( ( $wgEnotifWatchlist || $wgShowUpdatedMarker ) && $request->getVal( 'reset' ) &&
+                       $request->wasPosted() )
+               {
+                       $user->clearAllNotifications();
+                       $output->redirect( $this->getPageTitle()->getFullURL( $opts->getChangedValues() ) );
+                       return;
+               }
+
+               $this->setHeaders();
+               $this->outputHeader();
+               $this->addModules();
+
                // Add feed links
                $wlToken = $user->getTokenFromOption( 'watchlisttoken' );
                if ( $wlToken ) {
@@ -63,142 +183,75 @@ class SpecialWatchlist extends SpecialRecentChanges {
                        ) );
                }
 
-               $this->setHeaders();
-               $this->outputHeader();
-
                $output->addSubtitle(
                        $this->msg( 'watchlistfor2', $user->getName() )
                                ->rawParams( SpecialEditWatchlist::buildTools( null ) )
                );
 
-               $request = $this->getRequest();
-
-               $mode = SpecialEditWatchlist::getMode( $request, $par );
-               if ( $mode !== false ) {
-                       if ( $mode === SpecialEditWatchlist::EDIT_RAW ) {
-                               $title = SpecialPage::getTitleFor( 'EditWatchlist', 'raw' );
-                       } else {
-                               $title = SpecialPage::getTitleFor( 'EditWatchlist' );
-                       }
+               $dbr = wfGetDB( DB_SLAVE, 'watchlist' );
 
-                       $output->redirect( $title->getLocalURL() );
-                       return;
+               # Show a message about slave lag, if applicable
+               $lag = wfGetLB()->safeGetLag( $dbr );
+               if ( $lag > 0 ) {
+                       $output->showLagWarning( $lag );
                }
 
-               $dbr = wfGetDB( DB_SLAVE, 'watchlist' );
-
                $nitems = $this->countItems( $dbr );
                if ( $nitems == 0 ) {
                        $output->addWikiMsg( 'nowatchlist' );
                        return;
                }
 
-               // @todo use FormOptions!
-               $defaults = array(
-               /* float */ 'days' => floatval( $user->getOption( 'watchlistdays' ) ),
-               /* bool  */ 'hideMinor' => (int)$user->getBoolOption( 'watchlisthideminor' ),
-               /* bool  */ 'hideBots' => (int)$user->getBoolOption( 'watchlisthidebots' ),
-               /* bool  */ 'hideAnons' => (int)$user->getBoolOption( 'watchlisthideanons' ),
-               /* bool  */ 'hideLiu' => (int)$user->getBoolOption( 'watchlisthideliu' ),
-               /* bool  */ 'hidePatrolled' => (int)$user->getBoolOption( 'watchlisthidepatrolled' ),
-               /* bool  */ 'hideOwn' => (int)$user->getBoolOption( 'watchlisthideown' ),
-               /* bool  */ 'extended' => (int)$user->getBoolOption( 'extendwatchlist' ),
-               /* ?     */ 'namespace' => '', //means all
-               /* ?     */ 'invert' => false,
-               /* bool  */ 'associated' => false,
-               );
-               $this->customFilters = array();
-               wfRunHooks( 'SpecialWatchlistFilters', array( $this, &$this->customFilters ) );
-               foreach ( $this->customFilters as $key => $params ) {
-                       $defaults[$key] = $params['default'];
-               }
-
-               # Extract variables from the request, falling back to user preferences or
-               # other default values if these don't exist
-               $values = array();
-               $values['days'] = floatval( $request->getVal( 'days', $defaults['days'] ) );
-               $values['hideMinor'] = (int)$request->getBool( 'hideMinor', $defaults['hideMinor'] );
-               $values['hideBots'] = (int)$request->getBool( 'hideBots', $defaults['hideBots'] );
-               $values['hideAnons'] = (int)$request->getBool( 'hideAnons', $defaults['hideAnons'] );
-               $values['hideLiu'] = (int)$request->getBool( 'hideLiu', $defaults['hideLiu'] );
-               $values['hideOwn'] = (int)$request->getBool( 'hideOwn', $defaults['hideOwn'] );
-               $values['hidePatrolled'] = (int)$request->getBool( 'hidePatrolled', $defaults['hidePatrolled'] );
-               $values['extended'] = (int)$request->getBool( 'extended', $defaults['extended'] );
-               foreach ( $this->customFilters as $key => $params ) {
-                       $values[$key] = (int)$request->getBool( $key, $defaults[$key] );
-               }
-
-               # Get namespace value, if supplied, and prepare a WHERE fragment
-               $nameSpace = $request->getIntOrNull( 'namespace' );
-               $invert = $request->getBool( 'invert' );
-               $associated = $request->getBool( 'associated' );
-               if ( !is_null( $nameSpace ) ) {
-                       $eq_op = $invert ? '!=' : '=';
-                       $bool_op = $invert ? 'AND' : 'OR';
-                       $nameSpace = intval( $nameSpace ); // paranioa
-                       if ( !$associated ) {
-                               $nameSpaceClause = "rc_namespace $eq_op $nameSpace";
-                       } else {
-                               $associatedNS = MWNamespace::getAssociated( $nameSpace );
-                               $nameSpaceClause =
-                                       "rc_namespace $eq_op $nameSpace " .
-                                       $bool_op .
-                                       " rc_namespace $eq_op $associatedNS";
-                       }
-               } else {
-                       $nameSpace = '';
-                       $nameSpaceClause = '';
-               }
-               $values['namespace'] = $nameSpace;
-               $values['invert'] = $invert;
-               $values['associated'] = $associated;
-
-               // Dump everything here
-               $nondefaults = array();
-               foreach ( $defaults as $name => $defValue ) {
-                       wfAppendToArrayIfNotDefault( $name, $values[$name], $defaults, $nondefaults );
-               }
-
-               if ( ( $wgEnotifWatchlist || $wgShowUpdatedMarker ) && $request->getVal( 'reset' )
-                       && $request->wasPosted()
-               ) {
-                       $user->clearAllNotifications();
-                       $output->redirect( $this->getPageTitle()->getFullURL( $nondefaults ) );
-                       return;
-               }
-
                # Possible where conditions
                $conds = array();
 
-               if ( $values['days'] > 0 ) {
-                       $conds[] = 'rc_timestamp > ' . $dbr->addQuotes( $dbr->timestamp( time() - intval( $values['days'] * 86400 ) ) );
+               if ( $opts['days'] > 0 ) {
+                       $conds[] = 'rc_timestamp > ' . $dbr->addQuotes( $dbr->timestamp( time() - intval( $opts['days'] * 86400 ) ) );
                }
 
                # Toggles
-               if ( $values['hideOwn'] ) {
+               if ( $opts['hidemyself'] ) {
                        $conds[] = 'rc_user != ' . $user->getId();
                }
-               if ( $values['hideBots'] ) {
+               if ( $opts['hidebots'] ) {
                        $conds[] = 'rc_bot = 0';
                }
-               if ( $values['hideMinor'] ) {
+               if ( $opts['hideminor'] ) {
                        $conds[] = 'rc_minor = 0';
                }
-               if ( $values['hideLiu'] ) {
+               if ( $opts['hideliu'] ) {
                        $conds[] = 'rc_user = 0';
                }
-               if ( $values['hideAnons'] ) {
+               if ( $opts['hideanons'] ) {
                        $conds[] = 'rc_user != 0';
                }
-               if ( $user->useRCPatrol() && $values['hidePatrolled'] ) {
+               if ( $user->useRCPatrol() && $opts['hidepatrolled'] ) {
                        $conds[] = 'rc_patrolled != 1';
                }
-               if ( $nameSpaceClause ) {
-                       $conds[] = $nameSpaceClause;
+               # Namespace filtering
+               if ( $opts['namespace'] !== '' ) {
+                       $selectedNS = $dbr->addQuotes( $opts['namespace'] );
+                       $operator = $opts['invert'] ? '!=' : '=';
+                       $boolean = $opts['invert'] ? 'AND' : 'OR';
+
+                       # namespace association (bug 2429)
+                       if ( !$opts['associated'] ) {
+                               $condition = "rc_namespace $operator $selectedNS";
+                       } else {
+                               # Also add the associated namespace
+                               $associatedNS = $dbr->addQuotes(
+                                       MWNamespace::getAssociated( $opts['namespace'] )
+                               );
+                               $condition = "(rc_namespace $operator $selectedNS "
+                                       . $boolean
+                                       . " rc_namespace $operator $associatedNS)";
+                       }
+
+                       $conds[] = $condition;
                }
 
                # Toggle watchlist content (all recent edits or just the latest)
-               if ( $values['extended'] ) {
+               if ( $opts['extended'] ) {
                        $limitWatchlist = $user->getIntOption( 'wllimit' );
                        $usePage = false;
                } else {
@@ -218,51 +271,6 @@ class SpecialWatchlist extends SpecialRecentChanges {
                        $usePage = true;
                }
 
-               # Show a message about slave lag, if applicable
-               $lag = wfGetLB()->safeGetLag( $dbr );
-               if ( $lag > 0 ) {
-                       $output->showLagWarning( $lag );
-               }
-
-               # Create output
-               $form = '';
-
-               # Show watchlist header
-               $form .= "<p>";
-               $form .= $this->msg( 'watchlist-details' )->numParams( $nitems )->parse() . "\n";
-               if ( $wgEnotifWatchlist && $user->getOption( 'enotifwatchlistpages' ) ) {
-                       $form .= $this->msg( 'wlheader-enotif' )->parse() . "\n";
-               }
-               if ( $wgShowUpdatedMarker ) {
-                       $form .= $this->msg( 'wlheader-showupdated' )->parse() . "\n";
-               }
-               $form .= "</p>";
-
-               if ( $wgShowUpdatedMarker ) {
-                       $form .= Xml::openElement( 'form', array( 'method' => 'post',
-                               'action' => $this->getPageTitle()->getLocalURL(),
-                               'id' => 'mw-watchlist-resetbutton' ) ) . "\n" .
-                       Xml::submitButton( $this->msg( 'enotif_reset' )->text(), array( 'name' => 'dummy' ) ) . "\n" .
-                       Html::hidden( 'reset', 'all' ) . "\n";
-                       foreach ( $nondefaults as $key => $value ) {
-                               $form .= Html::hidden( $key, $value ) . "\n";
-                       }
-                       $form .= Xml::closeElement( 'form' ) . "\n";
-               }
-
-               $form .= Xml::openElement( 'form', array(
-                       'method' => 'post',
-                       'action' => $this->getPageTitle()->getLocalURL(),
-                       'id' => 'mw-watchlist-form'
-               ) );
-               $form .= Xml::fieldset(
-                       $this->msg( 'watchlist-options' )->text(),
-                       false,
-                       array( 'id' => 'mw-watchlist-options' )
-               );
-
-               $form .= SpecialRecentChanges::makeLegend( $this->getContext() );
-
                $tables = array( 'recentchanges', 'watchlist' );
                $fields = RecentChange::selectFields();
                $join_conds = array(
@@ -293,43 +301,44 @@ class SpecialWatchlist extends SpecialRecentChanges {
                }
 
                ChangeTags::modifyDisplayQuery( $tables, $fields, $conds, $join_conds, $options, '' );
-               wfRunHooks( 'SpecialWatchlistQuery', array( &$conds, &$tables, &$join_conds, &$fields, $values ) );
+               wfRunHooks( 'SpecialWatchlistQuery', array( &$conds, &$tables, &$join_conds, &$fields, $opts ) );
 
-               $res = $dbr->select( $tables, $fields, $conds, __METHOD__, $options, $join_conds );
-               $numRows = $res->numRows();
+               $rows = $dbr->select( $tables, $fields, $conds, __METHOD__, $options, $join_conds );
+               $numRows = $rows->numRows();
 
                /* Start bottom header */
 
                $lang = $this->getLanguage();
                $wlInfo = '';
-               if ( $values['days'] > 0 ) {
+               if ( $opts['days'] > 0 ) {
                        $timestamp = wfTimestampNow();
-                       $wlInfo = $this->msg( 'wlnote' )->numParams( $numRows, round( $values['days'] * 24 ) )->params(
+                       $wlInfo = $this->msg( 'wlnote' )->numParams( $numRows, round( $opts['days'] * 24 ) )->params(
                                $lang->userDate( $timestamp, $user ), $lang->userTime( $timestamp, $user ) )->parse() . "<br />\n";
                }
 
-               $cutofflinks = $this->cutoffLinks( $values['days'], $nondefaults ) . "<br />\n";
+               $nondefaults = $opts->getChangedValues();
+               $cutofflinks = $this->cutoffLinks( $opts['days'], $nondefaults ) . "<br />\n";
 
                # Spit out some control panel links
                $filters = array(
-                       'hideMinor' => 'rcshowhideminor',
-                       'hideBots' => 'rcshowhidebots',
-                       'hideAnons' => 'rcshowhideanons',
-                       'hideLiu' => 'rcshowhideliu',
-                       'hideOwn' => 'rcshowhidemine',
-                       'hidePatrolled' => 'rcshowhidepatr'
+                       'hideminor' => 'rcshowhideminor',
+                       'hidebots' => 'rcshowhidebots',
+                       'hideanons' => 'rcshowhideanons',
+                       'hideliu' => 'rcshowhideliu',
+                       'hidemyself' => 'rcshowhidemine',
+                       'hidepatrolled' => 'rcshowhidepatr'
                );
-               foreach ( $this->customFilters as $key => $params ) {
+               foreach ( $this->getCustomFilters() as $key => $params ) {
                        $filters[$key] = $params['msg'];
                }
                // Disable some if needed
                if ( !$user->useNPPatrol() ) {
-                       unset( $filters['hidePatrolled'] );
+                       unset( $filters['hidepatrolled'] );
                }
 
                $links = array();
                foreach ( $filters as $name => $msg ) {
-                       $links[] = $this->showHideLink( $nondefaults, $msg, $name, $values[$name] );
+                       $links[] = $this->showHideLink( $nondefaults, $msg, $name, $opts[$name] );
                }
 
                $hiddenFields = $nondefaults;
@@ -337,6 +346,45 @@ class SpecialWatchlist extends SpecialRecentChanges {
                unset( $hiddenFields['invert'] );
                unset( $hiddenFields['associated'] );
 
+               # Create output
+               $form = '';
+
+               # Show watchlist header
+               $form .= "<p>";
+               $form .= $this->msg( 'watchlist-details' )->numParams( $nitems )->parse() . "\n";
+               if ( $wgEnotifWatchlist && $user->getOption( 'enotifwatchlistpages' ) ) {
+                       $form .= $this->msg( 'wlheader-enotif' )->parse() . "\n";
+               }
+               if ( $wgShowUpdatedMarker ) {
+                       $form .= $this->msg( 'wlheader-showupdated' )->parse() . "\n";
+               }
+               $form .= "</p>";
+
+               if ( $wgShowUpdatedMarker ) {
+                       $form .= Xml::openElement( 'form', array( 'method' => 'post',
+                               'action' => $this->getPageTitle()->getLocalURL(),
+                               'id' => 'mw-watchlist-resetbutton' ) ) . "\n" .
+                       Xml::submitButton( $this->msg( 'enotif_reset' )->text(), array( 'name' => 'dummy' ) ) . "\n" .
+                       Html::hidden( 'reset', 'all' ) . "\n";
+                       foreach ( $nondefaults as $key => $value ) {
+                               $form .= Html::hidden( $key, $value ) . "\n";
+                       }
+                       $form .= Xml::closeElement( 'form' ) . "\n";
+               }
+
+               $form .= Xml::openElement( 'form', array(
+                       'method' => 'post',
+                       'action' => $this->getPageTitle()->getLocalURL(),
+                       'id' => 'mw-watchlist-form'
+               ) );
+               $form .= Xml::fieldset(
+                       $this->msg( 'watchlist-options' )->text(),
+                       false,
+                       array( 'id' => 'mw-watchlist-options' )
+               );
+
+               $form .= SpecialRecentChanges::makeLegend( $this->getContext() );
+
                # Namespace filter and put the whole form together.
                $form .= $wlInfo;
                $form .= $cutofflinks;
@@ -344,7 +392,7 @@ class SpecialWatchlist extends SpecialRecentChanges {
                $form .= "<hr />\n<p>";
                $form .= Html::namespaceSelector(
                        array(
-                               'selected' => $nameSpace,
+                               'selected' => $opts['namespace'],
                                'all' => '',
                                'label' => $this->msg( 'namespace' )->text()
                        ), array(
@@ -357,14 +405,14 @@ class SpecialWatchlist extends SpecialRecentChanges {
                        $this->msg( 'invert' )->text(),
                        'invert',
                        'nsinvert',
-                       $invert,
+                       $opts['invert'],
                        array( 'title' => $this->msg( 'tooltip-invert' )->text() )
                ) . '&#160;';
                $form .= Xml::checkLabel(
                        $this->msg( 'namespace_association' )->text(),
                        'associated',
-                       'associated',
-                       $associated,
+                       'nsassociated',
+                       $opts['associated'],
                        array( 'title' => $this->msg( 'tooltip-namespace_association' )->text() )
                ) . '&#160;';
                $form .= Xml::submitButton( $this->msg( 'allpagessubmit' )->text() ) . "</p>\n";
@@ -386,25 +434,22 @@ class SpecialWatchlist extends SpecialRecentChanges {
                /* End bottom header */
 
                /* Do link batch query */
-               $linkBatch = new LinkBatch;
-               foreach ( $res as $row ) {
-                       $userNameUnderscored = str_replace( ' ', '_', $row->rc_user_text );
-                       if ( $row->rc_user != 0 ) {
-                               $linkBatch->add( NS_USER, $userNameUnderscored );
-                       }
-                       $linkBatch->add( NS_USER_TALK, $userNameUnderscored );
-
-                       $linkBatch->add( $row->rc_namespace, $row->rc_title );
+               $batch = new LinkBatch;
+               foreach ( $rows as $row ) {
+                       $batch->add( NS_USER, $row->rc_user_text );
+                       $batch->add( NS_USER_TALK, $row->rc_user_text );
+                       $batch->add( $row->rc_namespace, $row->rc_title );
                }
-               $linkBatch->execute();
-               $dbr->dataSeek( $res, 0 );
+               $batch->execute();
+
+               $dbr->dataSeek( $rows, 0 );
 
                $list = ChangesList::newFromContext( $this->getContext() );
                $list->setWatchlistDivs();
 
                $s = $list->beginRecentChangesList();
                $counter = 1;
-               foreach ( $res as $obj ) {
+               foreach ( $rows as $obj ) {
                        # Make RC entry
                        $rc = RecentChange::newFromRow( $obj );
                        $rc->counter = $counter++;
@@ -499,9 +544,9 @@ class SpecialWatchlist extends SpecialRecentChanges {
         */
        protected function countItems( $dbr ) {
                # Fetch the raw count
-               $res = $dbr->select( 'watchlist', array( 'count' => 'COUNT(*)' ),
+               $rows = $dbr->select( 'watchlist', array( 'count' => 'COUNT(*)' ),
                        array( 'wl_user' => $this->getUser()->getId() ), __METHOD__ );
-               $row = $dbr->fetchObject( $res );
+               $row = $dbr->fetchObject( $rows );
                $count = $row->count;
 
                return floor( $count / 2 );
diff --git a/includes/utils/HashRing.php b/includes/utils/HashRing.php
deleted file mode 100644 (file)
index c152d41..0000000
+++ /dev/null
@@ -1,147 +0,0 @@
-<?php
-/**
- * Convenience class for weighted consistent hash rings.
- *
- * 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
- * @author Aaron Schulz
- */
-
-/**
- * Convenience class for weighted consistent hash rings
- *
- * @since 1.22
- */
-class HashRing {
-       /** @var Array (location => weight) */
-       protected $sourceMap = array();
-       /** @var Array (location => (start, end)) */
-       protected $ring = array();
-
-       const RING_SIZE = 268435456; // 2^28
-
-       /**
-        * @param array $map (location => weight)
-        */
-       public function __construct( array $map ) {
-               $map = array_filter( $map, function ( $w ) {
-                       return $w > 0;
-               } );
-               if ( !count( $map ) ) {
-                       throw new MWException( "Ring is empty or all weights are zero." );
-               }
-               $this->sourceMap = $map;
-               // Sort the locations based on the hash of their names
-               $hashes = array();
-               foreach ( $map as $location => $weight ) {
-                       $hashes[$location] = sha1( $location );
-               }
-               uksort( $map, function ( $a, $b ) use ( $hashes ) {
-                       return strcmp( $hashes[$a], $hashes[$b] );
-               } );
-               // Fit the map to weight-proportionate one with a space of size RING_SIZE
-               $sum = array_sum( $map );
-               $standardMap = array();
-               foreach ( $map as $location => $weight ) {
-                       $standardMap[$location] = (int)floor( $weight / $sum * self::RING_SIZE );
-               }
-               // Build a ring of RING_SIZE spots, with each location at a spot in location hash order
-               $index = 0;
-               foreach ( $standardMap as $location => $weight ) {
-                       // Location covers half-closed interval [$index,$index + $weight)
-                       $this->ring[$location] = array( $index, $index + $weight );
-                       $index += $weight;
-               }
-               // Make sure the last location covers what is left
-               end( $this->ring );
-               $this->ring[key( $this->ring )][1] = self::RING_SIZE;
-       }
-
-       /**
-        * Get the location of an item on the ring
-        *
-        * @param string $item
-        * @return string Location
-        */
-       public function getLocation( $item ) {
-               $locations = $this->getLocations( $item, 1 );
-
-               return $locations[0];
-       }
-
-       /**
-        * Get the location of an item on the ring, as well as the next clockwise locations
-        *
-        * @param string $item
-        * @param integer $limit Maximum number of locations to return
-        * @return array List of locations
-        */
-       public function getLocations( $item, $limit ) {
-               $locations = array();
-               $primaryLocation = null;
-               $spot = hexdec( substr( sha1( $item ), 0, 7 ) ); // first 28 bits
-               foreach ( $this->ring as $location => $range ) {
-                       if ( count( $locations ) >= $limit ) {
-                               break;
-                       }
-                       // The $primaryLocation is the location the item spot is in.
-                       // After that is reached, keep appending the next locations.
-                       if ( ( $range[0] <= $spot && $spot < $range[1] ) || $primaryLocation !== null ) {
-                               if ( $primaryLocation === null ) {
-                                       $primaryLocation = $location;
-                               }
-                               $locations[] = $location;
-                       }
-               }
-               // If more locations are requested, wrap-around and keep adding them
-               reset( $this->ring );
-               while ( count( $locations ) < $limit ) {
-                       list( $location, ) = each( $this->ring );
-                       if ( $location === $primaryLocation ) {
-                               break; // don't go in circles
-                       }
-                       $locations[] = $location;
-               }
-
-               return $locations;
-       }
-
-       /**
-        * Get the map of locations to weight (ignores 0-weight items)
-        *
-        * @return array
-        */
-       public function getLocationWeights() {
-               return $this->sourceMap;
-       }
-
-       /**
-        * Get a new hash ring with a location removed from the ring
-        *
-        * @param string $location
-        * @return HashRing|bool Returns false if no non-zero weighted spots are left
-        */
-       public function newWithoutLocation( $location ) {
-               $map = $this->sourceMap;
-               unset( $map[$location] );
-               if ( count( $map ) ) {
-                       return new self( $map );
-               }
-
-               return false;
-       }
-}
diff --git a/includes/utils/MappedIterator.php b/includes/utils/MappedIterator.php
deleted file mode 100644 (file)
index f2e6df6..0000000
+++ /dev/null
@@ -1,117 +0,0 @@
-<?php
-/**
- * Convenience class for generating iterators from iterators.
- *
- * 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
- * @author Aaron Schulz
- */
-
-/**
- * Convenience class for generating iterators from iterators.
- *
- * @since 1.21
- */
-class MappedIterator extends FilterIterator {
-       /** @var callable */
-       protected $vCallback;
-       /** @var callable */
-       protected $aCallback;
-       /** @var array */
-       protected $cache = array();
-
-       protected $rewound = false; // boolean; whether rewind() has been called
-
-       /**
-        * Build an new iterator from a base iterator by having the former wrap the
-        * later, returning the result of "value" callback for each current() invocation.
-        * The callback takes the result of current() on the base iterator as an argument.
-        * The keys of the base iterator are reused verbatim.
-        *
-        * An "accept" callback can also be provided which will be called for each value in
-        * the base iterator (post-callback) and will return true if that value should be
-        * included in iteration of the MappedIterator (otherwise it will be filtered out).
-        *
-        * @param Iterator|Array $iter
-        * @param callable $vCallback Value transformation callback
-        * @param array $options Options map (includes "accept") (since 1.22)
-        * @throws MWException
-        */
-       public function __construct( $iter, $vCallback, array $options = array() ) {
-               if ( is_array( $iter ) ) {
-                       $baseIterator = new ArrayIterator( $iter );
-               } elseif ( $iter instanceof Iterator ) {
-                       $baseIterator = $iter;
-               } else {
-                       throw new MWException( "Invalid base iterator provided." );
-               }
-               parent::__construct( $baseIterator );
-               $this->vCallback = $vCallback;
-               $this->aCallback = isset( $options['accept'] ) ? $options['accept'] : null;
-       }
-
-       public function next() {
-               $this->cache = array();
-               parent::next();
-       }
-
-       public function rewind() {
-               $this->rewound = true;
-               $this->cache = array();
-               parent::rewind();
-       }
-
-       public function accept() {
-               $value = call_user_func( $this->vCallback, $this->getInnerIterator()->current() );
-               $ok = ( $this->aCallback ) ? call_user_func( $this->aCallback, $value ) : true;
-               if ( $ok ) {
-                       $this->cache['current'] = $value;
-               }
-
-               return $ok;
-       }
-
-       public function key() {
-               $this->init();
-
-               return parent::key();
-       }
-
-       public function valid() {
-               $this->init();
-
-               return parent::valid();
-       }
-
-       public function current() {
-               $this->init();
-               if ( parent::valid() ) {
-                       return $this->cache['current'];
-               } else {
-                       return null; // out of range
-               }
-       }
-
-       /**
-        * Obviate the usual need for rewind() before using a FilterIterator in a manual loop
-        */
-       protected function init() {
-               if ( !$this->rewound ) {
-                       $this->rewind();
-               }
-       }
-}
index 47cef8b..e60293b 100644 (file)
@@ -243,6 +243,21 @@ class UIDGenerator {
         * @since 1.23
         */
        public static function newSequentialPerNodeIDs( $bucket, $bits, $count, $flags = 0 ) {
+               $gen = self::singleton();
+               return $gen->getSequentialPerNodeIDs( $bucket, $bits, $count, $flags );
+       }
+
+       /**
+        * Return IDs that are sequential *only* for this node and bucket
+        *
+        * @see UIDGenerator::newSequentialPerNodeID()
+        * @param string $bucket Arbitrary bucket name (should be ASCII)
+        * @param integer $bits Bit size (16 to 48) of resulting numbers before wrap-around
+        * @param integer $count Number of IDs to return (1 to 10000)
+        * @param integer $flags (supports UIDGenerator::QUICK_VOLATILE)
+        * @return array Ordered list of float integer values
+        */
+       protected function getSequentialPerNodeIDs( $bucket, $bits, $count, $flags ) {
                if ( $count <= 0 ) {
                        return array(); // nothing to do
                } elseif ( $count > 10000 ) {
@@ -274,7 +289,13 @@ class UIDGenerator {
                // Note: use of fmod() avoids "division by zero" on 32 bit machines
                if ( $counter === null ) {
                        $path = wfTempDir() . '/mw-' . __CLASS__ . '-' . rawurlencode( $bucket ) . '-48';
-                       $handle = fopen( $path, 'cb+' );
+                       // Get the UID lock file handle
+                       if ( isset( $this->fileHandles[$path] ) ) {
+                               $handle = $this->fileHandles[$path];
+                       } else {
+                               $handle = fopen( $path, 'cb+' );
+                               $this->fileHandles[$path] = $handle ?: null; // cache
+                       }
                        // Acquire the UID lock file
                        if ( $handle === false ) {
                                throw new MWException( "Could not open '{$path}'." );
@@ -292,8 +313,8 @@ class UIDGenerator {
                        fflush( $handle );
                        // Release the UID lock file
                        flock( $handle, LOCK_UN );
-                       fclose( $handle );
                }
+
                $ids = array();
                $divisor = pow( 2, $bits );
                $currentId = floor( $counter - $count ); // pre-increment counter value
index 0fed4c4..5c37bb8 100644 (file)
@@ -1334,7 +1334,6 @@ Details kan in die [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} s
 'rows' => 'Rye',
 'columns' => 'Kolomme',
 'searchresultshead' => 'Soekresultate',
-'resultsperpage' => 'Aantal resultate om te wys',
 'stub-threshold' => 'Drempel vir merk as <a href="#" class="stub">saadjie</a> (grepe):',
 'stub-threshold-disabled' => 'Afgeskakel',
 'recentchangesdays' => 'Aantal dae wat in onlangse wysigings vertoon word:',
@@ -3159,7 +3158,7 @@ $1',
 'minutes' => '{{PLURAL:$1|$1 minuut|$1 minute}}',
 'hours' => '{{PLURAL:$1|$1 uur|$1 ure}}',
 'days' => '{{PLURAL:$1|$1 dag|$1 dae}}',
-'weeks' => '{{PLURAL: $1|één week|$1 weke}}',
+'weeks' => '{{PLURAL:$1|één week|$1 weke}}',
 'months' => '{{PLURAL:$1|een maand|$1 maande}}',
 'years' => '{{PLURAL:$1|een jaar|$1 jaar}}',
 'ago' => '$1 gelede',
index 25de6fa..f6fdbc9 100644 (file)
@@ -867,7 +867,6 @@ $1ን ወይም ማንም ሌላ [[{{MediaWiki:Grouppage-sysop}}|መጋቢ]] ስ
 'rows' => 'በማዘጋጀቱ ሰንጠረዥ ስንት ተርታዎች?',
 'columns' => 'ስንት ዓምዶችስ?',
 'searchresultshead' => 'ፍለጋ',
-'resultsperpage' => 'ስንት ውጤቶች በየገጹ?',
 'recentchangesdays' => 'በቅርቡ ለውጦች ዝርዝር ስንት ቀን ይታይ?',
 'recentchangesdays-max' => '(እስከ $1 {{PLURAL:$1|ቀን|ቀን}} ድረስ)',
 'recentchangescount' => 'በዝርዝርዎ ላይ ስንት ለውጥ ይታይ? (እስከ 500)',
index 88a2987..7f38fec 100644 (file)
@@ -1088,7 +1088,6 @@ Asegure-se que iste cambio no trencará a continidat de l'historial d'a pachina.
 'rows' => 'Ringleras:',
 'columns' => 'Columnas:',
 'searchresultshead' => 'Mirar',
-'resultsperpage' => "Resultaus que s'amostrarán por pachina:",
 'stub-threshold' => 'Branquil superior ta o formateyo de <a href="#" class="stub">vinclos ta borradors</a> (en bytes):',
 'stub-threshold-disabled' => 'Desactivato',
 'recentchangesdays' => "Días que s'amostrarán en ''zaguers cambeos'':",
index b1a1b1f..b25a417 100644 (file)
@@ -628,7 +628,6 @@ folclicum āgnunge oþþe gelīcum frēom horde (sēo $1 for āscungum).
 'rows' => 'Rǣwa:',
 'columns' => 'Sȳla:',
 'searchresultshead' => 'Sōcn',
-'resultsperpage' => 'Tōhrīgunga tō īewenne for ǣlcum tramete:',
 'recentchangescount' => 'Hū mæniga adihtunga to īwenne gewunelīce:',
 'savedprefs' => 'Þīna fōreberunga wurdon gehordod.',
 'timezonelegend' => 'Tīdgeard',
index 8a802af..28c0539 100644 (file)
@@ -33,6 +33,7 @@
  * @author Hakeem
  * @author Histolo2
  * @author Houcinee1
+ * @author Ibrahim.ID
  * @author Jak
  * @author Khaledhosny
  * @author Lord Anubis
@@ -62,6 +63,7 @@
  * @author Zack wadghiri
  * @author Zanatos
  * @author أحمد
+ * @author الهميان
  * @author ترجمان05
  * @author خالد حسني
  * @author روخو
@@ -1640,7 +1642,6 @@ $1",
 'rows' => 'صفوف:',
 'columns' => 'أعمدة:',
 'searchresultshead' => 'بحث',
-'resultsperpage' => 'عدد النتائج في الصفحة:',
 'stub-threshold' => 'الحد لتنسيق <a href="#" class="stub">وصلة البذرة</a>:',
 'stub-threshold-disabled' => 'معطل',
 'recentchangesdays' => 'عدد الأيام المعروضة في أحدث التغييرات:',
index 7a64eda..9c1ad4f 100644 (file)
@@ -732,7 +732,6 @@ $1',
 'rows' => 'ܨ̈ܦܐ',
 'columns' => 'ܥܡܘܕ̈ܐ:',
 'searchresultshead' => 'ܒܨܝ',
-'resultsperpage' => 'ܡܢܝܢܐ ܕܦܠܛ̈ܐ ܒܦܐܬܐ:',
 'recentchangesdays' => 'ܝܘܡܬ̈ܐ ܠܚܙܝܐ ܒܫܘܚܠܦ̈ܐ ܚܕ̈ܬܐ:',
 'recentchangescount' => 'ܡܢܝܢܐ ܕܫܘܚܠܦ̈ܐ ܠܚܙܝܐ ܪܫܐܝܬ:',
 'savedprefs' => 'ܨܒܝܢܝܘܬ̈ܟ ܐܬܠܒܟܘ.',
index d0361f4..276c785 100644 (file)
@@ -954,7 +954,6 @@ Laḫed ana imken ikono l-indexaṫ dial {{SITENAME}} qdam o ma bqaoċ ṣalḫi
 'rows' => 'sofof:',
 'columns' => 'aaamida:',
 'searchresultshead' => 'Qelleb',
-'resultsperpage' => 'adad nataij  f sfha',
 'stub-threshold' => 'l-ḫadd l-aqṣa ṫaĝ <a href="#" class="stub">wṣlaṫ l-bidraṫ</a> (ḅayṫaṫ):',
 'stub-threshold-disabled' => 'makhdamch',
 'recentchangesdays' => 'n-nharaṫ lli twrri f-ṫġyiraṫ j-jdida:',
index e65767f..d281486 100644 (file)
@@ -1283,7 +1283,6 @@ $1",
 'rows' => 'صفوف:',
 'columns' => 'عمدان:',
 'searchresultshead' => 'تدوير',
-'resultsperpage' => 'عدد النتايج فى الصفحة:',
 'stub-threshold' => 'الحد لتنسيق <a href="#" class="stub">لينك البذرة</a>:',
 'stub-threshold-disabled' => 'معطل',
 'recentchangesdays' => 'عدد الأيام المعروضة فى اخرالتغييرات:',
index 25f871a..371cb98 100644 (file)
@@ -449,7 +449,7 @@ $1',
 'versionrequired' => 'মিডিয়াৱিকিৰ $1 সংকলন থাকিব লাগিব ।',
 'versionrequiredtext' => 'এই পৃষ্ঠাটো ব্যৱহাৰ কৰিবলৈ মিডিয়াৱিকিৰ $1 সংস্কৰণ থাকিব লাগিব । [[Special:Version|সংস্কৰণ পৃষ্ঠা]] চাওক।',
 
-'ok' => 'ঠিà¦\95 à¦\86à¦\9bà§\87',
+'ok' => 'শà§\81দà§\8dধ',
 'retrievedfrom' => '"$1"ৰ পৰা সংকলিত',
 'youhavenewmessages' => 'আপোনাৰ কাৰণে $1 আছে। ($2)',
 'youhavenewmessagesfromusers' => '{{PLURAL:$3|আন এজন সদস্য|$3 জন সদস্য}}ৰ পৰা আপোনালৈ $1 আহিছে ($2)।',
@@ -1331,7 +1331,6 @@ $1",
 'rows' => 'পথালী শাৰী:',
 'columns' => 'ঠিয় শাৰী:',
 'searchresultshead' => 'অনুসন্ধান',
-'resultsperpage' => 'প্ৰতি পৃষ্ঠা দৰ্শন:',
 'stub-threshold' => '<a href="#" class="stub">আধাৰ সংযোগ</a> ৰ সৰ্বোচ্চ আকাৰ (বাইটত):',
 'stub-threshold-disabled' => 'নিষ্ক্ৰিয়',
 'recentchangesdays' => 'শেহতীয়া সাল-সলনিত দেখুৱাব লগা দিন:',
@@ -3690,14 +3689,14 @@ $5
 'recreate' => 'পুনৰ সৃষ্টি কৰক',
 
 # action=purge
-'confirm_purge_button' => 'ঠিà¦\95 à¦\86à¦\9bà§\87',
+'confirm_purge_button' => 'শà§\81দà§\8dধ',
 'confirm-purge-top' => 'এই পৃষ্ঠাৰ কেচ্‌ খালী কৰা হওক ?',
 'confirm-purge-bottom' => "এখন পৃষ্ঠাক শোধিত কৰিলে কেচ্‌ আতৰি যায় আৰু সকলোতকৈ শেহতীয়া সংশোধন প্ৰদৰ্শিত হ'বলৈ বাধ্য কৰে।",
 
 # action=watch/unwatch
-'confirm-watch-button' => 'ঠিà¦\95 à¦\86à¦\9bà§\87',
+'confirm-watch-button' => 'শà§\81দà§\8dধ',
 'confirm-watch-top' => 'এই পৃষ্ঠাখন আপোনাৰ লক্ষ্য-তালিকাত যোগ কৰক',
-'confirm-unwatch-button' => 'ঠিà¦\95 à¦\86à¦\9bà§\87',
+'confirm-unwatch-button' => 'শà§\81দà§\8dধ',
 'confirm-unwatch-top' => 'এই পৃষ্ঠাখন আপোনাৰ লক্ষ্য-তালিকাৰ পৰা আঁতৰাওক',
 
 # Multipage image navigation
index d9c9aee..e72b676 100644 (file)
@@ -918,6 +918,8 @@ Esta yá esiste.',
 'content-not-allowed-here' => 'El conteníu «$1» nun se permite na páxina [[$2]]',
 'editwarning-warning' => 'Salir d\'esta páxina pue causar la perda de cualesquier cambiu fechu.
 Si aniciasti sesión, pue desactivase esti avisu na seición "Edición" de les tos preferencies.',
+'editpage-notsupportedcontentformat-title' => 'El formatu del conteníu nun tien sofitu',
+'editpage-notsupportedcontentformat-text' => 'El formatu del conteníu, $1, nun tien sofitu del modelu de conteníu $2.',
 
 # Content models
 'content-model-wikitext' => 'testu wiki',
@@ -960,6 +962,9 @@ Por favor comprueba la comparanza d'abaxo pa confirmar que ye eso lo que quies f
 'cantcreateaccount-text' => "La creación de cuentes dende esta direición IP ('''$1''') foi bloquiada por [[User:$3|$3]].
 
 El motivu dau por $3 ye ''$2''",
+'cantcreateaccount-range-text' => "La creación de cuentes dende direiciones IP del rangu '''$1''', qu'incluye la so direición IP ('''$4'''), ta bloquiada pol usuariu [[User:$3|$3]].
+
+La razón dada por $3 ye ''$2''.",
 
 # History pages
 'viewpagelogs' => "Ver los rexistros d'esta páxina",
@@ -1219,7 +1224,6 @@ Se puen alcontrar más detalles nel [{{fullurl:{{#Special:Log}}/delete|page={{FU
 'rows' => 'Fileres:',
 'columns' => 'Columnes:',
 'searchresultshead' => 'Buscar',
-'resultsperpage' => 'Resultaos por páxina:',
 'stub-threshold' => 'Llímite superior pa considerar como <a href="#" class="stub">enllaz a entamu</a> (bytes):',
 'stub-threshold-disabled' => 'Desactivao',
 'recentchangesdays' => "Díes que s'amuesen nos cambios recientes:",
@@ -1488,13 +1492,14 @@ Esta información sedrá pública.',
 'recentchanges-label-bot' => 'Esta edición ta fecha por un bot',
 'recentchanges-label-unpatrolled' => 'Esta edición ta ensin patrullar entá',
 'recentchanges-label-plusminus' => "El tamañu d'esta páxina cambió nesti númberu de bytes",
+'recentchanges-legend-heading' => "'''Lleenda:'''",
 'recentchanges-legend-newpage' => '(ver tamién la  [[Special:NewPages|llista de páxines nueves]])',
 'recentchanges-legend-plusminus' => "(''±123'')",
 'rcnotefrom' => "Abaxo tan los cambeos dende '''$2''' (s'amuesen fasta '''$1''').",
 'rclistfrom' => 'Amosar los nuevos cambios dende $1',
 'rcshowhideminor' => '$1 ediciones menores',
 'rcshowhidebots' => '$1 bots',
-'rcshowhideliu' => '$1 usuarios rexistraos',
+'rcshowhideliu' => '$1 los usuarios rexistraos',
 'rcshowhideanons' => '$1 usuarios anónimos',
 'rcshowhidepatr' => '$1 ediciones supervisaes',
 'rcshowhidemine' => '$1 les mios ediciones',
@@ -1616,6 +1621,7 @@ Si tovía asina quies xubir el ficheru, por favor vuelvi atrás y usa otru nome.
 'file-exists-duplicate' => 'Esti ficheru ye un duplicáu {{PLURAL:$1|del siguiente ficheru|de los siguientes ficheros}}:',
 'file-deleted-duplicate' => 'Yá se desanició enantes un ficheru idénticu a esti ([[:$1]]).
 Deberíes revisar el historial de desaniciu del ficheru enantes de xubilu otra vuelta.',
+'file-deleted-duplicate-notitle' => "Un ficheru idénticu a esti desanicióse anteriormente, y suprimióse'l títulu. Tendría de pidir a dalguién que pueda ver los datos del ficheru desaniciáu que revise la situación enantes de volver a xubilu.",
 'uploadwarning' => 'Avisu de xubíes de ficheros',
 'uploadwarning-text' => 'Por favor, camuda más abaxo la descripción del ficheru y vuelve a tentalo.',
 'savefile' => 'Guardar ficheru',
@@ -2000,6 +2006,7 @@ Les entraes <del>tachaes</del> tan resueltes.',
 'protectedpages' => 'Páxines protexíes',
 'protectedpages-indef' => 'Namái les proteiciones permanentes',
 'protectedpages-cascade' => 'Namái proteiciones en cascada',
+'protectedpages-noredirect' => 'Anubrir redireiciones',
 'protectedpagesempty' => 'Nun hai páxines protexíes anguaño con estos parámetros.',
 'protectedtitles' => 'Títulos protexíos',
 'protectedtitlesempty' => 'Nun hai títulos protexíos anguaño con estos parámetros.',
@@ -2276,6 +2283,7 @@ Restrinxóse l'esborráu d'estes páxines pa evitar perturbaciones accidentales
 'delete-warning-toobig' => "Esta páxina tien un historial d'ediciones grande, más de $1 {{PLURAL:$1|revisión|revisiones}}.
 Esborralu pue perturbar les operaciones de la base de datos de {{SITENAME}};
 obra con precaución.",
+'deleting-backlinks-warning' => "'''Avisu:''' Otres páxines enllacen a la páxina que ta a piques de desaniciar.",
 
 # Rollback
 'rollback' => 'Revertir ediciones',
@@ -2512,6 +2520,7 @@ Esto debería facese sólo pa prevenir vandalismu como indiquen les [[{{MediaWik
 Mira na [[Special:BlockList|llista de bloqueos]] pa revisar los bloqueos.',
 'ipb-blockingself' => '¡Tas a piques de bloquiate tú mesmu! ¿Tas seguru de que quies facer eso?',
 'ipb-confirmhideuser' => 'Tas a piques de bloquiar un usuariu con "anubrir usuariu" activao. Esto desaniciará el nome del usuariu de tolos llistaos y entraes de los rexistros. ¿De xuro quies facer eso?',
+'ipb-confirmaction' => "Si ta seguru de que quier facelo, por favor, marque'l campu «{{int:ipb-confirm}}» al final.",
 'ipb-edit-dropdown' => 'Editar motivos de bloquéu',
 'ipb-unblock-addr' => 'Desbloquiar $1',
 'ipb-unblock' => "Desbloquiar un nome d'usuariu o direición IP",
@@ -3075,7 +3084,7 @@ Al executalu pues comprometer el to sistema.",
 'minutes' => '{{PLURAL:$1|$1 minutu|$1 minutos}}',
 'hours' => '{{PLURAL:$1|$1 hora|$1 hores}}',
 'days' => '{{PLURAL:$1|$1 día|$1 díes}}',
-'weeks' => '{{PLURAL: $1|$1 selmana|$1 selmanes}}',
+'weeks' => '{{PLURAL:$1|$1 selmana|$1 selmanes}}',
 'months' => '{{PLURAL:$1|$1 mes|$1 meses}}',
 'years' => '{{PLURAL:$1|$1 añu|$1 años}}',
 'ago' => 'hai $1',
@@ -3623,7 +3632,7 @@ Por favor confirma que daveres quies volver a crear esta páxina.",
 
 # Language selector for translatable SVGs
 'img-lang-default' => '(llingua predeterminada)',
-'img-lang-info' => 'Representar esta imaxe en $1 $2.',
+'img-lang-info' => 'Representar esta imaxe en $1. $2',
 'img-lang-go' => 'Dir',
 
 # Table pager
@@ -3706,7 +3715,17 @@ Tamién pues [[Special:EditWatchlist|usar l'editor estándar]].",
 'version-hook-name' => 'Nome del hook',
 'version-hook-subscribedby' => 'Suscritu por',
 'version-version' => '(Versión $1)',
-'version-license' => 'Llicencia',
+'version-license' => 'Llicencia de MediaWiki',
+'version-ext-license' => 'Llicencia',
+'version-ext-colheader-name' => 'Estensión',
+'version-ext-colheader-version' => 'Versión',
+'version-ext-colheader-license' => 'Llicencia',
+'version-ext-colheader-description' => 'Descripción',
+'version-ext-colheader-credits' => 'Autores',
+'version-license-title' => 'Llicencia pa $1',
+'version-license-not-found' => "Nun s'alcontró información detallada de llicencia pa esta estensión.",
+'version-credits-title' => 'Créditos de $1',
+'version-credits-not-found' => "Nun s'alcontró información detallada de créditos pa esta estensión.",
 'version-poweredby-credits' => "Esta wiki funciona con '''[https://www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
 'version-poweredby-others' => 'otros',
 'version-poweredby-translators' => 'los traductores de translatewiki.net',
@@ -3724,13 +3743,14 @@ Tendría d'haber recibío [{{SERVER}}{{SCRIPTPATH}}/COPYING una copia de la Llic
 'version-entrypoints-header-url' => 'URL',
 
 # Special:Redirect
-'redirect' => "Redireición por nome de ficheru, o ID d'usuariu o de revisión",
+'redirect' => 'Redireición por ficheru, usuariu, páxina o ID de revisión',
 'redirect-legend' => 'Redirixir a un ficheru o una páxina',
-'redirect-summary' => "Esta páxina especial redirixe a un ficheru (dando'l so nome), una páxina (dando una ID de revisión) o una páxina d'usuariu (dando un númberu d'ID d'usuariu). Usu: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/revision/328429]], o [[{{#Special:Redirect}}/user/101]].",
+'redirect-summary' => "Esta páxina especial redirixe a un ficheru (dando'l so nome), una páxina (dando una ID de revisión o de páxina) o una páxina d'usuariu (dando un númberu d'ID d'usuariu). Usu: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]],  [[{{#Special:Redirect}}/revision/328429]], o [[{{#Special:Redirect}}/user/101]].",
 'redirect-submit' => 'Dir',
 'redirect-lookup' => 'Buscar:',
 'redirect-value' => 'Valor:',
 'redirect-user' => "ID d'usuariu:",
+'redirect-page' => 'ID de la páxina',
 'redirect-revision' => 'Revisión de páxina',
 'redirect-file' => 'Nome del ficheru',
 'redirect-not-exists' => "Nun s'alcontró'l valor",
@@ -3924,6 +3944,7 @@ D\'otra miente, pues usar el formulariu cenciellu d\'abaxo. El to comentariu apa
 'api-error-overwrite' => 'Nun ta permitío sobroscribir un ficheru esistente.',
 'api-error-stashfailed' => 'Fallu internu: el sirvidor nun pudo guardar el ficheru temporal.',
 'api-error-publishfailed' => 'Fallu internu: el sirvidor nun pudo espublizar el ficheru temporal.',
+'api-error-stasherror' => 'Hebo un error al xubir el ficheru al almacén.',
 'api-error-timeout' => 'El sirvidor nun respondió nel tiempu esperáu.',
 'api-error-unclassified' => 'Hebo un fallu desconocíu',
 'api-error-unknown-code' => 'Fallu desconocíu: «$1»',
@@ -3973,10 +3994,12 @@ En realidá cuasi tolo qu'apaeza ente llaves dobles.",
 'expand_templates_input' => "Testu d'entrada:",
 'expand_templates_output' => 'Resultáu',
 'expand_templates_xml_output' => 'Salida XML',
+'expand_templates_html_output' => 'Salida HTML en bruto',
 'expand_templates_ok' => 'Aceutar',
 'expand_templates_remove_comments' => 'Eliminar comentarios',
 'expand_templates_remove_nowiki' => 'Quitar les etiquetes <nowiki> nos resultaos',
 'expand_templates_generate_xml' => "Amosar l'árbole d'análisis sintáuticu XML",
+'expand_templates_generate_rawhtml' => 'Ver el HTML en bruto',
 'expand_templates_preview' => 'Vista previa',
 
 );
index e9d86b4..e91b274 100644 (file)
@@ -855,7 +855,6 @@ Ta ropasusu warzafu bu yo va [[Special:Search|aneyara ko wiki]] yawal.',
 'rows' => 'Emacekeem',
 'columns' => 'Brizeem',
 'searchresultshead' => 'Nedira va aneyaratrasikseem',
-'resultsperpage' => 'Fuxebuon trasiksota',
 'recentchangesdays' => 'Gonedin viel se koe noeltaf betakseem :',
 'recentchangesdays-max' => '(cugon $1 {{PLURAL:$1|viel|viel}})',
 'recentchangescount' => 'Omavon gonedina ota va noeltaf betakseem ik buizvot ik "log" :',
index ca81e4a..e822d2e 100644 (file)
@@ -1041,7 +1041,6 @@ $1",
 'rows' => 'Sıralar:',
 'columns' => 'Sütunlar:',
 'searchresultshead' => 'Axtar',
-'resultsperpage' => 'Səhifəyə aid tapılmış nəticələr:',
 'stub-threshold' => '<a href="#" class="stub">Keçidsiz linki</a> format etmək üçün hüdud (baytlarla):',
 'stub-threshold-disabled' => 'Kənarlaşdırılıb',
 'recentchangesdays' => 'Son dəyişiklərdə göstərilən günlərin miqdarı:',
index b0fb52a..194e1ab 100644 (file)
@@ -1178,7 +1178,6 @@ $1",
 'rows' => 'سطرلر:',
 'columns' => 'سوتونلار',
 'searchresultshead' => 'آختار',
-'resultsperpage' => 'صحیفه‌‌يه عاید تاپیلمیش نتیجه‌لر:',
 'stub-threshold' => '<a href="#" class="stub">کئچیدسیز لینکی</a> فورمات ائتمک اوچون حدود (بایت‌لارلا):',
 'stub-threshold-disabled' => 'چالیشمایان',
 'recentchangesdays' => 'سون دییشیک‌لرده گؤستریلن گون‌لرین میقداری:',
index 48863b8..36ca388 100644 (file)
@@ -1271,7 +1271,6 @@ $1",
 'rows' => 'Юлдар:',
 'columns' => 'Бағаналар:',
 'searchresultshead' => 'Эҙләү',
-'resultsperpage' => 'Биттә табылған яҙыуҙар',
 'stub-threshold' => '<a href="#" class="stub">Материалдарға һылтанмалар </a> форматлау сиге (байттарҙа)',
 'stub-threshold-disabled' => 'Һүндерелгән',
 'recentchangesdays' => 'Күҙәтеү исемлегендә күренгән көндәр һаны:',
index 44c963a..5869bce 100644 (file)
@@ -713,7 +713,6 @@ Details stehen im [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}}
 'rows' => 'Zeiln:',
 'columns' => 'Spoiten',
 'searchresultshead' => 'Suachen',
-'resultsperpage' => 'Dreffer pró Seiten:',
 'savedprefs' => 'Deine Eihstellungen san gspeicherd worn.',
 'timezonelegend' => 'Zaidzone:',
 'localtime' => 'Ortszaid:',
@@ -1222,7 +1221,7 @@ Da aktuöje Text voh da gléschden Seiten is netter fyr Administraatorn zuagäng
 'undeletebtn' => 'Wiederherstön',
 'undeletelink' => 'oschaugn / wiadaheastejn',
 'undeleteviewlink' => 'oschaugn',
-'undeletedfiles' => '$1 {{plural:$1|Datei|Dateien}} san wieda hergstellt worn',
+'undeletedfiles' => '$1 {{PLURAL:$1|Datei|Dateien}} san wieda hergstellt worn',
 'undelete-search-box' => 'Suach noch gléschde Seiten',
 'undelete-search-submit' => 'Suach',
 'undelete-show-file-submit' => 'Jo',
index 3509ce2..cae3c65 100644 (file)
@@ -987,7 +987,6 @@ $1",
 'rows' => 'ردیفآن«',
 'columns' => 'ستون‌ان:',
 'searchresultshead' => 'گردگ',
-'resultsperpage' => 'کلیک ته هر صفحه:',
 'stub-threshold' => 'سرحد په  <a href="#" class="stub">چنڈ لینک</a> فرمت (بایت):',
 'recentchangesdays' => 'روچ ان به پیش دارگ ته نوکیت تغییرات:',
 'recentchangesdays-max' => '(حداکثر $1 {{PLURAL:$1|روچ|روچ}})',
index db45b4d..5dc7d8d 100644 (file)
@@ -932,6 +932,8 @@ Igwa na kaini.',
 'invalid-content-data' => 'Imbalidong datos nin laman',
 'content-not-allowed-here' => '"$1" na laman dae pinagtutugutan sa pahina [[$2]]',
 'editwarning-warning' => 'Sa pagbaya kaining pahina magkakausa saimo na mawara an anuman na mga kaliwatan na saimong ginibo. Kun ika maglaog, mapuwede mong untukon ining patanid sa "Pagliliwat" na seksyon kan saimong mga kamuyahan.',
+'editpage-notsupportedcontentformat-title' => 'Kalamnan nin pormat bakong suportado',
+'editpage-notsupportedcontentformat-text' => 'An pormat nin kalamnan na $1 bakong suportado kan modelong kalamnan na $2.',
 
 # Content models
 'content-model-wikitext' => 'wiki-teksto',
@@ -1235,7 +1237,6 @@ An mga detalye mapuwedeng matatagboan sa [{{fullurl:{{#Special:Log}}/delete|page
 'rows' => 'Mga hilera:',
 'columns' => 'Mga taytay:',
 'searchresultshead' => 'Hanápon',
-'resultsperpage' => 'Mga tamà kada pahina:',
 'stub-threshold' => 'Kasagkoran kan <a href="#" class="stub">takod kan tambô</a> pigpopormato:',
 'stub-threshold-disabled' => 'Pinagpundo',
 'recentchangesdays' => 'Mga aldáw na ipapahilíng sa mga nakakaági pa sanáng pagbabàgó:',
index 2409488..fc79d1c 100644 (file)
@@ -1099,7 +1099,6 @@ $1",
 'rows' => 'Радкі:',
 'columns' => 'Калонкі:',
 'searchresultshead' => 'Пошук',
-'resultsperpage' => 'Вынікаў на старонку:',
 'stub-threshold' => 'Парог для паказу спасылкі <a href="#" class="stub">як на пачатковы артыкул</a> (у байтах):',
 'stub-threshold-disabled' => 'Не ўключана',
 'recentchangesdays' => 'За колькі дзён паказваць {{lc:{{:{{ns:mediawiki}}:recentchanges/be}}}}:',
@@ -1955,7 +1954,7 @@ $1',
 'watchmethod-list' => 'правяраем наяўнасць нядаўніх правак ў назіраных старонках',
 'watchlistcontains' => 'У вашым спісе назірання $1 {{PLURAL:$1|старонка|старонкі|старонак}}.',
 'iteminvalidname' => "Праблема са складнікам '$1', недапушчальная назва...",
-'wlnote' => "Ніжэй {{PLURAL:$1|паказана апошняе $1 змена|паказаны апошнія $1 змены|паказаны апошнія $1 змен}} за {{PLURAL:$2|апошнюю|апошнія|апошнія}} '''$2''' {{plural:$2|гадзіну|гадзіны|гадзіны}}, на момант часу $3 $4.",
+'wlnote' => "Ніжэй {{PLURAL:$1|паказана апошняе $1 змена|паказаны апошнія $1 змены|паказаны апошнія $1 змен}} за {{PLURAL:$2|апошнюю|апошнія|апошнія}} '''$2''' {{PLURAL:$2|гадзіну|гадзіны|гадзіны}}, на момант часу $3 $4.",
 'wlshowlast' => 'Паказваць апошнія $1 гадз. $2 дзён $3',
 'watchlist-options' => 'Магчымасці назірання',
 
index 55266ee..5b82ae7 100644 (file)
@@ -631,8 +631,8 @@ $1',
 'no-null-revision' => 'Немагчыма стварыць нулявую вэрсію для старонкі «$1»',
 'badtitle' => 'Няслушная назва',
 'badtitletext' => 'Запытаная назва старонкі няслушная ці пустая, альбо няслушна ўказаная міжмоўная ці інтэрвікі-назва. Яна можа ўтрымліваць сымбалі, якія нельга ўжываць у назвах.',
-'perfcached' => 'Наступныя зьвесткі кэшаваныя і могуць быць састарэлымі. У кэшы {{PLURAL:$1|1=даступны|даступныя}} ня больш за $1 {{PLURAL:$1|вынік|вынікі|вынікаў}}.',
-'perfcachedts' => 'Наступныя зьвесткі кэшаваныя і апошні раз былі абноўленыя $1. У кэшы {{PLURAL:$4|1=даступны|даступныя}} ня больш за $4 {{PLURAL:$4|вынік|вынікі|вынікаў}}.',
+'perfcached' => 'Наступныя зьвесткі кэшаваныя і могуць быць састарэлымі. У кэшы {{PLURAL:$1|даступны|даступныя|даступныя}} ня больш за $1 {{PLURAL:$1|вынік|вынікаў|вынікі}}.',
+'perfcachedts' => 'Наступныя зьвесткі кэшаваныя і апошні раз былі абноўленыя $1. У кэшы {{PLURAL:$4|даступны|даступныя|даступныя}} ня больш за $4 {{PLURAL:$4|вынік|вынікаў|вынікі}}.',
 'querypage-no-updates' => 'Абнаўленьні гэтай старонкі цяпер адключаныя. Зьвесткі ня будуць абнаўляцца.',
 'viewsource' => 'Паказаць крыніцу',
 'viewsource-title' => 'Прагляд крыніцы для $1',
@@ -1393,7 +1393,6 @@ $1",
 'rows' => 'Радкоў:',
 'columns' => 'Слупкоў:',
 'searchresultshead' => 'Пошук',
-'resultsperpage' => 'Колькасьць вынікаў на старонцы:',
 'stub-threshold' => 'Максымальны памер старонкі для паказу спасылак <a href="#" class="stub">як на накід</a> (у байтах):',
 'stub-threshold-disabled' => 'Выключаны',
 'recentchangesdays' => 'Колькасьць дзён для паказу ў апошніх зьменах:',
@@ -2431,6 +2430,7 @@ $UNWATCHURL
 Выдаленьне такіх старонак было забароненае, каб пазьбегнуць праблемаў у працы {{GRAMMAR:родны|{{SITENAME}}}}.',
 'delete-warning-toobig' => 'Гэтая старонка мае доўгую гісторыю рэдагаваньняў, больш за $1 {{PLURAL:$1|вэрсію|вэрсіі|вэрсіяў}}.
 Яе выдаленьне можа выклікаць праблемы ў працы базы зьвестак {{GRAMMAR:родны|{{SITENAME}}}}; будзьце асьцярожны.',
+'deleting-backlinks-warning' => "'''Увага:''' іншыя старонкі спасылаюцца на старонку, якую вы зьбіраецеся выдаліць.",
 
 # Rollback
 'rollback' => 'Адкаціць рэдагаваньні',
index 7b7b6cb..0799f63 100644 (file)
@@ -1334,7 +1334,6 @@ $1",
 'rows' => 'Редове:',
 'columns' => 'Колони:',
 'searchresultshead' => 'Търсене',
-'resultsperpage' => 'Резултати на страница:',
 'stub-threshold' => 'Праг за форматиране на <a href="#" class="stub">препратки към мъничета</a>:',
 'stub-threshold-disabled' => 'Изключено',
 'recentchangesdays' => 'Брой дни в последни промени:',
index 40f8875..4d49bd7 100644 (file)
@@ -1181,7 +1181,6 @@ Catatan nang dihaharnya matan isi {{SITENAME}} kawa-ai sudah kadaluarsa.',
 'rows' => 'Baris:',
 'columns' => 'Kolom:',
 'searchresultshead' => 'Gagai',
-'resultsperpage' => 'Hantukan par tungkaran:',
 'stub-threshold' => 'Ambang watas gasan pormat <a href="#" class="stub">taautan rintisan</a>:',
 'stub-threshold-disabled' => 'Kada kawa-akan',
 'recentchangesdays' => 'Jumlah hari nang manampaiakan paubahan pahanyarnya:',
index dfb2c3b..2fee72c 100644 (file)
@@ -1137,7 +1137,7 @@ $1",
 'searchprofile-everything-tooltip' => 'সকল বিষয়বস্তু অনুসন্ধান করো (আলাপের পাতা সহ)',
 'searchprofile-advanced-tooltip' => 'স্বনির্ধারিত নামস্থানে অনুসন্ধান করো',
 'search-result-size' => '$1 ({{PLURAL:$2|১টি শব্দ|$2টি শব্দ}})',
-'search-result-category-size' => '{{PLURAL: $1 | 1 সদস্য | $1 সদস্যবৃন্দ}} ({{PLURAL: $2 | 1 উপবিষয়শ্রেণীটি | $2 টি}}, {{PLURAL: $3 | 1 ফাইল | $3 ফাইল}})',
+'search-result-category-size' => '{{PLURAL:$1 | 1 সদস্য | $1 সদস্যবৃন্দ}} ({{PLURAL:$2 | 1 উপবিষয়শ্রেণীটি | $2 টি}}, {{PLURAL:$3 | 1 ফাইল | $3 ফাইল}})',
 'search-result-score' => 'মিলেছে: $1%',
 'search-redirect' => '(পুনর্নিদেশনা $1)',
 'search-section' => '(অনুচ্ছেদ $1)',
@@ -1195,7 +1195,6 @@ $1",
 'rows' => 'সারি:',
 'columns' => 'কলাম:',
 'searchresultshead' => 'অনুসন্ধান',
-'resultsperpage' => 'প্রতি পাতায় হিট:',
 'stub-threshold' => '<a href="#" class="stub">অসম্পূর্ণ নিবন্ধের সংযোগগুলির</a> বিশেষ ফরম্যাটিঙের সীমা (বাইটে):',
 'stub-threshold-disabled' => 'নিস্ক্রিয়',
 'recentchangesdays' => 'সাম্প্রতিক পরিবর্তনে দিনসমূহ দেখানোর জন্য:',
@@ -1945,7 +1944,7 @@ Maybe you want to edit the description on its [$2 file description page] there.'
 'mostinterwikis' => 'সবচেয়ে বেশী ইন্টারউইকি লিংক-সমৃদ্ধ নিবন্ধসমূহ',
 'mostrevisions' => 'সবচেয়ে বেশী বার সম্পাদিত নিবন্ধসমূহ',
 'prefixindex' => 'উপসর্গ সহ সমস্ত পাতা',
-'prefixindex-namespace' => 'পà§\8dরিফিà¦\95à§\8dস à¦¸à¦®à§\8dপবলিত সকল পাতা ($1 নামস্থান)',
+'prefixindex-namespace' => 'à¦\89পসরà§\8dà¦\97 à¦¸à¦¹ সকল পাতা ($1 নামস্থান)',
 'prefixindex-strip' => 'তালিকা থেকে প্রিফিক্স সরাও',
 'shortpages' => 'সংক্ষিপ্ত পাতাসমূহ',
 'longpages' => 'দীর্ঘ পাতাসমূহ',
@@ -2940,7 +2939,7 @@ $2',
 # Patrol log
 'patrol-log-page' => 'পরীক্ষণ লগ',
 'patrol-log-header' => 'এটি যাচাইকৃত রিভিশনের তালিকা।',
-'log-show-hide-patrol' => '$1 পরীক্ষণ লগ',
+'log-show-hide-patrol' => 'পরীক্ষণ লগ $1',
 
 # Image deletion
 'deletedrevision' => 'মুছে ফেলা পুরাতন সংশোধন $1',
@@ -3657,7 +3656,7 @@ $4-এ নিশ্চিতকরণ কোডটি মেয়াদোত
 'version-hook-name' => 'হুকের নাম',
 'version-hook-subscribedby' => 'সাবস্ক্রাইব করেছেন',
 'version-version' => '(সংস্করণ $1)',
-'version-license' => 'লাইসেন্স',
+'version-license' => 'মিডিয়াà¦\89à¦\87à¦\95ি à¦²à¦¾à¦\87সà§\87নà§\8dস',
 'version-poweredby-credits' => "এইক উইকিটি পরিচালিত হচ্ছে '''[https://www.mediawiki.org/ মিডিয়াউইকি]'''-এর মাধ্যমে, কপিরাইট © ২০০১-$1 $2।",
 'version-poweredby-others' => 'অন্যান্য',
 'version-poweredby-translators' => 'translatewiki.net অনুবাদকগণ',
@@ -3889,7 +3888,7 @@ $4-এ নিশ্চিতকরণ কোডটি মেয়াদোত
 'duration-minutes' => '$1 {{PLURAL:$1|মিনিট|মিনিট}}',
 'duration-hours' => '$1 {{PLURAL:$1|ঘন্টা|ঘন্টা}}',
 'duration-days' => '$1 {{PLURAL:$1|দিন|দিন}}',
-'duration-weeks' => '{{PLURAL:$1|সপ্তাহ|সপ্তাহ}}',
+'duration-weeks' => '$1 {{PLURAL:$1|সপ্তাহ}}',
 'duration-years' => '$1 {{PLURAL:$1|বছর|বছর}}',
 'duration-decades' => '$1 {{PLURAL:$1|দশক|দশক}}',
 'duration-centuries' => '$1 {{PLURAL:$1|শতাব্দী|শতাব্দী}}',
index ca81414..baaa328 100644 (file)
@@ -820,7 +820,7 @@ $2',
 'searchprofile-everything-tooltip' => 'হাব্বি থাকে বিসারা (য়্যারির পাতাতউ)',
 'searchprofile-advanced-tooltip' => 'নিজর লেপকরা নাঙথাকে বিসারা',
 'search-result-size' => '$1 ({{PLURAL:$2|1 ৱাহি|$2 ৱাহিহানি}})',
-'search-result-category-size' => '{{PLURAL: $1 | 1 সদস্য | $1 সদস্যগি}} ({{PLURAL: $2 | 1 উপবিষয়থাকহানি | $2 হান}}, {{PLURAL: $3 | 1 ফাইল | $3 ফাইল}})',
+'search-result-category-size' => '{{PLURAL:$1 | 1 সদস্য | $1 সদস্যগি}} ({{PLURAL:$2 | 1 উপবিষয়থাকহানি | $2 হান}}, {{PLURAL:$3 | 1 ফাইল | $3 ফাইল}})',
 'search-result-score' => 'মান্নপা $1%',
 'search-redirect' => '(বারোআলথক $1)',
 'search-section' => '(অনুচ্ছেদ $1)',
index b29e16e..3b2bffb 100644 (file)
@@ -1292,7 +1292,6 @@ Gallout a reot kavout munudoù e [{{fullurl:{{#Special:Log}}/delete|page={{FULLP
 'rows' => 'Linennoù :',
 'columns' => 'Bannoù',
 'searchresultshead' => 'Klask',
-'resultsperpage' => 'Niver a respontoù dre bajenn :',
 'stub-threshold' => 'Bevenn uhelañ evit al <a href="#" class="stub">liammoù war-du an danvez pennadoù</a> (okted) :',
 'stub-threshold-disabled' => 'Diweredekaet',
 'recentchangesdays' => "Niver a zevezhioù da ziskouez er c'hemmoù diwezhañ :",
@@ -3747,8 +3746,8 @@ Gallout a rit [[Special:EditWatchlist|implijout an aozer boutin ivez]].',
 'version-parser-function-hooks' => "Galv an arc'hwelioù dielfennañ",
 'version-hook-name' => 'Anv ar galv',
 'version-hook-subscribedby' => 'Termenet gant',
-'version-version' => '(Stumm $1)',
-'version-license' => 'Aotre-implijout',
+'version-version' => '($1)',
+'version-license' => 'Aotre-implijout MediaWiki',
 'version-poweredby-credits' => "Mont a ra ar wiki-mañ en-dro a-drugarez da '''[https://www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
 'version-poweredby-others' => 're all',
 'version-poweredby-translators' => 'troerien translatewiki.net',
index f20faea..a49465e 100644 (file)
@@ -1402,7 +1402,6 @@ Više informacija možete pronaći u [{{fullurl:{{#Special:Log}}/delete|page={{F
 'rows' => 'Redova',
 'columns' => 'Kolona',
 'searchresultshead' => 'Podešavanja rezultata pretrage',
-'resultsperpage' => 'Pogodaka po stranici:',
 'stub-threshold' => 'Formatiranje <a href="#" class="stub">linkova stranica u začetku</a> (bajtova):',
 'stub-threshold-disabled' => 'Isključen/a',
 'recentchangesdays' => 'Broj dana za prikaz u nedavnim izmjenama:',
index b4d79fb..fdf3ec0 100644 (file)
@@ -1329,7 +1329,6 @@ Es pot trobar més informació en el [{{fullurl:{{#Special:Log}}/delete|page={{F
 'rows' => 'Files',
 'columns' => 'Columnes',
 'searchresultshead' => 'Preferències de la cerca',
-'resultsperpage' => 'Resultats a mostrar per pàgina',
 'stub-threshold' => 'Límit per a formatar l\'enllaç com <a href="#" class="stub">esborrany</a> (en octets):',
 'stub-threshold-disabled' => 'Deshabilitat',
 'recentchangesdays' => 'Dies a mostrar en els canvis recents:',
index 2161933..d56770b 100644 (file)
@@ -1241,7 +1241,6 @@ $1",
 'rows' => 'МогӀанаш:',
 'columns' => 'БӀогӀамаш:',
 'searchresultshead' => 'Лаха',
-'resultsperpage' => 'Карийначу дӀаяздаршан дукхалла:',
 'stub-threshold' => 'Кеч яран доза <a href="#" class="stub">коьртамогӀамна хьажорагаш</a> (байташках):',
 'recentchangesdays' => 'Керла нисдар гайта динахь:',
 'recentchangesdays-max' => 'Къезиг  $1 {{PLURAL:$1|дена}}',
@@ -1335,26 +1334,26 @@ $1",
 'group-autoconfirmed' => 'Ша тӀелаьцболу декъашхой',
 'group-bot' => 'Шаболххой',
 'group-sysop' => 'Куьйгалхой',
-'group-bureaucrat' => 'Ð\94аÑ\80жаÑ\85ой',
+'group-bureaucrat' => 'Ð\91Ñ\8eÑ\80окÑ\80аÑ\82аÑ\88',
 'group-suppress' => 'Ревизораш',
 'group-all' => '(массо)',
 
 'group-user-member' => '{{GENDER:$1|декъашхо}}',
 'group-bot-member' => 'шаболххо',
 'group-sysop-member' => '{{GENDER:$1|куьйгалхо}}',
-'group-bureaucrat-member' => 'даржахо',
+'group-bureaucrat-member' => '{{GENDER:$1|бюрократхо}}',
 'group-suppress-member' => 'левисорхо',
 
 'grouppage-user' => '{{ns:project}}:Декъашхой',
 'grouppage-autoconfirmed' => '{{ns:project}}:Бакъонаш йолу декъашхой',
 'grouppage-bot' => '{{ns:project}}:Шаболххой',
 'grouppage-sysop' => '{{ns:project}}:Куьйгалхой',
-'grouppage-bureaucrat' => '{{ns:project}}:Ð\94аÑ\80жаÑ\85ой',
+'grouppage-bureaucrat' => '{{ns:project}}:Ð\91Ñ\8eÑ\80окÑ\80аÑ\82аÑ\88',
 'grouppage-suppress' => '{{ns:project}}:Ревизораш',
 
 # Rights
 'right-read' => 'агӀонашка хьажар',
-'right-edit' => 'Ð\90гÓ\80оаÑ\88 Ð½Ð¸Ñ\81Ñ\8fÑ\80',
+'right-edit' => 'агÓ\80онаÑ\88 Ð½Ð¸Ð¹Ñ\81е',
 'right-createpage' => 'АгӀонаш кхоллар (дийцарш дац)',
 'right-createtalk' => 'Дийцаре агӀонаш кхоллар',
 'right-createaccount' => 'декъашхошна керла дӀаяздарш кхоллар',
@@ -1498,6 +1497,13 @@ $1",
 'upload-recreate-warning' => "'''Тегам бе: иштта цӀе йолу файл дӀаяьккхина я цӀе хийцина.'''
 
 Лахахьа гойтуш ю хӀокху агӀона тептар:",
+'uploadtext' => "Лелайе хӀара агӀо сервер чу файлаш йохуш.
+Хьалхо чуйаьхна файлаш хьажа,  [[Special:FileList|кхузахь]]. Кхин чуйаьхна файлаш дӀаязло [[Special:Log/upload|чуяхаран тептар чохь]], дӀаяьхна файлаш каро йиш ю [[Special:Log/delete|кхузахь]].
+
+Файл агӀона чуйилла лелабе лахара могӀанаш:
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>''' файла Файлан юьззина верси чуйиллуш;
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|цунахь лаьцна хаам]]</nowiki></code>''' 200 пиксель барамехь файл чуйилар бухахь цунахь лаьцна могӀа а болуш;
+* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' файлан тӀе хьажораг хӀотайо файл агӀонгахь ца гуш.",
 'upload-permitted' => 'Магийна файлийн тайпанаш: $1.',
 'uploadlogpage' => 'Чуяхаран тéптар',
 'uploadlogpagetext' => 'Лахахьа гойтуш бу тӀаьххьара чуяхна файлийн могӀам.
@@ -1580,6 +1586,7 @@ PICT # тайп тайпан
 'listfiles_description' => 'Цуьнах лаьцна',
 'listfiles_count' => 'Верси',
 'listfiles-show-all' => 'Гайта суьртийн шира версеш',
+'listfiles-latestversion-yes' => 'ХӀаъ',
 
 # File description page
 'file-anchor-link' => 'Файл',
@@ -1852,6 +1859,7 @@ PICT # тайп тайпан
 'emailccme' => 'Соьга а кхосса хааман копи.',
 'emailsent' => 'Кехат дӏадахьийтина',
 'emailsenttext' => 'Хьан электроннан хаам дӏабахьийтина.',
+'emailuserfooter' => 'ХӀара хаам бахийтинера $1 {{GENDER:$1|декъащхочо}} $2 {{GENDER:$2|декъащхочунга}} «декъашхочунга хаам» олучу функцин гӀоьнца {{SITENAME}} проектан.',
 
 # Watchlist
 'watchlist' => 'Тергаме могӀам',
@@ -1870,7 +1878,7 @@ PICT # тайп тайпан
 'notanarticle' => 'Бац яззам',
 'watchlist-details' => 'Хьан тергаме могlамца $1 {{PLURAL:$1|агlо|агlонаш|агlонаш}} ю, дийцаре агlонаша йоцуш.',
 'wlheader-showupdated' => "Хийцам бина агӀонаш '''Ӏаьржа''' шрифтцан билгальяха ю.",
-'wlnote' => 'Лахахьа {{PLURAL:$1|тlаьхьа богlу $1 хийцам|тlаьхьа богlу $1 хийцамаш|тlаьхьа богlу $1 хийцамаш}} хlокху {{PLURAL:$2|тlаьхьар|тlаьхьара|тlаьхьара}} <strong>$2</strong> {{plural:$2|сохьт|сохьатехь|сохьташкахь}}.',
+'wlnote' => 'Лахахьа {{PLURAL:$1|тlаьхьа богlу $1 хийцам|тlаьхьа богlу $1 хийцамаш|тlаьхьа богlу $1 хийцамаш}} хlокху {{PLURAL:$2|тlаьхьар|тlаьхьара|тlаьхьара}} <strong>$2</strong> {{PLURAL:$2|сохьт|сохьатехь|сохьташкахь}}.',
 'wlshowlast' => 'Гайта тlаьххьара $1 сахьташ $2 денош $3',
 'watchlist-options' => 'Тергаме могlаман гlирс нисбар',
 
@@ -1922,7 +1930,7 @@ PICT # тайп тайпан
 'editcomment' => "Хийцамаш барна гайтина бахьна: ''$1''.",
 'revertpage' => 'Нисдарш [[Special:Contributions/$2|$2]] ([[User talk:$2|дийцаре]]) юха даьхна башхаллийн [[User:$1|$1]]',
 'revertpage-nouser' => 'Нисдарш (декъашхочун цӀе хьулйина) юхадаьхина башхаллин {{GENDER:$1|[[User:$1|$1]]}}',
-'rollback-success' => 'Юха даьхна $1; нисдарш, $2 версен.',
+'rollback-success' => 'Юхадаьхна $1; нисдарш, $2 версен.',
 
 # Protect
 'protectlogpage' => 'Гlаролли тептар',
@@ -2184,6 +2192,7 @@ PICT # тайп тайпан
 
 Ишта чу ханчохь, ахьа дехьа яккха йезар ю йа куьйга хlоттайар, нагахь иза хьашт йалахь.",
 'movearticle' => 'Цle хийца хlокху агlон',
+'moveuserpage-warning' => "'''Тергам бе.''' Хьо декъашхочун агӀона цӀе хийца гӀерта. Дехар до, тергам бе, декъашхочун агӀона цӀе бен хийца лур яц, декъашхочун дӀаяздаран цӀе хийца лур яц.",
 'newtitle' => 'Керла цlе',
 'move-watch' => 'Латайé хӀара агӀо тергаме могӀанан юкъахь',
 'movepagebtn' => 'Агlон цlе хийца',
@@ -2353,7 +2362,9 @@ PICT # тайп тайпан
 'pageinfo-language' => 'АгӀона мотт',
 'pageinfo-toolboxlink' => 'Агlонах болу бовзам',
 'pageinfo-redirectsto-info' => 'Хаам',
+'pageinfo-contentpage-yes' => 'ХӀаъ',
 'pageinfo-protect-cascading' => 'Чахчарин гӀоралла кхузара',
+'pageinfo-protect-cascading-yes' => 'ХӀаъ',
 'pageinfo-protect-cascading-from' => 'Чахчарин гӀоралла тӀера',
 'pageinfo-category-info' => 'Категорех лаьцна хаам',
 
@@ -2659,6 +2670,7 @@ MediaWiki яржош ю и шуна пайдане хир яц те аьлла,
 'tags-description-header' => 'МаьӀнан дуьззина сурт хӀоттор',
 'tags-active-header' => 'Жигара?',
 'tags-hitcount-header' => 'Къастам бина нисдарш',
+'tags-active-yes' => 'ХӀаъ',
 'tags-edit' => 'нисйé',
 'tags-hitcount' => '$1 {{PLURAL:$1|хийцам|хийцамаш|хийцамаш}}',
 
@@ -2683,6 +2695,7 @@ MediaWiki яржош ю и шуна пайдане хир яц те аьлла,
 'htmlform-submit' => 'ДӀадахьийта',
 'htmlform-reset' => 'Цаоьшу хийцамаш',
 'htmlform-selectorother-other' => 'Кхин',
+'htmlform-yes' => 'ХӀаъ',
 
 # New logging system
 'logentry-delete-delete' => '$1 {{GENDER:$2|дӀаяьккхина}} агӀо $3',
@@ -2703,7 +2716,7 @@ MediaWiki яржош ю и шуна пайдане хир яц те аьлла,
 'revdelete-uname-unhid' => 'декъашхочун цӀе гуча яьккхина',
 'revdelete-restricted' => 'куьйгалхойн доза туху',
 'revdelete-unrestricted' => 'куьйгалхойн доза тохар дӀаяьккхина',
-'logentry-move-move' => '$1 {{GENDER:$2|цӀе хийцина|цӀе хийцина}} $3 → $4',
+'logentry-move-move' => '$1 {{GENDER:$2|цӀе хийцина}} $3 → $4',
 'logentry-move-move-noredirect' => '$1 {{GENDER:$2|цӀе хийцина}} $3 → $4 дӀасахьажийнарг цаюьтуш',
 'logentry-move-move_redir' => '$1 {{GENDER:$2|цӀе хийцина|цӀе хийцина}} $3 оцу $4 дӀасахьажоран тӀохул',
 'logentry-move-move_redir-noredirect' => '$1 {{GENDER:$2|цӀе хийцина|цӀе хийцина}} $3 оцу $4 дӀасахьажоран тӀохул а дӀасахьажийнарг цаюьтуш а',
@@ -2717,6 +2730,7 @@ MediaWiki яржош ю и шуна пайдане хир яц те аьлла,
 
 # Feedback
 'feedback-cancel' => 'Цаоьшу',
+'feedback-close' => 'Кийчча ю',
 
 # Search suggestions
 'searchsuggest-search' => 'Лаха',
@@ -2732,7 +2746,9 @@ MediaWiki яржош ю и шуна пайдане хир яц те аьлла,
 # Limit report
 'limitreport-title' => 'АгӀона хӀоттам къасторан хаамаш:',
 'limitreport-cputime' => 'Процессоран хан лелор',
+'limitreport-cputime-value' => '$1 {{PLURAL:$1|секунд}}',
 'limitreport-walltime' => 'Йодуш йолу хенахь лелор',
+'limitreport-walltime-value' => '$1 {{PLURAL:$1|секунд}}',
 'limitreport-ppvisitednodes' => 'Препроцессор хьаьжна шадин дукхалла',
 'limitreport-ppgeneratednodes' => 'Препроцессорс сгенерировать бина шадин дукхалла',
 'limitreport-postexpandincludesize' => 'Схьаяьстина юккъерчаран барам',
@@ -2744,8 +2760,16 @@ MediaWiki яржош ю и шуна пайдане хир яц те аьлла,
 
 # Special:ExpandTemplates
 'expandtemplates' => 'Кепаш схьаястар',
+'expand_templates_intro' => 'ХӀокху белхан агӀорахь йиш ю йоза хийца.
+Кхин кепаш схьаяста.
+<code><nowiki>{{#language:…}}</nowiki></code> кхочуш дан тайп
+<code><nowiki>{{CURRENTDAY}}</nowiki></code>.',
+'expand_templates_title' => 'АгӀона {{FULLPAGENAME}} корта кхин а:',
+'expand_templates_input' => 'Чудолу йоза:',
 'expand_templates_output' => 'Хилам',
 'expand_templates_remove_comments' => 'ДӀаяха комментареш',
+'expand_templates_remove_nowiki' => 'ДӀайоху тегаш <nowiki> хилча',
+'expand_templates_generate_xml' => 'Гойту дитта цу XML',
 'expand_templates_preview' => 'Хьалха муха ю хьажа',
 
 );
index fc0ecf1..3271db1 100644 (file)
@@ -614,7 +614,7 @@ $2',
 'userlogout' => 'بچۆ دەرەوە',
 'notloggedin' => 'لە ژوورەوە نیت',
 'userlogin-noaccount' => 'ھەژمارت نییە؟',
-'userlogin-joinproject' => 'ڕەگەڵ {{SITENAME}} کەوە',
+'userlogin-joinproject' => 'وێڕای {{SITENAME}} کەوە',
 'nologin' => 'ھەژمارت نییە؟  $1.',
 'nologinlink' => 'ھەژمارێک دروست بکە',
 'createaccount' => 'ھەژمار دروست بکە',
@@ -1260,7 +1260,6 @@ $1",
 'rows' => 'ڕیزەکان:',
 'columns' => 'ستوونەکان:',
 'searchresultshead' => 'گەڕان',
-'resultsperpage' => 'ژمارەی ئەنجامەکان لە ھەر پەڕەیەک:',
 'stub-threshold' => 'سنوور بۆ شێوازی <a href="#" class="stub">بەستەری کۆڵکە</a> (بایت):',
 'stub-threshold-disabled' => 'ناچالاک',
 'recentchangesdays' => 'ژمارە ڕۆژە نیشاندراوەکان لە دوایین گۆڕانکارییەکان:',
@@ -2175,6 +2174,7 @@ $UNWATCHURL
 'delete-warning-toobig' => 'ئەم لاپەڕە مێژوویەکی دەستکاری زۆر گەورەی هەیە، زیاتر لە $1 {{PLURAL:$1|پێداچوونەوە|پێداچوونەوە}}.
 سڕینەوی ئەوە لە وانەیە کارەکانی بنکەدراوی {{SITENAME}} تووشی کێشە بکات؛
 دوورنواڕانە جێ‌بەجێی بکە.',
+'deleting-backlinks-warning' => "'''ھۆشدار:''' پەڕەی تر بەم پەڕەیەی دەتەوێ بیسڕییەوە بەستەر دراوە.",
 
 # Rollback
 'rollback' => 'گەڕاندنەوەی دەستکارییەکان',
@@ -2898,7 +2898,7 @@ $1',
 'days' => '{{PLURAL:$1|$1 ڕۆژ}}',
 'weeks' => '{{PLURAL:$1|$1 حەفتە}}',
 'months' => '{{PLURAL:$1|$1 مانگ}}',
-'years' => '{{PLURAL: $1|$1 ساڵ}}',
+'years' => '{{PLURAL:$1|$1 ساڵ}}',
 'ago' => '$1 لەمە پێش',
 'just-now' => 'ھەرئێستا',
 
index b29a9e8..268bcab 100644 (file)
@@ -884,7 +884,6 @@ $3 мына бу себепни бильдирди: ''$2''",
 'rows' => 'Сатыр',
 'columns' => 'Сутун',
 'searchresultshead' => 'Къыдырув',
-'resultsperpage' => 'Саифеде косьтериледжек тапылгъан саифе сайысы',
 'recentchangesdays' => 'Сонъки денъиштирмелер саифесинде косьтериледжек кунь сайысы:',
 'recentchangesdays-max' => '(энъ чокъ $1 {{PLURAL:$1|1=кунь|кунь}})',
 'recentchangescount' => 'Ог бельгиленген косьтериледжек денъиштирмелер сайысы:',
index c7c2641..0b69084 100644 (file)
@@ -9,6 +9,7 @@
  *
  * @author Chmee2
  * @author Danny B.
+ * @author DemonioCZ
  * @author Dontlietome7
  * @author Geitost
  * @author Helix84
@@ -1187,6 +1188,8 @@ Zřejmě byla smazána.',
 'content-not-allowed-here' => 'Obsah typu $1 není na stránce [[$2]] dovolen.',
 'editwarning-warning' => 'Opuštěním této stránky se mohou veškeré provedené změny ztratit.
 Přihlášení uživatelé si mohou toto varování vypnout na záložce „Editace“ v uživatelském nastavení.',
+'editpage-notsupportedcontentformat-title' => 'Nepodporovaný formát obsahu',
+'editpage-notsupportedcontentformat-text' => 'Model obsahu $2 nepodporuje formát obsahu $1.',
 
 # Content models
 'content-model-wikitext' => 'wikitext',
@@ -1490,7 +1493,6 @@ Podrobnosti mohou být uvedeny v [{{fullurl:{{#Special:Log}}/delete|page={{FULLP
 'rows' => 'Řádky',
 'columns' => 'Sloupce',
 'searchresultshead' => 'Vyhledávání',
-'resultsperpage' => 'Počet výsledků na stránku:',
 'stub-threshold' => 'Limit pro formátování odkazu jako <a href="#" class="stub">pahýl</a> (v bajtech):',
 'stub-threshold-disabled' => 'Vypnuto',
 'recentchangesdays' => 'Počet dní zobrazených v posledních změnách:',
@@ -2763,6 +2765,7 @@ Udejte přesný důvod níže (například ocitujte, které stránky byly poško
 Můžete si prohlédnout [[Special:BlockList|seznam zablokovaných uživatelů]].',
 'ipb-blockingself' => 'Chystáte se zablokovat {{gender:|sám|sama|sami}} sebe! Jste si {{gender:|jist|jista|jisti}}, že to chcete udělat?',
 'ipb-confirmhideuser' => 'Chystáte se zablokovat uživatele se zapnutou volbou „skrýt uživatelské jméno“. To způsobí, že jméno uživatele zmizí ze všech seznamů a protokolovacích záznamů. Jste si {{gender:|jist|jista|jisti}}, že to chcete udělat?',
+'ipb-confirmaction' => 'Pokud jste si {{GENDER:|jist|jista|jisti}}, že to chcete udělat, zaškrtněte pole „{{int:ipb-confirm}}“ dole.',
 'ipb-edit-dropdown' => 'Editace seznamu důvodů zablokování',
 'ipb-unblock-addr' => 'Odblokovat uživatele nebo IP $1',
 'ipb-unblock' => 'Odblokovat uživatele nebo IP adresu',
@@ -3302,7 +3305,7 @@ Otevřením souboru můžete ohrozit svůj počítač.",
 
 # Special:NewFiles
 'newimages' => 'Galerie nových souborů',
-'imagelisttext' => "Níže je {{PLURAL:$1|jeden soubor|seznam '''$1'''&nbsp;souborů seřazených $2|seznam '''$1'''&nbsp;souborů seřazených $2}}.",
+'imagelisttext' => "Níže je {{PLURAL:$1|'''$1''' soubor|seznam '''$1'''&nbsp;souborů seřazených $2}}.",
 'newimages-summary' => 'Na této speciální stránce se zobrazují poslední načtené soubory.',
 'newimages-legend' => 'Filtr',
 'newimages-label' => 'Název souboru (nebo jeho část):',
@@ -3996,7 +3999,7 @@ Seznam editovaných stránek můžete také [[Special:EditWatchlist|editovat ve
 'version-parser-function-hooks' => 'Funkce parseru',
 'version-hook-name' => 'Název přípojného bodu',
 'version-hook-subscribedby' => 'Volán z',
-'version-version' => '(Verze $1)',
+'version-version' => '($1)',
 'version-license' => 'Licence MediaWiki',
 'version-ext-license' => 'Licence',
 'version-ext-colheader-name' => 'Rozšíření',
index 890ac1b..574057a 100644 (file)
@@ -1237,7 +1237,6 @@ Cofiwch y gall mynegeion Google o gynnwys {{SITENAME}} fod ar ei hôl hi.",
 'rows' => 'Rhesi:',
 'columns' => 'Colofnau:',
 'searchresultshead' => 'Chwilio',
-'resultsperpage' => 'Cyfradd taro fesul tudalen:',
 'stub-threshold' => 'Trothwy ar gyfer fformatio <a href="#" class="stub">cyswllt eginyn</a> (beitiau):',
 'stub-threshold-disabled' => 'Analluogwyd',
 'recentchangesdays' => "Nifer y diwrnodau i'w dangos yn 'newidiadau diweddar':",
@@ -1630,6 +1629,8 @@ Ewch nôl ac uwchlwythwch y ffeil gydag enw gwahanol iddo.
 'file-exists-duplicate' => "Dyblgeb yw'r ffeil hwn o'r {{PLURAL:$1|ffeil|ffeil|ffeiliau|ffeiliau|ffeiliau|ffeiliau}} sy'n dilyn:",
 'file-deleted-duplicate' => "Mae ffeil union debyg i hon ([[:$1]]) eisoes wedi cael ei dileu.
 Dylech edrych ar hanes dileu'r ffeil honno cyn bwrw ati i'w llwytho unwaith eto.",
+'file-deleted-duplicate-notitle' => "Mae ffeil union debyg i hon eisoes wedi cael ei dileu, ac mae'r teitl wedi ei hatal rhag ymddangos ar goedd.
+Cyn i chi ail-lwytho'r ffeil, dylech holi i rywun â'r gallu ganddo i weld data ffeil sydd wedi ei hatal rhag ymddangos, i adolygu'r sefyllfa.",
 'uploadwarning' => 'Rhybudd uwchlwytho',
 'uploadwarning-text' => 'Newidiwch ddisgrifiad y ffeil isod ac yna ceisiwch ei huwchlwytho eto, os gwelwch yn dda.',
 'savefile' => "Cadw'r ffeil",
@@ -2514,6 +2515,7 @@ Rhowch reswm dros rwystro'r defnyddiwr (er enghraifft, dywedwch pa dudalen(au) a
 Gweler y [[Special:BlockList|rhestr blociau]] er mwyn arolygu blociau.',
 'ipb-blockingself' => "Rydych ar rwystro'ch hunan! A ydych yn siŵr eich bod chi am wneud hyn?",
 'ipb-confirmhideuser' => 'Rydych ar rwystro defnyddiwr sydd yn "guddiedig." Bydd hyn yn atal enw\'r defnyddiwr ym mhob rhestr a chofnod lòg. A ydych yn siŵr eich bod chi am wneud hyn?',
+'ipb-confirmaction' => 'Os ydych wir am wneud hyn, cliciwch ar y maes "{{int:ipb-confirm}}" ar y gwaelod.',
 'ipb-edit-dropdown' => "Golygu'r rhesymau dros flocio",
 'ipb-unblock-addr' => 'Dadflocio $1',
 'ipb-unblock' => 'Dadflocio enw defnyddiwr neu gyfeiriad IP',
index 1078bd4..03a0a57 100644 (file)
@@ -1322,7 +1322,6 @@ Detaljer kan findes i [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}
 'rows' => 'Rækker',
 'columns' => 'Kolonner',
 'searchresultshead' => 'Søgeresultater',
-'resultsperpage' => 'Resultater pr. side',
 'stub-threshold' => 'Grænse for visning af henvisning som <a href="#" class="stub">artikelstump</a>:',
 'stub-threshold-disabled' => 'Deaktiveret',
 'recentchangesdays' => 'Antal dage som skal vises i seneste ændringer:',
@@ -1715,6 +1714,8 @@ Hvis du fortsat vil lægge filen op, bedes du gå tilbage og bruge et nyt navn.
 [[File:$1|thumb|center|$1]]',
 'file-exists-duplicate' => 'Denne fil er en bublet af {{PLURAL:$1|den nedenstående fil|de nedenstående $1 filer}}:',
 'file-deleted-duplicate' => 'En fil identisk med denne fil ([[:$1]]) er tidligere blevet slettet. Du bør tjekke den fils sletningshistorik før du prøver at genoplægge den.',
+'file-deleted-duplicate-notitle' => 'En fil, der er identisk med denne fil er tidligere blevet slettet, og titlen er blevet undertrykt.
+Du bør spørge en person med evnen til at se undertrykte fildata for at gennemgå situationen inden du fortsætter med at uploade den igen.',
 'uploadwarning' => 'Advarsel',
 'uploadwarning-text' => 'Vær venlig at ændre filbeskrivelsen nedenfor og prøv igen.',
 'savefile' => 'Gem fil',
@@ -2485,8 +2486,8 @@ Teksten i de slettede versioner er kun tilgængelig for administratorer.',
 'undeleteinvert' => 'Omvend valget af versioner',
 'undeletecomment' => 'Begrundelse:',
 'undeletedrevisions' => '$1 {{PLURAL:$1|version|versioner}} gendannet',
-'undeletedrevisions-files' => '$1 {{plural:$1|version|versioner}} og $2 {{plural:$2|fil|filer}} gendannet',
-'undeletedfiles' => '$1 {{plural:$1|fil|filer}} gendannet',
+'undeletedrevisions-files' => '$1 {{PLURAL:$1|version|versioner}} og $2 {{PLURAL:$2|fil|filer}} gendannet',
+'undeletedfiles' => '$1 {{PLURAL:$1|fil|filer}} gendannet',
 'cannotundelete' => 'Gendannelse mislykkedes:
 $1',
 'undeletedpage' => "'''$1''' blev gendannet.
@@ -3143,7 +3144,7 @@ Du kan beskadige dit system hvis du udfører den.",
 
 # Video information, used by Language::formatTimePeriod() to format lengths in the above messages
 'hours-abbrev' => '$1t',
-'seconds' => '{{PLURAL: $1|$1 sekund|$1 sekunder}}',
+'seconds' => '{{PLURAL:$1|$1 sekund|$1 sekunder}}',
 'minutes' => '{{PLURAL:$1|$1 minut|$1 minutter}}',
 'hours' => '{{PLURAL:$1|$1 time|$1 timer}}',
 'days' => '{{PLURAL:$1|$1 dag|$1 dage}}',
@@ -3749,7 +3750,7 @@ Du kan også [[Special:EditWatchlist|bruge standard editoren]].',
 'version' => 'Information om MediaWiki',
 'version-extensions' => 'Installerede udvidelser',
 'version-specialpages' => 'Specialsider',
-'version-parserhooks' => 'Oversætter-funktioner',
+'version-parserhooks' => 'Parserfunktioner',
 'version-variables' => 'Variabler',
 'version-antispam' => 'Spamforebyggelse',
 'version-skins' => 'Udseender',
@@ -3757,7 +3758,7 @@ Du kan også [[Special:EditWatchlist|bruge standard editoren]].',
 'version-mediahandlers' => 'Specialhåndtering af mediefiler',
 'version-hooks' => 'Funktionstilføjelser',
 'version-parser-extensiontags' => 'Tilføjede tags',
-'version-parser-function-hooks' => 'Oversætter-funktioner',
+'version-parser-function-hooks' => 'Parserfunktioner',
 'version-hook-name' => 'Navn',
 'version-hook-subscribedby' => 'Brugt af',
 'version-version' => '(Version $1)',
index fed416f..31cc8a2 100644 (file)
@@ -1254,6 +1254,8 @@ Sie wurde anscheinend gelöscht.',
 'content-not-allowed-here' => 'Der Inhalt „$1“ ist auf der Seite [[$2]] nicht erlaubt',
 'editwarning-warning' => 'Das Verlassen dieser Seite kann dazu führen, dass deine Änderungen verloren gehen.
 Wenn du angemeldet bist, kannst du das Anzeigen dieser Warnung im Bereich „Bearbeiten“ deiner Einstellungen abschalten.',
+'editpage-notsupportedcontentformat-title' => 'Das Inhaltsformat wird nicht unterstützt',
+'editpage-notsupportedcontentformat-text' => 'Das Inhaltsformat $1 wird vom Inhaltsmodell $2 nicht unterstützt.',
 
 # Content models
 'content-model-wikitext' => 'Wikitext',
@@ -1555,7 +1557,6 @@ Einzelheiten sind im [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}}
 'rows' => 'Zeilen:',
 'columns' => 'Spalten:',
 'searchresultshead' => 'Suche',
-'resultsperpage' => 'Treffer pro Seite:',
 'stub-threshold' => 'Linkformatierung <a href="#" class="stub">kleiner Seiten</a> (in Bytes):',
 'stub-threshold-disabled' => 'Deaktiviert',
 'recentchangesdays' => 'Anzahl der standardmäßig einbezogenen Tage:',
@@ -2349,8 +2350,8 @@ Jede Zeile enthält Links zur ersten und zweiten Weiterleitung sowie dem Ziel de
 'unusedcategoriestext' => 'Diese Spezialseite zeigt alle Kategorien, die leer sind, also selbst keine Kategorien oder Seiten enthalten.',
 'notargettitle' => 'Keine Seite angegeben',
 'notargettext' => 'Du hast nicht angegeben, auf welche Seite diese Funktion angewendet werden soll.',
-'nopagetitle' => 'Quellseite nicht vorhanden',
-'nopagetext' => 'Die zu verschiebende Seite ist nicht vorhanden.',
+'nopagetitle' => 'Seite nicht vorhanden',
+'nopagetext' => 'Die angegebene Seite ist nicht vorhanden.',
 'pager-newer-n' => '{{PLURAL:$1|nächster|nächste $1}}',
 'pager-older-n' => '{{PLURAL:$1|vorheriger|vorherige $1}}',
 'suppress' => 'Oversight',
@@ -4032,7 +4033,7 @@ Du kannst auch die [[Special:EditWatchlist|Standardseite]] zum Bearbeiten benutz
 'version-parser-function-hooks' => "Parsererweiterungen ''(Funktionen)''",
 'version-hook-name' => 'Schnittstellenname',
 'version-hook-subscribedby' => 'Aufruf von',
-'version-version' => '(Version $1)',
+'version-version' => '($1)',
 'version-svn-revision' => '(Version $2)',
 'version-license' => 'MediaWiki-Lizenz',
 'version-ext-license' => 'Lizenz',
index 2b6e780..4a903d6 100644 (file)
@@ -387,39 +387,39 @@ $messages = array(
 'editfont-serif' => 'Babetê serifi',
 
 # Dates
-'sunday' => 'Bazar',
-'monday' => 'Berarek',
-'tuesday' => 'Telete',
+'sunday' => 'Kırê',
+'monday' => 'Dışeme',
+'tuesday' => 'Sêşeme',
 'wednesday' => 'Çarşeme',
-'thursday' => 'Panşeme',
-'friday' => 'Ã\89ne',
-'saturday' => 'Bahdé éni',
-'sun' => 'Baz',
-'mon' => 'Bbz',
-'tue' => 'Tlt',
+'thursday' => 'Pancşeme',
+'friday' => 'Ã\8ane',
+'saturday' => 'Şeme',
+'sun' => 'Krê',
+'mon' => 'Dış',
+'tue' => 'Sêş',
 'wed' => 'Çrş',
 'thu' => 'Pşm',
 'fri' => 'Êne',
-'sat' => 'Bdé',
+'sat' => 'Şem',
 'january' => 'Çele',
-'february' => 'Zemherı',
+'february' => 'Sıbate',
 'march' => 'Adar',
 'april' => 'Nisane',
-'may_long' => 'Gúlan',
+'may_long' => 'Gulane',
 'june' => 'Heziran',
-'july' => 'Temuz',
+'july' => 'Temuze',
 'august' => 'Tebaxe',
 'september' => 'Keşkelun',
 'october' => 'Tışrino Verên',
 'november' => 'Tışrino Peyên',
 'december' => 'Kanun',
 'january-gen' => 'Çele',
-'february-gen' => 'Zemherı',
-'march-gen' => 'Mert',
+'february-gen' => 'Sıbate',
+'march-gen' => 'Adar',
 'april-gen' => 'Nisane',
-'may-gen' => 'Gúlan',
+'may-gen' => 'Gulane',
 'june-gen' => 'Heziran',
-'july-gen' => 'Temuz',
+'july-gen' => 'Temuze',
 'august-gen' => 'Tebaxe',
 'september-gen' => 'Keşkelun',
 'october-gen' => 'Tışrino Verên',
@@ -438,7 +438,7 @@ $messages = array(
 'nov' => 'Tşp',
 'dec' => 'Kan',
 'january-date' => 'Çele  $1',
-'february-date' => 'Şıbate $1',
+'february-date' => 'Sıbate $1',
 'march-date' => 'Adar $1',
 'april-date' => 'Nisane $1',
 'may-date' => 'Gulane $1',
@@ -446,13 +446,13 @@ $messages = array(
 'july-date' => 'Temuze $1',
 'august-date' => 'Tebaxe $1',
 'september-date' => 'Keşkelun $1',
-'october-date' => 'Cıtan $1',
-'november-date' => 'Qasım $1',
-'december-date' => '$1 Kanun',
+'october-date' => 'Tışrino Verên $1',
+'november-date' => 'Tışrino Peyên $1',
+'december-date' => 'Kanun $1',
 
 # Categories related messages
-'pagecategories' => '{{PLURAL:$1|Kategori|Kategoriy}}',
-'category_header' => 'Perré ke kategori da "$1" de yé',
+'pagecategories' => '{{PLURAL:$1|Kategoriye|Kategoriy}}',
+'category_header' => 'Pelê ke kategoriya "$1" derê',
 'subcategories' => 'Kategoriyê bınêni',
 'category-media-header' => 'Dosyeyê ke kategoriya "$1" derê',
 'category-empty' => "''Ena kategoriye de hewna qet nuştey ya zi medya çıniyê.''",
@@ -471,7 +471,7 @@ $messages = array(
 'broken-file-category' => 'Peleye ke gıreyê dosyeyanê ğeletan muhtewa kenê',
 'categoryviewer-pagedlinks' => '($1) ($2)',
 
-'about' => 'Heqdé cı',
+'about' => 'Heqa cı de',
 'article' => 'Wesiqe',
 'newwindow' => '(pençereyê newey de beno a)',
 'cancel' => 'Bıtexelne',
@@ -500,11 +500,11 @@ $messages = array(
 'vector-action-undelete' => 'Esterıtışi peyser bıgê',
 'vector-action-unprotect' => 'Starkerdışi bıvurne',
 'vector-simplesearch-preference' => 'Çuweya cı geyreyış de rehater aktiv ke (Tenya vector skin de)',
-'vector-view-create' => 'İycad ke',
+'vector-view-create' => 'Vıraze',
 'vector-view-edit' => 'Bıvurne',
 'vector-view-history' => 'Verênan bıvêne',
 'vector-view-view' => 'Bıwane',
-'vector-view-viewsource' => 'Çımi bıvin',
+'vector-view-viewsource' => 'Çımey bıvêne',
 'actions' => 'Hereketi',
 'namespaces' => 'Cayê namey',
 'variants' => 'Varyanti',
@@ -526,7 +526,7 @@ $messages = array(
 'print' => 'Nusten ke',
 'view' => 'Bıvin',
 'edit' => 'Bıvurne',
-'create' => 'İycad ke',
+'create' => 'Vıraze',
 'editthispage' => 'Ena pele bıvurne',
 'create-this-page' => 'Na pele bınuse',
 'delete' => 'Bestere',
@@ -539,7 +539,7 @@ $messages = array(
 'protectthispage' => 'Ena pele bıpawe',
 'unprotect' => 'Starkerdışi bıvurne',
 'unprotectthispage' => 'Starkerdışe ena peler bıvurne',
-'newpage' => 'Pera newiye',
+'newpage' => 'Pela newiye',
 'talkpage' => 'Ena pele sero werêne',
 'talkpagelinktext' => 'Werênayış',
 'specialpage' => 'Pela xısusiye',
@@ -576,18 +576,18 @@ $1',
 'pool-errorunknown' => 'Xeta nêzanıtiye',
 
 # All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
-'aboutsite' => 'Heqdé {{SITENAME}}',
-'aboutpage' => 'Project:Heqdê cı',
+'aboutsite' => 'Heqa {{SITENAME}} de',
+'aboutpage' => 'Project:Heqa cı de',
 'copyright' => 'Zerrekacı $1 bındı not biya.',
 'copyrightpage' => '{{ns:project}}:Heqa telifi',
 'currentevents' => 'Veng u vac',
 'currentevents-url' => 'Project:Rocani hadisey',
-'disclaimers' => 'Reddiya mesuliyeti',
+'disclaimers' => 'Redê mesuliyeti',
 'disclaimerpage' => 'Project:Reddê mesuliyetê bıngey',
 'edithelp' => 'Peştdariya vurnayışi',
 'helppage' => 'Help:Zerrek',
-'mainpage' => 'Pera Seri',
-'mainpage-description' => 'Pera Seri',
+'mainpage' => 'Pela Seri',
+'mainpage-description' => 'Pela seri',
 'policy-url' => 'Project:Terzê hereketi',
 'portal' => 'Portalê cemaeti',
 'portal-url' => 'Project:Portalê cemaeti',
@@ -617,7 +617,7 @@ $1',
 'editold' => 'bıvurne',
 'viewsourceold' => 'çımey cı bıvinê',
 'editlink' => 'bıvurne',
-'viewsourcelink' => 'Ã\87ımi bıvin',
+'viewsourcelink' => 'çımey bıvêne',
 'editsectionhint' => 'Leteyo ke bıvuriyo: $1',
 'toc' => 'Sernameyê meselan',
 'showtoc' => 'bımocne',
@@ -644,7 +644,7 @@ $1',
 'nstab-main' => 'Wesiqe',
 'nstab-user' => 'Pera Karberi',
 'nstab-media' => 'Pera Medya',
-'nstab-special' => 'Pera bağsi',
+'nstab-special' => 'Pela xase',
 'nstab-project' => 'Pera proci',
 'nstab-image' => 'Dosya',
 'nstab-mediawiki' => 'Mesac',
@@ -709,7 +709,7 @@ Beno ke, tede yew ya zi zêdê işareti estê ke sernaman de nêxebetiyenê.',
 'perfcached' => 'Datay cı ver hazır biye. No semedê ra nıkayin niyo! tewr zaf {{PLURAL:$1|netice|$1 netice}} debêno de',
 'perfcachedts' => 'Cêr de malumatê nımıteyi esti, demdê newe kerdışo peyın: $1. Tewr zaf {{PLURAL:$4|netice|$4 neticey cı}} debyayo de',
 'querypage-no-updates' => 'Nıka newe kerdış nêbeno. no datayi ca de newe nêbeni .',
-'viewsource' => 'Çımi bıvin',
+'viewsource' => 'Çımey bıvêne',
 'viewsource-title' => "Cı geyrayışê $1'i bıvin",
 'actionthrottled' => 'Kerden peysnaya',
 'actionthrottledtext' => 'Riyê tedbirê anti-spami ra,  wextê do kılmek de şıma nê fealiyeti nêşkenê zaf zêde bıkerê, şıma ki no hedi viyarna ra.
@@ -1035,9 +1035,9 @@ Heta ke werte de qısım çıniyo, ca çıniyo ke tı raştkerdışê xo qeyd b
 
 Qey na hesabê newe parola, cıkewtış dıma şıma eşkeni na qısım de ''[[Special:ChangePassword|parola bıvurn]]'' bıvurni.",
 'newarticle' => '(Newe)',
-'newarticletext' => 'Ena per erdmaluamti miyan de çıniya.
-Şıma qayıle ena perer vırazese dora metini bıkarne. (yana  [[{{MediaWiki:Helppage}}|Pera destegi]] ra malumat bıgire).
-Nara ke şıma ğamğamde ameyé tiya se butonda peyseri bıploğne u şıré cado verén.',
+'newarticletext' => "To yew gıre tıkna be ra yew pela ke hewna çıniya.
+Seba afernayışê pele ra, qutiya metnê cêrêni bıgurene (seba melumati qaytê [[{{MediaWiki:Helppage}}|pela peşti]] ke).
+Eke be ğeletine ameya tiya, wa gocega '''peyser'''i programê xo de bıtıkne.",
 'anontalkpagetext' => "----''No pel, pel o karbero hesab a nêkerdeyan o, ya zi karbero hesab akerdeyan o labele pê hesabê xo nêkewto de. No sebeb ra ma IP adres şuxulneni û ney IP adresan herkes eşkeno bıvino. Eke şıma qayil niye ina bo xo ri [[Special:UserLogin/signup|yew hesab bıvıraze]] veyaxut [[Special:UserLogin|hesab akere]].''",
 'noarticletext' => 'Na per enewke venga.
 Tı şenay na perer, peran de [[Special:Search/{{PAGENAME}}|binan miyan de bıgeyrè]],
@@ -1327,7 +1327,7 @@ Listey xırabi u bloki re pelay [[Special:BlockList|IP'yê ke bloke biyê]] bivi
 'mergehistory-header' => 'No pel, reviyonê yew peli eşkeno yewna pelo newe de piyawano.
 no vurnayişo ke şıma keni kontrol bıkere yew pelo kehen nêbo.',
 'mergehistory-box' => 'revizyonê pelanî yew bike:',
-'mergehistory-from' => 'Para Çımi:',
+'mergehistory-from' => 'Pela çımey:',
 'mergehistory-into' => 'Pela destinasyonî',
 'mergehistory-list' => 'tarixê vurnayîşî ke eşkeno yew bi.',
 'mergehistory-merge' => '[[:$1]] qey ney revizyonê cêrini [[:$2]] şıma ekeni piyawani. Benatê wexto muwaqqet de piyayanayişê rezizyonan de tuşa radyo bıxebitne.',
@@ -1360,7 +1360,7 @@ no vurnayişo ke şıma keni kontrol bıkere yew pelo kehen nêbo.',
 'lineno' => 'Xeta $1i:',
 'compareselectedversions' => 'Rewizyonanê weçineyan pêver ke',
 'showhideselectedversions' => 'Revizyonanê weçinıtan bımocne/bınımne',
-'editundo' => 'peyser bıgi',
+'editundo' => 'peyser bıgê',
 'diff-empty' => '(Babetna niyo)',
 'diff-multi' => '({{PLURAL:$1|Yew revizyono miyanên|$1 revizyonê miyanêni}} terefê {{PLURAL:$2|yew karberi|$2 karberan}} nêmocno)',
 'diff-multi-manyusers' => '({{PLURAL:$1|jew timar kerdışo qıckeko|$1 timar kerdışo qıckeko}} timar kerdo, $2 {{PLURAL:$2|Karber|karberi}} memocne)',
@@ -1384,11 +1384,11 @@ Detayê besternayışi [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}
 'viewprevnext' => '($1 {{int:pipe-separator}} $2) ($3) bıvênên',
 'searchmenu-exists' => "''Ena 'Wikipediya de ser \"[[:\$1]]\" yew pel esto'''",
 'searchmenu-new' => "''Na Wiki de pelay \"[[:\$1]]\" vıraze!'''",
-'searchprofile-articles' => 'Perré muhteway',
-'searchprofile-project' => 'Pera Destegi uw Procan',
+'searchprofile-articles' => 'Pelê tedeestey',
+'searchprofile-project' => 'Pelê peşti û procey',
 'searchprofile-images' => 'Multimedya',
 'searchprofile-everything' => 'Heme çi',
-'searchprofile-advanced' => 'Ravérden',
+'searchprofile-advanced' => 'Raverşiyaye',
 'searchprofile-articles-tooltip' => '$1 de cı geyré',
 'searchprofile-project-tooltip' => '$1 de bigêre',
 'searchprofile-images-tooltip' => 'Dosya cı geyr',
@@ -1453,7 +1453,6 @@ Detayê besternayışi [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}
 'rows' => 'Xeti:',
 'columns' => 'Estûni:',
 'searchresultshead' => 'Cı geyre',
-'resultsperpage' => 'Neticeye ke perde bıase:',
 'stub-threshold' => 'Qandé <a href="#" class="stub">Taslağ  formati</a> sinor (bayti):',
 'stub-threshold-disabled' => 'Astengın',
 'recentchangesdays' => 'Rocê ke vurnayışanê peyênan de bıasê:',
@@ -1527,7 +1526,7 @@ Eka tu wazene ke nameyo raşt xo bide, ma nameyo raşt ti iştirakanê ti de moc
 'prefs-dateformat' => 'Formatê tarixi',
 'prefs-timeoffset' => 'Wext offset',
 'prefs-advancedediting' => 'Herayen weçinayış',
-'prefs-editor' => 'Timarkar',
+'prefs-editor' => 'Vurnayoğ',
 'prefs-preview' => 'Verqayt',
 'prefs-advancedrc' => 'Tercihê raverberdey',
 'prefs-advancedrendering' => 'Tercihê raverberdey',
@@ -1716,23 +1715,23 @@ Eka tu wazene ke nameyo raşt xo bide, ma nameyo raşt ti iştirakanê ti de moc
 'enhancedrc-history' => 'verenayış',
 'recentchanges' => 'Vurnayışê peyêni',
 'recentchanges-legend' => 'Tercihê vurnayışanê peyênan',
-'recentchanges-summary' => 'Ena perer de wiki sero vurnayışanê peyênan teqib ke.',
+'recentchanges-summary' => 'Ena pele de wiki sero vurnayışanê peyênan teqib ke.',
 'recentchanges-noresult' => 'Zey kiterandé şıma vırnayış névineya',
 'recentchanges-feed-description' => 'Ena feed dı vurnayişanê tewr peniyan teqip bık.',
-'recentchanges-label-newpage' => 'Ena vırnayış ra pera newi vıraziyê',
-'recentchanges-label-minor' => 'Ena vırnayışa werkeka',
-'recentchanges-label-bot' => 'No vurnayışé boti yo.',
+'recentchanges-label-newpage' => 'Enê vurnayışi ra yew pela newiye vıraziye',
+'recentchanges-label-minor' => 'Eno yew vurnayışo werdiyo',
+'recentchanges-label-bot' => 'Eno vurnayış terefê yew boti ra vıraziyo',
 'recentchanges-label-unpatrolled' => 'Eno vurnayış hewna dewriya nêbiyo',
-'recentchanges-label-plusminus' => 'Ebata na perer ebatta na nımra de vırneya',
+'recentchanges-label-plusminus' => 'Ebadê pele de bazê bayti de vayeyê cı',
 'recentchanges-legend-heading' => "'''Kıtabek:'''",
-'recentchanges-legend-newpage' => '(Zewbi bıvin [[Special:NewPages|Listeya peran de newan]])',
+'recentchanges-legend-newpage' => '([[Special:NewPages|Lista pelanê neweyan]] zi bıvêne)',
 'recentchanges-legend-plusminus' => "''(±123)''",
 'rcnotefrom' => "Cêr de '''$2''' ra nata vurnayışiyê asenê (tewr vêşi <b> '''$1'''</b> asenê).",
 'rclistfrom' => '$1 ra tepiya vurnayışanê neweyan bımocne',
-'rcshowhideminor' => 'Vırnayışané werkekean $1',
+'rcshowhideminor' => 'Vurnayışanê werdiyan $1',
 'rcshowhidebots' => 'Botan $1',
-'rcshowhideliu' => 'Karberé qeydınan $1',
-'rcshowhideanons' => 'Karberané bénaman $1',
+'rcshowhideliu' => 'Karberanê qeydbiyayeyan $1',
+'rcshowhideanons' => 'Karberanê bênameyan $1',
 'rcshowhidepatr' => '$1 vurnayışê ke dewriya geyrayê',
 'rcshowhidemine' => 'Vurnayışanê mı $1',
 'rclinks' => 'Peyniya $2 rocan de $1 vurnayışan bımocne <br />$3',
@@ -1862,7 +1861,7 @@ Semedê ancia barkerdışi dewamkerdış ra ver tarixê esterışê dosya gani q
 Dosyayn de Java barkerdışi rê icazet nêdeyê, çıkı emeleya merduman nêbena.',
 'upload-source' => 'Dosyayê henî',
 'sourcefilename' => 'Nameyê dosyaye çimeyî',
-'sourceurl' => "URL'yê Çımi",
+'sourceurl' => 'URLyê çımey:',
 'destfilename' => 'Destînasyonê nameyêdosya',
 'upload-maxfilesize' => 'Ebatêî dosya tewr girdî: $1',
 'upload-description' => 'Deskripsiyonê dosyayî',
@@ -2128,7 +2127,7 @@ listeya ke ha ver a têna na {{PLURAL:$1|dosyaya ewwili|dosyaya $1 ewwili}} mocn
 'randomincategory-selectcategory-submit' => 'Şo',
 
 # Random redirect
-'randomredirect' => 'Xoseri hetenayış',
+'randomredirect' => 'Serçarnayışo rastameye',
 'randomredirect-nopages' => 'Ena cayênameyê "$1"î de redereksiyonî çin o.',
 
 # Statistics
@@ -2234,7 +2233,7 @@ gıreyê her satıri de gıreyi; raş motışê yewın u dıyıni esto.
 'listusers-desc' => 'Kemeyen rézed ratn',
 'usereditcount' => '$1 {{PLURAL:$1|vurnayîş|vurnayîşî}}',
 'usercreated' => '$2 de $1 {{GENDER:$3|viraziya}}',
-'newpages' => 'Pe newey',
+'newpages' => 'Pe newey',
 'newpages-username' => 'Nameyê karberi:',
 'ancientpages' => 'Wesiqeyê ke vurnayışê ciyê peyeni tewr kehani',
 'move' => 'Bere',
@@ -2307,7 +2306,7 @@ hem zi bıewnê [[Special:WantedCategories|kategori yê ke waziyeni]].',
 # Special:LinkSearch
 'linksearch' => 'Gıreyê teberi cı geyrê',
 'linksearch-pat' => 'bıgêr motif:',
-'linksearch-ns' => 'Heruna naman:',
+'linksearch-ns' => 'Heruna nameyan:',
 'linksearch-ok' => 'Cı geyre',
 'linksearch-text' => 'Jokeri ê zey "*.wikipedia.org"i benê ke bıgureniyê.
 Tewr senık yew sewiya serêna cayê tesiri lazıma, mesela "*.org".<br />
@@ -2492,12 +2491,12 @@ Qe qeydê wedarnayışi, $2 bevinin.',
 'deletecomment' => 'Sebeb:',
 'deleteotherreason' => 'Sebebo bin:',
 'deletereasonotherlist' => 'Sebebo bin',
-'deletereason-dropdown' => '*Sebebé esterıti
-** Spam
+'deletereason-dropdown' => '* Sebebê esterıtışê pêroyi
+** Vurnayışo nêwaşte (spam)
 ** Vandalizm
-** İhlala heqdé telifi
-** WaÅ\9ftıÅ\9fé nustoği
-** Xırab hetenayış',
+** İxlalê heqa telifi
+** WaÅ\9ftıÅ\9fê nuÅ\9ftoği
+** Oryantasyono xırabe',
 'delete-edit-reasonlist' => 'Sebebê vurnayışan bıvurne',
 'delete-toobig' => 'no pel, pê $1 {{PLURAL:$1|tene vuriyayiş|tene vuriyayiş}}i wayirê yew tarixo kehen o.
 qey hewna nêşiyayişi wina pelani u {{SITENAME}}nêxerebnayişê keyepeli yew hed niyaya ro.',
@@ -2540,7 +2539,7 @@ Qey malumato ziyede [[Special:ProtectedPages|Peleyê ke star biye]] bewni rê ê
 'protect-title' => 'qey "$1" yew seviyaya pawıtışi bıvıcinê',
 'protect-title-notallowed' => 'Star kerdış sewiyeyê "$1" bıvinê',
 'prot_1movedto2' => 'nameyê [[$1]] peli yo newe: [[$2]]',
-'protect-badnamespace-title' => 'Heruna naman itad starêna',
+'protect-badnamespace-title' => 'Heruna nameyana bêsıtare',
 'protect-badnamespace-text' => 'Na herunda namide peley nêstarênê.',
 'protect-norestrictiontypes-text' => 'Na perdi mahne esto cokira tipeci nikarnina',
 'protect-norestrictiontypes-title' => 'Pera starneyin',
@@ -2590,7 +2589,7 @@ Tı eşkeno seviyeye kılit kerdışi bıvurno, feqat tı nıeşken "cascading p
 # Restrictions (nouns)
 'restriction-edit' => 'Bıvurne',
 'restriction-move' => 'Ber',
-'restriction-create' => 'İycad ke',
+'restriction-create' => 'Vıraze',
 'restriction-upload' => 'Bar ke',
 
 # Restriction levels
@@ -2619,7 +2618,7 @@ Revizyoni ya hewn a biyê ya arşiw ra veciyayê ya zi cıresayişê şımayi ş
 'undeletebtn' => 'Timar bike',
 'undeletelink' => 'bıvêne/peyser bia',
 'undeleteviewlink' => 'bıvin',
-'undeleteinvert' => 'vicnayeyi qeldaye açarn',
+'undeleteinvert' => 'Weçinıtışi açarne',
 'undeletecomment' => 'Sebeb:',
 'undeletedrevisions' => 'pêro piya{{PLURAL:$1|1 qeyd|$1 qeyd}} tepiya anciya.',
 'undeletedrevisions-files' => '{{PLURAL:$1|1 revizyon|$1 revizyon}} u {{PLURAL:$2|1 dosya|$2 dosya}} ameyê halê xo yê verıni',
@@ -2649,10 +2648,10 @@ $1',
 'undelete-show-file-submit' => 'E',
 
 # Namespace form on various pages
-'namespace' => 'Heruna naman:',
-'invert' => 'Weçinayan ğariç bıasné',
+'namespace' => 'Heruna nameyan:',
+'invert' => 'Weçinıtışi açarne',
 'tooltip-invert' => 'nameyo ke nışan biyo (u nameyo elekeyın zi nışanyyayo se) vurnayışan  zerrekan nımtışi re ena dore tesdiqi nışan kerê',
-'namespace_association' => 'Elaqedar nameyé cayan',
+'namespace_association' => 'Heruna nameyanê elaqedaran',
 'tooltip-namespace_association' => 'Herunda canemiya elekeyın nışan kerdışi sero qıse kerdışi yana zerre dekerdışi rê ena dora tesdiqi nışan kerê',
 'blanknamespace' => '(Ser)',
 
@@ -3085,8 +3084,8 @@ dosyaya emaneti vindbiyo',
 'tooltip-search' => '{{SITENAME}} miyan de bıvin',
 'tooltip-search-go' => 'Ebe nê namey tami şo yew pela ke esta',
 'tooltip-search-fulltext' => 'Nê  metni peran dı cı geyre',
-'tooltip-p-logo' => 'Şo pera seri',
-'tooltip-n-mainpage' => 'Şo pera seri',
+'tooltip-p-logo' => 'Şo pela seri',
+'tooltip-n-mainpage' => 'Şo pela seri',
 'tooltip-n-mainpage-description' => 'Şo pela seri',
 'tooltip-n-portal' => 'Heqa projey de, kes çı şeno bıkero, çıçiyo koti deyo',
 'tooltip-n-currentevents' => 'Vurnayışanê peyênan de melumatê pey bıvêne',
@@ -3106,12 +3105,12 @@ dosyaya emaneti vindbiyo',
 'tooltip-ca-nstab-main' => 'Perra muhtevay bıvin',
 'tooltip-ca-nstab-user' => 'Pera karberi bıvin',
 'tooltip-ca-nstab-media' => 'Pera medya bıvin',
-'tooltip-ca-nstab-special' => 'Na zu pera bağsi ya, şıma néşené sero vırnayış bıkeré',
+'tooltip-ca-nstab-special' => 'Na yew pela xasa, şıma nêşenê sero vurnayış bıkerê',
 'tooltip-ca-nstab-project' => 'Pera proci bıvin',
 'tooltip-ca-nstab-image' => 'Pera dosyayer bıvin',
 'tooltip-ca-nstab-mediawiki' => 'Mesacané sistemi bıvin',
 'tooltip-ca-nstab-template' => 'Şabloni bıvin',
-'tooltip-ca-nstab-help' => 'Pera destegi bıvin',
+'tooltip-ca-nstab-help' => 'Pela peşti bıvêne',
 'tooltip-ca-nstab-category' => 'Pera kategori bıvin',
 'tooltip-minoredit' => 'Nay vırnayışa werdi nışan bıkeré',
 'tooltip-save' => 'Vurnayışa qeyd ke',
@@ -3181,7 +3180,7 @@ Ney '''Mefiyé de'''!",
 'pageinfo-redirects-name' => 'Hetenayışê na perer',
 'pageinfo-redirects-value' => '$1',
 'pageinfo-subpages-name' => 'Bınpelê na pela',
-'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|hetenayış|hetenayışi}}; $3 {{PLURAL:$3|raykerdışt|raykerdışi}})',
+'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|serçarnayış|serçarnayışi}}; $3 {{PLURAL:$3|nêserçarnayış|nêserçarnayışi}})',
 'pageinfo-firstuser' => 'Pela vıraşter',
 'pageinfo-firsttime' => 'Demê pela vıraştışi',
 'pageinfo-lastuser' => 'Vurnayoğo peyên',
@@ -3795,7 +3794,7 @@ $8',
 'exif-dc-publisher' => 'Hesrekar',
 'exif-dc-relation' => 'Medyay cı',
 'exif-dc-rights' => 'Heqi',
-'exif-dc-source' => 'Medyay çımi',
+'exif-dc-source' => 'Medyaya çımey',
 'exif-dc-type' => 'Babeta medyay',
 
 'exif-rating-rejected' => 'Red ke',
@@ -3840,7 +3839,7 @@ Adresa şıma re qey erşawıtışê e-postayê araştin, butonê cêrıni pıpl
 E-posta yo ke erşawiyeno tede gıreyê kodê araşti esto, gıreyi pıploxne akerê u e-postayê xo araşt kerê.',
 'confirmemail_pending' => 'Yew codê konfirmasyonî ma ti ra şiravt;
 Eka ti newe hesabê xo viraşt, ti gani yew di dekika vindero u email xo kontrol bike, yani reyna yew hesab meviraz.',
-'confirmemail_send' => 'Yew kodê konfirmasyonî email mina bişirave',
+'confirmemail_send' => 'Yew kodê konfirmasyoni bırışe',
 'confirmemail_sent' => 'Emailê konfirmasyonî şiravt',
 'confirmemail_oncreate' => 'Yew codê konfirmasyonî ma ti ra şiravt;
 Ena kod semed ci kewtîşî lazim niyo, feqat ti gani sistem rê eno kod bimocne ke ti opsiyonê emailî wîkî a bike.',
@@ -4107,6 +4106,7 @@ Ti hem zi eşkeno [[Special:EditWatchlist|use the standard editor]].',
 'version-version' => '(Versiyon $1)',
 'version-svn-revision' => '(r$2)',
 'version-license' => 'Lisans',
+'version-ext-license' => 'Lisans',
 'version-poweredby-credits' => "Ena wiki, dezginda '''[https://www.mediawiki.org/ MediaWiki]''' ya piya vıraziyaya, heqê telifi © 2001-$1 $2.",
 'version-poweredby-others' => 'Zewmi',
 'version-poweredby-translators' => "Açernere translatewiki.net'i",
@@ -4152,8 +4152,8 @@ enê programiya piya [{{SERVER}}{{SCRIPTPATH}}/COPYING jew kopyay lisans dê GNU
 # Special:SpecialPages
 'specialpages' => 'Pelê xısusiy',
 'specialpages-note-top' => 'Kıtabek',
-'specialpages-note' => '*Normal pera bağsi.
-* <span class="mw-specialpagerestricted">Peré bağseyé ke groté ver hafıza.</span>',
+'specialpages-note' => '* Pelê xasê normali.
+* <span class="mw-specialpagerestricted">Pelê xasê nımıtey.</span>',
 'specialpages-group-maintenance' => 'Raporê tepıştışi',
 'specialpages-group-other' => 'Pelê xasiyê bini',
 'specialpages-group-login' => 'Cı kewe / hesab vıraze',
index d5b679c..82dcd1b 100644 (file)
@@ -561,7 +561,7 @@ Administrator, kenž jo jen zastajił, jo toś tu pśicynu pódał: "$3".',
 
 # Virus scanner
 'virus-badscanner' => "Špatna konfiguracija: njeznaty wirusowy scanner: ''$1''",
-'virus-scanfailed' => 'Scannowanje jo se njeraźiło (kod $1)',
+'virus-scanfailed' => 'Scannowanje njejo se raźiło (koda $1)',
 'virus-unknownscanner' => 'njeznaty antiwirus:',
 
 # Login and logout pages
@@ -740,7 +740,7 @@ Ty by měł se něnto pśizjawiś a nowe gronidło wustajiś. Jolic něchten dru
 Nachylne gronidło: $2',
 'passwordreset-emailsent' => 'E-mail za anulěrowanje gronidła jo se pósłała.',
 'passwordreset-emailsent-capture' => 'E-mail za anulěrowanje gronidła jo se pósłała, kótaraž pokazujo se dołojce.',
-'passwordreset-emailerror-capture' => 'E-mail za anulěrowanje gronidła jo se napórała, kótaraž se dołojce pokazujo, ale słanje {{GENDER:$2|wužywarjeju|wužywarce}} jo se njeraźiło: $1',
+'passwordreset-emailerror-capture' => 'E-mail za anulěrowanje gronidła jo se napórała, kótaraž se dołojce pokazujo, ale słanje {{GENDER:$2|wužywarjeju|wužywarce}} njejo se raźiło: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'E-mailowu adresu změniś',
@@ -951,11 +951,13 @@ Zda sem až jo wulašowany.',
 'edit-already-exists' => 'Njejo móžno było nowy bok napóraś.
 Eksistěrujo južo.',
 'defaultmessagetext' => 'Standardny tekst powěźeńki',
-'content-failed-to-parse' => 'Parsowanje wopśimjeśa $2 za model $1 jo se njeraźiło: $3',
+'content-failed-to-parse' => 'Parsowanje wopśimjeśa $2 za model $1 njejo se raźiło: $3',
 'invalid-content-data' => 'Njepłaśiwe wopśimjeśowe daty',
 'content-not-allowed-here' => 'Wopśimjeśe "$1" njejo na boku [[$2]] dowólone',
 'editwarning-warning' => 'Gaž toś ten bok se spušća, mógu se změny zgubiś, kótarež sy pśewjadł.
 Jolic sy pśizjawjeny, móžoš toś to warnowanje we wótrězku „Wobźěłaś“ swójich nastajenjow znjemóžniś.',
+'editpage-notsupportedcontentformat-title' => 'Wopśimjeśowy format se njepódpěra.',
+'editpage-notsupportedcontentformat-text' => 'Wopśimjeśowy format $1 njepódpěra se pśez wopśimjeśowy model $2.',
 
 # Content models
 'content-model-wikitext' => 'wikitekst',
@@ -1258,7 +1260,6 @@ Drobnostki móžoš w [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}
 'rows' => 'Rědki:',
 'columns' => 'Słupy:',
 'searchresultshead' => 'Pytaś',
-'resultsperpage' => 'Wuslědki na bok:',
 'stub-threshold' => 'Formatěrowanje  <a href="#" class="stub">wótkaza na zarodk</a> (w bytach):',
 'stub-threshold-disabled' => 'Znjemóžnjony',
 'recentchangesdays' => 'Licba dnjow, kenž se pokazuju w "slědnych změnach":',
@@ -1495,7 +1496,7 @@ Toś ta informacija buźo zjawna.',
 'action-undelete' => 'Toś ten bok wótnowiś',
 'action-suppressrevision' => 'schowanu wersiju pśeglědaś a wótnowiś',
 'action-suppressionlog' => 'toś ten priwatny protokol zwobrazniś',
-'action-block' => 'Toś tomu wužiwarjeju wobźěłowanje zawoboraś',
+'action-block' => 'Toś tomu wužywarjeju wobźěłowanje zawoboraś',
 'action-protect' => 'Šćitowe stopnje za toś ten bok změniś',
 'action-rollback' => 'změny slědnego wužywarja, kótaryž jo wobźěłał wěsty bok, malsnje slědk stajiś',
 'action-import' => 'boki z drugego wikija importěrowaś',
@@ -1764,8 +1765,8 @@ Togodla njedajo se jeje wěstoty pśekontrolěrowaś.',
 'uploadstash-summary' => 'Toś ten bok zmóžnja dostup do datajow, kótarež su nagrate (abo so nagrawaju), ale hyšći njejsu do wikija wózjawjone. Toś te dataje njejsu widobne za nikogo, mimo až za wužywarja, kótaryž jo je nagrał.',
 'uploadstash-clear' => 'Schowane nagrate dataje wulašowaś',
 'uploadstash-nofiles' => 'Njamaš schowane nagrate dataje.',
-'uploadstash-badtoken' => 'Wuwjeźenje teje akcije jo se njeraźiło, snaź dokulaž twóje wobźěłowańske daty su spadnjone. Wopytaj hyšći raz.',
-'uploadstash-errclear' => 'Wótpóranje datajow jo se njeraźiło.',
+'uploadstash-badtoken' => 'Wuwjeźenje teje akcije njejo se raźiło, snaź dokulaž twóje wobźěłowańske daty su spadnjone. Wopytaj hyšći raz.',
+'uploadstash-errclear' => 'Wótpóranje datajow njejo se raźiło.',
 'uploadstash-refresh' => 'Lisćinu datajow aktualizěrowaś',
 'invalid-chunk-offset' => 'Njepłaśiwy startowy dypk',
 
@@ -1791,7 +1792,7 @@ Za optimalnu wěstotu img_auth.php jo znjemóžnjony.',
 # HTTP errors
 'http-invalid-url' => 'Njepłaśiwy URL: $1',
 'http-invalid-scheme' => 'URL ze šemu "$1" se njepódpěraju.',
-'http-request-error' => 'HTTP-napšašowanje jo se njeraźiło njeznateje zmólki dla.',
+'http-request-error' => 'HTTP-napšašowanje njejo se raźiło njeznateje zmólki dla.',
 'http-read-error' => 'Cytańska zmólka HTTP.',
 'http-timed-out' => 'HTTP-napšašowanje jo cas pśekšocyło.',
 'http-curl-error' => 'Zmólka pśi wótwółowanju URL: $1',
@@ -2411,7 +2412,7 @@ W takich padach dejš nejnowše wulašowane wersije markěroanje abo schowanje w
 'undeletedrevisions' => '{{PLURAL:$1|1 wersija jo se nawrośiła|$1 wersiji stej se nawrośiłej|$1 wersije su se nawrośili}}.',
 'undeletedrevisions-files' => '{{PLURAL:$1|1 wersija|$1 wersiji|$1 wersije}} a {{PLURAL:$2|1 dataja|$2 dataji|$2 dataje}} {{PLURAL:$2|jo se nawrośiła|stej se nawrośiłej|su se nawrośili}}.',
 'undeletedfiles' => '{{PLURAL:$1|1 dataja jo se nawrośiła|$1 dataji stej se nawrośiłej|$1 dataje su se nawrośili}}.',
-'cannotundelete' => 'Wótnowjenje jo se njeraźiło:
+'cannotundelete' => 'Wótnowjenje njejo se raźiło:
 $1',
 'undeletedpage' => "Bok '''$1''' jo se nawrośił.
 
@@ -2524,6 +2525,7 @@ Nejnowšy zapisk protokola blokěrowanjow pódawa se dołojce ako referenca:',
 Glědaj do [[Special:BlockList|lisćiny blokěrowanjow]], aby blokěrowanja pśeglědał.',
 'ipb-blockingself' => 'Coš samogo blokěrowaś! Coš to napšawdu cyniś?',
 'ipb-confirmhideuser' => 'Coš rowno wužywarja z nastajenim "wužywarja schowaś" blokěrowaś. To k tomu dowjeźo, až mě wužywarja pódłocyjo se we wšych lisćinach a protokolowych zapiskach. Coš to napšawdu cyniś?',
+'ipb-confirmaction' => 'Jolic sy se wěsty, až coš to napšawdu cyniś, pśeglědaj pšosym dołojce pólo "{{int:ipb-confirm}}".',
 'ipb-edit-dropdown' => 'Pśicyny blokěrowanja wobźěłaś',
 'ipb-unblock-addr' => '$1 dopušćiś',
 'ipb-unblock' => 'Wužywarske mě abo IP-adresu dopušćiś',
@@ -2790,9 +2792,9 @@ Wšykne transwiki-importowe akcije protokolěruju se w [[Special:Log/import|log-
 'importhistoryconflict' => 'Konflikt wersijow (snaź jo toś ten bok južo raz se importěrował)',
 'importnosources' => 'Za transwikijowe importěrowanje njejsu žrědła definěrowane, direktne stawizny nagraśow su znjemóžnjone.',
 'importnofile' => 'Žedna dataja za importěrowanje njejo se nagrała.',
-'importuploaderrorsize' => 'Nagrawanje importoweje dataje jo se njeraźiło. Dataja jo wětša ako dowólona wjelikosć nagraśow.',
-'importuploaderrorpartial' => 'Nagrawanje importoweje dataje jo se njeraźiło. Dataja jo se jano pó źělach nagrała.',
-'importuploaderrortemp' => 'Nagrawanje importoweje dataje jo se njeraźiło. Temporarny zapis feluje.',
+'importuploaderrorsize' => 'Nagrawanje importoweje dataje njejo se raźiło. Dataja jo wětša ako dowólona wjelikosć nagraśow.',
+'importuploaderrorpartial' => 'Nagrawanje importoweje dataje njejo se raźiło. Dataja jo se jano pó źělach nagrała.',
+'importuploaderrortemp' => 'Nagrawanje importoweje dataje njejo se raźiło. Temporarny zapis felujo.',
 'import-parse-failure' => 'Zmólka pśi XML-imporśe:',
 'import-noarticle' => 'Žeden bok za import!',
 'import-nonewrevisions' => 'Wšykne wersije buchu južo pjerwjej importowane.',
@@ -2997,7 +2999,7 @@ HOW '''NIC''' njezapisaś!",
 'markedaspatrollederrortext' => 'Musyš wersiju wuzwóliś.',
 'markedaspatrollederror-noautopatrol' => 'Njesmějoš swóje změny ako kontrolěrowane markěrowaś.',
 'markedaspatrollednotify' => 'Toś ta změna do $1 jo se ako doglědowana markěrowała.',
-'markedaspatrollederrornotify' => 'Markěrowanje ako doglědowane jo se njeraźiło.',
+'markedaspatrollederrornotify' => 'Markěrowanje ako doglědowane njejo se raźiło.',
 
 # Patrol log
 'patrol-log-page' => 'Protokol kontrolow',
@@ -3060,7 +3062,7 @@ $1',
 'minutes' => '{{PLURAL:$1|$1 minutu|$1 minutoma|$1 minutami|$1 minutami}}',
 'hours' => '{{PLURAL:$1|$1 góźinu|$1 góźinoma|$1 góźinami|$1 góźinami}}',
 'days' => '{{PLURAL:$1|$1 dnjom|$1 dnjoma|$1 dnjami|$1 dnjami}}',
-'weeks' => '{{PLURAL: $1|$1 tyźeń|$1 tyźenja|$1 tyźenje|$1 tyźenjow}}',
+'weeks' => '{{PLURAL:$1|$1 tyźeń|$1 tyźenja|$1 tyźenje|$1 tyźenjow}}',
 'months' => '{{PLURAL:$1|$1 mjasecom|$1 mjasecoma|$1 mjasecami}}',
 'years' => '{{PLURAL:$1|$1 lětom|$1 lětoma|$1 lětami}}',
 'ago' => 'pśed $1',
@@ -3557,7 +3559,7 @@ Toś ten wobkšuśeński kod płaśi až do $4.',
 # Scary transclusion
 'scarytranscludedisabled' => '[Pśidawanje interwiki jo deaktiwěrowane]',
 'scarytranscludefailed' => '[Zapśěgnjenje pśedłogi za $1 njejo se raźiło]',
-'scarytranscludefailed-httpstatus' => '[Wótwołanje pśedłogi za $1 jo se njeraźiło: HTTP $2]',
+'scarytranscludefailed-httpstatus' => '[Wótwołanje pśedłogi za $1 njejo se raźiło: HTTP $2]',
 'scarytranscludetoolong' => '[URL jo pśedłujki]',
 
 # Delete conflict
@@ -3682,7 +3684,7 @@ Móžoš teke [[Special:EditWatchlist|standardny wobźěłowański bok wužywaś
 'version-parser-function-hooks' => 'Parserowe funkcije',
 'version-hook-name' => 'Mě kokule',
 'version-hook-subscribedby' => 'Aboněrowany wót',
-'version-version' => '(Wersija $1)',
+'version-version' => '($1)',
 'version-license' => 'Licenca MediaWiki',
 'version-ext-license' => 'Licenca',
 'version-ext-colheader-name' => 'Rozšyrjenje',
@@ -3869,7 +3871,7 @@ Hować móžoš slědujucy jadnory formular wužywaś. Twój komentar pśidajo s
 'feedback-submit' => 'Komentar wótpósłaś',
 'feedback-adding' => 'Komentar pśidawa se bokoju...',
 'feedback-error1' => 'Zmólka: Njepóznaty wuslědk wót API',
-'feedback-error2' => 'Zmólka: Wobźěłanje jo se njeraźiło',
+'feedback-error2' => 'Zmólka: Wobźěłanje njejo se raźiło',
 'feedback-error3' => 'Zmólka: Žedne wótegrono wót API',
 'feedback-thanks' => 'Źěkujomy se! Twój komentar jo se k bokoju "[$2 $1]" pósłał.',
 'feedback-close' => 'Dokóńcony',
@@ -3890,7 +3892,7 @@ Hować móžoš slědujucy jadnory formular wužywaś. Twój komentar pśidajo s
 'api-error-duplicate-popup-title' => '{{PLURAL:$1|Dwójna dataja|Dwójnej dataji|Dwójne dataje|Dwójne dataje}}',
 'api-error-empty-file' => 'Dataja, kótaruž sy nagrał, jo prozna była.',
 'api-error-emptypage' => 'Napóranje nowych, proznych bokow njejo dowólone.',
-'api-error-fetchfileerror' => 'Nutśikowna zmólka: Pśii wobstarowanju dataje jo se něco njeraźiło.',
+'api-error-fetchfileerror' => 'Nutśikowna zmólka: Pśi wobstarowanju dataje něco njejo se raźiło.',
 'api-error-fileexists-forbidden' => 'Dataja z mjenim "$1" južo eksistěrujo, a njedajo se pśepisaś.',
 'api-error-fileexists-shared-forbidden' => 'Dataja z mjenim "$1" južo eksistěrujo w zgromadnem datajowem repozitoriumje a njedajo se pśepisaś.',
 'api-error-file-too-large' => 'Dataja, kótaruž sy nagrał, jo pśewjelika była.',
@@ -3901,7 +3903,7 @@ Hować móžoš slědujucy jadnory formular wužywaś. Twój komentar pśidajo s
 'api-error-hookaborted' => 'Změna, kótaruž sy wopytał pśewjasć, jo se pśetergnuła pśez rozšyrjenje.',
 'api-error-http' => 'Nutśikowna zmólka: Zwisk ze serwerom njemóžno.',
 'api-error-illegal-filename' => 'Datajowe mě njejo dowólone.',
-'api-error-internal-error' => 'Nutśikowna zmólka: Pśi pśeźěłowanju twójogo nagraśa na wiki jo se něco njeraźiło.',
+'api-error-internal-error' => 'Nutśikowna zmólka: Pśi pśeźěłowanju twójogo nagraśa na wiki něco njejo se raźiło.',
 'api-error-invalid-file-key' => 'Nutśikowna zmólka: Dataja njejo se w temporernem składowaku namakała.',
 'api-error-missingparam' => 'Nutśikowna zmólka: Felujuce parametry pśi napšašowanju.',
 'api-error-missingresult' => 'Nutśikowna zmólka: Njedajo se zwěsćiś, lěc kopěrowanje jo se raźiło.',
@@ -3917,7 +3919,7 @@ Hować móžoš slědujucy jadnory formular wužywaś. Twój komentar pśidajo s
 'api-error-timeout' => 'Serwer njejo we wócakanem casu wótgronił.',
 'api-error-unclassified' => 'Njeznata zmólka jo nastała.',
 'api-error-unknown-code' => 'Njeznata zmólka: "$1"',
-'api-error-unknown-error' => 'Nutśikowna zmólka: Pśi nagrawanju twójeje dataje jo se něco njeraźiło.',
+'api-error-unknown-error' => 'Nutśikowna zmólka: Pśi nagrawanju twójeje dataje něco njejo se raźiło.',
 'api-error-unknown-warning' => 'Njeznate warnowanje: $1',
 'api-error-unknownerror' => 'Njeznata zmólka: "$1".',
 'api-error-uploaddisabled' => 'Nagraśa su na toś tom wikiju znjemóžnjone.',
index ad0665c..7257deb 100644 (file)
@@ -16,6 +16,7 @@ $fallback = 'it';
 $messages = array(
 # User preference toggles
 'tog-underline' => "Tîra 'na rîga sòta i colegamèint.",
+'tog-justify' => 'Mésa in ōrdin di carâter di peréiod.',
 'tog-hideminor' => "Lōga 'l mudéfichi pió céchi int al j ûltmi mudéfichi.",
 'tog-hidepatrolled' => "Lōga 'l mudéfichi verifichêdi int al j ûltmi mudéfichi",
 'tog-newpageshidepatrolled' => "Lōga al pàgini verifichêdi da l'elèinch dal pàgini pió nōvi.",
@@ -27,6 +28,46 @@ $messages = array(
 'tog-editsection' => 'Mudéfica dal sesiòun per mèz dal colegamèint [mudéfica].',
 'tog-editsectiononrightclick' => 'Mudéfica dal sesiòun per mèz dal cléch a dréta insém al tétol.',
 'tog-showtoc' => "Fà vèder al sûnt (p'r al pàgini cun pió 'd 3 sesiòun)",
+'tog-rememberpassword' => "Tîn a mèint la cêva 'd ingrès insém a cól navigadōr ché (per un mâsim ed $1{{PLURAL:$1|dé}}).",
+'tog-watchcreations' => "Zûnta al pàgini fâti e i file carghê int i tgnû 'd ôc specêl.",
+'tog-watchdefault' => "Zûnta al pàgini e i file mudifichê int i tgnû 'd ôc specêl.",
+'tog-watchmoves' => "Zûnta al pàgini e i file spustê int i tgnû 'd ôc specêl.",
+'tog-watchdeletion' => "Zûnta al pàgini e i file scanşlê int i tgnû 'd ôc specêl.",
+'tog-minordefault' => 'Sògna ògni mudéfica cme céca (sōl cme pre-stabilî)',
+'tog-previewontop' => "Fà vèder còl ch' ò fât sōver la caşèla ed mudéfica e mìa sòta.",
+'tog-previewonfirst' => "Fà vèder còl ch' ò fât almēno 'na vôlta préma 'd salvêr",
+'tog-enotifwatchlistpages' => "Mândon un avîş cun la pôsta eletrônica quând a vîn cambiê 'na pàgina o un file preşèint int i tgnû 'd ôc specêl",
+'tog-enotifusertalkpages' => "Mândon un avîş cun la pôsta eletrônica quând a vîn cambiê la mé pàgina 'd discusiòun",
+'tog-enotifminoredits' => "Mândom un avîş ânca p'r al mudéfichi céchi ed pàgini e file",
+'tog-enotifrevealaddr' => "Fà vèder al mé indirés ed la pôsta eletrônica int i mesâg 'd avîş",
+'tog-shownumberswatching' => "Fà vèder al nómer ed j utèint che gh'àn la pàgina sòta uservasiòun",
+'tog-oldsig' => "La fîrma 'd adèsa",
+'tog-fancysig' => 'Trâta la fîrma cme wikitèst (sèinsa colegamèint avtomâtich)',
+'tog-uselivepreview' => 'Permèt la funsiòun "Live preview" (guêrda préma \'d salvêr dal vîv - in sperimèint)',
+'tog-forceeditsummary' => "Dmânda s'l'è vèira che al câmp argumèint l' é vōd",
+'tog-watchlisthideown' => "Lōga al mé mudéfichi int i  tgnû 'd ôc specêl",
+'tog-watchlisthidebots' => "Lōga al mudéfichi di bot int i tgnû 'd ôc specêl",
+'tog-watchlisthideminor' => "Lōga al mudéfichi céchi int i tgnû 'd ôc specêl",
+'tog-watchlisthideliu' => "Lōga al mudéfichi 'd j utèint registrê int i tgnû 'd ôc specêl",
+'tog-watchlisthideanons' => "Lōga al mudéfichi 'd j utèint sèinsa nòm int i tgnû 'd ôc specêl",
+'tog-watchlisthidepatrolled' => "Lōga al mudéfichi verifichêdi int i tgnû 'd ôc specêl",
+'tog-ccmeonemails' => "Mândom 'na côpia di mesâg spidî a chiêter utèint",
+'tog-diffonly' => "An fê mia vèder còl che gh'é dèinter int la pàgina dôp al cunfrûnt tr'al versiòun",
+'tog-showhiddencats' => 'Fà vèder al categoréi lughêdi',
+'tog-norollbackdiff' => 'An fê mia vèder al cunfrûnt tr\' al versiòun dôp avèir fât un "rollback"',
+'tog-useeditwarning' => "Avîşom quând a vâgh fōra da 'na pàgina d' mudéfica e an n'ò mìa salvê al mudéfichi fâti",
+'tog-prefershttps' => "Drōva sèimper un colegamèint sicûr quând ét fê l'ingès",
+
+'underline-always' => 'Sèimper',
+'underline-never' => 'Mài',
+'underline-default' => "Mantî al j impustasiòun dal navigadōr o 'd la skin",
+
+# Font style option in Special:Preferences
+'editfont-style' => "Stîl dal carâter int la caşèla 'd mudéfica:",
+'editfont-default' => 'Pre-stabilî dal navigadōr',
+'editfont-monospace' => 'Carâter a larghésa fésa',
+'editfont-sansserif' => 'Carâter sans-serif',
+'editfont-serif' => 'Carâter serif',
 
 # Dates
 'sunday' => 'Dumènica',
@@ -79,6 +120,18 @@ $messages = array(
 'oct' => 'Utò',
 'nov' => 'Nov',
 'dec' => 'Dic',
+'january-date' => 'Znêr $1',
+'february-date' => 'Fervêr $1',
+'march-date' => 'Mêrs $1',
+'april-date' => 'Avrîl $1',
+'may-date' => 'Mâg $1',
+'june-date' => 'Zógn $1',
+'july-date' => 'Lój $1',
+'august-date' => 'Agòst $1',
+'september-date' => 'Setèmber $1',
+'october-date' => 'Otòber $1',
+'november-date' => 'Novèmber $1',
+'december-date' => 'Dicèmber $1',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Categoréia!Categoréi}}',
@@ -87,30 +140,47 @@ $messages = array(
 'category-media-header' => "File int la categoréia ''$1''",
 'category-empty' => '"Al mumèint la categoréia l\'an ghà mìa nisóna pàgina o file multimediêl."',
 'hidden-categories' => '{{PLURAL:$1|Categoréia lughêda|Categoréi lughêdi}}',
+'hidden-category-category' => 'Categoréi lughêdi',
 'category-subcat-count' => "{{PLURAL:$2|In cla categoréia ché a gh'é sōl 'n'ónica sòt-categoréia.| In cla categoréia ché a gh'é {{PLURAL:$1|la sòt-categoréia sgnêda|al $1 sòt-categoréi sgnêdi}} ed sègvit, só 'n totêl ed $2.}}",
+'category-subcat-count-limited' => "In cla categoréia ché a gh'é{{PLURAL:$1|'na sòt-categoréia, nutêda|$1 sòt-categoréi, nutêdi}}ché 'd sègvit.",
 'category-article-count' => "{{PLURAL:$2|In cla categoréia ché a gh'é sōl 'na pàgina, sgnêda ché.|In cla categoréia ché gh'é{{PLURAL:$1|la pàgina sgnêda| al pàgini $1 sgnêdi}} ed sègvit, in un totêl ed $2.}}",
+'category-article-count-limited' => "In cla categoréia ché a gh'é {{PLURAL:$1|la pàgina nutêda|al  $1 pàgini nutêdi ch'é 'd sègvit.}}",
 'category-file-count' => "{{PLURAL:$2|In cla categoréia ché a gh'é sōl un file, sgnê ché.|In cla categoréia ché gh'é{{PLURAL:$1|un file sgnê ché| i file $1, sgnê}} ed sègvit, in un totêl ed $2.}}",
+'category-file-count-limited' => "In cla categoréia ché a gh'é {{PLURAL:$1|al file nutê|i $1 file nutê}} ché 'd sègvit.",
 'listingcontinuesabbrev' => 'cunt.',
+'index-category' => 'Pàgini gancêdi',
+'noindex-category' => 'Pàgini mìa gancêdi',
+'broken-file-category' => "Pàgini cun dèinter di file ch' an gh'în mìa.",
 
 'about' => 'Infumasiòun',
+'article' => "Còl che gh'é int la pàgina",
 'newwindow' => "(a s'arvés 'na fnèstra nōva)",
 'cancel' => 'Scanşèla',
+'moredotdotdot' => 'Êter...',
+'morenotlisted' => "Cl'elèinch ché an n'é mìa finî.",
+'mypage' => 'Pàgina',
 'mytalk' => 'Al mē discusiòun',
+'anontalk' => "Discusiòun per cl' IP ché",
 'navigation' => 'Navigasiòun',
 'and' => '&#32;e',
 
 # Cologne Blue skin
 'qbfind' => 'Câta',
+'qbbrowse' => 'Sfòja',
 'qbedit' => 'Mudéfica',
 'qbpageoptions' => "Siēlti 'd la pàgina",
 'qbmyoptions' => 'Al mē pàgini',
 'faq' => 'Dmândi fâti',
+'faqpage' => 'Project:Dmândi fâti despès',
 
 # Vector skin
 'vector-action-addsection' => 'Zûnta discusiòun',
 'vector-action-delete' => 'Scanşèla',
 'vector-action-move' => 'Spôsta',
 'vector-action-protect' => 'Prutēz',
+'vector-action-undelete' => 'Fà al recóper',
+'vector-action-unprotect' => 'Câmbia la prutesiòun',
+'vector-simplesearch-preference' => 'Drōva la bâra per la sērca pió fâcila (sōl per la skin Vector)',
 'vector-view-create' => 'Invèinta',
 'vector-view-edit' => 'Mudéfica',
 'vector-view-history' => 'Guêrda la stôria',
@@ -120,6 +190,7 @@ $messages = array(
 'namespaces' => 'Spâsi di nòm',
 'variants' => 'Mudéfichi',
 
+'navigation-heading' => "Lésta 'd navigasiòun",
 'errorpagetitle' => 'Erōr',
 'returnto' => 'Tōrna a $1',
 'tagline' => 'Da {{SITENAME}}',
@@ -130,15 +201,19 @@ $messages = array(
 'searcharticle' => 'Và',
 'history' => "Stòria 'd la pàgina",
 'history_short' => 'Stôria',
+'updatedmarker' => 'cambiêda da la mé ûltma vişita',
 'printableversion' => "Stâmpa la pàgina ch' ét vèd.",
 'permalink' => 'Colegamèint fés',
 'print' => 'Stâmpa',
 'view' => 'Guêrda',
 'edit' => 'Mudéfichi',
 'create' => 'Invèinta',
+'editthispage' => 'Mudéfica cla pàgina ché',
+'create-this-page' => 'Fà cla pàgina ché',
 'delete' => 'Scanşéla',
 'deletethispage' => 'Scanşéla cla pàgina ché',
-'undelete_short' => "Recóper ed {{PLURAL:$1|'na revişiòun|$1 revişiòun}}",
+'undeletethispage' => "Fà 'l recóper ed cla pàgina ché",
+'undelete_short' => "Recóper ed {{PLURAL:$1|'na versiòun|$1 versiòun}}",
 'viewdeleted_short' => "Guèrda {{PLURAL:$1|'na mudéficha scanşlêda|$1 mudéfichi scanşlêdi}}",
 'protect' => 'Prutēz',
 'protect_change' => 'Câmbia',
@@ -172,6 +247,12 @@ $messages = array(
 'jumpto' => 'Và a:',
 'jumptonavigation' => 'Navigasiòun',
 'jumptosearch' => 'Sērca',
+'view-pool-error' => 'In cól mumèint ché i terminêl în trôp câregh.
+Trôp utèint în drē serchêr ed vèder cla pàgina ché.
+Spèta soquânt minût préma ed pruvêr incòra a carghêr la pgina.
+
+$1',
+'pool-timeout' => "Tèimp che gh'é da spetêr préma dal sblôch.",
 'pool-queuefull' => 'A ghé la fîla, trôpa gînta a vōl vèder la pàgina, prōva tra soquânt minût',
 'pool-errorunknown' => 'Erōr mìa cgnusû',
 
@@ -194,9 +275,21 @@ $messages = array(
 'privacy' => 'Infurmasiòun só la véta privêda',
 'privacypage' => 'Project:Règoli só la secretèsa dal j infurmasiòun personêli.',
 
+'badaccess' => 'I permès în mìa asê',
+'badaccess-group0' => "An 't gh'è mìa i permès necesâri per fêr còl che t'é dmandê.",
+'badaccess-groups' => "La funsiòun dmandêda l'é riservêda a j utèint che fân pêrt {{PLURAL:$2|al gróp|a ûn di gróp ché sòta}}: $1",
+
+'versionrequired' => "L'é necesâria la versiòun $1 ed MediaWiki",
+'versionrequiredtext' => "Per druvê cla pàgina ché l'é necesâri avèir la versiòun $1 dal prugrâma MediaWiki. Guêrda [[Special:Version|la pàgina apôsta]].",
+
 'ok' => 'Va bèin',
 'retrievedfrom' => 'Tôt da "$1".',
 'youhavenewmessages' => "{{PLURAL:$3|T'ê}} $1 ($2)",
+'youhavenewmessagesfromusers' => '{{PLURAL:$4|Ét ghê}} $1 da {{PLURAL:$3|un êter utèint|$3 utèint}} ($2).',
+'youhavenewmessagesmanyusers' => "Ét gh'ê $1 da dimòndi utèint $2.",
+'newmessageslinkplural' => '{{PLURAL:$1|un nōv mesâg|999=nōv mesâg}}',
+'newmessagesdifflinkplural' => '{{PLURAL:$1|ûltma mudéfica|999=ûltmi mudéfichi}}',
+'youhavenewmessagesmulti' => "Ét gh'ê di mesâg nōv insém a $1",
 'editsection' => 'Mudéfica',
 'editold' => 'mudéfica',
 'viewsourceold' => 'guêrda la surzéia',
@@ -234,15 +327,54 @@ $messages = array(
 'nstab-help' => 'Per quî rivê da pôch',
 'nstab-category' => 'Categoréia',
 
+# Main script and global functions
+'nosuchaction' => 'Operasiòun mìa arcgnusûda',
+'nosuchactiontext' => "Còl che t'é scrét int l' URL an n'é mìa vâlid.
+L'é anca pusébil che la URL la sia stêda scréta şbaliêda o che sia stê fât un colegamèint mìa vâlid.
+Còst al pré ânca dîr che gh'é un bug in {{SITENAME}}.",
+'nosuchspecialpage' => "La pàgina specêla l'an gh'é mìa.",
+'nospecialpagetext' => "<strong>La pàgina specêla serchêda an n'é mìa stêda arcgnusûda</strong>
+
+L'elèinch dal pàgini specêli vâlidi a 's câta in [[Special:SpecialPages|Elèinch dal pàgini specêli]].",
+
 # General errors
 'error' => 'Erōr',
 'databaseerror' => "Erōr dal 'database'",
+'databaseerror-text' => 'È sucès un erōr de dmânda insém al databêş.
+A pré ânch èser un bug int al prugrâma.',
+'databaseerror-textcl' => 'È sucès un erōr de dmânda insém al databêş.',
+'databaseerror-query' => 'Istrusiòun SQL: $1',
+'databaseerror-function' => 'Funsiòun: $1',
+'databaseerror-error' => 'Erōr: $1',
+'laggedslavemode' => "'''Atèinti:''' la pàgina la pré avèir mìa al revisiòun pió nōv.",
 'readonly' => "'Database' bluchê",
-'missing-article' => "Al datebêş an n'à mìa catê al tèst ed 'na pàgina ch' l' aré duvû catêres sòt' al nòm \"\$1\" \$2. Ed sôlit còst a sucēd quând a vîn arciamê, a partîr da la stòria dal mudéfichi o dal cunfrûnt tra revişiòun, un colegamèint a 'na pàgina scanşlêda, a un cunfrûnt tra revişiòun che gh'în mìa o a un cunfrûnt tra revişiòun cun la stòria dal mudéfichi scanşlêda. In chês cuntrâri, a s'é pubabilmèint catê un erōr int al prugrâma ed Media Wiki. A se dmânda al piaşèir ed comunichêr còl ch'é sucès a un [[Special:ListUsers/sysop|amministadōr]] e comunichêregh l'indirés (URL) in quistiòun.",
-'missingarticle-rev' => '(revişiòun n°: $1)',
+'enterlockreason' => "Scréver al mutîv dal blôch, precişêr quând a 's pèinsa che 'l vègna tôt via.",
+'readonlytext' => "In cól mumèint ché al databêş l'é bluchê e an 's pōlen fêr né zûnti né mudéfichi. Al blôch ed sôlit l'é lighê a 'na revişiòun normêla e quând la srà finîda al gnirà sbluchê. 
+
+L'aminitradōr dal sistēma ch' al l'à bluchê l'à dê cla spiegasiòun ché: $1",
+'missing-article' => "Al datebêş an n'à mìa catê al tèst ed 'na pàgina ch' l' aré duvû catêres sòt' al nòm \"\$1\" \$2. Ed sôlit còst a sucēd quând a vîn arciamê, a partîr da la stòria dal mudéfichi o dal cunfrûnt tra versiòun, un colegamèint a 'na pàgina scanşlêda, a un cunfrûnt tra versiòun che gh'în mìa o a un cunfrûnt tra versiòun cun la stòria dal mudéfichi scanşlêda. In chês cuntrâri, a s'é pubabilmèint catê un erōr int al prugrâma ed Media Wiki. A se dmânda al piaşèir ed comunichêr còl ch'é sucès a un [[Special:ListUsers/sysop|amministadōr]] e comunichêregh l'indirés (URL) in quistiòun.",
+'missingarticle-rev' => '(nómer ed la versiòun: $1)',
 'missingarticle-diff' => '(Diff: $1, $2)',
+'readonly_lag' => "Al databêş l'é stê bluchê in avtomàtich per permèter a i terminêl cun al databêş schiêv ed mètres in pâs cun al master",
 'internalerror' => 'Erōr intêren',
 'internalerror_info' => 'Erōr intêren: $1',
+'fileappenderrorread' => 'An n\'é mìa stê pusébil lēşer "$1" mèinter es fêva la zûnta.',
+'fileappenderror' => 'An n\'é mìa pusébil zuntêr "$1" a "$2".',
+'filecopyerror' => 'An n\'é mìa pusébil cupiêr al file "$1" in "$2".',
+'filerenameerror' => 'An n\'é mìa pusébil cambiêr al nòm ed "$1" in "$2".',
+'filedeleteerror' => 'An n\'é mìa pusébil scanşlêr al file "$1".',
+'directorycreateerror' => 'An n\'é mìa pusébil fêr la directory "$1".',
+'filenotfound' => 'An n\'é mìa pusébil catêr al file "$1".',
+'fileexistserror' => 'An n\'é mìa pusébil scréver al file "$1": al file al gh\'é bèle.',
+'unexpected' => 'Valōr mìa pervést "$1"="$2".',
+'formerror' => "Erōr: an n'é ma pusébil spidîr al môdul.",
+'badarticleerror' => 'Operasiòun mìa permésa per cla pàgina ché.',
+'cannotdelete' => 'An n\'é mìa stê pusébil scanşlêr la pàgina o al file "$1".
+Al pré èser bèle stê scanşlê da quelchidûn êter.',
+'cannotdelete-title' => 'Impusébil scanşlêr la pàgina "$1".',
+'delete-hook-aborted' => "L' hook an n'à mia permés la scanşladûra.
+An n'é mìa stê dê la spiegasiòun.",
+'no-null-revision' => 'An pōl èser fât \'na versiòun mìa vâlida per la pàgina "$1"',
 'badtitle' => 'Tétol mìa curèt.',
 'badtitletext' => "Al tétol ed la pàgina serchêda l'é vōd, şbaliê opór al deşvîn da 'n erōr int i colegamèint di côdis o int i colegamèint druvê in wiki. In pió al pré avèir ûn o pió carâter ch'an pōlen mìa èser druvê int i tétol.",
 'viewsource' => 'Guêrda la surzéia',
@@ -264,7 +396,9 @@ $messages = array(
 'nologin' => "An gh'èt mìa incòra un ingrès? $1",
 'nologinlink' => 'Fà la tó inscrisiòun',
 'createaccount' => 'Fà la tó inscrisiòun',
+'gotaccount' => "Gh'èt bèle un ingrès? $1",
 'gotaccountlink' => 'Và dèinter',
+'userlogin-resetlink' => "T'ét scurdê j elemèint p'r al tó ingrès?",
 'createaccountmail' => "Drōva 'na cêva 'd ingrès a chêş pruvişôria e spidésla a l'indirés ed pôsta eletrônica sgnê.",
 'createaccountreason' => 'Mutîv:',
 'loginerror' => "Erōr 'd ingrès",
@@ -331,6 +465,7 @@ Al tō mudéfichi în MIA incòra stêdi salvêdi.",
 'template-protected' => '(prutèt)',
 'template-semiprotected' => '(mèz-prutèt)',
 'hiddencategories' => "Cla pàgina ché l' é 'd {{PLURAL:$1|'na categoréia lughêda|$1 categoréi lughêdi}}:",
+'permissionserrorstext-withaction' => "An 's gh'à mìa i permès necesâri per $2, per{{PLURAL:$1|cól mutîv ché|chi mutîv ché}}:",
 'recreate-moveddeleted-warn' => "'''Atensiòun: a s'é drē serchêr ed fêr 'na pàgina bèle scanşlêda tèimp fa'''. 
 
 Asicurêres che sìa dabòun necesâri cuntinvêr a mudifichêr cla pàgina ché.
@@ -347,19 +482,19 @@ Per cumditê còst l'é l'èlèinch dal scanşladûri e di spustamèint relatîv
 
 # History pages
 'viewpagelogs' => "Guêrda la stòria 'd cla pàgina ché",
-'currentrev' => 'Ûltma revişiòun',
-'currentrev-asof' => 'Ûltma revişiòun dal $1',
-'revisionasof' => 'Revişiòun dal $1',
-'revision-info' => 'Revişiòun ed $1, avtōr: $2',
-'previousrevision' => '← Revişiòun pió vècia',
-'nextrevision' => 'Revişiòun pió nōva →',
-'currentrevisionlink' => 'Ûltma revişiòun',
+'currentrev' => 'Ûltma versiòun',
+'currentrev-asof' => 'Ûltma versiòun dal $1',
+'revisionasof' => 'Versiòun dal $1',
+'revision-info' => 'Versiòun ed $1, avtōr: $2',
+'previousrevision' => '← Versiòun pió vècia',
+'nextrevision' => 'Versiòun pió nōva →',
+'currentrevisionlink' => 'Ûltma versiòun',
 'cur' => 'cur',
 'next' => 'Còl dôp',
 'last' => 'Còl préma',
 'page_first' => 'préma',
 'page_last' => 'ûltem',
-'histlegend' => "Cunfrûnt tra 'l revişiòun:  sernés al caşèli cumpâgni al revişiòun vrûdi e schésa Invio o al ptòun in bâs. Spiegasiòun: : '''({{int:cur}})''' = diferèinsi cun la revişiòun d' adèsa, '''({{int:last}})''' = diferèinsi cun la revişiòun ed préma, '''{{int:minoreditletter}}''' = mudéfica céca.",
+'histlegend' => "Cunfrûnt tra 'l versiòun:  sernés al caşèli cumpâgni al versiòun vrûdi e schésa Invio o al ptòun in bâs. Spiegasiòun: : '''({{int:cur}})''' = diferèinsi cun la versiòun d' adèsa, '''({{int:last}})''' = diferèinsi cun la versiòun ed préma, '''{{int:minoreditletter}}''' = mudéfica céca.",
 'history-fieldset-title' => "Nâviga int la stòria 'd la pàgina",
 'history-show-deleted' => 'Sōl quî scanşlê',
 'histfirst' => 'préma',
@@ -381,7 +516,7 @@ Per cumditê còst l'é l'èlèinch dal scanşladûri e di spustamèint relatîv
 # Diffs
 'history-title' => '$1 stòria dal mudéfichi',
 'lineno' => 'Rîga $1:',
-'compareselectedversions' => 'Cunfrûnta al revişiòun sernîdi.',
+'compareselectedversions' => 'Cunfrûnta al versiòun sernîdi.',
 'editundo' => 'scanşèla',
 'diff-multi' => "({{PLURAL:$2|'Na revişion ed mèz|$1 revişiòun ed mèz}} di {{PLURAL:$2|un utèint|$2 utèint}} mìa {{PLURAL:$1|fâta vèder|fâti vèder}})",
 
@@ -408,6 +543,7 @@ Per cumditê còst l'é l'èlèinch dal scanşladûri e di spustamèint relatîv
 'searchprofile-everything-tooltip' => "Sērca dapertót (ânch int al pàgini 'd discusuòun).",
 'searchprofile-advanced-tooltip' => 'Sērca int i spâsi di nòm fât só mzûra.',
 'search-result-size' => "$1 ({{PLURAL:$2|'na parôla|$2 parôli}})",
+'search-result-category-size' => '{{PLURAL:$1|1 utèint|$1 utèint}} ({{PLURAL:$2|1 sotcategoréia|$2 sotcategoréi}},{{PLURAL:$3|1 file|$3 files}})',
 'search-redirect' => '(redirect $1)',
 'search-section' => '(sesiòun $1)',
 'search-suggest' => "Fōrsi 't serchêv $1",
@@ -450,6 +586,8 @@ Per cumditê còst l'é l'èlèinch dal scanşladûri e di spustamèint relatîv
 'yourrealname' => 'Nòm vèira:',
 'yourlanguage' => 'Léngua',
 'email' => 'E-mail',
+'prefs-help-email' => "Mèter l'indéris ed la tó pôsta eletrônica an n'é mia necesâri, mó al permèt ed ricêver la cêva 'd ingrès se per chêş ét la scurdés.",
+'prefs-help-email-others' => "Ét pō ânca sernîr ed lasêr che chiêter a 's mèten in cuntât  tēgh cun la pôsta eletrônica cun al colegamèint da la tó pàgina utèint o da còla 'd discusiòun.  Al tó indirés al vîn mìa fât savèir a quî ch'ét 's mèten in cuntât tēgh.",
 
 # Groups
 'group' => 'Gróp:',
@@ -507,6 +645,7 @@ Per cumditê còst l'é l'èlèinch dal scanşladûri e di spustamèint relatîv
 'rcshowhidebots' => '$1 i bot',
 'rcshowhideliu' => '$1 j utèint registrê',
 'rcshowhideanons' => '$1 j utèint sèinsa nòm.',
+'rcshowhidepatr' => '$1 al mudéfichi verifichêdi',
 'rcshowhidemine' => '$1 al mē mudéfichi',
 'rclinks' => 'Fà vèder al $1 ûltmi mudéfichi fâti int j ûltem $2 dé<br />$3',
 'diff' => 'dif',
@@ -552,7 +691,7 @@ Per cumditê còst l'é l'èlèinch dal scanşladûri e di spustamèint relatîv
 'filehist-current' => '(adès)',
 'filehist-datetime' => 'Dâta/Ōra',
 'filehist-thumb' => 'Miniadûra',
-'filehist-thumbtext' => 'Miniadûra ed la revişiòun dal $1.',
+'filehist-thumbtext' => 'Miniadûra ed la versiòundal $1.',
 'filehist-user' => 'Utèint',
 'filehist-dimensions' => 'Amzûri',
 'filehist-comment' => 'Cumèint',
@@ -610,6 +749,7 @@ Per cumditê còst l'é l'èlèinch dal scanşladûri e di spustamèint relatîv
 'listgrouprights-members' => "(elèinch 'd j inscrét)",
 
 # Email user
+'emailuser' => "Scrév a l'utèint",
 'emailfrom' => 'Da:',
 'emailto' => 'A:',
 'emailsubject' => 'Argumèint:',
@@ -623,6 +763,7 @@ Per cumditê còst l'é l'èlèinch dal scanşladûri e di spustamèint relatîv
 'watch' => 'Và adrē',
 'watchthispage' => 'Và adrē a cla pàgina ché',
 'unwatch' => 'Andêr mìa adrē',
+'watchlist-details' => "La lésta 'd quî tgnû 'd ôc specêl la gh'à {{PLURAL:$1|'na pàgina (e la relatîva pàgina 'd discusiòun)|$1 pagine (e al relatîvi  pàgini 'd discusiòun)}}.",
 'wlshowlast' => 'Fà vèder al j ûltmi $1 ōri $2 dé $3',
 'watchlist-options' => 'Siēlti di tgnû sòt ôc specêl.',
 
@@ -678,7 +819,7 @@ Per cumditê còst l'é l'èlèinch dal scanşladûri e di spustamèint relatîv
 'sp-contributions-talk' => 'discusiòun',
 'sp-contributions-search' => 'Sērca i lavōr fât',
 'sp-contributions-username' => 'Indirés IP o nòm utèint',
-'sp-contributions-toponly' => "Fà vèder sōl i lavōr ch' în al j ûltmi revişiòun per la pàgina.",
+'sp-contributions-toponly' => "Fà vèder sōl i lavōr ch' în al j ûltmi versiòun per la pàgina.",
 'sp-contributions-submit' => 'Sērca',
 
 # What links here
@@ -686,7 +827,7 @@ Per cumditê còst l'é l'èlèinch dal scanşladûri e di spustamèint relatîv
 'whatlinkshere-title' => 'Pàgini che pûnten a "$1"',
 'whatlinkshere-page' => 'Pàgina:',
 'linkshere' => "Al pàgini segvèinti a gh'àn di colegamèint a '''[[:$1]]'''.",
-'nolinkshere' => "Nisóna pàgina la gh'à dèinter colegamèint che pûnten a '''[[$1]]'''.",
+'nolinkshere' => "Nisóna pàgina la gh'à dèinter colegamèint che pûnten a '''[[:$1]]'''.",
 'isredirect' => 'Pàgina redirect',
 'istemplate' => 'uniòun',
 'isimage' => "Colegamèint vêrs al 'file'",
@@ -718,6 +859,7 @@ Per cumditê còst l'é l'èlèinch dal scanşladûri e di spustamèint relatîv
 'blocklogpage' => 'Blôch',
 'blocklogentry' => "t'é bluchê [[$1]] per un peréiod ed $2 $3",
 'unblocklogentry' => "l'à şbluchê $1",
+'block-log-flags-nocreate' => 'Registrasiòun bluchêda',
 
 # Move page
 'move-page' => 'Spustamèint ed $1',
@@ -759,7 +901,7 @@ Per cumditê còst l'é l'èlèinch dal scanşladûri e di spustamèint relatîv
 'tooltip-ca-edit' => 'Ét pō mudifiche cla pàgina ché. Per piaşèir drōva al ptòun "Guêrda préma" préma \'d salvêr còl che t\'é fât.',
 'tooltip-ca-addsection' => "Cumîncia 'na sesiòun nōva.",
 'tooltip-ca-viewsource' => "Cla pàgina ché l'é sòta prutesiòun, mó 't pō vèder al só côdis surzéia.",
-'tooltip-ca-history' => 'Revişiòun fâti a cla pàgina ché.',
+'tooltip-ca-history' => 'Versiòun ed préma fâti a cla pàgina ché.',
 'tooltip-ca-protect' => 'Prutēz cla pàgina ché',
 'tooltip-ca-delete' => 'Scanşéla cla pàgina ché',
 'tooltip-ca-move' => 'Spôsta cla pàgina ché (câmbia tétol)',
@@ -784,7 +926,7 @@ Per cumditê còst l'é l'èlèinch dal scanşladûri e di spustamèint relatîv
 'tooltip-t-upload' => "Cârga un 'file'",
 'tooltip-t-specialpages' => 'Elèinch ed tót al pàgini specêli',
 'tooltip-t-print' => 'Per stampêr cla pàgina ché.',
-'tooltip-t-permalink' => "Colegamèint fés a cla revişiòun ché 'd  la pàgina.",
+'tooltip-t-permalink' => "Colegamèint fés a cla versiòun ché 'd  la pàgina.",
 'tooltip-ca-nstab-main' => 'Guêrda la pàgina',
 'tooltip-ca-nstab-user' => 'Guêrda la pàgina utèint',
 'tooltip-ca-nstab-special' => "Còsta ché l'é 'na pàgina specêlal l'an pōl mìa èser mudifichêda",
@@ -797,7 +939,7 @@ Per cumditê còst l'é l'èlèinch dal scanşladûri e di spustamèint relatîv
 'tooltip-save' => 'Sêlva al mudéfichi',
 'tooltip-preview' => "Guêrda al mudéfichi préma 'd salvêr (cunsiliê préma 'd salvêr)",
 'tooltip-diff' => "Guêrda 'l mudéfichi fâti al tèst",
-'tooltip-compareselectedversions' => "Guêrda al diferèinsi tr' al dō revişiòun sernîdi ed cla pàgina ché.",
+'tooltip-compareselectedversions' => "Guêrda al diferèinsi tr' al dō versiòun sernîdi ed cla pàgina ché.",
 'tooltip-watch' => "Zûnta cla pàgina ché a la tó lésta di tgnû 'd ôc specêl.",
 'tooltip-rollback' => "\"Rollback\" al scanşèla cun un cléch tót' al mudéfichi fâti a cla pàgina ché da l'ûltem ch' al gh'à més al mân.",
 'tooltip-undo' => '"Scanşèla" al permèt de scanşlêr cla mudéfica ché e l\'arvés al mudèl ed mudéfica in môd "Guerda préma". E al permèt ed mèter dèinter \'na spiegasiòun int l\' elemèint ed la mudéfica.',
@@ -900,11 +1042,14 @@ a vînen cunsidrê sōl j elèinch puntê (ríghi che cumîncen cun al carâter
 'watchlisttools-edit' => "Fa vèder e mudéfica la lést quî di tgnû 'd ôc specêl.",
 'watchlisttools-raw' => 'Mudéfica la lésta in furmê tèst.',
 
+# Core parser functions
+'duplicate-defaultsort' => "Atensiòun la cêva per urdnêr pre-stabilîda ''$1'' la vîn cambiêda cun la ''$2''.",
+
 # Special:Version
 'version' => 'Versiòun',
 'version-specialpages' => 'Pàgina specêla',
 'version-other' => 'Êter',
-'version-version' => '(Versiòun $1)',
+'version-version' => '($1)',
 'version-license' => 'Licèinsa Media Wiki',
 'version-poweredby-others' => 'êter',
 
index 1681419..7964c30 100644 (file)
@@ -813,7 +813,7 @@ $2',
 'gotaccount' => 'Έχετε ήδη λογαριασμό; $1.',
 'gotaccountlink' => 'Είσοδος',
 'userlogin-resetlink' => 'Ξεχάσατε τα στοιχεία εισόδου σας;',
-'userlogin-resetpassword-link' => 'Î\9eεÏ\87λαÏ\83αÏ\84ε Ï\84ον ÎºÏ\89δικÏ\8c Ï\80Ï\81Ï\8cÏ\83βαÏ\83ηÏ\82',
+'userlogin-resetpassword-link' => 'Î\9eεÏ\87άÏ\83αÏ\84ε Ï\84ον ÎºÏ\89δικÏ\8c Ï\80Ï\81Ï\8cÏ\83βαÏ\83ηÏ\82;',
 'helplogin-url' => 'Help:Σύνδεση',
 'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Βοήθεια για τη σύνδεσή σας]]',
 'createacct-join' => 'Εισάγετε τα στοιχεία σας παρακάτω.',
@@ -1475,7 +1475,6 @@ $1",
 'rows' => 'Σειρές',
 'columns' => 'Στήλες',
 'searchresultshead' => 'Αποτελέσματα αναζήτησης/Ρυθμίσεις',
-'resultsperpage' => 'Αποτελέσματα ανά σελίδα',
 'stub-threshold' => 'Κατώφλι για μορφοποίηση <span class="mw-stub-example">συνδέσμου επεκτάσιμου</span>:',
 'stub-threshold-disabled' => 'Απενεργοποιημένο',
 'recentchangesdays' => 'Ημέρες προς εμφάνιση στις πρόσφατες αλλαγές:',
@@ -1738,7 +1737,9 @@ $1",
 'recentchanges-label-minor' => 'Αυτή είναι μια μικροαλλαγή',
 'recentchanges-label-bot' => 'Αυτή η επεξεργασία έγινε από ένα ρομπότ',
 'recentchanges-label-unpatrolled' => 'Αυτή η επεξεργασία δεν έχει ελεγχθεί ακόμα',
-'recentchanges-legend-newpage' => '$1 - νέα σελίδα',
+'recentchanges-label-plusminus' => 'Μεταβολή του μεγέθους της σελίδας σε bytes',
+'recentchanges-legend-heading' => "'''Υπόμνημα:'''",
+'recentchanges-legend-newpage' => '(δείτε [[Ειδικό:Νέεςσελίδες|Νέες σελίδες]])',
 'rcnotefrom' => "Παρακάτω είναι οι αλλαγές από τις '''$2''' (εμφανίζονται μέχρι '''$1''').",
 'rclistfrom' => 'Εμφάνιση νέων αλλαγών αρχίζοντας από $1',
 'rcshowhideminor' => '$1 μικροεπεξεργασιών',
@@ -2199,12 +2200,12 @@ $1',
 'unusedimages' => 'Αχρησιμοποίητες εικόνες',
 'popularpages' => 'Δημοφιλείς σελίδες',
 'wantedcategories' => 'Επιθυμητές κατηγορίες',
-'wantedpages' => 'Î\95Ï\80ιθÏ\85μηÏ\84ές σελίδες',
+'wantedpages' => 'Î\96ηÏ\84οÏ\8dμενες σελίδες',
 'wantedpages-badtitle' => 'Μη εγκυρός τίτλος στο σύνολο αποτελέσματος: $1',
-'wantedfiles' => 'Î\95Ï\80ιθÏ\85μηÏ\84ά αρχεία',
+'wantedfiles' => 'Î\96ηÏ\84οÏ\8dμενα αρχεία',
 'wantedfiletext-cat' => 'Τα ακόλουθα αρχεία χρησιμοποιούνται αλλά δεν υπάρχουν. Αρχεία από εξωτερικά αποθετήρια ενδέχεται να παρατίθενται παρότι υπάρχουν. Κάθε τέτοιες λανθασμένες αναφορές θα <del>διαγραμμίζονται</del>. Επιπλέον, σελίδες που ενσωματώνουν αρχεία που δεν υπάρχουν παρατίθενται στο [[:$1]].',
 'wantedfiletext-nocat' => 'Τα ακόλουθα αρχεία χρησιμοποιούνται αλλά δεν υπάρχουν. Πέρα από τα υπάρχοντα ενδέχεται να έχουν καταχωριστεί και αρχεία από εξωτερικές πηγές λογισμικού. Τέτοιες ψευδο-υπαρκτές καταχωρίσεις θα εμφανίζονται <del>διαγραμμισμένες</del>.',
-'wantedtemplates' => 'Î\95Ï\80ιθÏ\85μηÏ\84ά πρότυπα',
+'wantedtemplates' => 'Î\96ηÏ\84οÏ\8dμενα πρότυπα',
 'mostlinked' => 'Οι σελίδες με τις περισσότερες αναφορές',
 'mostlinkedcategories' => 'Περισσότερο χρησιμοποιούμενες κατηγορίες',
 'mostlinkedtemplates' => 'Περισσότερο χρησιμοποιούμενα πρότυπα',
index 04d7ced..0728d28 100644 (file)
@@ -363,6 +363,7 @@ $magicWords = array(
        'numberingroup'           => array( 1,    'NUMBERINGROUP', 'NUMINGROUP' ),
        'staticredirect'          => array( 1,    '__STATICREDIRECT__' ),
        'protectionlevel'         => array( 1,    'PROTECTIONLEVEL' ),
+       'cascadingsources'        => array( 1,    'CASCADINGSOURCES' ),
        'formatdate'              => array( 0,    'formatdate', 'dateformat' ),
        'url_path'                => array( 0,    'PATH' ),
        'url_wiki'                => array( 0,    'WIKI' ),
@@ -1577,6 +1578,8 @@ It already exists.',
 'content-not-allowed-here'         => '"$1" content is not allowed on page [[$2]]',
 'editwarning-warning'              => 'Leaving this page may cause you to lose any changes you have made.
 If you are logged in, you can disable this warning in the "Editing" section of your preferences.',
+'editpage-notsupportedcontentformat-title'=> 'Content format not supported',
+'editpage-notsupportedcontentformat-text' => 'The content format $1 is not supported by the content model $2.',
 
 # Content models
 'content-model-wikitext'   => 'wikitext',
@@ -1910,7 +1913,6 @@ Note that their indexes of {{SITENAME}} content may be out of date.',
 'rows'                          => 'Rows:',
 'columns'                       => 'Columns:',
 'searchresultshead'             => 'Search',
-'resultsperpage'                => 'Hits per page:',
 'stub-threshold'                => 'Threshold for <a href="#" class="stub">stub link</a> formatting (bytes):',
 'stub-threshold-disabled'       => 'Disabled',
 'recentchangesdays'             => 'Days to show in recent changes:',
@@ -4848,6 +4850,13 @@ You should have received [{{SERVER}}{{SCRIPTPATH}}/COPYING a copy of the GNU Gen
 'version-software'                      => 'Installed software',
 'version-software-product'              => 'Product',
 'version-software-version'              => 'Version',
+'version-db-mysql-url'                  => 'http://www.mysql.com/', # do not translate or duplicate this message to other languages
+'version-db-mariadb-url'                => 'http://mariadb.org/', # do not translate or duplicate this message to other languages
+'version-db-percona-url'                => 'http://www.percona.com/software/percona-server', # do not translate or duplicate this message to other languages
+'version-db-postgres-url'               => 'http://www.postgresql.org/', # do not translate or duplicate this message to other languages
+'version-db-oracle-url'                 => 'http://www.oracle.com/database/', # do not translate or duplicate this message to other languages
+'version-db-sqlite-url'                 => 'http://www.sqlite.org/', # do not translate or duplicate this message to other languages
+'version-db-mssql-url'                  => 'http://www.microsoft.com/sql/', # do not translate or duplicate this message to other languages
 'version-entrypoints'                   => 'Entry point URLs',
 'version-entrypoints-header-entrypoint' => 'Entry point',
 'version-entrypoints-header-url'        => 'URL',
index 26af794..60f8ce0 100644 (file)
@@ -706,9 +706,11 @@ Datenoj ĉi tie ne estos nune refreŝigitaj.',
 'protectedpagetext' => 'Tiu ĉi paĝo estas ŝlosita por malebligi redaktadon.',
 'viewsourcetext' => 'Vi povas rigardi kaj kopii la fonton de la paĝo:',
 'viewyourtext' => "Vi povas vidi kaj kopii la fonton de '''viaj redaktoj''' al ĉi tiu paĝo:",
-'protectedinterface' => 'Ĉi tiu paĝo provizas interfacan tekston por la softvaro, kaj estas ŝlosita por malebligi misuzon.
+'protectedinterface' => 'Ĉi tiu paĝo provizas interfacan tekston por la programaro, kaj estas ŝlosita por malebligi misuzon.
 Por aldoni aŭ ŝanĝi tradukojn por ĉiuj vikioj, bonvolu uzi [//translatewiki.net/ translatewiki.net], la projekto por provizi tradukojn por MediaWiki.',
-'editinginterface' => "'''Atentu:''' Vi redaktas paĝon, kiu estas uzata kiel interfaca teksto por la programaro. Ŝanĝoj de ĉi tiu teksto povas ŝanĝi aspekton de la interfaco por aliaj uzantoj sur ĉi tiu vikio. Por aldoni aŭ ŝanĝi tradukojn, bonvolu uzi [//translatewiki.net/ translatewiki.net], la MediaWiki-projekton por lingvigaj versioj.",
+'editinginterface' => "'''Atentu:''' Vi redaktas paĝon, kiu provizas interfacan tekston por la programaro.
+Ŝanĝoj de ĉi tiu teksto ŝanĝos aspekton de la interfaco por aliaj uzantoj de ĉi tiu vikio.
+Por aldoni aŭ ŝanĝi tradukojn por ĉiuj vikioj, bonvolu uzi [//translatewiki.net/ translatewiki.net], la projekton por provizi tradukojn por MediaWiki.",
 'cascadeprotected' => 'Ĉi tiu paĝo estas protektita kontraŭ redaktado, ĉar ĝi estas inkludita en la {{PLURAL:$1|sekvan paĝon, kiu|sekvajn paĝojn, kiuj}} estas {{PLURAL:$1|protektata|protektataj}} kun la "kaskada" opcio turnita sur:
 $2',
 'namespaceprotected' => "Vi ne rajtas redakti paĝojn en la '''$1''' nomspaco.",
@@ -745,8 +747,10 @@ Ne forgesu ŝanĝi viajn [[Special:Preferences|{{SITENAME}}-preferojn]]',
 'yourpassword' => 'Pasvorto:',
 'userlogin-yourpassword' => 'Pasvorto',
 'userlogin-yourpassword-ph' => 'Enigu vian pasvorton',
+'createacct-yourpassword-ph' => 'Tajpu pasvorton',
 'yourpasswordagain' => 'Retajpu pasvorton',
 'createacct-yourpasswordagain' => 'Konfirmu pasvorton',
+'createacct-yourpasswordagain-ph' => 'Retajpu pasvorton',
 'remembermypassword' => 'Memori mian ensalutadon ĉe ĉi tiu komputilo (daŭrante maksimume $1 {{PLURAL:$1|tagon|tagojn}})',
 'userlogin-remembermypassword' => 'Memoru mian ensaluton',
 'userlogin-signwithsecure' => 'Uzu sekurigitan konekton',
@@ -1448,7 +1452,6 @@ indekso pro troŝarĝita servilo. Intertempe, vi povas serĉi per <i>guglo</i> a
 'rows' => 'Linioj:',
 'columns' => 'Kolumnoj:',
 'searchresultshead' => 'Serĉi',
-'resultsperpage' => 'Montri trovitajn po',
 'stub-threshold' => 'Ago-sojlo por formatigo de <a href="#" class="stub">ligil-ĝermo (anglalingve: "stub link")</a> (bitikoj):',
 'stub-threshold-disabled' => 'Malebligita',
 'recentchangesdays' => 'Tagoj montrendaj en lastaj ŝanĝoj:',
@@ -1659,7 +1662,7 @@ indekso pro troŝarĝita servilo. Intertempe, vi povas serĉi per <i>guglo</i> a
 'action-createpage' => 'krei paĝojn',
 'action-createtalk' => 'krei diskuto-paĝojn',
 'action-createaccount' => 'krei ĉi tiun uzanto-konton',
-'action-minoredit' => 'marki ĉi tiun redakton kiel malgravan',
+'action-minoredit' => 'marki ĉi tiun redakton eta',
 'action-move' => 'movi ĉi tiun paĝon',
 'action-move-subpages' => 'movi ĉi tiun paĝon, kaj ties subpaĝojn',
 'action-move-rootuserpages' => 'movi radikajn uzanto-paĝojn',
@@ -1711,7 +1714,7 @@ indekso pro troŝarĝita servilo. Intertempe, vi povas serĉi per <i>guglo</i> a
 'rclistfrom' => 'Montri novajn ŝanĝojn ekde "$1"',
 'rcshowhideminor' => '$1 redaktetojn',
 'rcshowhidebots' => '$1 robotojn',
-'rcshowhideliu' => '$1 ensalutantojn',
+'rcshowhideliu' => '$1 registriĝintojn',
 'rcshowhideanons' => '$1 anonimajn redaktojn',
 'rcshowhidepatr' => '$1 patrolitajn redaktojn',
 'rcshowhidemine' => '$1 miajn redaktojn',
@@ -3909,7 +3912,7 @@ Vi povas ankaŭ [[Special:EditWatchlist|redakti norme]].',
 'version-hook-name' => 'Nomo de hoko',
 'version-hook-subscribedby' => 'Abonita de',
 'version-version' => '(Versio $1)',
-'version-license' => 'Permesilo',
+'version-license' => 'Permesilo de MediaWiki',
 'version-poweredby-credits' => "Ĉi tiu vikio funkcias per '''[https://www.mediawiki.org/ MediaWiki]''', aŭtorrajto ©&thinsp;2001–$1 $2.",
 'version-poweredby-others' => 'aliaj',
 'version-credits-summary' => 'Ni ŝatus agnoski la sekvajn personojn pro siaj kontribuoj al [[Special:Version|MediaWiki]].',
index 319f077..a36e5e0 100644 (file)
@@ -87,6 +87,7 @@
  * @author Remember the dot
  * @author Remux
  * @author Richard Wolf VI
+ * @author Salvador alc
  * @author Sanbec
  * @author Savh
  * @author Shirayuki
@@ -423,7 +424,7 @@ $messages = array(
 'tog-diffonly' => "No mostrar bajo las ''diferencias'' el contenido de la página",
 'tog-showhiddencats' => 'Mostrar las categorías escondidas',
 'tog-noconvertlink' => 'Desactivar la conversión de título de enlace',
-'tog-norollbackdiff' => "Omitir la ''diferencia'' después de revertir",
+'tog-norollbackdiff' => 'Omitir la diferencia después de revertir',
 'tog-useeditwarning' => 'Advertirme cuando abandone una página editada con cambios sin grabar',
 'tog-prefershttps' => 'Utiliza una conexión segura siempre que haya iniciado una sesión',
 
@@ -452,7 +453,7 @@ $messages = array(
 'wed' => 'mié',
 'thu' => 'jue',
 'fri' => 'vie',
-'sat' => 'sab',
+'sat' => 'sáb',
 'january' => 'enero',
 'february' => 'febrero',
 'march' => 'marzo',
@@ -611,7 +612,7 @@ $messages = array(
 'redirectedfrom' => '(Redirigido desde «$1»)',
 'redirectpagesub' => 'Página de redirección',
 'lastmodifiedat' => 'Esta página fue modificada por última vez el $1, a las $2.',
-'viewcount' => 'Esta página ha sido visitada {{PLURAL:$1|una vez|$1 veces}}.',
+'viewcount' => 'Esta página se ha visitado {{PLURAL:$1|una vez|$1 veces}}.',
 'protectedpage' => 'Página protegida',
 'jumpto' => 'Saltar a:',
 'jumptonavigation' => 'navegación',
@@ -747,7 +748,7 @@ Por favor, avisa a un [[Special:ListUsers/sysop|administrador]], tomando nota de
 Puede que ya haya sido borrado por alguien más.',
 'cannotdelete-title' => 'No se puede borrar la página «$1»',
 'delete-hook-aborted' => 'La modificación que intentaste hacer fue cancelada por un gancho de extensión. No hay explicación disponible.',
-'no-null-revision' => 'No se pudo crear la nueva revisión nula para la página "$1"',
+'no-null-revision' => 'No se pudo crear la revisión nula para la página «$1»',
 'badtitle' => 'Título incorrecto',
 'badtitletext' => 'El título de la página solicitada está vacío, no es válido, o es un enlace interidioma o interwiki incorrecto.
 Puede que contenga uno o más caracteres que no se pueden usar en los títulos.',
@@ -788,7 +789,7 @@ El administrador que lo ha bloqueado ofrece esta explicación: "$3".',
 
 # Virus scanner
 'virus-badscanner' => "Error de configuración: Antivirus desconocido: ''$1''",
-'virus-scanfailed' => 'Escaneo fallido (código $1)',
+'virus-scanfailed' => 'falló el análisis (código $1)',
 'virus-unknownscanner' => 'antivirus desconocido:',
 
 # Login and logout pages
@@ -800,7 +801,7 @@ No olvides personalizar tus [[Special:Preferences|preferencias de {{SITENAME}}]]
 'yourname' => 'Nombre de usuario:',
 'userlogin-yourname' => 'Usuario',
 'userlogin-yourname-ph' => 'Escribe tu nombre de usuario',
-'createacct-another-username-ph' => 'Ingrese el nombre de usuario',
+'createacct-another-username-ph' => 'Escribe el nombre de usuario',
 'yourpassword' => 'Contraseña:',
 'userlogin-yourpassword' => 'Contraseña',
 'userlogin-yourpassword-ph' => 'Escribe tu contraseña',
@@ -924,8 +925,8 @@ Puedes ignorar este mensaje si esta cuenta fue creada por error.',
 'login-abort-generic' => 'Tu inicio de sesión no fue exitoso - Cancelado',
 'loginlanguagelabel' => 'Idioma: $1',
 'suspicious-userlogout' => 'Tu solicitud de desconexión ha sido denegada, pues parece haber sido enviada desde un navegador defectuoso o un proxy caché.',
-'createacct-another-realname-tip' => 'El nombre Real es opcional.
-Si elige proporcionarlo, se usará para dar al usuario la atribución de su trabajo.',
+'createacct-another-realname-tip' => 'El nombre real es opcional.
+Si se proporciona, se usará para dar al usuario la atribución de su trabajo.',
 
 # Email sending
 'php-mail-error-unknown' => 'Error desconocido en la función mail() de PHP.',
@@ -935,7 +936,7 @@ Si elige proporcionarlo, se usará para dar al usuario la atribución de su trab
 # Change password dialog
 'changepassword' => 'Cambiar contraseña',
 'resetpass_announce' => 'Has iniciado sesión con una contraseña temporal que fue enviada por correo electrónico.
-Por favor, introduce una nueva contraseña aquí:',
+Establece una contraseña nueva aquí:',
 'resetpass_text' => '<!-- Añada texto aquí -->',
 'resetpass_header' => 'Cambiar la contraseña de la cuenta',
 'oldpassword' => 'Contraseña antigua:',
@@ -994,8 +995,8 @@ Contraseña temporal: $2',
 'changeemail-header' => 'Cambiar la dirección de correo de la cuenta',
 'changeemail-text' => 'Rellena este formulario para cambiar tu dirección de correo electrónico. Debes introducir la contraseña para confirmar este cambio.',
 'changeemail-no-info' => 'Debes iniciar sesión para acceder directamente a esta página.',
-'changeemail-oldemail' => 'Dirección de correo electrónico actual:',
-'changeemail-newemail' => 'Nueva dirección de correo electrónico:',
+'changeemail-oldemail' => 'Dirección electrónica actual:',
+'changeemail-newemail' => 'Dirección electrónica nueva:',
 'changeemail-none' => '(ninguna)',
 'changeemail-password' => 'Tu contraseña en {{SITENAME}}:',
 'changeemail-submit' => 'Cambiar correo electrónico',
@@ -1218,6 +1219,8 @@ Ya existe.',
 'content-not-allowed-here' => 'El contenido "$1" no está permitido en la página [[$2]]',
 'editwarning-warning' => 'Si abandonas esta página perderás tus cambios.
 Si estás identificado, puedes deshabilitar esta advertencia en la sección "Edición" de tus preferencias.',
+'editpage-notsupportedcontentformat-title' => 'Formato de contenido no admitido',
+'editpage-notsupportedcontentformat-text' => 'El formato de contenido $1 no es compatible con el modelo de contenido  $2.',
 
 # Content models
 'content-model-wikitext' => 'texto wiki',
@@ -1258,6 +1261,9 @@ Ese o esos parámetros han sido omitidos.',
 'cantcreateaccounttitle' => 'No se puede crear la cuenta',
 'cantcreateaccount-text' => "La creación de cuentas desde esta dirección IP ('''$1''') ha sido bloqueada por [[User:$3|$3]].
 
+El motivo dado por $3 es ''$2''",
+'cantcreateaccount-range-text' => "La creación de cuentas de usuario desde direcciones IP en el rango '''$1''', que incluye tu dirección IP ('''$4'''), ha sido bloqueada por [[User:$3|$3]].
+
 El motivo dado por $3 es ''$2''",
 
 # History pages
@@ -1337,9 +1343,9 @@ Aún tiene la posibilidad de verla; puede ampliar los detalles en el [{{fullurl:
 Otros administradores de {{SITENAME}} aún podrán acceder al contenido oculto y podrán deshacer el borrado a través de la misma interfaz, a menos que se establezcan restricciones adicionales.",
 'revdelete-confirm' => 'Por favor confirma que deseas realizar la operación, que entiendes las consecuencias y que estás ejecutando dicha acción acorde con [[{{MediaWiki:Policy-url}}|las políticas]].',
 'revdelete-suppress-text' => "La herramienta de supresión '''solo''' debería usarse en los siguientes casos:
-* Información potencialmente injuriosa o calumniante.
-* Información personal inapropiada, tal como:
-*: ''nombres, domicilios, números de teléfono, números de la seguridad social e información análoga.",
+* información potencialmente injuriosa o calumniante.
+* información personal inapropiada, tal como:
+*: ''nombres, domicilios, números de teléfono, números de la seguridad social e información análoga.''",
 'revdelete-legend' => 'Establecer restricciones de revisión:',
 'revdelete-hide-text' => 'Texto de la revisión',
 'revdelete-hide-image' => 'Ocultar el contenido del archivo',
@@ -1521,7 +1527,6 @@ Mientras tanto puedes buscar mediante Google, pero ten en cuenta que sus índice
 'rows' => 'Filas:',
 'columns' => 'Columnas:',
 'searchresultshead' => 'Búsquedas',
-'resultsperpage' => 'Resultados por página:',
 'stub-threshold' => 'Límite para formato de <a href="#" class="stub">enlace a esbozo</a> (bytes):',
 'stub-threshold-disabled' => 'Desactivado',
 'recentchangesdays' => 'Días a mostrar en cambios recientes:',
@@ -1603,6 +1608,7 @@ Tu dirección de correo no se revela cuando otros usuarios te contactan.',
 'prefs-tokenwatchlist' => 'Clave',
 'prefs-diffs' => 'Diferencias',
 'prefs-help-prefershttps' => 'Esta preferencia tendrá efecto en tu próximo inicio de sesión.',
+'prefs-tabs-navigation-hint' => 'Sugerencia: Puede utilizar las teclas de flecha izquierda y derecha para navegar entre las pestañas de la lista de pestañas.',
 
 # User preference: email validation using jQuery
 'email-address-validity-valid' => 'La dirección de correo electrónico parece ser válida',
@@ -1909,6 +1915,7 @@ Si tiene esta imagen a toda resolución súbala, si no, por favor cambie el nomb
 Si todavía quiere subir su archivo, por favor, regrese a la página anterior y use otro nombre. [[File:$1|thumb|center|$1]]',
 'file-exists-duplicate' => 'Este archivo es un duplicado {{PLURAL:$1|del siguiente|de los siguientes}}:',
 'file-deleted-duplicate' => 'Un archivo idéntico a este ([[:$1]]) ha sido borrado con anterioridad. Debes comprobar el historial de borrado del archivo ante de volver a subirlo.',
+'file-deleted-duplicate-notitle' => 'Un archivo idéntico a este ha sido borrado con anterioridad, y el título ha sido suprimido. Deberías contactar con alguien capaz de ver los datos de archivos borrados para que revise esta situación antes de proceder a subir de nuevo este archivo.',
 'uploadwarning' => 'Advertencia de subida de archivo',
 'uploadwarning-text' => 'Por favor, modifique la descripción del archivo abajo indicada e inténtelo de nuevo.',
 'savefile' => 'Guardar archivo',
@@ -2253,6 +2260,7 @@ Las entradas <del>tachadas</del> han sido resueltas.',
 'ninterwikis' => '$1 {{PLURAL:$1|interwiki|interwikis}}',
 'nlinks' => '$1 {{PLURAL:$1|enlace|enlaces}}',
 'nmembers' => '$1 {{PLURAL:$1|artículo|artículos}}',
+'nmemberschanged' => '$1 → $2 {{PLURAL:$2|miembro|miembros}}',
 'nrevisions' => '$1 {{PLURAL:$1|revisión|revisiones}}',
 'nviews' => '$1 {{PLURAL:$1|vista|vistas}}',
 'nimagelinks' => 'Usado en {{PLURAL:$1|una página|$1 páginas}}',
@@ -2291,6 +2299,7 @@ Las entradas <del>tachadas</del> han sido resueltas.',
 'protectedpages' => 'Páginas protegidas',
 'protectedpages-indef' => 'Sólo protecciones indefinidas',
 'protectedpages-cascade' => 'Sólo protecciones en cascada',
+'protectedpages-noredirect' => 'Ocultar redirecciones',
 'protectedpagesempty' => 'Actualmente no hay ninguna página protegida con esos parámetros.',
 'protectedtitles' => 'Títulos protegidos',
 'protectedtitlesempty' => 'Actualmente no existen entradas protegidas con esos parámetros.',
@@ -2463,7 +2472,7 @@ La dirección de correo electrónico que indicaste en [[Special:Preferences|tus
 'addwatch' => 'Añadir a la lista de seguimiento',
 'addedwatchtext' => 'La página «[[:$1]]» ha sido añadida a tu [[Special:Watchlist|lista de seguimiento]]. Los cambios futuros en esta página y en su página de discusión asociada se indicarán ahí.',
 'removewatch' => 'Quitar de la lista de seguimiento',
-'removedwatchtext' => 'La página «[[:$1]]» ha sido eliminada de tu [[Special:Watchlist|lista de seguimiento]].',
+'removedwatchtext' => 'Se ha eliminado la página «[[:$1]]» de tu [[Special:Watchlist|lista de seguimiento]].',
 'watch' => 'Vigilar',
 'watchthispage' => 'Vigilar esta página',
 'unwatch' => 'Dejar de vigilar',
@@ -2564,6 +2573,7 @@ Véase $2 para un registro de los borrados recientes.',
 'delete-edit-reasonlist' => 'Editar razones de borrado',
 'delete-toobig' => 'Esta página tiene un historial muy grande, con más de $1 {{PLURAL:$1|revisión|revisiones}}. Borrar este tipo de páginas ha sido restringido para prevenir posibles problemas en {{SITENAME}}.',
 'delete-warning-toobig' => 'Esta página tiene un historial de más de $1 {{PLURAL:$1|revisión|revisiones}}. Eliminarla puede perturbar las operaciones de la base de datos de {{SITENAME}}. Ten cuidado al borrar.',
+'deleting-backlinks-warning' => "'''Advertencia:''' Hay enlaces desde otras páginas a la página que estás a punto de borrar.",
 
 # Rollback
 'rollback' => 'Revertir ediciones',
@@ -2798,6 +2808,7 @@ Explica la razón específica del bloqueo (por ejemplo, citando las páginas en
 Véase la [[Special:BlockList|lista de bloqueos]] para revisarlo.',
 'ipb-blockingself' => '¡Estás a punto de bloquearte a ti mismo!  ¿Estás seguro de que quieres hacerlo?',
 'ipb-confirmhideuser' => 'Estás a punto de bloquear un usuario con la opción de supresión activada. Esto suprimirá el nombre de usuario en todas las listas y entradas de registro. ¿Estás seguro de que deseas proceder?',
+'ipb-confirmaction' => 'Si estás seguro de querer hacerlo, por favor, marca el campo «{{int:ipb-confirm}}» que hay al final.',
 'ipb-edit-dropdown' => 'Editar motivo del bloqueo',
 'ipb-unblock-addr' => 'Desbloquear $1',
 'ipb-unblock' => 'Desbloquear un usuario o una IP',
@@ -3904,6 +3915,8 @@ Confirma que realmente quieres volver a crear esta página.",
 
 # Language selector for translatable SVGs
 'img-lang-default' => '(idioma predeterminado)',
+'img-lang-info' => 'Renderizar esta imagen en $1. $2',
+'img-lang-go' => 'Adelante',
 
 # Table pager
 'ascending_abbrev' => 'asc',
@@ -3985,7 +3998,17 @@ También puedes [[Special:EditWatchlist|usar el editor estándar]].',
 'version-hook-name' => 'Nombre de la extensión',
 'version-hook-subscribedby' => 'Suscrito por',
 'version-version' => '(Versión $1)',
-'version-license' => 'Licencia',
+'version-license' => 'Licencia de MediaWiki',
+'version-ext-license' => 'Licencia',
+'version-ext-colheader-name' => 'Extensión',
+'version-ext-colheader-version' => 'Versión',
+'version-ext-colheader-license' => 'Licencia',
+'version-ext-colheader-description' => 'Descripción',
+'version-ext-colheader-credits' => 'Autores',
+'version-license-title' => 'Licencia para $1',
+'version-license-not-found' => 'No se han encontrado información detallada de licencia para esta extensión.',
+'version-credits-title' => 'Reconocimiento para $1',
+'version-credits-not-found' => 'No se ha encontrado información detallada de reconocimiento para esta extensión.',
 'version-poweredby-credits' => "Este wiki funciona gracias a '''[https://www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
 'version-poweredby-others' => 'otros',
 'version-poweredby-translators' => 'Traductores de translatewiki.net',
@@ -4012,6 +4035,7 @@ Has recibido [{{SERVER}}{{SCRIPTPATH}}/COPYING una copia de la Licencia Pública
 'redirect-lookup' => 'Buscar:',
 'redirect-value' => 'Valor:',
 'redirect-user' => 'Id. del usuario',
+'redirect-page' => 'ID de la página',
 'redirect-revision' => 'Revisión de página',
 'redirect-file' => 'Nombre de fichero',
 'redirect-not-exists' => 'No se encontró el valor',
@@ -4207,6 +4231,7 @@ En otro caso, puedes usar el siguiente formulario. Tu comentario será añadido
 'api-error-overwrite' => 'No se permite sobrescribir un archivo existente.',
 'api-error-stashfailed' => 'Error interno: El servidor no pudo almacenar el archivo temporal.',
 'api-error-publishfailed' => 'Error interno: el servidor no pudo publicar el archivo temporal.',
+'api-error-stasherror' => 'Ha ocurrido un error al subir el archivo al depósito.',
 'api-error-timeout' => 'El servidor no respondió en el plazo previsto.',
 'api-error-unclassified' => 'Ocurrió un error desconocido.',
 'api-error-unknown-code' => 'Error desconocido: «$1»',
@@ -4254,10 +4279,12 @@ También expande las funciones sintácticas como <code><nowiki>{{</nowiki>#langu
 'expand_templates_input' => 'Texto a expandir:',
 'expand_templates_output' => 'Resultado:',
 'expand_templates_xml_output' => 'Salida XML',
+'expand_templates_html_output' => 'Salida HTML en crudo',
 'expand_templates_ok' => 'Aceptar',
 'expand_templates_remove_comments' => 'Eliminar comentarios (<!-- ... -->)',
 'expand_templates_remove_nowiki' => 'Suprimir <nowiki> etiquetas en resultado',
 'expand_templates_generate_xml' => 'Mostrar el árbol XML.',
+'expand_templates_generate_rawhtml' => 'Mostrar HTML en crudo',
 'expand_templates_preview' => 'Previsualización',
 
 );
index 8a53579..4fd5ebe 100644 (file)
@@ -1431,7 +1431,6 @@ Pane tähele, et Google'is talletatud {{GRAMMAR:genitive|{{SITENAME}}}} sisu võ
 'rows' => 'Ridu:',
 'columns' => 'Veerge:',
 'searchresultshead' => 'Otsingutulemite sätted',
-'resultsperpage' => 'Vasteid leheküljel:',
 'stub-threshold' => '<a href="#" class="stub">Nii</a> lingitud lehekülje suuruse ülempiir (baitides):',
 'stub-threshold-disabled' => 'Välja lülitatud',
 'recentchangesdays' => 'Mitu päeva näidata viimastes muudatustes:',
index 8b5db5b..dd75860 100644 (file)
@@ -1226,7 +1226,6 @@ Kontura zaitez nabigazio loturek, zutabea ezabatu dezakela.',
 'rows' => 'Lerroak:',
 'columns' => 'Zutabeak:',
 'searchresultshead' => 'Bilaketa',
-'resultsperpage' => 'Emaitza orrialdeko:',
 'stub-threshold' => '<a href="#" class="stub">stub link</a> formaturako atalasea (byteak):',
 'stub-threshold-disabled' => 'Ezgaitua',
 'recentchangesdays' => 'Aldaketa berrietan erakutsi beharreko egun kopurua:',
@@ -1368,10 +1367,10 @@ Informazio hau publikoa da.',
 'right-createtalk' => 'Eztabaida orriak sortu',
 'right-createaccount' => 'Erabiltzaile kontu berria sortu',
 'right-minoredit' => 'Aldaketa txiki gisa markatu',
-'right-move' => 'Orrialdeak mugitu',
+'right-move' => 'Mugitu orriak',
 'right-move-subpages' => 'Mugitu orrialdeak bere azpiorrialdeekin',
 'right-move-rootuserpages' => 'Erro-lankidearen orriak mugitu',
-'right-movefile' => 'Fitxategiak mugitu',
+'right-movefile' => 'Mugitu fitxategiak',
 'right-suppressredirect' => 'Ez sortu birzuzenketa bat antzinako izenetik orrialdea mugitzerakoan',
 'right-upload' => 'Fitxategia igo',
 'right-reupload' => 'Jada existitzen den artxibo bat gainidatzi',
@@ -2532,7 +2531,7 @@ Hala ere, $2-(r)en parte denez, blokeoa kendu daiteke.',
 'lockedbyandtime' => '({{GENDER:$1|$1}}k egina $2ko $3(e)tan)',
 
 # Move page
-'move-page' => '$1 mugitu',
+'move-page' => 'Mugitu «$1»',
 'move-page-legend' => 'Orrialdea mugitu',
 'movepagetext' => "Beheko formularioa erabiliz orrialde baten izena aldatuko da, historia osoa izen berrira mugituz.
 Izenburu zaharra izenburu berrira daraman birbideratze bilakatuko da.
@@ -2551,7 +2550,7 @@ mesedez, egiazta ezazu honen ondorioak ulertzen dituzula, jarraitu baino lehen."
 * Beheko koadroa hautatzen ez baduzu.
 
 Kasu horietan orrialdea eskuz mugitu edo bestearekin bateratu beharko duzu.",
-'movearticle' => 'Orrialdea mugitu',
+'movearticle' => 'Mugitu orria',
 'moveuserpage-warning' => "'''Oharra:''' Lankide orrialde bat mugitzera zoaz. Kontutan izan orrialde bakarrik mugituko duzula eta '''ez''' duzula lankide izena aldatuko.",
 'movenologintext' => 'Orrialde bat mugitzeko erregistratutako lankidea izan behar duzu eta [[Special:UserLogin|saioa hasi]].',
 'movenotallowed' => 'Ez daukazu orrialdeak mugitzeko baimenik.',
@@ -2560,7 +2559,7 @@ Kasu horietan orrialdea eskuz mugitu edo bestearekin bateratu beharko duzu.",
 'cant-move-to-user-page' => 'Ez duzu orrialde bat lankide orrialde batera mugitzeko eskumenik (lankide azpiorrialde batera izan ezik).',
 'newtitle' => 'Izenburu berria',
 'move-watch' => 'Orrialde hau jarraitu',
-'movepagebtn' => 'Orrialde mugitu',
+'movepagebtn' => 'Mugitu orria',
 'pagemovedsub' => 'Mugimendua eginda',
 'movepage-moved' => '\'\'\'"$1" "$2"(e)ra mugitu da\'\'\'',
 'movepage-moved-redirect' => 'Birbideratze orri bat sortu da.',
@@ -2573,7 +2572,7 @@ Kasu horietan orrialdea eskuz mugitu edo bestearekin bateratu beharko duzu.",
 'movepage-page-exists' => '$1 orrialdea jada badago eta ezin da automatikoki gainetik idatzi.',
 'movepage-page-moved' => '«$1» orria «$2» izenera aldatu da.',
 'movepage-page-unmoved' => '$1 orrialdea ezin da $2(e)ra mugitu.',
-'movepage-max-pages' => '$1 {{PLURAL:$1|orrialderen|orrialdeen}} maximoa mugitu da eta jada ez dira gehiago mugituko modu automatikoan.',
+'movepage-max-pages' => '$1 {{PLURAL:$1|orrialderen|orrialdeen}} kopuru maximoa jada mugitu da, eta ez dira gehiago mugituko modu automatikoan.',
 'movelogpage' => 'Mugimendu erregistroa',
 'movelogpagetext' => 'Mugitutako orrialdeen zerrenda bat azaltzen da jarraian.',
 'movesubpage' => '{{PLURAL:$1|Azpiorrialde|Azpiorrialdeak}}',
@@ -2955,9 +2954,9 @@ Zure sisteman exekutatzea arriskutsua izan liteke.",
 'minutes' => '{{PLURAL:$1|minutu $1|$1 minutu}}',
 'hours' => '{{PLURAL:$1|ordu $1|$1 ordu}}',
 'days' => '{{PLURAL:$1|egun $1|$1 egun}}',
-'weeks' => '{{PLURAL: $1|aste $1|$1 aste}}',
+'weeks' => '{{PLURAL:$1|aste $1|$1 aste}}',
 'months' => '{{PLURAL:$1|hilabete $1|$1 hilabete}}',
-'years' => '{{PLURAL: $1|urte $1|$1 urte}}',
+'years' => '{{PLURAL:$1|urte $1|$1 urte}}',
 'ago' => 'Duela $1',
 'just-now' => 'orain',
 
index 48c1f7e..5b711e2 100644 (file)
@@ -788,7 +788,6 @@ Asigurati e qu'esti chambu mantenga la continuiá el estorial la páhina.",
 'rows' => 'Filas:',
 'columns' => 'Colunas:',
 'searchresultshead' => 'Landeal',
-'resultsperpage' => 'Resurtaus pol páhina:',
 'stub-threshold' => 'Arrayu superiol pa consieral cumu <a href="#" class="stub">atihu a prencipiu</a> (bytes):',
 'recentchangesdays' => 'Númeru e dias a muestral en "úrtimus chambus":',
 'recentchangesdays-max' => 'Máissimu $1 {{PLURAL:$1|dia|dias}}',
index 87fb9a5..5584a9c 100644 (file)
@@ -24,6 +24,7 @@
  * @author Ladsgroup
  * @author Leyth
  * @author Mardetanha
+ * @author Mcuteangel
  * @author Mehdi
  * @author Mehran
  * @author MehranVB
@@ -452,8 +453,8 @@ $imageFiles = array(
 
 $messages = array(
 # User preference toggles
-'tog-underline' => 'خط کشیدن زیر پیوندها:',
-'tog-justify' => 'بÙ\86دÙ\87ا ØªÙ\85اÙ\85â\80\8cÚ\86Û\8cÙ\86 Ù\86Ù\85اÛ\8cØ´ Û\8cابÙ\86د',
+'tog-underline' => 'پیوند خط کشی شده در زیر:',
+'tog-justify' => 'تÙ\88جÛ\8cÙ\87 Ù¾Ø§Ø±Ø§Ú¯Ø±Ø§Ù\81',
 'tog-hideminor' => 'تغییرات جزئی از فهرست تغییرات اخیر پنهان شوند',
 'tog-hidepatrolled' => 'ویرایش‌های گشت‌خورده از فهرست تغییرات اخیر پنهان شوند',
 'tog-newpageshidepatrolled' => 'صفحه‌های گشت‌خورده از فهرست صفحه‌های تازه پنهان شوند',
@@ -1302,6 +1303,8 @@ $2
 'content-not-allowed-here' => 'محتوای «$1» در صفحهٔ [[$2]] مجاز نیست',
 'editwarning-warning' => 'خروج از این صفحه ممکن است باعث از دست رفتن هرچه نوشته‌اید شود.
 اگر شما با نام کاربری وارد شده‌اید می‌توانید این هشدار را در بخش «در حال ویرایش» ترجیحاتتان بیابید.',
+'editpage-notsupportedcontentformat-title' => 'فرمت محتوا پشتیبانی نشده',
+'editpage-notsupportedcontentformat-text' => 'فرمت محتوای $1 توسط مدل محتوای $2 پشتیبانی نشده‌است.',
 
 # Content models
 'content-model-wikitext' => 'ویکی‌متن',
@@ -1606,7 +1609,6 @@ $1",
 'rows' => 'تعداد سطرها:',
 'columns' => 'تعداد ستون‌ها:',
 'searchresultshead' => 'جستجو',
-'resultsperpage' => 'تعداد نتایج در هر صفحه:',
 'stub-threshold' => 'آستانهٔ ویرایش پیوندهای <a href="#" class="stub">ناقص</a> (بایت):',
 'stub-threshold-disabled' => 'غیرفعال',
 'recentchangesdays' => 'تعداد روزهای نمایش داده‌شده در تغییرات اخیر:',
@@ -1810,7 +1812,7 @@ $1",
 'right-mergehistory' => 'ادغام تاریخچهٔ صفحه‌ها',
 'right-userrights' => 'ویرایش تمام اختیارات کاربرها',
 'right-userrights-interwiki' => 'ویرایش اختیارات کاربرهای ویکی‌های دیگر',
-'right-siteadmin' => 'قفل کردن و باز کردن پایگاه داده',
+'right-siteadmin' => 'قفل‌کردن و بازکردن پایگاه داده‌ها',
 'right-override-export-depth' => 'برون‌بری صفحه‌ها شامل صفحه‌های پیوند شده تا عمق ۵',
 'right-sendemail' => 'ارسال رایانامه به دیگر کاربران',
 'right-passwordreset' => 'مشاهدهٔ نامه‌های تنظیم مجدد گذرواژه',
@@ -1857,7 +1859,7 @@ $1",
 'action-mergehistory' => 'ادغام تاریخچهٔ این صفحه',
 'action-userrights' => 'ویرایش همهٔ اختیارات کاربری',
 'action-userrights-interwiki' => 'ویرایش اختیارات کاربری کاربران یک ویکی دیگر',
-'action-siteadmin' => 'قفل کردن و باز کردن پایگاه داده',
+'action-siteadmin' => 'قفل‌کردن و بازکردن پایگاه داده‌ها',
 'action-sendemail' => 'ارسال ایمیل',
 'action-editmywatchlist' => 'فهرست پیگیری‌های خود را ویرایش کنید',
 'action-viewmywatchlist' => 'فهرست پیگیری‌های خود را ببینید',
@@ -2905,6 +2907,7 @@ $1',
 برای بررسی بسته‌شده‌ها [[Special:BlockList|فهرست بسته‌شده‌ها]] را ببینید.',
 'ipb-blockingself' => 'شما در حال بستن خودتان هستید!  آیا مطمئن هستید که می‌خواهید چنین کاری انجام دهید؟',
 'ipb-confirmhideuser' => 'شما در حال بستن یک کاربر هستید که «پنهان‌سازی کاربر» برایش فعال شد‌ه‌است. این کار نام کاربر را از همهٔ فهرست‌ها و سیاهه‌ها مخفی می‌کند. آیا مطمئن هستید که می‌خواهید آن را انجام دهید؟',
+'ipb-confirmaction' => 'اگر واقعاً مطمئنید که می‌خواهید آن را انجام دهید، لطفاً زمینهٔ "{{int:ipb-confirm}}" را در زیر بررسی کنید.',
 'ipb-edit-dropdown' => 'ویرایش دلایل قطع‌دسترسی',
 'ipb-unblock-addr' => 'باز کردن $1',
 'ipb-unblock' => 'باز کردن نام کاربری یا نشانی آی‌پی',
@@ -4148,7 +4151,7 @@ $5
 'version-parser-function-hooks' => 'قلاب‌های عملگر تجزیه‌گر',
 'version-hook-name' => 'نام قلاب',
 'version-hook-subscribedby' => 'وارد شده توسط',
-'version-version' => '(نسخه $1)',
+'version-version' => '(نسخه  $1)',
 'version-svn-revision' => '(&رلم;r$2)',
 'version-license' => 'اجازه‌نامهٔ مدیاویکی',
 'version-ext-license' => 'مجوزها',
index c1fbe77..e0fa8d5 100644 (file)
@@ -12,6 +12,7 @@
  * @author Cimon Avaro
  * @author Crt
  * @author ElmA
+ * @author Elseweyr
  * @author Geitost
  * @author Harriv
  * @author Hyperborean
@@ -31,6 +32,7 @@
  * @author Pxos
  * @author Samoasambia
  * @author Silvonen
+ * @author Smite
  * @author Snidata
  * @author Str4nd
  * @author Stryn
@@ -1173,6 +1175,9 @@ Varmista alla olevasta vertailusta, että haluat saada aikaan tämän lopputulok
 'cantcreateaccount-text' => "Tunnusten luonti tästä IP-osoitteesta ('''$1''') on estetty. Estäjänä on [[User:$3|$3]].
 
 Käyttäjän $3 antama syy on ''$2''",
+'cantcreateaccount-range-text' => "Tunnusten luominen IP-osoitteista osoitealueella '''\$1''', johon kuuluu myös sinun käyttämäsi IP-osoite ('''\$4'''), on estetty. Eston on asettanut [[User:\$3|\$3]].
+
+Syy estolle on \"\$2\".",
 
 # History pages
 'viewpagelogs' => 'Näytä tämän sivun lokit',
@@ -1434,7 +1439,6 @@ $1 {{int:pipe-separator}} $2',
 'rows' => 'Rivejä',
 'columns' => 'Sarakkeita',
 'searchresultshead' => 'Haku',
-'resultsperpage' => 'Tuloksia sivua kohti',
 'stub-threshold' => '<a href="#" class="stub">Tynkäsivun</a> osoituskynnys',
 'stub-threshold-disabled' => 'Ei käytössä',
 'recentchangesdays' => 'Näytettävien päivien määrä tuoreissa&nbsp;muutoksissa',
@@ -1515,6 +1519,7 @@ Tämä tieto on julkinen.',
 'prefs-tokenwatchlist' => 'Avain',
 'prefs-diffs' => 'Eroavaisuudet',
 'prefs-help-prefershttps' => 'Tämä asetus tulee voimaan seuraavan sisäänkirjautumisesi yhteydessä.',
+'prefs-tabs-navigation-hint' => 'Vihje: Voit käyttää vasenta ja oikeata nuolinäppäintä liikkumiseen välilehtien välillä.',
 
 # User preference: email validation using jQuery
 'email-address-validity-valid' => 'Sähköpostiosoite vaikuttaa kelvolliselta',
@@ -1703,6 +1708,7 @@ Tämä tieto on julkinen.',
 'recentchanges-label-plusminus' => 'Sivun koon muutos tavuina',
 'recentchanges-legend-heading' => "'''Selitys:'''",
 'recentchanges-legend-newpage' => '(katso myös [[Special:NewPages|lista uusista sivuista]])',
+'recentchanges-legend-plusminus' => "(''±123'')",
 'rcnotefrom' => 'Alla on muutokset <b>$2</b> lähtien. Enintään <b>$1</b> merkintää näytetään.',
 'rclistfrom' => 'Näytä uudet muutokset $1 alkaen',
 'rcshowhideminor' => '$1 pienet muutokset',
@@ -2149,6 +2155,7 @@ Jokaisella rivillä on linkit ensimmäiseen ja toiseen ohjaukseen sekä toisen o
 'ninterwikis' => '$1 {{PLURAL:$1|kielilinkki|kielilinkkiä}}',
 'nlinks' => '$1 {{PLURAL:$1|linkki|linkkiä}}',
 'nmembers' => '$1 {{PLURAL:$1|jäsen|jäsentä}}',
+'nmemberschanged' => '$1 → $2 {{PLURAL:$2|jäsen|jäsentä}}',
 'nrevisions' => '$1 {{PLURAL:$1|muutos|muutosta}}',
 'nviews' => '$1 {{PLURAL:$1|lataus|latausta}}',
 'nimagelinks' => 'Käytössä $1 {{PLURAL:$1|sivulla}}',
@@ -2187,6 +2194,7 @@ Jokaisella rivillä on linkit ensimmäiseen ja toiseen ohjaukseen sekä toisen o
 'protectedpages' => 'Suojatut sivut',
 'protectedpages-indef' => 'Vain ikuisesti suojatut',
 'protectedpages-cascade' => 'Vain tarttuvasti suojatut',
+'protectedpages-noredirect' => 'Piilota ohjaukset',
 'protectedpagesempty' => 'Mitään sivuja ei ole tällä hetkellä suojattu näillä asetuksilla.',
 'protectedtitles' => 'Suojatut sivunimet',
 'protectedtitlesempty' => 'Ei suojattuja sivunimiä näillä hakuehdoilla.',
@@ -2459,6 +2467,7 @@ Sivulla $2 on lista viimeaikaisista poistoista.',
 'delete-edit-reasonlist' => 'Muokkaa poistosyitä',
 'delete-toobig' => 'Tällä sivulla on pitkä muutoshistoria – yli $1 {{PLURAL:$1|versio|versiota}}. Näin suurien muutoshistorioiden poistamista on rajoitettu suorituskykysyistä.',
 'delete-warning-toobig' => 'Tällä sivulla on pitkä muutoshistoria – yli $1 {{PLURAL:$1|versio|versiota}}. Näin suurien muutoshistorioiden poistaminen voi haitata sivuston suorituskykyä.',
+'deleting-backlinks-warning' => "'''Varoitus:''' Sivulle, jota olet poistamassa, johtaa linkkejä muilta sivuilta.",
 
 # Rollback
 'rollback' => 'palauta aiempaan versioon',
@@ -2687,6 +2696,7 @@ Kirjoita eston syy alla olevaan kenttään.',
 Voimassa olevat estot näkyvät [[Special:BlockList|estolistasta]].',
 'ipb-blockingself' => 'Olet estämässä itseäsi. Oletko varma, että haluat tehdä niin?',
 'ipb-confirmhideuser' => 'Olet estämässä käyttäjää ”piilota käyttäjä” -toiminnon kanssa.  Tämä piilottaa käyttäjän nimen kaikissa luetteloissa ja lokitapahtumissa.  Oletko varma, että haluat tehdä näin?',
+'ipb-confirmaction' => 'Jos olet varma että haluat todella tehdä tämän, tarkista kentän "{{int:ipb-confirm}}" sisältö alhaalta.',
 'ipb-edit-dropdown' => 'Muokkaa estosyitä',
 'ipb-unblock-addr' => 'Poista käyttäjän $1 esto',
 'ipb-unblock' => 'Poista käyttäjän tai IP-osoitteen muokkausesto',
@@ -3767,6 +3777,7 @@ Varmista, että haluat luoda sivun uudelleen.",
 
 # Separators for various lists, etc.
 'percent' => '$1&#160;%',
+'quotation-marks' => '"$1"',
 
 # Multipage image navigation
 'imgmultipageprev' => '← edellinen sivu',
@@ -3776,6 +3787,7 @@ Varmista, että haluat luoda sivun uudelleen.",
 
 # Language selector for translatable SVGs
 'img-lang-default' => '(oletuskieli)',
+'img-lang-info' => 'Näytä tämä kuva kielellä $1. $2',
 'img-lang-go' => 'Suorita',
 
 # Table pager
@@ -3859,8 +3871,18 @@ Voit myös muokata listaa [[Special:EditWatchlist|tavalliseen tapaan]].',
 'version-parser-function-hooks' => 'Jäsentimen laajennusfunktiot',
 'version-hook-name' => 'Kytköspisteen nimi',
 'version-hook-subscribedby' => 'Kytkökset',
-'version-version' => '(Versio $1)',
-'version-license' => 'Lisenssi',
+'version-version' => '($1)',
+'version-license' => 'MediaWikin lisenssi',
+'version-ext-license' => 'Lisenssi',
+'version-ext-colheader-name' => 'Laajennusosa',
+'version-ext-colheader-version' => 'Versio',
+'version-ext-colheader-license' => 'Lisenssi',
+'version-ext-colheader-description' => 'Kuvaus',
+'version-ext-colheader-credits' => 'Tekijät',
+'version-license-title' => 'Lisenssi ohjelmalle $1',
+'version-license-not-found' => 'Tälle lisäosalle ei ole saatavissa tarkkoja lisenssitietoja.',
+'version-credits-title' => 'Laajennuksen $1 tekijätiedot',
+'version-credits-not-found' => 'Tälle laajenukselle ei löytynyt yksityiskohtaisia tekijätietoja.',
 'version-poweredby-credits' => "Tämä wiki käyttää '''[https://www.mediawiki.org/ MediaWikiä]'''. Copyright © 2001–$1 $2.",
 'version-poweredby-others' => 'muut',
 'version-poweredby-translators' => 'translatewiki.net-kääntäjät',
@@ -3878,13 +3900,14 @@ Sinun olisi pitänyt saada [{{SERVER}}{{SCRIPTPATH}}/COPYING kopio GNU General P
 'version-entrypoints-header-url' => 'URL',
 
 # Special:Redirect
-'redirect' => 'Ohjaus tiedostonimen, käyttäjätunnisteen tai versiotunnisteen mukaan',
+'redirect' => 'Ohjaus tiedoston, käyttäjän, sivun tai version tunnisteen mukaan',
 'redirect-legend' => 'Ohjaus tiedostoon tai sivulle',
-'redirect-summary' => 'Tämä toimintosivu ohjaa tiedostoon (tiedostonimen mukaan), sivulle (versiotunnisteen mukaan) tai käyttäjäsivulle (käyttäjätunnisteen mukaan). Käyttö: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/revision/328429]] tai [[{{#Special:Redirect}}/user/101]].',
+'redirect-summary' => 'Tämä toimintosivu ohjaa tiedostoon (tiedostonimen mukaan), sivulle (version numeron tai sivun tunnisteen mukaan) tai käyttäjäsivulle (käyttäjän numeron mukaan). Käyttö: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]] tai [[{{#Special:Redirect}}/user/101]].',
 'redirect-submit' => 'Siirry',
 'redirect-lookup' => 'Hae:',
 'redirect-value' => 'Arvo:',
-'redirect-user' => 'Käyttäjätunniste',
+'redirect-user' => 'Käyttäjän tunnusnumero',
+'redirect-page' => 'Sivun tunnistenumero',
 'redirect-revision' => 'Sivun versio',
 'redirect-file' => 'Tiedostonimi',
 'redirect-not-exists' => 'Arvoa ei löytynyt',
@@ -4078,6 +4101,7 @@ Muussa tapauksessa voit käyttää alla olevaa helpompaa lomaketta. Kommenttisi
 'api-error-overwrite' => 'Olemassa olevan tiedoston korvaaminen toisella ei ole sallittua.',
 'api-error-stashfailed' => 'Sisäinen virhe: Väliaikaisen tiedoston tallentaminen epäonnistui.',
 'api-error-publishfailed' => 'Sisäinen virhe: Väliaikaisen tiedoston julkaiseminen epäonnistui.',
+'api-error-stasherror' => 'Tiedostoa ladattaessa tapahtui virhe.',
 'api-error-timeout' => 'Palvelin ei vastannut odotetun ajan kuluessa.',
 'api-error-unclassified' => 'Tapahtui tuntematon virhe.',
 'api-error-unknown-code' => 'Tuntematon virhe: $1.',
@@ -4107,10 +4131,12 @@ Muussa tapauksessa voit käyttää alla olevaa helpompaa lomaketta. Kommenttisi
 'limitreport-cputime-value' => '$1 {{PLURAL:$1|sekunti|sekuntia}}',
 'limitreport-walltime' => 'Todellinen ajankäyttö',
 'limitreport-walltime-value' => '$1 {{PLURAL:$1|sekunti|sekuntia}}',
+'limitreport-ppvisitednodes' => 'Esikääntäjän läpikäymien solmujen määrä',
 'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|tavu|tavua}}',
 'limitreport-templateargumentsize' => 'Mallineen argumenttien koko',
 'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|tavu|tavua}}',
 'limitreport-expansiondepth' => 'Highest expansion depth',
+'limitreport-expensivefunctioncount' => 'Vaativien parserfunktioiden määrä',
 
 # Special:ExpandTemplates
 'expandtemplates' => 'Mallineiden laajennus',
@@ -4122,10 +4148,12 @@ Toisin sanoen melkein kaiken, joka on kaksoisaaltosulkeiden sisällä.',
 'expand_templates_input' => 'Teksti',
 'expand_templates_output' => 'Tulos',
 'expand_templates_xml_output' => 'XML-tuloste',
+'expand_templates_html_output' => 'Raaka HTML-koodi',
 'expand_templates_ok' => 'Laajenna',
 'expand_templates_remove_comments' => 'Poista kommentit',
 'expand_templates_remove_nowiki' => 'Poista <nowiki>-tagit tulosteesta',
 'expand_templates_generate_xml' => 'Näytä XML-jäsennyspuu',
+'expand_templates_generate_rawhtml' => 'Näytä raaka HTML',
 'expand_templates_preview' => 'Esikatselu',
 
 );
index 4965b9b..556ed60 100644 (file)
@@ -1232,7 +1232,6 @@ Legg til merkis, at teirra innihaldsyvirlit av {{SITENAME}} kann vera gamalt og
 'rows' => 'Røð:',
 'columns' => 'Teigar:',
 'searchresultshead' => 'Leita',
-'resultsperpage' => 'Úrslit fyri hvørja síðu:',
 'stub-threshold' => 'Avmarkað til <a href="#" class="stub">stubba leinki</a> formatering (bytes):',
 'stub-threshold-disabled' => 'Er gjørt óvirki',
 'recentchangesdays' => 'Dagar av vísa í seinastu broytingum:',
index 481a358..5ab6bbf 100644 (file)
@@ -62,6 +62,7 @@
  * @author Louperivois
  * @author Ltrlg
  * @author Lucyin
+ * @author Manohisoa
  * @author Mattho69
  * @author McDutchie
  * @author Meithal
@@ -1122,7 +1123,7 @@ Il peut être modifié sur la page ''[[Special:ChangePassword|Changement de mot
 Pour créer cette page, entrez votre texte dans la boîte ci-dessous (vous pouvez consulter [[{{MediaWiki:Helppage}}|la page d'aide]] pour plus d'informations).
 Si vous êtes arrivé{{GENDER:||e|(e)}} ici par erreur, cliquez sur le bouton '''retour''' de votre navigateur.",
 'anontalkpagetext' => "---- ''Vous êtes sur la page de discussion d'un utilisateur anonyme qui n'a pas encore créé de compte ou qui n'en utilise pas. Pour cette raison, nous devons utiliser son adresse IP pour l'identifier. Une adresse IP peut être partagée par plusieurs utilisateurs. Si vous êtes un{{GENDER:||e|}} utilisat{{GENDER:|eur|rice|eur}} anonyme et si vous constatez que des commentaires qui ne vous concernent pas vous ont été adressés, vous pouvez [[Special:UserLogin/signup|créer un compte]] ou [[Special:UserLogin|vous connecter]] afin d'éviter toute confusion future avec d'autres contributeurs anonymes.''",
-'noarticletext' => 'Il n\'y a pour l\'instant aucun texte sur cette page.
+'noarticletext' => 'Il n’y a pour l’instant aucun texte sur cette page.
 Vous pouvez [[Special:Search/{{PAGENAME}}|lancer une recherche sur ce titre]] dans les autres pages,
 <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} rechercher dans les opérations liées]
 ou [{{fullurl:{{FULLPAGENAME}}|action=edit}} créer cette page]</span>.',
@@ -1239,6 +1240,8 @@ Elle existe déjà.",
 'content-not-allowed-here' => 'Le contenu « $1 » n’est pas autorisé sur la page [[$2]]',
 'editwarning-warning' => 'Quitter cette page vous fera perdre toutes les modifications que vous avez faites.
 Si vous êtes connecté, vous pouvez désactiver cet avertissement dans la section « Modification » de vos préférences.',
+'editpage-notsupportedcontentformat-title' => 'Format de contenu non pris en charge',
+'editpage-notsupportedcontentformat-text' => "Le format de contenu $1 n'est pas pris en charge par le modèle de contenu $2 .",
 
 # Content models
 'content-model-wikitext' => 'wikitexte',
@@ -1538,7 +1541,6 @@ Vous pouvez trouver des détails dans le [{{fullurl:{{#Special:Log}}/delete|page
 'rows' => 'Rangées :',
 'columns' => 'Colonnes :',
 'searchresultshead' => 'Filtrer avec cette valeur',
-'resultsperpage' => 'Nombre de réponses par page :',
 'stub-threshold' => 'Limite supérieure pour les <a href="#" class="stub">liens vers les ébauches</a> (octets) :',
 'stub-threshold-disabled' => 'Désactivé',
 'recentchangesdays' => 'Nombre de jours à afficher dans les modifications récentes :',
@@ -2835,6 +2837,7 @@ Donnez ci-dessous un motif précis (par exemple en citant les pages qui ont ét
 Consultez la [[Special:BlockList|liste des blocages]] pour revoir les blocages.',
 'ipb-blockingself' => 'Vous êtes sur le point de bloquer votre propre compte ! Êtes-vous certain{{GENDER:||e|(e)}} de vouloir faire cela ?',
 'ipb-confirmhideuser' => "Vous êtes sur le point de bloquer un utilisateur avec « cacher l'utilisateur » activé. Cela supprime le nom de l'utilisateur dans toutes les listes et les entrées du journal. Êtes-vous sûr de vouloir le faire ?",
+'ipb-confirmaction' => 'Si vous êtes sûr de vraiment vouloir le faire, veuillez cocher le champ « {{int:ipb-confirm}} » en bas.',
 'ipb-edit-dropdown' => 'Modifier les motifs de blocage par défaut',
 'ipb-unblock-addr' => 'Débloquer $1',
 'ipb-unblock' => 'Débloquer un compte utilisateur ou une adresse IP',
index 479e4a2..90f3556 100644 (file)
@@ -1454,7 +1454,6 @@ Notâd que lor endèxacion du contegnu de {{SITENAME}} pôt pas étre a jorn.',
 'rows' => 'Renches :',
 'columns' => 'Colones :',
 'searchresultshead' => 'Rechèrche',
-'resultsperpage' => 'Nombro de rèponses per pâge :',
 'stub-threshold' => 'Limita d’amont por los <a href="#" class="stub">lims de vers los començons</a> (octèts) :',
 'stub-threshold-disabled' => 'Dèsactivâ',
 'recentchangesdays' => 'Nombro de jorns a montrar dedens los dèrriérs changements :',
index f5e184e..425f046 100644 (file)
@@ -527,7 +527,7 @@ Ferschük det man noch ans.',
 'passwordtooshort' => 'Paaswurden skel tumanst {{PLURAL:$1|1 tiaken|$1 tiakens}} lung wees.',
 'password-name-match' => 'Dü könst dan brükernööm ei üs paaswurd nem.',
 'password-login-forbidden' => 'Didiar brükernööm mä detdiar paaswurd as ei tuläät.',
-'mailmypassword' => 'Schüür mi en nei paaswurd.',
+'mailmypassword' => 'Paaswurd turagsaat',
 'passwordremindertitle' => 'Nei tidjwiis paaswurd för {{SITENAME}}',
 'passwordremindertext' => 'En brüker (woorskiinelk dü, faan IP adres $1) hää am en nei paaswurd för {{SITENAME}} ($4) fraaget.
 En nei paaswurd för di brüker "$2" as maaget wurden an het nü "$3".
@@ -599,7 +599,7 @@ of am en nei paaswurd uunfraaget.',
 # Special:PasswordReset
 'passwordreset' => 'Paaswurd turagsaat',
 'passwordreset-text-one' => 'Fal detheer formulaar ütj, am din paaswurd turag tu saaten.',
-'passwordreset-text-many' => '{{PLURAL:$1|Fal ian fial ütj, am din paaswurd turag tu saaten.}}',
+'passwordreset-text-many' => '{{PLURAL:$1|Fal ian faan jodiat fialen ütj, am en tidjwiis paaswurd tuschüürd tu fun.}}',
 'passwordreset-legend' => 'Paaswurd turagsaat',
 'passwordreset-disabled' => 'Dü könst din paaswurd uun detdiar wiki ei turagsaat.',
 'passwordreset-emaildisabled' => 'E-mail as üüb detheer Wiki ufknipset wurden.',
@@ -852,6 +852,8 @@ Uun't strik- an fersküüw-logbuk oner stäänt muar diartu.",
 'content-not-allowed-here' => '„$1“ mut ei skrewen wurd üüb sidj [[$2]]',
 'editwarning-warning' => 'Wan dü detheer sidj slotst, kön feranrangen ferleesen gung.
 Üs uunmeldet brüker könst dü detheer wäärnang bi din iinstelangen oner „Bewerke“ wechknipse.',
+'editpage-notsupportedcontentformat-title' => 'Detdiar formoot gongt ei.',
+'editpage-notsupportedcontentformat-text' => 'Det formoot $1 gongt ei mä det model $2.',
 
 # Content models
 'content-model-wikitext' => 'wikitekst',
@@ -892,6 +894,9 @@ Luke oner, of dü det uk würelk du wel, an do seekre din feranrangen.',
 'cantcreateaccount-text' => "Det iinrachten faan en brükerkonto faan det IP-adres '''($1)''' as faan [[User:$3|$3]] speret wurden.
 
 Grünj för det sper: ''$2''",
+'cantcreateaccount-range-text' => "Det iinrachten faan brükerkontos uun det IP-adresfial '''$1''', huar uk din IP ('''$4''') uun as, as faan [[User:$3|$3]] speret wurden.
+
+Di grünj faan $3 wiar: ''$2''",
 
 # History pages
 'viewpagelogs' => 'Logbuken faan detdiar sidj uunwise',
@@ -1039,7 +1044,7 @@ A nawigatjuun-links saat ales weder turag üüb di ual stant.',
 'mergehistory-reason' => 'Grünj:',
 
 # Merge log
-'mergelog' => 'Feriin-logbök',
+'mergelog' => 'Ferianangs-logbuk',
 'pagemerge-logentry' => '[[$1]] efter [[$2]] tuupfeerd (werjuunen bit $3)',
 'revertmerge' => 'Det tuupfeeren turagsaat',
 'mergelogpagetext' => 'Diar as det logbuk faan a tuupfeerd sidjen.',
@@ -1145,7 +1150,6 @@ Dü könst det uun't [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}}
 'rows' => 'Räen:',
 'columns' => 'Spleder:',
 'searchresultshead' => 'Schük',
-'resultsperpage' => 'So fölsis komt det föör per sidj:',
 'stub-threshold' => 'Formatiarang faan links <a href="#" class="stub">för letj sidjen</a> (uun Byte):',
 'stub-threshold-disabled' => 'Ufsteld',
 'recentchangesdays' => 'Soföl daar skel a „leetst feranrangen“ uunwise:',
@@ -1227,6 +1231,7 @@ Arken koon det lees.',
 'prefs-tokenwatchlist' => 'Token',
 'prefs-diffs' => 'Ferskeel',
 'prefs-help-prefershttps' => 'Detdiar iinstelang täält, wan dü di naist tooch uunmeldest.',
+'prefs-tabs-navigation-hint' => "Halep: Dü könst a lachter of rochter wiiser-knoop brük, am tesken a ridjerkoorden boowen uun't menüü hen an weder tu springen.",
 
 # User preference: email validation using jQuery
 'email-address-validity-valid' => 'Detdiar E-Mail-adres schocht gud ütj.',
@@ -1365,10 +1370,10 @@ Arken koon det lees.',
 'action-createtalk' => 'diskusjuunssidjen maage',
 'action-createaccount' => 'jüdeer brükerkonto mååge',
 'action-minoredit' => 'detdiar feranrang üs letj kääntiakne',
-'action-move' => 'jüdeer sid ferschüwe',
-'action-move-subpages' => 'jüdeer sid än unerside ferschüwe',
+'action-move' => 'an fersküüw det diar sidj',
+'action-move-subpages' => 'an fersküüw detdiar sidj mä hör onersidjen',
 'action-move-rootuserpages' => 'hood-brükersidj fersküüw',
-'action-movefile' => 'jüdeer sid ferschüwe',
+'action-movefile' => 'an fersküüw detdiar datei',
 'action-upload' => 'Datein huuchschüür',
 'action-reupload' => 'det datei auerskriiw',
 'action-reupload-shared' => 'det datei auerskriiw, diar uun en gemiansoom archiif leit',
@@ -1413,13 +1418,14 @@ Arken koon det lees.',
 'recentchanges-label-bot' => 'Feranrang faan en bot',
 'recentchanges-label-unpatrolled' => 'Detdiar feranrang as noch ei efterluket wurden',
 'recentchanges-label-plusminus' => 'Feranert sidjengrate (am soföl bytes)',
+'recentchanges-legend-heading' => "'''Ferklaarang:'''",
 'recentchanges-legend-newpage' => "(luke uk bi't [[Special:NewPages|list mä nei sidjen]])",
 'recentchanges-legend-plusminus' => "(''±123'')",
 'rcnotefrom' => "Diar wurd a feranrangen sant '''$2'''uunwiset (ei muar üs '''$1''' feranrangen).",
 'rclistfrom' => 'Bluas feranrangen sant $1 wise.',
 'rcshowhideminor' => '$1 letj feranrangen',
 'rcshowhidebots' => '$1 bots',
-'rcshowhideliu' => '$1 uunmeldet brükern',
+'rcshowhideliu' => '$1 registriaret brükern',
 'rcshowhideanons' => '$1 anonüüm brükern',
 'rcshowhidepatr' => '$1 efterluket feranrangen',
 'rcshowhidemine' => '$1 min bidracher',
@@ -1531,6 +1537,8 @@ Gung noch ans turag an schüür det datei mä en öödern nööm huuch.
 [[File:$1|thumb|center|$1]]",
 'file-exists-duplicate' => 'Detdiar datei as en duplikaat faan {{PLURAL:$1|detdiar datei|$1 datein}}:',
 'file-deleted-duplicate' => "En duplikaat faan detdiar datei ([[:$1]]) as al ans stregen wurden. Luke iin uun logbuk för't striken, iar dü det noch ans huuchsjüürst.",
+'file-deleted-duplicate-notitle' => 'Detdiar datei as leetst iarst stregen wurden an di nööm as ferbürgen wurden.
+Dü skulst hoker fraage, di ferbürgen nöömer uunluke koon, am tu besnaakin, wat det diarmä üüb ham hää.',
 'uploadwarning' => 'Wäärnang',
 'uploadwarning-text' => 'Feranre det datei-beskriiwang an ferschük det noch ans nei.',
 'savefile' => 'Datei seekre',
@@ -1854,6 +1862,7 @@ Uun arke rä stun ferwisangen tu't iarst an ööder widjerfeerang an uk tu det s
 'ninterwikis' => '$1 {{PLURAL:$1|interwiki|interwikis}}',
 'nlinks' => '$1 {{PLURAL:$1|link|links}}',
 'nmembers' => '{{PLURAL:$1|1 iindrach|$1 iindracher}}',
+'nmemberschanged' => '$1 → $2 {{PLURAL:$2|lasmoot|lasmooten}}',
 'nrevisions' => '$1 {{PLURAL:$1|feranrang|feranrangen}}',
 'nviews' => '$1 {{PLURAL:$1|klik|kliks}}',
 'nimagelinks' => 'Brükt üüb $1 {{PLURAL:$1|sidj|sidjen}}',
@@ -1892,6 +1901,7 @@ Uun arke rä stun ferwisangen tu't iarst an ööder widjerfeerang an uk tu det s
 'protectedpages' => 'Seekert sidjen',
 'protectedpages-indef' => 'Bluas permanent seekert sidjen uunwise',
 'protectedpages-cascade' => 'Bluas sidjen mä kaskaaden-seekerhaid',
+'protectedpages-noredirect' => 'Widjerfeerangen fersteeg',
 'protectedpagesempty' => 'Uun uugenblak san sok sidjen ei seekert.',
 'protectedtitles' => 'Seekert sidjennöömer',
 'protectedtitlesempty' => 'Uun uugenblak san sok sidjen ei speret.',
@@ -2156,6 +2166,7 @@ Halep an muar diartu: {{canonicalurl:{{MediaWiki:Helppage}}}}',
 'delete-edit-reasonlist' => "Grünjer för't striken bewerke",
 'delete-toobig' => 'Detdiar sidj hää muar üs $1 {{PLURAL:$1|werjuun|werjuunen}} . Sok sidjen kön ei so gau stregen wurd, ööders san a servers plaat.',
 'delete-warning-toobig' => "Detdiar sidj hää muar üs $1 {{PLURAL:$1|werjuun|werjuunen}} . Det striken koon komer maage bi't dootenbeenk.",
+'deleting-backlinks-warning' => "'''Paase üüb:''' Diar ferwise noch ööder sidjen üüb det sidj, diar dü strik wel.",
 
 # Rollback
 'rollback' => 'Feranrangen turagsaat',
@@ -2388,6 +2399,7 @@ Skriiw en guden grünj för det sper ap.',
 Am det aptuheewen, gung tu't [[Special:BlockList|sperlist]].",
 'ipb-blockingself' => 'Wel dü würelk di salew spere?',
 'ipb-confirmhideuser' => 'Dü beest diarbi, en brüker uun det muude „brüker fersteeg“ tu sperin. Do woort di brükernööm uun aal a logbuken an listen ferbürgen. Wel dü det würelk du?',
+'ipb-confirmaction' => 'Wan dü was an seeker beest, dat dü det würelk du wel, do trak oner üüb det fial „{{int:ipb-confirm}}“.',
 'ipb-edit-dropdown' => "Grünjer för't sperin bewerke",
 'ipb-unblock-addr' => '„$1“ ei muar spere',
 'ipb-unblock' => 'IP-adres/brüker ei muar spere',
@@ -2490,7 +2502,7 @@ Fertel det dan ISP of dan süsteemsiinst. Eeben proxys stel det seekerhaid uun f
 
 # Move page
 'move-page' => 'Fersküüw $1',
-'move-page-legend' => 'Sid ferschüwe',
+'move-page-legend' => 'Sidj fersküüw',
 'movepagetext' => "Mä detdiar formulaar könst dü en sidj mä aal sin werjuunen amnääm.
 Di ual tiitel woort üüb di nei widjerfeerd.
 Dü könst widjerfeerangen, diar üüb di ual tiitel wise, automaatisk üüb di nei tiitel widjerfeer läät.
@@ -3444,6 +3456,11 @@ Ferseekre, dat dü det sidj würelk nei maage wel.",
 'imgmultigo' => 'Widjer',
 'imgmultigoto' => 'Gung tu sidj $1',
 
+# Language selector for translatable SVGs
+'img-lang-default' => '(standard spriak)',
+'img-lang-info' => 'Detdiar bil uun $1 amwerke. $2',
+'img-lang-go' => 'Widjer',
+
 # Table pager
 'ascending_abbrev' => 'ap',
 'descending_abbrev' => 'deel',
@@ -3520,8 +3537,18 @@ Dü könst uk det [[Special:EditWatchlist|normool sidj]] tu bewerkin nem.",
 'version-parser-function-hooks' => 'Parser function hooks',
 'version-hook-name' => 'Hook nööm',
 'version-hook-subscribedby' => 'Aprepen faan',
-'version-version' => '(Werjuun $1)',
-'version-license' => 'Lisens',
+'version-version' => '($1)',
+'version-license' => 'MediaWiki-lisens',
+'version-ext-license' => 'Lisens',
+'version-ext-colheader-name' => 'Ütjwidjang',
+'version-ext-colheader-version' => 'Werjuun',
+'version-ext-colheader-license' => 'Lisens',
+'version-ext-colheader-description' => 'Beskriiwang',
+'version-ext-colheader-credits' => 'Skriiwern',
+'version-license-title' => 'Lisens för $1',
+'version-license-not-found' => 'För detdiar ütjwidjang as nian lisens fünjen wurden.',
+'version-credits-title' => 'Soonk för $1',
+'version-credits-not-found' => 'För detdiar ütjwidjang as nään soonk fünjen wurden.',
 'version-poweredby-credits' => "Detheer wääbsteed werket mä '''[https://www.mediawiki.org/wiki/MediaWiki/de MediaWiki]''', Copyright © 2001–$1 $2.",
 'version-poweredby-others' => 'öödern',
 'version-poweredby-translators' => 'Auersaatern faan translatewiki.net',
@@ -3539,14 +3566,15 @@ You should have received [{{SERVER}}{{SCRIPTPATH}}/COPYING a copy of the GNU Gen
 'version-entrypoints-header-url' => 'URL',
 
 # Special:Redirect
-'redirect' => 'Widjerfeerang üüb en brükersidj, sidjenwerjuun of datei.',
+'redirect' => 'Widjerfeerang faan en brüker, en sidj, en sidjenwerjuun of en datei.',
 'redirect-legend' => 'Widjerfeerang üüb en sidjenwerjuun of datei.',
-'redirect-summary' => 'Detdiar spezial-sidj feert widjer üüb en brükersidj, sidjenwerjuun of datei.
-An det woort so brükt: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/revision/328429]], of [[{{#Special:Redirect}}/user/101]].',
+'redirect-summary' => 'Detdiar spezial-sidj feert widjer üüb en brükersidj, sidj, sidjenwerjuun of datei.
+An det woort so brükt:  [[{{#Special:Redirect}}/user/101]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]] of [[{{#Special:Redirect}}/file/Example.jpg]].',
 'redirect-submit' => 'Widjer',
 'redirect-lookup' => 'Schük:',
 'redirect-value' => 'Käänang of dateinööm:',
 'redirect-user' => 'Brüker-ID',
+'redirect-page' => 'Sidjenkäännumer (ID)',
 'redirect-revision' => 'Sidjenwerjuun',
 'redirect-file' => 'Dateinööm',
 'redirect-not-exists' => 'Wäärs ei fünjen',
@@ -3741,6 +3769,7 @@ An det woort so brükt: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special
 'api-error-overwrite' => 'Dü könst nian datei auerskriiw, wat al diar as.',
 'api-error-stashfailed' => 'Intern feeler: Di server küd nian tidjwiis datei seekre.',
 'api-error-publishfailed' => 'Intern feeler: Di server küd det tidjwiis datei ei widjer schüür.',
+'api-error-stasherror' => "Bi't huuchschüüren faan detdiar datei as wat skiaf gingen.",
 'api-error-timeout' => 'Di server hää ei rochttidjag swaaret (time-out).',
 'api-error-unclassified' => 'Diar as irgentwat skiaf gingen.',
 'api-error-unknown-code' => 'Ünbekäänd feeler: „$1“',
@@ -3787,10 +3816,12 @@ Uk parser-funktjuunen liküs <code><nowiki>{{</nowiki>#language:…}}</code> an
 'expand_templates_input' => 'Skriiwfial:',
 'expand_templates_output' => 'Resultaat',
 'expand_templates_xml_output' => 'XML-resultaat',
+'expand_templates_html_output' => 'Rä HTML-ütjgoow',
 'expand_templates_ok' => 'OK',
 'expand_templates_remove_comments' => 'Komentaaren wechnem',
 'expand_templates_remove_nowiki' => "<nowiki>-tags uun't resultaat ei uunwise",
 'expand_templates_generate_xml' => 'XML-parser-buum uunwise',
+'expand_templates_generate_rawhtml' => 'Rä HTML uunwise',
 'expand_templates_preview' => 'Föörskau',
 
 );
index ecf6d8a..879dcb1 100644 (file)
@@ -807,7 +807,6 @@ Leiende: (cur) = difarencis cun la version atuâl, (prec) = difarencis cun la ve
 'rows' => 'Riis',
 'columns' => 'Colonis:',
 'searchresultshead' => 'Ricercje',
-'resultsperpage' => 'Risultâts par pagjine',
 'stub-threshold' => 'Valôr minim pe formatazion dai <a href="#" class="stub">leams aboç</a> (bytes):',
 'recentchangesdays' => 'Numar di zornadis di mostrâ tai ultins cambiaments:',
 'recentchangesdays-max' => '(massim $1 {{PLURAL:$1|zornade|zornadis}})',
index 89b8ea4..b59ae53 100644 (file)
@@ -1011,7 +1011,6 @@ Prebearje in oare sykopdracht.',
 'rows' => 'Rigen',
 'columns' => 'Kolommen',
 'searchresultshead' => 'Sykje',
-'resultsperpage' => 'Treffers de side',
 'stub-threshold' => 'Drompel foar markearring <a href="#" class="stub">stobbe</a> (bytes):',
 'recentchangesdays' => 'Dagen om sjen te litten yn Koartlyn feroare:',
 'recentchangesdays-max' => '(maksimaal $1 {{PLURAL:$1|dei|dagen}})',
index 6b99771..3934280 100644 (file)
@@ -823,7 +823,6 @@ Treoir: (rth) = difríocht ón leagan reatha, (rmh) = difríocht ón leagan roim
 'rows' => 'Sraitheanna',
 'columns' => 'Colúin',
 'searchresultshead' => 'Cuardaigh',
-'resultsperpage' => 'Torthaí le taispeáint ó leathanach:',
 'stub-threshold-disabled' => 'Díchumasaithe',
 'recentchangesdays' => 'Méid laethanta le taispeáint sna hathruithe is déanaí:',
 'recentchangesdays-max' => '(uasmhéid $1 {{PLURAL:$1|lá|lá}})',
index 2d6569e..0351603 100644 (file)
@@ -762,7 +762,6 @@ $2',
 'rows' => '横:',
 'columns' => '竖:',
 'searchresultshead' => '设置寻到𠮶结果',
-'resultsperpage' => '设置寻到𠮶链接数',
 'stub-threshold' => '<a href="#" class="stub">细文链接</a>格式门槛:',
 'recentchangesdays' => '最近更改中𠮶显示日数:',
 'recentchangescount' => '最近更改中𠮶编辑数:',
index 26cc546..334c848 100644 (file)
@@ -783,7 +783,6 @@ $2',
 'rows' => '橫:',
 'columns' => '豎:',
 'searchresultshead' => '設置尋到嗰結果',
-'resultsperpage' => '設置尋到嗰連結數',
 'stub-threshold' => '<a href="#" class="stub">細文連結</a>格式門檻:',
 'recentchangesdays' => '頂晏嗰改動嗰顯示日數:',
 'recentchangescount' => '最近更改中嗰編輯數:',
index 59bf178..4230691 100644 (file)
@@ -1443,7 +1443,6 @@ Note que os seus índices do contido de {{SITENAME}} poden estar desactualizados
 'rows' => 'Filas:',
 'columns' => 'Columnas:',
 'searchresultshead' => 'Procurar',
-'resultsperpage' => 'Número de resultados por páxina:',
 'stub-threshold' => 'Límite superior para o formato de <a href="#" class="stub">ligazóns de bosquexo</a> (bytes):',
 'stub-threshold-disabled' => 'Desactivado',
 'recentchangesdays' => 'Número de días a mostrar nos cambios recentes:',
index 4d3d90f..a6e47dd 100644 (file)
@@ -826,7 +826,6 @@ $1",
 'rows' => 'Σειραί:',
 'columns' => 'Στῆλαι:',
 'searchresultshead' => 'Ζητεῖν',
-'resultsperpage' => 'Ἀποτελέσματα ἀνά δέλτον:',
 'stub-threshold' => 'Ἄνω φράγμα διὰ τοῦς <a href="#" class="stub">συνδέσμους πρὸς λείμματα</a> (δυφία):',
 'stub-threshold-disabled' => 'Ἀπενεργηθέν',
 'recentchangesdays' => 'Αἱ ἡμέραι αἱ δεικτέαι ἐν ταῖς προσφάτοις ἀλλαγαῖς:',
index f4146a0..18e996a 100644 (file)
@@ -1256,7 +1256,6 @@ Einzelheite chasch im [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}
 'rows' => 'Zylene',
 'columns' => 'Spaltene',
 'searchresultshead' => 'Suech-Ergäbnis',
-'resultsperpage' => 'Träffer pro Syte',
 'stub-threshold' => 'Gleichformatierig <a href="#" class="stub">vu chleine Syte</a> (in Byte):',
 'stub-threshold-disabled' => 'Deaktiviert',
 'recentchangesdays' => 'Aazahl vu dr Täg, wu d Lischt vu dr  „Letschte Änderige“ standardmässig soll umfasse:',
index debfc59..e1bf53a 100644 (file)
@@ -1285,7 +1285,6 @@ $1",
 'rows' => 'પંક્તિઓ',
 'columns' => 'સ્તંભ',
 'searchresultshead' => 'શોધો',
-'resultsperpage' => 'પ્રતિ પાના પર પરિણામો',
 'stub-threshold' => '<a href="#" class="stub">stub link</a>નાફોર્મમેટિંગ માટે શરૂઆતિ પગથિયું  (બાઈટ્સ):',
 'stub-threshold-disabled' => 'નિષ્ક્રિય કરેલ',
 'recentchangesdays' => 'તાજા ફેરફારોમાં દેખાડવાના દિવસો',
index fe97a41..57cb3f4 100644 (file)
@@ -1211,6 +1211,8 @@ $2
 'content-not-allowed-here' => 'תוכן מסוג "$1" אינו מותר בדף [[$2]]',
 'editwarning-warning' => 'עזיבת דף זה עשויה לגרום לאובדן כל השינויים שביצעתם.
 אם אתם מחוברים לחשבון, תוכלו לבטל אזהרה זו בחלק "עריכה" שבהעדפות שלכם.',
+'editpage-notsupportedcontentformat-title' => 'סוג התוכן אינו נתמך',
+'editpage-notsupportedcontentformat-text' => 'תוכן מסוג $1 אינו נתמך על־ידי מודל התוכן $2.',
 
 # Content models
 'content-model-wikitext' => 'טקסט ויקי',
@@ -1518,7 +1520,6 @@ $1",
 'rows' => 'שורות:',
 'columns' => 'עמודות:',
 'searchresultshead' => 'חיפוש',
-'resultsperpage' => 'מספר תוצאות בעמוד:',
 'stub-threshold' => 'סף לעיצוב <a href="#" class="stub">קישורים</a> לקצרמרים (בתים):',
 'stub-threshold-disabled' => 'מבוטל',
 'recentchangesdays' => 'מספר הימים שיוצגו בדף השינויים האחרונים:',
@@ -2813,9 +2814,9 @@ $1',
 'blockipsuccesstext' => '{{GENDER:$1|המשתמש|המשתמשת}} [[Special:Contributions/$1|$1]] {{GENDER:$1|נחסם|נחסמה}}.
 
 ראו את [[Special:BlockList|רשימת החסומים]] כדי לצפות בחסימות.',
-'ipb-blockingself' => '×\90ת×\9d ×¢×\95×\9e×\93×\99×\9d ×\9c×\97ס×\95×\9d ×\90ת ×¢×¦×\9e×\9b×\9d! ×\94×\90×\9d ×\90ת×\9d ×\91×\90×\9eת ×¨×\95צ×\99×\9d ×\9cעש×\95ת ×\90ת ×\96×\94?',
+'ipb-blockingself' => '×\90ת×\9d ×¢×\95×\9e×\93×\99×\9d ×\9c×\97ס×\95×\9d ×\90ת ×¢×¦×\9e×\9b×\9d! ×\94×\90×\9d ×\90ת×\9d ×\91×\98×\95×\97×\99×\9d ×©×\91רצ×\95× ×\9b×\9d ×\9cעש×\95ת ×\96×\90ת?',
 'ipb-confirmhideuser' => 'אתם עומדים לחסום משתמש עם האפשרות "הסתרת משתמש". פעולה זו תסתיר את שם המשתמש בכל הרשימות ופעולות היומן. האם אתם בטוחים שברצונכם לעשות זאת?',
-'ipb-confirmaction' => '×\90×\9d ×\91×\90×\9eת ×¨×¦×\99ת ×\9cעש×\95ת ×\90ת ×\96×\94, × ×\90 ×\9cס×\9e×\9f ×\90ת ×\94ש×\93×\94 "{{int:ipb-confirm}}" בתחתית.',
+'ipb-confirmaction' => '×\90×\9d ×\90ת×\9d ×\91×\90×\9eת ×\91×\98×\95×\97×\99×\9d ×©×\91רצ×\95× ×\9b×\9d ×\9cעש×\95ת ×\96×\90ת, ×\90× ×\90 ×¡×\9e× ×\95 ×\90ת ×\94ש×\93×\94 "{{int:ipb-confirm}}" ×©בתחתית.',
 'ipb-edit-dropdown' => 'עריכת סיבות החסימה',
 'ipb-unblock-addr' => 'הסרת חסימה של $1',
 'ipb-unblock' => 'הסרת חסימה של שם משתמש או כתובת IP',
@@ -4080,7 +4081,7 @@ $5
 'version-parser-function-hooks' => 'מבנים של פונקציות מפענח',
 'version-hook-name' => 'שם ה־Hook',
 'version-hook-subscribedby' => 'הפונקציה הרושמת',
-'version-version' => '(גרסה $1)',
+'version-version' => '($1)',
 'version-license' => 'רישיון עבור מדיה־ויקי',
 'version-ext-license' => 'רישיון',
 'version-ext-colheader-name' => 'הרחבה',
index 689f8db..b22c623 100644 (file)
@@ -618,7 +618,7 @@ $2',
 'yourpasswordagain' => 'कूटशब्द दुबारा लिखें:',
 'createacct-yourpasswordagain' => 'कूटशब्द की पुष्टि करें',
 'createacct-yourpasswordagain-ph' => 'कूटशब्द पुनः लिखें',
-'remembermypassword' => 'हà¥\8dया à¤¬à¥\8dराà¤\89à¤\9cराà¤\9aà¥\87र à¤®à¤¾à¤\9cà¥\8b à¤²à¥\89à¤\97 à¤\87न à¤¯à¤¾à¤¦ à¤¦à¤µà¤°à¤¾à¤¤ (à¤\9aडाà¤\82तà¤\9aड $1 {{PLURAL:$1|दिस|दिसाà¤\82}} à¤\96ातà¥\80र)',
+'remembermypassword' => 'à¤\87स à¤¬à¥\8dराà¤\89à¤\9c़र à¤ªà¤° à¤®à¥\87रा à¤²à¥\89à¤\97िन à¤¯à¤¾à¤¦ à¤°à¤\96à¥\87à¤\82 (à¤\85धिà¤\95तम $1 {{PLURAL:$1|दिन|दिनà¥\8bà¤\82}} à¤\95à¥\87 à¤²à¤¿à¤\8f)',
 'userlogin-remembermypassword' => 'मुझे लॉग्ड इन रखें',
 'userlogin-signwithsecure' => 'सुरक्षित कनेक्शन का प्रयोग करें',
 'yourdomainname' => 'आपका डोमेन:',
@@ -1335,7 +1335,6 @@ $1",
 'rows' => 'कतारें:',
 'columns' => 'कॉलम:',
 'searchresultshead' => 'खोज',
-'resultsperpage' => 'प्रति पृष्ठ हिट्स:',
 'stub-threshold' => '<a href="#" class="stub">आधार कड़ियों</a> का अधिकतम आकार (बाइट):',
 'stub-threshold-disabled' => 'अक्षम किया गया',
 'recentchangesdays' => 'हाल में हुए बदलावों में दर्शाने के दिन:',
@@ -2158,7 +2157,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization देखें।',
 'prevpage' => 'पिछला पृष्ठ ($1)',
 'allpagesfrom' => 'इस अक्षर से आरंभ होने वाले पृष्ठ दर्शाएँ:',
 'allpagesto' => 'इस अक्षर से समाप्त होने वाले पृष्ठ दिखाएँ:',
-'allarticles' => 'सà¤\97ळà¥\80 à¤ªà¤¾à¤¨à¤¾',
+'allarticles' => 'सभà¥\80 à¤ªà¥\83षà¥\8dठ',
 'allinnamespace' => 'सभी पृष्ठ ($1 नामस्थान)',
 'allpagessubmit' => 'जाएँ',
 'allpagesprefix' => 'इस उपपद से शुरू होने वाले पृष्ठ दर्शाएँ:',
@@ -2845,7 +2844,7 @@ $1 को बाध्य करने का कारण है: "$2"',
 
 # Namespace 8 related
 'allmessages' => 'व्यवस्था संदेश',
-'allmessagesname' => 'नाà¤\82व',
+'allmessagesname' => 'नाम',
 'allmessagesdefault' => 'डिफॉल्ट पाठ',
 'allmessagescurrent' => 'वर्तमान पाठ',
 'allmessagestext' => 'ये मीडियाविकि नामस्थान में उपलब्ध प्रणाली संदेशों की एक सूची है। यदि आप सामान्य मीडियाविकि क्षेत्रीयकरण में योगदान देना चाहें तो कृपया [https://www.mediawiki.org/wiki/Localisation मीडियाविकि क्षेत्रीयकरण] व [//translatewiki.net translatewiki.net] को देखें।',
index 877cdcb..57344e1 100644 (file)
@@ -516,7 +516,7 @@ $messages = array(
 'deletethispage' => 'Izbriši ovu stranicu',
 'undeletethispage' => 'Vrati ovu stranicu',
 'undelete_short' => 'Vrati {{PLURAL:$1|$1 uređivanje|$1 uređivanja}}',
-'viewdeleted_short' => 'Prikaži $1 {{plural: $1|izbrisano uređivanje|izbrisana uređivanja|izbrisanih uređivanja}}',
+'viewdeleted_short' => 'Prikaži $1 {{PLURAL:$1|izbrisano uređivanje|izbrisana uređivanja|izbrisanih uređivanja}}',
 'protect' => 'Zaštiti',
 'protect_change' => 'promijeni',
 'protectthispage' => 'Zaštiti ovu stranicu',
@@ -1413,7 +1413,6 @@ Više informacija možete pronaći u [{{fullurl:{{#Special:Log}}/delete|page={{F
 'rows' => 'Redova',
 'columns' => 'Stupaca',
 'searchresultshead' => 'Prikaz rezultata pretrage',
-'resultsperpage' => 'Koliko pogodaka na jednoj stranici',
 'stub-threshold' => 'Prag za formatiranje poput <a href="#" class="stub">poveznice mrve</a>:',
 'stub-threshold-disabled' => 'Onemogućeno',
 'recentchangesdays' => 'Broj dana prikazanih u nedavnim promjenama:',
@@ -1979,7 +1978,7 @@ Sljedeći popis prikazuje {{PLURAL:$1|stranice koje|prvih $1 stranica koje}} vod
 'linkstoimage-redirect' => '$1 (preusmjeravanje datoteke) $2',
 'duplicatesoffile' => '{{PLURAL:$1|Sljedeća datoteka je kopija|$1 sljedeće datoteke su kopije|$1 sljedećih datoteka su kopije}} ove datoteke ([[Special:FileDuplicateSearch/$2|više detalja]]):',
 'sharedupload' => 'Ova je datoteka postavljena na $1 i mogu je koristiti ostali projekti.',
-'sharedupload-desc-there' => 'Ova datoteka je s $1 i mogu je koristiti drugi projekti. Pogledajte [$2 stranicu s opisom datoteke] za dodatne informacije.',
+'sharedupload-desc-there' => 'Ova datoteka je s projekta $1 i mogu je koristiti drugi projekti. Pogledajte [$2 stranicu s opisom datoteke] za dodatne informacije.',
 'sharedupload-desc-here' => 'Ova datoteka je sa $1 i mogu je koristiti drugi projekti. Opis s njezine [$2 stranice s opisom datoteke] prikazan je ispod.',
 'sharedupload-desc-edit' => 'Ova datoteka nalazi se na $1 i može se rabiti na drugim projektima.
 Njen opis možete urediti na [$2 stranici opisa datoteke].',
index b6f0e13..0acda6e 100644 (file)
@@ -880,12 +880,12 @@ Twoje změny hišće njejsu składowane!",
 'previewconflict' => 'Tutón přehlad zwobraznja tekst w hornim tekstowym polu,  kaž so zjewi, jeli jón składuješ.',
 'session_fail_preview' => "'''Njemóžachmy twoju změnu předźěłać, dokelž su so posedźenske daty zhubili.'''
 Spytaj prošu hišće raz.
-Jeli to hišće njefunguje, [[Special:UserLogout|wotzjew so]] a přizjew so zaso.",
-'session_fail_preview_html' => "'''Njemóžachmy twoje změnu předźěłać, dokelž su so posedźenske daty zhubili.'''
+Jeli přeco hišće njefunguje, [[Special:UserLogout|wotzjew so]] a přizjew so znowa.",
+'session_fail_preview_html' => "'''Njemóžachmy twoju změnu předźěłać, dokelž su so posedźenske daty zhubili.'''
 
-''Dokelž we {{GRAMMAR:lokatiw|{{SITENAME}}}} je luty HTML zmóžnił, je přehlad jako wěstotna naprawa přećiwo atakam přez JavaScript schowany.''
+''Dokelž je we {{GRAMMAR:lokatiw|{{SITENAME}}}} luty HTML zmóžnjeny, je přehlad jako wěstotna naprawa přećiwo atakam přez JavaScript schowany.''
 
-'''Jeli to je legitimny wobdźěłowanski pospyt, spytaj prošu hišće raz. Jeli to hišće njefunguje, [[Special:UserLogout|wotzjew so]] a přizjew so znowa.'''",
+'''Jeli to je chutnje měnjeny wobdźěłowanski pospyt, spytaj prošu hišće raz. Jeli přeco hišće njefunguje, [[Special:UserLogout|wotzjew so]] a přizjew so znowa.'''",
 'token_suffix_mismatch' => "'''Twoja změna je so wotpokazała, dokelž twój wobhladowak je znamješka skepsał.
 Składowanje móže wobsah strony zničić. Móže so to na přikład přez wopačnje dźěłowacy proksy stać.'''",
 'edit_form_incomplete' => "'''Někotre dźěle wobdźěłowanskeho formulara njejsu serwer docpěli; prošu přepruwuj, hač twoje změny su w porjadku a spytaj hišće raz.'''",
@@ -960,6 +960,8 @@ Eksistuje hižo.',
 'invalid-content-data' => 'Njepłaćiwe wobsahowe daty',
 'content-not-allowed-here' => 'Wobsah "$1" njeje na stronje [[$2]] dowoleny',
 'editwarning-warning' => 'Hdyž so strona wopušća, móža so změny zhubić, kotrež sy přewjedł. Jeli sy přizjewjeny, móžeš tute warnowanje we wotrězku "Wobdźěłowanje" swojich nastajenjow znjemóžnić.',
+'editpage-notsupportedcontentformat-title' => 'Wobsahowy format so njepodpěruje',
+'editpage-notsupportedcontentformat-text' => 'Wobsahowy format $1 so přez wobsahowy model $2 njepodpěruje.',
 
 # Content models
 'content-model-wikitext' => 'wikitekst',
@@ -1260,7 +1262,6 @@ Podrobnosće móžeš w [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}
 'rows' => 'Rjadki:',
 'columns' => 'Stołpiki:',
 'searchresultshead' => 'Pytać',
-'resultsperpage' => 'Wuslědki za stronu:',
 'stub-threshold' => 'Wotkazowe formatowanje <a href="#" class="stub">małych stronow</a> (w bajtach):',
 'stub-threshold-disabled' => 'Znjemóžnjeny',
 'recentchangesdays' => 'Ličba dnjow w lisćinje aktualnych změnow:',
@@ -2529,6 +2530,7 @@ Najnowši zapisk w protokolu blokowanjow so deleka jako referenca podawa:',
 Hlej [[Special:BlockList|lisćinu blokowanjow]], zo by zablokowanjow pruwował.',
 'ipb-blockingself' => 'Chceš samoho blokować! Chceš to woprawdźe činić?',
 'ipb-confirmhideuser' => 'Chceš runje wužiwarja z nastajenjom "wužiwarja schować" blokować. To k tomu dowjedźe, zo mjeno wužiwarja so we wšch lisćinach a protokolowych zapiskach potłóči. Chceš to woprawdźe činić?',
+'ipb-confirmaction' => 'Jeli sy sej wěsty, zo chceš to woprawdźe činić, přepruwuj prošu deleka polo "{{int:ipb-confirm}}".',
 'ipb-edit-dropdown' => 'přičiny zablokowanjow wobdźěłać',
 'ipb-unblock-addr' => 'zablokowanje wužiwarja „$1“ zběhnyć',
 'ipb-unblock' => 'zablokowanje wužiwarja abo IP-adresy zběhnyć',
index 2ad4809..98c1527 100644 (file)
@@ -1412,7 +1412,6 @@ Ezt általában egy elavult, törölt oldalra mutató laptörténeti hivatkozás
 'rows' => 'Sor',
 'columns' => 'Oszlop',
 'searchresultshead' => 'Keresés',
-'resultsperpage' => 'Laponként mutatott találatok száma:',
 'stub-threshold' => 'A hivatkozások <a href="#" class="stub">csonkként</a> történő formázásának határa (bájtban):',
 'stub-threshold-disabled' => 'Kikapcsolva',
 'recentchangesdays' => 'A friss változtatásokban mutatott napok száma:',
@@ -1664,6 +1663,7 @@ A műveletet nem lehet visszavonni.',
 'recentchanges-label-bot' => 'Ezt a szerkesztést egy bot hajtotta végre',
 'recentchanges-label-unpatrolled' => 'Ezt a szerkesztést még nem ellenőrizték',
 'recentchanges-label-plusminus' => 'Az oldal mérete ennyi bájttal módosult',
+'recentchanges-legend-heading' => 'Jelmagyarázat:',
 'recentchanges-legend-newpage' => '(lásd még: [[Special:NewPages|Új lapok]])',
 'rcnotefrom' => 'Alább a <b>$2</b> óta történt változtatások láthatóak (<b>$1</b> db).',
 'rclistfrom' => '$1 után történt változtatások megtekintése',
index 103713b..5393820 100644 (file)
@@ -1316,7 +1316,6 @@ Nota que lor indices del contento de {{SITENAME}} pote esser obsolete.',
 'rows' => 'Lineas:',
 'columns' => 'Columnas:',
 'searchresultshead' => 'Recerca',
-'resultsperpage' => 'Resultatos per pagina:',
 'stub-threshold' => 'Limite pro formatar le ligamines in <a href="#" class="stub">stilo de peciettas</a> (bytes):',
 'stub-threshold-disabled' => 'Disactivate',
 'recentchangesdays' => 'Numero de dies a monstrar in modificationes recente:',
@@ -2630,6 +2629,7 @@ specific que ha essite vandalisate).',
 Vide le [[Special:BlockList|lista de blocadas]] pro revider le blocadas.',
 'ipb-blockingself' => 'Tu sta super le puncto de blocar te mesme! Es tu secur de voler facer isto?',
 'ipb-confirmhideuser' => 'Tu es super le puncto de blocar un usator con le option "celar usator" activate. Isto supprimera le nomine del usator in tote le listas e entratas de registro. Es tu secur de voler facer isto?',
+'ipb-confirmaction' => 'Si tu es absolutemente secur de voler facer lo, marca le quadrato "{{int:ipb-confirm}}" al fundo.',
 'ipb-edit-dropdown' => 'Modificar le motivos pro blocar',
 'ipb-unblock-addr' => 'Disblocar $1',
 'ipb-unblock' => 'Disblocar un nomine de usator o un adresse IP',
@@ -3225,7 +3225,7 @@ Omne ligamines posterior in le mesme linea es considerate como exceptiones, i.e.
 Si le file ha essite modificate ab su stato original, es possibile que alcun detalios non reflecte completemente le file modificate.',
 'metadata-expand' => 'Revelar detalios extense',
 'metadata-collapse' => 'Celar detalios extense',
-'metadata-fields' => 'Le campos de metadatos de imagine listate in iste message essera includite in le visualisation del pagina de imagine quando le tabula de metadatos es plicate.
+'metadata-fields' => 'Le campos de metadatos de imagine listate in iste message essera includite in le visualisation del pagina de imagine quando le tabella de metadatos es plicate.
 Le alteres essera initialmente celate.
 * make
 * model
index edb09b9..2431bed 100644 (file)
@@ -1476,7 +1476,6 @@ Perlu diingat bahwa indeks Google untuk konten {{SITENAME}} mungkin belum mencak
 'rows' => 'Baris:',
 'columns' => 'Kolom:',
 'searchresultshead' => 'Cari',
-'resultsperpage' => 'Hasil per halaman:',
 'stub-threshold' => 'Ambang batas untuk format <a href="#" class="stub">pranala rintisan</a>:',
 'stub-threshold-disabled' => 'Dinonaktifkan',
 'recentchangesdays' => 'Jumlah hari yang ditampilkan di perubahan terbaru:',
index efb770e..369bb41 100644 (file)
@@ -747,7 +747,6 @@ Okwu ụmà: '''({{int:cur}})''' = gbánwe na nké orü mbu, '''({{int:last}})''
 'rows' => 'Ǹdịlị:',
 'columns' => 'Ogìdì:',
 'searchresultshead' => 'Chọwa',
-'resultsperpage' => 'Nlé na ihü:',
 'stub-threshold-disabled' => 'Ápụgị òkò',
 'timezonelegend' => 'Nkeji ogẹ:',
 'localtime' => 'Ogẹ ebeanọr:',
index 76403af..6b880d5 100644 (file)
@@ -1201,7 +1201,6 @@ Laglagipem laeng a dagiti pagsurotan nagyan ti {{SITENAME}} ket baka baak.',
 'rows' => 'Ar-aray:',
 'columns' => 'Tuk-tukol:',
 'searchresultshead' => 'Biruken',
-'resultsperpage' => 'Nabirukan ti tunggal maysa a panid:',
 'stub-threshold' => 'Pagpatinggaan para iti panagporma ti <a href="#" class="stub">pungol a silpo</a> (dagiti byte):',
 'stub-threshold-disabled' => 'Nabaldado',
 'recentchangesdays' => 'Al-aldaw nga ipakita dagiti kinaudi a binalbaliwan:',
index 4cefd2f..72c0a13 100644 (file)
@@ -695,7 +695,6 @@ Surskriburo: '''({{int:cur}})''' = diferi kun l'aktuala versiono,
 'rows' => 'Linei:',
 'columns' => 'Kolumni:',
 'searchresultshead' => 'Preferaji di la rezultaji dil sercho',
-'resultsperpage' => 'Trovaji po pagino:',
 'recentchangesdays' => 'Dii montrota en la recenta chanji:',
 'recentchangesdays-max' => 'Maximo $1 {{PLURAL:$1|dio|dii}}',
 'recentchangescount' => 'Quanto de redakti montrota kustume:',
index dd85f75..64b0e80 100644 (file)
@@ -505,7 +505,7 @@ Sjá [[Special:Version|útgáfusíðuna]].',
 'youhavenewmessages' => 'Þú hefur fengið $1 ($2).',
 'youhavenewmessagesfromusers' => 'Þú hefur $1 frá {{PLURAL:$3|öðrum notanda|$3 notendum}} ($2)',
 'youhavenewmessagesmanyusers' => 'Þú hefur $1 frá mörgum notendum ($2).',
-'newmessageslinkplural' => '{{PLURAL:$1|ein|}} ný skilaboð',
+'newmessageslinkplural' => '{{PLURAL:$1|ný}} skilaboð',
 'newmessagesdifflinkplural' => '{{PLURAL:$1|síðasta breyting|síðustu breytingar}} spjallsíðunnar',
 'youhavenewmessagesmulti' => 'Þín bíða ný skilaboð á $1',
 'editsection' => 'breyta',
@@ -593,8 +593,8 @@ Líklegt er að einhver annar hafi gert það.',
 Engin skýring gefin.',
 'badtitle' => 'Slæmur titill',
 'badtitletext' => 'Umbeðin síðutitill er ógildur.',
-'perfcached' => 'Eftirfarandi er afrit af umbeðinni síðu og gæti því ekki verið nýjasta útgáfa hennar. Allt að {{PLURAL:$1|ein niðurstaða er aðgengileg|$1 niðurstöður eru aðgengilegar}} í skyndiminninu.',
-'perfcachedts' => 'Eftirfarandi gögn eru í skyndiminninu, og voru síðast uppfærð $1. Allt að {{PLURAL:$4|ein niðurstaða er aðgengileg|$4 niðurstöður eru aðgengilegar}} í skyndiminninu.',
+'perfcached' => 'Eftirfarandi er afrit af umbeðinni síðu og gæti því ekki verið nýjasta útgáfa hennar. Allt að $1 {{PLURAL:$1|niðurstaða er aðgengileg|niðurstöður eru aðgengilegar}} í skyndiminninu.',
+'perfcachedts' => 'Eftirfarandi gögn eru í skyndiminninu, og voru síðast uppfærð $1. Allt að $4 {{PLURAL:$4|niðurstaða er aðgengileg|niðurstöður eru aðgengilegar}} í skyndiminninu.',
 'querypage-no-updates' => 'Lokað er fyrir uppfærslur af þessari síðu. Gögn sett hér munu ekki vistast.',
 'viewsource' => 'Skoða efni',
 'viewsource-title' => 'Skoða efni $1',
@@ -720,7 +720,7 @@ Athugaðu hvort um innsláttavillu er að ræða eða [[Special:UserLogin/signup
 'login-userblocked' => 'Þessi notandi hefur verið settur í bann.  Innskráning ekki leyfð.',
 'wrongpassword' => 'Uppgefið lykilorð er rangt. Vinsamlegast reyndu aftur.',
 'wrongpasswordempty' => 'Lykilorðsreiturinn var auður. Vinsamlegast reyndu aftur.',
-'passwordtooshort' => 'Lykilorð skal vera að minnsta kosti {{PLURAL:$1 |einn stafur|$1 stafir}}.',
+'passwordtooshort' => 'Lykilorð skal vera að minnsta kosti $1 {{PLURAL:$1|stafur|stafir}}.',
 'password-name-match' => 'Þarf að lykilorð þitt sé öðruvísi notandanafni þínu',
 'password-login-forbidden' => 'Notkun þessa notendanafns og lykilorðs er ekki leyfileg.',
 'mailmypassword' => 'Endurstilla lykilorð',
@@ -728,10 +728,10 @@ Athugaðu hvort um innsláttavillu er að ræða eða [[Special:UserLogin/signup
 'passwordremindertext' => 'Einhver (líklegast þú, á vistfanginu $1) hefur beðið um að fá nýtt
 lykilorð fyrir {{SITENAME}} ($4). Tímabundið lykilorð fyrir notandann „$2“
 hefur verið búið til og er núna „$3“. Ef þetta er það sem þú vildir, þarfu að skrá
-þig inn og velja nýtt lykilorð.  Þetta tímabundna lykilorð rennur út eftir {{PLURAL:$5|einn dag|$5 daga}}.
+þig inn og velja nýtt lykilorð.  Þetta tímabundna lykilorð rennur út eftir $5 {{PLURAL:$5|dag|daga}}.
 
 Ef það var ekki þú sem fórst fram á þetta, eða ef þú mannst lykilorðið þitt,
-og vilt ekki lengur breyta því, skaltu hunsa þetta skilaboð og
+og vilt ekki lengur breyta því, skaltu hunsa þessi skilaboð og
 halda áfram að nota gamla lykilorðið.',
 'noemail' => 'Það er ekkert netfang skráð fyrir notandan "$1".',
 'noemailcreate' => 'Þú verður að skrá gilt netfang',
@@ -809,14 +809,14 @@ endursetningu lykilorðsins þíns fyrir {{SITENAME}} ($4). Aðgangur eftirfaran
 
 $2
 
-Ef þetta er það sem þú vildir, þarftu að skrá þig inn og velja nýtt lykilorð. {{PLURAL:$3|Tímabundna lykilorð|Tímabundnu lykilorðin}} renna út eftir {{PLURAL:$5|einn dag|$5 daga}}.
+Ef þetta er það sem þú vildir, þarftu að skrá þig inn og velja nýtt lykilorð. {{PLURAL:$3|Tímabundna lykilorðið rennur|Tímabundnu lykilorðin renna}} út eftir $5 {{PLURAL:$5|dag|daga}}.
 
 Ef það varst ekki þú sem fórst fram á þetta, eða ef þú mannst lykilorðið þitt, og villt ekki lengur breyta því, skaltu hunsa þessi skilaboð og halda áfram að nota gamla lykilorðið.',
 'passwordreset-emailtext-user' => 'Notandinn $1 á {{SITENAME}} hefur beðið um endursetningu lykilorðsins þíns fyrir {{SITENAME}} ($4). Aðgangur eftirfarandi {{PLURAL:$3|notanda er|notendum eru}} tengd þessu netfangi:
 
 $2
 
-Ef þetta er það sem þú vildir, þarftu að skrá þig inn og velja nýtt lykilorð. {{PLURAL:$3|Tímabundna lykilorð|Tímabundnu lykilorðin}} renna út eftir {{PLURAL:$5|einn dag|$5 daga}}.
+Ef þetta er það sem þú vildir, þarftu að skrá þig inn og velja nýtt lykilorð. {{PLURAL:$3|Tímabundna lykilorðið rennur|Tímabundnu lykilorðin renna}} út eftir $5 {{PLURAL:$5|dag|daga}}.
 
 Ef það varst ekki þú sem fórst fram á þetta, eða ef þú mannst lykilorðið þitt, og villt ekki lengur breyta því, skaltu hunsa þessi skilaboð og halda áfram að nota gamla lykilorðið.',
 'passwordreset-emailelement' => 'Notendanafn: $1
@@ -1005,7 +1005,7 @@ Lausn er í gildi sem leyfir þér að breyta síðum: Stafatákn sem eru ekki 
 Ef þú vilt ekki að textanum verði breytt skaltu ekki senda hann inn hér.<br />
 Þú lofar okkur einnig að þú hafir skrifað þetta sjálfur, að efnið sé í almannaeigu eða að það heyri undir frjálst leyfi. (sjá $1).
 '''EKKI SENDA INN HÖFUNDARRÉTTARVARIРEFNI ÁN LEYFIS RÉTTHAFA!'''",
-'longpageerror' => "'''VILLA: Textinn sem þú sendir inn er {{PLURAL:$1|eitt kílóbæti|$1 kílóbæti}} að lengd, en hámarkið er {{PLURAL:$2|eitt kílóbæti|$2 kílóbæti}}. Ekki er hægt að vista textann.'''",
+'longpageerror' => "'''VILLA: Textinn sem þú sendir inn er $1 {{PLURAL:$1|kílóbæti|kílóbæti}} að lengd, en hámarkið er $2 {{PLURAL:$2|kílóbæti|kílóbæti}}. Ekki er hægt að vista textann.'''",
 'readonlywarning' => "'''AÐVÖRUN: Gagnagrunninum hefur verið læst til að unnt sé að framkvæma viðhaldsaðgerðir, svo þú getur ekki vistað breytingar þínar núna.'''
 Þú ættir að klippa og líma textann yfir í textaskjal til þess að geyma hann til seinni tíma.
 
@@ -1063,7 +1063,7 @@ Ef þú ert skráður inn, þá getur þú óvirkjað þessi skilaboð í „Bre
 # Parser/template warnings
 'expensive-parserfunction-warning' => "'''Viðvörun:''' Þessi síða inniheldur of mörg vinnslufrek aðgerðar þáttunar köll.
 
-Hún ætti að innihalda minna en $2 {{PLURAL:$2|kall|köll}}, en {{PLURAL:$1|er nú eitt kall|eru nú $1 köll}}.",
+Hún ætti að innihalda minna en $2 {{PLURAL:$2|kall|köll}}, en {{PLURAL:$1|er nú $1 kall|eru nú $1 köll}}.",
 'expensive-parserfunction-category' => 'Síður með of mörg vinnslufrek aðgerðar þáttunar köll',
 'post-expand-template-inclusion-warning' => "'''Viðvörun:''' Sniðið tekur of mikið pláss.
 Hluti sniðsins verður ekki með.",
@@ -1265,9 +1265,9 @@ Athugaðu að með því að nota flakktenglana er þessi dálkur endurstilltur.
 'showhideselectedversions' => 'Sýna/fela valdar breytingar',
 'editundo' => 'Taka aftur þessa breytingu',
 'diff-empty' => '(Enginn munur)',
-'diff-multi' => '({{PLURAL:$1|Ein millibreyting ekki sýnd|$1 millibreytingar ekki sýndar}} frá {{PLURAL:$2|notanda|$2 notendum}}.)',
-'diff-multi-manyusers' => '({{PLURAL:$1|Ein millibreyting ekki sýnd|$1 millibreytingar ekki sýndar}} frá fleiri en {{PLURAL:$2|einum notanda|$2 notendum}}.)',
-'difference-missing-revision' => '{{PLURAL:$2|Ein útgáfa|$2 útgáfur}} samanburðarins ($1) {{PLURAL:$2|fannst|fundust}} ekki.
+'diff-multi' => '$1 ({{PLURAL:$1|millibreyting ekki sýnd|millibreytingar ekki sýndar}} frá $2 {{PLURAL:$2|notanda|notendum}}.)',
+'diff-multi-manyusers' => '($1 {{PLURAL:$1|millibreyting ekki sýnd|millibreytingar ekki sýndar}} frá fleiri en $2 {{PLURAL:$2|notanda|notendum}}.)',
+'difference-missing-revision' => '$2 {{PLURAL:$2|útgáfa|útgáfur}} samanburðarins ($1) {{PLURAL:$2|fannst|fundust}} ekki.
 
 Þetta gerist oftast þegar úreldur samanburðartengill tengir á síðu sem hefur verið eytt.
 Frekari upplýsingar eru í [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} eyðingarskránni].',
@@ -1357,7 +1357,6 @@ Athugaðu að skrár þeirra yfir {{SITENAME}}-efni kunna að vera úreltar.',
 'rows' => 'Raðir',
 'columns' => 'Dálkar',
 'searchresultshead' => 'Leit',
-'resultsperpage' => 'Niðurstöður á síðu',
 'stub-threshold' => 'Þröskuldur fyrir <a href="#" class="stub">stubbatengla</a> (bæt):',
 'stub-threshold-disabled' => 'Óvirkt',
 'recentchangesdays' => 'Fjöldi daga sem nýlegar breytingar ná yfir:',
@@ -1814,7 +1813,7 @@ Ef vandamálið lagast ekki, hafðu samband við [[Special:ListUsers/sysop|stjó
 'backend-fail-closetemp' => 'Mistókst að loka tímabundinni skrá.',
 'backend-fail-read' => 'Mistókst að lesa skrá $1.',
 'backend-fail-create' => 'Mistókst að skrifa skrá $1.',
-'backend-fail-maxsize' => 'Mistókst að skrifa skránna $1 því hún er stærri en {{PLURAL:$2|eitt bæti|$2 bæti}}.',
+'backend-fail-maxsize' => 'Mistókst að skrifa skránna „$1” því hún er stærri en $2 {{PLURAL:$2|bæti}}.',
 'backend-fail-readonly' => 'Gagnabankann "$1" er engöngu hægt að lesa í augnablikinu. Ástæðan sem var gefin er: "\'\'$2\'\'"',
 'backend-fail-synced' => 'Skráin $1 er í ósamkvæmu ástandi innan innri geymslubakenda',
 'backend-fail-connect' => 'Mistókst að tengjast gagnabankanum "$1".',
@@ -2514,7 +2513,7 @@ Innihald greinarinnar er einungis aðgengilegt möppudýrum.',
 'undeletecomment' => 'Ástæða:',
 'undeletedrevisions' => '$1 {{PLURAL:$1|breyting endurvakin|breytingar endurvaktar}}',
 'undeletedrevisions-files' => '$1 {{PLURAL:$1|breyting|breytingar}} og $2 {{PLURAL:$2|skrá|skrár}} endurvaktar',
-'undeletedfiles' => '{{PLURAL:$1|Ein skrá endurvakin|$1 skrár endurvaktar}}',
+'undeletedfiles' => '$1 {{PLURAL:$1|skrá endurvakin|skrár endurvaktar}}',
 'cannotundelete' => 'Ekki var hægt að afturkalla eyðingu.
 $1',
 'undeletedpage' => "'''$1 var endurvakin'''
@@ -3705,7 +3704,7 @@ Vinsamlegast staðfestu að þú viljir endurvekja hana.',
 'watchlistedit-normal-explain' => 'Titlarnir á vaktlistanum þínum er sýndir fyrir neðan.
 Til að fjarlægja titil hakaðu í kassann við hliðina á honum og smelltu á „{{int:Watchlistedit-normal-submit}}“. Þú getur einnig [[Special:EditWatchlist/raw|breytt honum opnum]].',
 'watchlistedit-normal-submit' => 'Fjarlægja titla',
-'watchlistedit-normal-done' => '{{PLURAL:$1|Ein síða var fjarlægð|$1 síður voru fjarlægðar}} af vaktlistanum þínum:',
+'watchlistedit-normal-done' => '$1 {{PLURAL:$1|síða var fjarlægð|síður voru fjarlægðar}} af vaktlistanum þínum:',
 'watchlistedit-raw-title' => 'Breyta opnum vaktlistanum',
 'watchlistedit-raw-legend' => 'Breyta opnum vaktlistanum',
 'watchlistedit-raw-explain' => 'Titlarnir á vaktlistanum þínum eru sýndir hér fyrir neðan og þeim er hægt að breyta með því að bæta við og taka út af honum;
index a27c70c..0e8aab7 100644 (file)
@@ -1109,6 +1109,8 @@ Esiste già.',
 'content-not-allowed-here' => 'Contenuto in "$1" non consentito nella pagine [[$2]]',
 'editwarning-warning' => 'Lasciare questa pagina potrebbe causare la perdita di tutte le modifiche fatte.
 Se hai effettuato l\'accesso, puoi disattivare questo avviso nella sezione "Casella di modifica" delle tue preferenze.',
+'editpage-notsupportedcontentformat-title' => 'Formato contenuto non supportato',
+'editpage-notsupportedcontentformat-text' => 'Il formato del contenuto $1 non è supportato dal modello di contenuto $2.',
 
 # Content models
 'content-model-wikitext' => 'wikitesto',
@@ -1407,7 +1409,6 @@ I dettagli possono essere trovati nel [{{fullurl:{{#Special:Log}}/delete|page={{
 'rows' => 'Righe:',
 'columns' => 'Colonne:',
 'searchresultshead' => 'Ricerca',
-'resultsperpage' => 'Numero di risultati per pagina:',
 'stub-threshold' => 'Valore minimo per i <a href="#" class="stub">collegamenti agli stub</a>, in byte:',
 'stub-threshold-disabled' => 'Disattivato',
 'recentchangesdays' => 'Numero di giorni da mostrare nelle ultime modifiche:',
@@ -1791,6 +1792,7 @@ Se si dispone dell'immagine nella risoluzione originale, si prega di caricarla.
 'fileexists-shared-forbidden' => "Un file con questo nome esiste già nell'archivio di risorse multimediali condivise. Se si desidera ancora caricare il file, tornare indietro e modificare il nome con il quale caricare il file. [[File:$1|thumb|center|$1]]",
 'file-exists-duplicate' => 'Questo file è un duplicato {{PLURAL:$1|del seguente|dei seguenti}} file:',
 'file-deleted-duplicate' => 'Un file identico a questo ([[:$1]]) è stato cancellato in passato. Verificare la cronologia delle cancellazioni prima di caricarlo di nuovo.',
+'file-deleted-duplicate-notitle' => 'Un file identico a questo è stato cancellato in passato, ed il titolo è stato soppresso. Chiedi a qualcuno che ha la possibilità di vedere i file soppressi di esaminare la situazione prima di procedere nuovamente al caricamento.',
 'uploadwarning' => 'Avviso di caricamento',
 'uploadwarning-text' => 'Per favore modifica qui sotto la descrizione del file e prova di nuovo.',
 'savefile' => 'Salva file',
@@ -2673,6 +2675,7 @@ Consultare la [[Special:BlockList|lista dei blocchi]] per vedere i blocchi attiv
 'ipb-confirmhideuser' => 'Si sta per bloccare un utente con l\'opzione "Nascondi utente" abilitata.
 In questo modo si evita che il nome utente compaia in tutte le liste e le voci di registro.
 Sei sicuro di voler continuare?',
+'ipb-confirmaction' => 'Se sei sicuro di volerlo fare davvero, controlla il campo "{{int:ipb-confirm}}" in basso.',
 'ipb-edit-dropdown' => 'Modifica i motivi per il blocco',
 'ipb-unblock-addr' => 'Sblocca $1',
 'ipb-unblock' => 'Sblocca un utente o un indirizzo IP',
@@ -3851,8 +3854,18 @@ Si noti che è anche possibile [[Special:EditWatchlist|modificare la lista con l
 'version-parser-function-hooks' => 'Hook per funzioni del parser',
 'version-hook-name' => "Nome dell'hook",
 'version-hook-subscribedby' => 'Sottoscrizioni',
-'version-version' => '(Versione $1)',
-'version-license' => 'Licenza',
+'version-version' => '($1)',
+'version-license' => 'Licenza MediaWiki',
+'version-ext-license' => 'Licenza',
+'version-ext-colheader-name' => 'Estensione',
+'version-ext-colheader-version' => 'Versione',
+'version-ext-colheader-license' => 'Licenza',
+'version-ext-colheader-description' => 'Descrizione',
+'version-ext-colheader-credits' => 'Autori',
+'version-license-title' => 'Licenza per $1',
+'version-license-not-found' => 'Per questa estensione non è stata trovata alcuna informazione dettagliata sulla licenza.',
+'version-credits-title' => 'Crediti per $1',
+'version-credits-not-found' => 'Per questa estensione non è stata trovata alcuna informazione dettagliata sui crediti.',
 'version-poweredby-credits' => "Questo wiki è realizzato con '''[https://www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
 'version-poweredby-others' => 'altri',
 'version-poweredby-translators' => 'traduttori di translatewiki.net',
index 9c4ad60..c61e33d 100644 (file)
@@ -1235,6 +1235,8 @@ $1または他の[[{{MediaWiki:Grouppage-sysop}}|管理者]]にこのブロッ
 'content-not-allowed-here' => 'ページ [[$2]] では、「$1」コンテンツは許可されていません',
 'editwarning-warning' => 'このページを離れると、あなたが行なった変更がすべて失われてしまうかもしれません。
 ログインしている場合、個人設定の「編集」タブでこの警告を表示しないようにすることができます。',
+'editpage-notsupportedcontentformat-title' => '対応していないコンテンツ形式',
+'editpage-notsupportedcontentformat-text' => 'コンテンツ モデル $2 は、コンテンツ形式 $1 に対応していません。',
 
 # Content models
 'content-model-wikitext' => 'ウィキテキスト',
@@ -1445,7 +1447,7 @@ $1",
 'difference-title' => '「$1」の版間の差分',
 'difference-title-multipage' => 'ページ「$1」と「$2」の間の差分',
 'difference-multipage' => '(ページ間の差分)',
-'lineno' => '$1行:',
+'lineno' => '行$1:',
 'compareselectedversions' => '選択した版同士を比較',
 'showhideselectedversions' => '選択した版を表示/非表示',
 'editundo' => '取り消し',
@@ -1543,7 +1545,6 @@ $1",
 'rows' => '行数:',
 'columns' => '列数:',
 'searchresultshead' => '検索',
-'resultsperpage' => '1 ページあたりの表示件数:',
 'stub-threshold' => '<a href="#" class="stub">スタブリンク</a>として表示する閾値 (バイト):',
 'stub-threshold-disabled' => '無効',
 'recentchangesdays' => '最近の更新に表示する日数:',
@@ -1955,7 +1956,7 @@ $1 {{PLURAL:$1|文字}}以下である必要があります。',
 'file-deleted-duplicate' => 'このファイル ([[:$1]]) と同一のファイルが以前に削除されています。
 再度アップロードをする前に、以前削除されたファイルの削除記録を確認してください。',
 'file-deleted-duplicate-notitle' => 'このファイルと同一のファイルが、以前に削除されページ名が秘匿されました。
-You should ask someone with the ability to view suppressed file data to review the situation before proceeding to re-upload it.',
+再度アップロードをする前に、秘匿されたファイルのデータを閲覧する権限を持った利用者に連絡して、状況を精査してもらってください。',
 'uploadwarning' => 'アップロード警告',
 'uploadwarning-text' => '下記のファイル解説を修正して再試行してください。',
 'savefile' => 'ファイルを保存',
@@ -2871,6 +2872,7 @@ $1',
 [[Special:BlockList|ブロックの一覧]]を参照してください。',
 'ipb-blockingself' => '自分自身をブロックしようとしています! 本当に実行しますか?',
 'ipb-confirmhideuser' => '利用者名の秘匿を有効にしてブロックしようとしています。実行すると、すべての一覧や記録項目で利用者名が表示されません。本当に実行しますか?',
+'ipb-confirmaction' => '本当に実行する場合は、下の「{{int:ipb-confirm}}」欄にチェックを入れてください。',
 'ipb-edit-dropdown' => 'ブロック理由を編集',
 'ipb-unblock-addr' => '$1のブロックを解除',
 'ipb-unblock' => '利用者またはIPアドレスのブロックを解除',
@@ -4214,7 +4216,7 @@ $5
 'version-parser-function-hooks' => 'パーサー関数フック',
 'version-hook-name' => 'フック名',
 'version-hook-subscribedby' => '使用個所',
-'version-version' => '($1)',
+'version-version' => '(バージョン $1)',
 'version-license' => 'MediaWiki のライセンス',
 'version-ext-license' => 'ライセンス',
 'version-ext-colheader-name' => '拡張機能',
index 80b2cd5..08fdcc6 100644 (file)
@@ -1158,7 +1158,6 @@ Rinciané bisa ditemokaké nèng [{{fullurl:{{#Special:Log}}/delete|page={{FULLP
 'rows' => 'Larikan:',
 'columns' => 'Kolom:',
 'searchresultshead' => 'Panggolèkan',
-'resultsperpage' => 'Cacahing klik saben kaca:',
 'stub-threshold' => 'Ambang wates kanggo format <a href="#" class="stub">pranala rintisan</a>:',
 'stub-threshold-disabled' => 'Dipatèni',
 'recentchangesdays' => 'Cacahé dina sing dituduhaké ing owah-owahan pungkasan:',
@@ -2952,7 +2951,7 @@ Yèn dilakokaké, sistem Sampéyan bisa kaserang.",
 'minutes' => '{{PLURAL:$1|$1 menit|$1 menit}}',
 'hours' => '{{PLURAL:$1|$1 jam|$1 jam}}',
 'days' => '{{PLURAL:$1|$1 dina|$1 dina}}',
-'weeks' => '{{PLURAL: $1|minggu|minggu}}',
+'weeks' => '{{PLURAL:$1|minggu|minggu}}',
 'months' => '{{PLURAL:$1|$1 sasi|$1 sasi}}',
 'years' => '{{PLURAL:$1|$1 taun|$1 taun}}',
 'ago' => '$1 kapungkur',
index 6b12886..8e35e75 100644 (file)
@@ -1295,7 +1295,6 @@ $1",
 'rows' => 'რიგები:',
 'columns' => 'სვეტები',
 'searchresultshead' => 'ძიება',
-'resultsperpage' => 'შედეგები გვერდის მიხედვით:',
 'stub-threshold' => 'გაფორმების გასაუმჯობესებლად <a href="#" class="stub"> მოცემულია ესკიზების ბმულები</a> (ბაიტებში):',
 'stub-threshold-disabled' => 'გათიშულია',
 'recentchangesdays' => 'ბოლო ცვლილებებში საჩვენებელი დღეები:',
@@ -3806,7 +3805,7 @@ $5
 'version-hook-subscribedby' => 'ჩაწერილია',
 'version-version' => '(ვერსია $1)',
 'version-svn-revision' => '(r$2)',
-'version-license' => 'ლიცენზია',
+'version-license' => 'á\83\9bá\83\94á\83\93á\83\98á\83\90á\83\95á\83\98á\83\99á\83\98á\83¡ á\83\9aá\83\98á\83ªá\83\94á\83\9cá\83\96á\83\98á\83\90',
 'version-poweredby-credits' => "ეს ვიკი მუშაობს '''[https://www.mediawiki.org/ MediaWiki]'''-ს ძრავზე, copyright © 2001-$1 $2.",
 'version-poweredby-others' => 'სხვები',
 'version-poweredby-translators' => 'translatewiki.net-ის მთარგმნელები',
index 488ea1e..3637503 100644 (file)
@@ -547,31 +547,34 @@ G leɛnaya-k, kcem tikelt nniḍen yis-s.',
 ur tezmireḍ ara ad tesɛuḍ awal n tbaḍnit i tettuḍ.',
 'eauthentsent' => 'Yiwen email yetweceggeε ar tansa id efkeḍ.
 Uqbel ad n-ceggeε email nniḍen, ilaq ad ḍfereḍ ayen yellan deg email dɣa ad sergegeḍ amiḍan agi d win inek(m).',
-'throttled-mailpassword' => 'Asmekti n wawal n uɛaddi yettwazen yagi deg {{PLURAL:$1|asrag agi aneggaru| $1 isragen agi ineggura}}. Asmekti n wawal n uɛaddi yettwazen tikelt kan mkul $1 swayeɛ. deg {{PLURAL:$1|asrag|azilal n $1 isragen}}.',
+'throttled-mailpassword' => 'Neceggɛed yakan tirawt n uwennez i awal-ik/im n uɛaddi deg {{PLURAL:$1|asrag agi aneggaru|$1 isragen agi ineggura}}. Awennez n uwal n uɛaddi yettwaceggaɛ tikelt kan deg {{PLURAL:$1|asrag|$1 isragen}}.',
 'mailerror' => 'Agul asmi yettwazen e-mail: $1',
 'acct_creation_throttle_hit' => 'Amdan i seqdacen tansa IP inek/inem yesnulfud {{PLURAL:$1|yiwen amiḍan|$1 imiḍanen}} deg 24 izragen agi ineggura, negweḍ ar talast n turagt deg azilal agi n wakud.',
-'emailauthenticated' => 'Tansa e-mail inek/inem tesesteb ass n $2 af $3.',
-'emailnotauthenticated' => 'Tansa e-mail inek mazal ur tettuɛqel. Ḥedd e-mail ur ttwazen i ulaḥedd n iḍaɣaren-agi.',
+'emailauthenticated' => 'Tansa e-mail inek/inem tesergeg ass n $2 af $3.',
+'emailnotauthenticated' => 'Tansa email inek mazal ur tettuɛqel. Ur d netceggaɛ ara email i yal tiseɣnin agi.',
 'noemailprefs' => 'Efk tansa e-mail iwakken ad leḥḥun iḍaɣaren-nni.',
 'emailconfirmlink' => 'Sentem tansa e-mail inek',
 'invalidemailaddress' => 'Tansa e-mail-agi ur telhi, ur tesɛi ara taseddast n lɛali. Ssekcem tansa e-mail s taseddast n lɛali neɣ ur tefkiḍ acemma.',
 'cannotchangeemail' => 'Ur t-zemreḍ ara ad beddeleḍ tansa e-mail deg uwiki agi.',
 'emaildisabled' => 'Asmel agi ur yezmer ara ad i cegaɛ e-mail.',
 'accountcreated' => 'Isem n wemseqdac yettwaxleq',
-'accountcreatedtext' => 'Isem n wemseqdac i $1 yettwaxleq.',
+'accountcreatedtext' => 'Amiḍan n umseqdac i [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|amyannan]]) yexelqed.',
 'createaccount-title' => 'Asnulfu n umiḍan i {{SITENAME}}',
 'createaccount-text' => 'Albeɛḍ yesnulfu-d amiḍan i tansa e-amil inek/inem ɣef {{SITENAME}} ($4) s-isem n-useqdac « $2 », s awal n uɛaddi « $3 ».
 Ilaq tura ad lldiḍ taɣimit dɣa ad beddeleḍ awal ik/im n uɛaddi.',
 'usernamehasherror' => 'Isem n useqdac ur yezmer ara ad i sɛu  isekkilen n ugeddeḥ',
 'login-throttled' => 'Tɛerdeḍ ad qqeneḍ aṭas tiqwal deg dqiqat agi iɛddan.
-Ilaq ad rǧuḍ ciṭaḥ uqbel ad ɛerdeḍ tikkelt nniḍen.',
+Ilaq ad rǧuḍ $1 uqbel ad ɛerdeḍ tikkelt nniḍen.',
 'login-abort-generic' => 'Taremt ik/im n tuqqna tebrir',
 'loginlanguagelabel' => 'Tutlayt: $1',
 'suspicious-userlogout' => 'Asuter n usenser yugwi acku yella ugur s iminig naɣ s tazarkatut n uqeddac proxy.',
+'createacct-another-realname-tip' => '* Isem n ṣṣeḥ d-axeṭran.
+Ma teɛzemeḍ a t-tefkeḍ, ad yettuseqdac iwakken ad snen medden anwa yuran tikkin inek.',
 
 # Email sending
 'php-mail-error-unknown' => 'anezri warisem deg tawuri mail() n PHP',
 'user-mail-no-addy' => 'Ɛred ad icegaɛ e-mail war tansa e-mail',
+'user-mail-no-body' => 'Arram n uceggaɛ email s tafekka tilemt neɣ d-awezlan aṭas.',
 
 # Change password dialog
 'changepassword' => 'Beddel awal n tbaḍnit',
@@ -582,7 +585,7 @@ Ilaq ad rǧuḍ ciṭaḥ uqbel ad ɛerdeḍ tikkelt nniḍen.',
 'newpassword' => 'Awal n tbaḍnit amaynut:',
 'retypenew' => 'Ɛiwed ssekcem n tbaḍnit amaynut:',
 'resetpass_submit' => 'Eg awal n tbaḍnit u kcem',
-'changepassword-success' => 'Awal n tbaḍnit yettubeddel! Qrib ad tkecmeḍ...',
+'changepassword-success' => 'Awal n uɛaddi yettubeddel s lerbaḥ !',
 'resetpass_forbidden' => 'Ur zemreḍ ara ad beddeleḍ awalen n uɛaddi',
 'resetpass-no-info' => 'Ilaq ad qqeneḍ iwakken ad ẓṛeḍ asebter agi.',
 'resetpass-submit-loggedin' => 'Beddel awal n uɛaddi',
@@ -590,32 +593,36 @@ Ilaq ad rǧuḍ ciṭaḥ uqbel ad ɛerdeḍ tikkelt nniḍen.',
 'resetpass-wrong-oldpass' => 'Awal n uɛaddi ur i seɣbel ara.
 Ahat ilaq ad beddeleḍ awal ik/im n uɛaddi naɣ ad ssutereḍ awal n uɛaddi amaynut.',
 'resetpass-temp-password' => 'Awal n uɛaddi amakud',
+'resetpass-abort-generic' => 'Asiɣzef yesemmewet abeddel n uwal n uɛaddi.',
 
 # Special:PasswordReset
 'passwordreset' => 'Awennez tikkelt nniḍen n awal uɛaddi',
+'passwordreset-text-one' => 'Ččur tiferkit agi iwakken ad wennezeḍ awal-ik/im n uɛaddi.',
+'passwordreset-text-many' => '{{PLURAL:$1|Čcur yiwet n tiɣwezza iwakken ad rmeseḍ awal n uɛaddi uɛḍil deg tirawt.}}',
 'passwordreset-legend' => 'Awennez tikkelt nniḍen n awal uɛaddi',
 'passwordreset-disabled' => 'Awennez n awal uɛaddi yensa deg uwiki agi.',
+'passwordreset-emaildisabled' => 'Tiseɣnin email nsant ɣef wiki agi.',
 'passwordreset-username' => 'Isem n useqdac',
 'passwordreset-domain' => 'Talɣut :',
 'passwordreset-capture' => 'Ẓeṛ tirawt ?',
 'passwordreset-capture-help' => 'Lukan ad tekkiḍ ɣef texxamt agi, tirawt (deg-es awal n uɛaddi akudan) att beqqeḍ dɣa ad tetwetceggaɛ i useqdac.',
 'passwordreset-email' => 'Tansa e-mail :',
 'passwordreset-emailtitle' => 'Tilɣa n umiḍan ɣef {{SITENAME}}',
-'passwordreset-emailtext-ip' => 'Yiwen (Ahat kečč/kem, seg tansa IP $1) yessutered asiwel n tilɣa n umiḍan inek/inem i {{SITENAME}} ($4). {{PLURAL:$3|Amiḍan n useqdac agi yedrew|imiḍanen n iseqdacen agi drewen}} s tansa e-mail agi :
+'passwordreset-emailtext-ip' => 'Yiwen (Ahat kečč/kem, seg tansa IP $1) yessutered awennez n awal n uɛaddi i {{SITENAME}} ($4). {{PLURAL:$3|Amiḍan n useqdac agi yeqqen|imiḍanen n iseqdacen agi qqenen}} s tansa e-mail agi :
 
 $2
 
-{{PLURAL:$3|Awal n uɛaddi agi ad i aff tasewti-s|Awalen n uɛaddi agi ad affen taseweti nsen}} deg {{PLURAL:$5|yiwen ass|$5 ussan}}. Ilaq tura ad qqeneḍ dɣa ad freneḍ awal n uɛaddi amaynut. Lukan mačči d kečč/kem i xedmen asuter agi, naɣ tecfiḍ tura i awal n uɛaddi inek/inem, tzemreḍ ad eǧǧeḍ izen agi.',
-'passwordreset-emailtext-user' => 'Aseqdac $1 ɣef {{SITENAME}} yessutered asiwel n tilɣa n umiḍan inek/inem i {{SITENAME}} ($4). {{PLURAL:$3|Amiḍan n useqdac agi yedrew|imiḍanen n iseqdacen agi drewen}} s tansa e-mail agi :
+{{PLURAL:$3|Awal n uɛaddi uɛḍil agi ad i aff tasewti-s|Awalen n uɛaddi uɛḍilen agi ad affen taseweti nsen}} deg {{PLURAL:$5|yiwen ass|$5 ussan}}. Ilaq tura ad qqeneḍ dɣa ad freneḍ awal n uɛaddi amaynut. Lukan mačči d kečč/kem i xedmen asuter agi, naɣ tecfiḍ tura i awal n uɛaddi inek/inem, tzemreḍ ad eǧǧeḍ izen agi.',
+'passwordreset-emailtext-user' => 'Aseqdac $1 ɣef {{SITENAME}} yessutered awennez n awal n uɛaddi i {{SITENAME}} ($4). {{PLURAL:$3|Amiḍan n useqdac agi yeqqen|imiḍanen n iseqdacen agi qqenen}} s tansa e-mail agi :
 
 $2
 
-{{PLURAL:$3|Awal n uɛaddi agi ad i aff tasewti-s|Awalen n uɛaddi agi ad affen taseweti nsen}} deg {{PLURAL:$5|yiwen ass|$5 ussan}}. Ilaq tura ad qqeneḍ dɣa ad freneḍ awal n uɛaddi amaynut. Lukan mačči d kečč/kem i xedmen asuter agi, naɣ tecfiḍ tura i awal n uɛaddi inek/inem, tzemreḍ ad eǧǧeḍ izen agi.',
+{{PLURAL:$3|Awal n uɛaddi uɛḍil agi ad i aff tasewti-s|Awalen n uɛaddi uɛḍilen agi ad affen taseweti nsen}} deg {{PLURAL:$5|yiwen ass|$5 ussan}}. Ilaq tura ad qqeneḍ dɣa ad freneḍ awal n uɛaddi amaynut. Lukan mačči d kečč/kem i xedmen asuter agi, naɣ tecfiḍ tura i awal n uɛaddi inek/inem, tzemreḍ ad eǧǧeḍ izen agi.',
 'passwordreset-emailelement' => 'Isem n useqdac : $1
 Awal n uɛddi akudan : $2',
-'passwordreset-emailsent' => 'Tirawt n usmekti tetwazen.',
-'passwordreset-emailsent-capture' => 'Tirawt n usmekti tetwazen, ẓeṛ-itt ddaw agi.',
-'passwordreset-emailerror-capture' => 'Tirawt n usmekti t-arewed, ẓeṛ-itt ddaw agi, lamaɛna azen yefkad anezri (tirawt ur tru ara) : $1',
+'passwordreset-emailsent' => 'Tirawt n uwennez n awal n uɛaddi tetwaceggaɛ.',
+'passwordreset-emailsent-capture' => 'Tirawt n uwennez n awal n uɛaddi tetwaceggaɛ, ẓeṛ-itt ddaw agi.',
+'passwordreset-emailerror-capture' => 'Tirawt n uwennez n awal n uɛaddi t-arewed, ẓeṛ-itt ddaw agi, lamaɛna aceggaɛ i {{GENDER:$2|umseqdac}} yefkad anezri : $1',
 
 # Special:ChangeEmail
 'changeemail' => 'Beddel tansa n e-mail',
@@ -625,9 +632,23 @@ Awal n uɛddi akudan : $2',
 'changeemail-oldemail' => 'Tansa e-mail n tura :',
 'changeemail-newemail' => 'Tansa e-mail tamaynut :',
 'changeemail-none' => '(ulac)',
+'changeemail-password' => 'Awal-ik/im n uɛaddi ɣef {{SITENAME}} :',
 'changeemail-submit' => 'Beddel tansa e-mail',
 'changeemail-cancel' => 'Semmewet',
 
+# Special:ResetTokens
+'resettokens' => 'Wennez tiddas',
+'resettokens-text' => 'D-agi tzemreḍ ad twennezeḍ tiddas i ɛemmeden ad kecmeḍ ar isefka usligen i qqenen ar amiḍan inek/inem.
+
+Ilaq ad twennezeḍ tiddas ma tferqeḍ-ten s tuccḍa s umseqdac nniḍen neɣ ma amiḍan inek/inem yexṣer.',
+'resettokens-no-tokens' => 'Ulac tiddas an wennez.',
+'resettokens-legend' => 'Wennez tiddas',
+'resettokens-tokens' => 'Tiddas :',
+'resettokens-token-label' => '$1 (azal amiran : $2)',
+'resettokens-watchlist-token' => 'Tiddest i usuddem (Atom/RSS) web n [[Special:Watchlist|ibeddilen n isebtar n umuɣ inek/inem n uḍfar]]',
+'resettokens-done' => 'Tiddas i wennezen.',
+'resettokens-resetbutton' => 'Wennez tiddas i fernen',
+
 # Edit page toolbar
 'bold_sample' => 'Aḍris aberbuz',
 'bold_tip' => 'Aḍris aberbuz',
@@ -702,8 +723,8 @@ Smekti-ten u fka-ten i unedbal-nni.",
 'loginreqlink' => 'Kcem',
 'loginreqpagetext' => 'Yessefk $1 iwakken ad teẓriḍ isebtar wiyaḍ.',
 'accmailtitle' => 'Awal n tbaḍnit yettwazen.',
-'accmailtext' => "Awal n uɛaddi id yuran s ugacur i [[User talk:$1|$1]] yetwecgaɛ i $2.
-Awal n uɛaddi i umiḍan agi amaynut yezmer ad yetbeddel ɣef usebter n ''[[Special:ChangePassword|ubeddel n awal uɛddi]]'' sakin tuqqna.",
+'accmailtext' => 'Awal n uɛaddi id yuran s ugacur i [[User talk:$1|$1]] yetweceggaɛ i $2.
+Yezmer ad yetbeddel ɣef usebtar [[Special:ChangePassword|Abeddel n awal uɛddi]] sakin tuqqna.',
 'newarticle' => '(Amaynut)',
 'newarticletext' => 'Tḍefreḍ azday ɣer usebter mazal ur yettwaxleq ara.
 Akken ad txelqeḍ asebter-nni, aru deg tenkult i tella deg ukessar
@@ -739,7 +760,7 @@ Asekcem aneggaru n useklas n ikyafen yella ddaw agi :',
 
 '''Cfut, ttagi d azar-timeẓriwt kan.'''
 Ibeddlen mazal ur ttusmektin ara!",
-'continue-editing' => 'Kemmel abeddel',
+'continue-editing' => 'Ṛuḥ ar taɣzut n ubeddel',
 'previewconflict' => 'Pre-timeẓriwt-agi tesskan aḍris i yellan deg usawen lemmer tebɣiḍ a tt-tesmektiḍ.',
 'session_fail_preview' => "'''Suref-aɣ! ur nezmir ara a nesmekti abeddil inek axaṭer yella ugur.
 G leɛnayek ɛreḍ tikelt nniḍen. Lukan mazal yella ugur, ffeɣ umbeɛd kcem.'''",
@@ -799,7 +820,7 @@ Tzemreḍ ad uɣaleḍ ar deffir dɣa ad beddeleḍ asebter yellan yakan, naɣ [
 'nocreate-loggedin' => 'Ur tesɛiḍ ara turagt i usnulfu n isebtar imaynuten.',
 'sectioneditnotsupported-title' => 'Abeddel n tigezmi agi ur yezmer ara',
 'sectioneditnotsupported-text' => 'Abeddel n tigezmi ur yezmer ara deg usebtar agi n ubeddel.',
-'permissionserrors' => 'Anezri n turagt',
+'permissionserrors' => 'Agul n turagt',
 'permissionserrorstext' => 'Ur tesɛiḍ ara turagt iwakken ad xedmeḍ wayagi i {{PLURAL:$1|taɣẓint|tiɣẓinin}} agi :',
 'permissionserrorstext-withaction' => 'Ur sɛiḍ ara ttesriḥ af $2, i {{PLURAL:$1|taɣẓint|tiɣẓinin}} agi :',
 'recreate-moveddeleted-warn' => "'''Ɣur-wet : asebter agi i tebɣam ad snulfum, yetwekkes uqbel.'''
@@ -813,12 +834,16 @@ Tamentilt warisem',
 Ahat yetwemḥa.',
 'edit-conflict' => 'Amgirred n ubeddel.',
 'edit-no-change' => 'Abeddel inek/inem ur yetwexdam ara acku ur di ban ara abeddel deg uḍris.',
+'postedit-confirmation' => 'Abeddel inek/inem yetwakles.',
 'edit-already-exists' => 'Asebter amaynut ur d yesnufu ara.
 Yella yakan.',
 'defaultmessagetext' => 'Izen s lexṣas',
 'content-failed-to-parse' => 'Tasleṭ n ugbur n $2 i talɣa $1 texseṛ : $3',
 'invalid-content-data' => 'Isefka n ugbur ur ɣbelen ara',
 'content-not-allowed-here' => 'Agbur "$1" ur yesɛa ara turagt ɣef usebter [[$2]]',
+'editwarning-warning' => 'Ma ad teffeɣeḍ deg usebtar agi, akkw ibeddilen id xeddemeḍ ad sṛuḥen.
+
+Ma teqqeneḍ, tzemreḍ ad senseḍ alɣu agi deg tigezmi « Abeddel » n ismenyifen inek/inem.',
 
 # Content models
 'content-model-wikitext' => 'wikiaḍris',
@@ -850,6 +875,7 @@ Ilaq ad i sɛu ddaw n  $2 {{PLURAL:$2|tiɣri|tiɣriwin }}, wannag tura {{PLURAL:
 'undo-failure' => 'Ur yezmir ara ad issefu abeddel axaṭer yella amennuɣ abusari deg ubeddel.',
 'undo-norev' => 'Abeddel ur yezmer ara ad yetwekkes acku ulac-itt naɣ tetwekkes yakan',
 'undo-summary' => 'Ssefsu tasiwelt $1 sɣur [[Special:Contributions/$2|$2]] ([[User talk:$2|Meslay]])',
+'undo-summary-username-hidden' => 'Semmewet tacaggart $1 sɣur amseqdac yeffren',
 
 # Account creation failure
 'cantcreateaccounttitle' => 'Ur yezmir ara ad yexleq isem n wemseqdac',
@@ -877,8 +903,8 @@ Tabadut: (tura) = amgirred akk d tasiwelt n tura,
 (amgirred) = amgirred akk d tasiwelt ssabeq, M = abeddel afessas.',
 'history-fieldset-title' => 'Inig deg umazray',
 'history-show-deleted' => 'Ekkes kan',
-'histfirst' => 'Tikkin timezwura',
-'histlast' => 'Tikkin tineggura',
+'histfirst' => 'tiqdimin',
+'histlast' => 'timaynutin',
 'historysize' => '({{PLURAL:$1|1 atamḍan|$1 itamḍanen}})',
 'historyempty' => '(amecluc)',
 
@@ -933,19 +959,20 @@ Tzemreḍ att ẓṛeḍ ; tilɣa llant deg [{{fullurl:{{#Special:Log}}/delete|p
 'revdelete-text' => 'Ileqman d tidyanin yettumḥan ad qqimen deg umezruy n usebter dɣa deg iɣmisen, maca agbur nsen ur i sɛu ara tuffart i uzayez."
 Inedbalen wiyaḍ deg {{SITENAME}} zemren ad ẓṛen imuren i yettwafren u zemren a ten-mḥan, ḥaca ma llan icekkilen.',
 'revdelete-confirm' => 'Sergeg ma tebɣiḍ ad xedmeḍ tigawt agi, fehmeḍ inalkamen, dɣa temtawiḍ s [[{{MediaWiki:Policy-url}}|ilugan]].',
-'revdelete-suppress-text' => "Ilaq tukksa at illi kan deg tijṛa agi :
-* tilɣa n yiwen ur ezgan ara
-*: ''tansa, uṭṭun n tilifun, uṭṭun n taɣellist tamettit, …''",
+'revdelete-suppress-text' => "Ilaq tukksa att illi \"kan\" deg tijṛa agi :
+* Tilɣa ahat tinergamin
+* Tilɣa ur sɛant ara amkan d-agi
+*: ''tansa, uḍḍun n tilifun, uḍḍun n taɣellist tamettit, …''",
 'revdelete-legend' => 'Sbebd akref n tamuɣli',
-'revdelete-hide-text' => 'Ffer aḍris n tsiwelt',
+'revdelete-hide-text' => 'Aḍris n tacaggart',
 'revdelete-hide-image' => 'Ffer ayen yellan deg ufaylu',
 'revdelete-hide-name' => 'Ffer tigawt d nnican',
-'revdelete-hide-comment' => 'Ffer abeddel n uwennit',
-'revdelete-hide-user' => 'Ffer Isem n wemseqdac/IP n umeskar',
+'revdelete-hide-comment' => 'Beddel agzul',
+'revdelete-hide-user' => 'Isem n umseqdac/Tansa IP n umaẓrag',
 'revdelete-hide-restricted' => 'Mḥu isefka agi i inedbalen d yimdanen wiyaḍ',
 'revdelete-radio-same' => '(ur beddel ara)',
-'revdelete-radio-set' => 'Ih',
-'revdelete-radio-unset' => 'Ala',
+'revdelete-radio-set' => 'Udrig',
+'revdelete-radio-unset' => 'Yeban',
 'revdelete-suppress' => 'Kkes talɣut seg inedbalen d yimdanen wiyaḍ',
 'revdelete-unsuppress' => 'Kkes icekkilen ɣef tisiwal i yuɣalen-d',
 'revdelete-log' => 'Ayɣer',
@@ -1022,6 +1049,7 @@ Senked d akken tamhelt agi ad eǧǧ amezruy n usebtar ad ikemmel.',
 'compareselectedversions' => 'Ẓer imgerraden ger tisiwal i textareḍ',
 'showhideselectedversions' => 'Ssken/Ffer ileqman i xtiṛen',
 'editundo' => 'ssefsu',
+'diff-empty' => '(Ulac amgerrad)',
 'diff-multi' => '({{PLURAL:$1|Yiwet tasiwelt tabusarit|$1 n tisiwal tibusarin}} af {{PLURAL:$2|amseqdac|$2 imseqdacen}} {{PLURAL:$1|ur ttumlal ara|ur ttumlalent ara}})',
 'diff-multi-manyusers' => '({{PLURAL:$1|Yiwen lqem agrawan|$1 ileqman igrawanen}} af {{PLURAL:$2|aseqdac|$2 iseqdacen}} {{PLURAL:$1|yeffer|ffren}})',
 'difference-missing-revision' => '{{PLURAL:$1|Yiwet tacaggart|$1 ticaggartin}} n tameẓla agi ($1) {{PLURAL:$2|ur tella ara (ulac)|ur llant ara (ulac)}}.
@@ -1079,10 +1107,11 @@ Tzemreḍ ad affeḍ tilɣa deg [{{fullurl:{{#Special:Log}}/delete|page={{FULLPA
 'powersearch-togglenone' => 'Ulac',
 'search-external' => 'Anadi yeffɣen',
 'searchdisabled' => 'Anadi deg {{SITENAME}} yettwakkes. Tzemreḍ ad tnadiḍ s Google. Meɛna ur tettuḍ ara, tasmult n google taqdimt.',
+'search-error' => 'Tella tuccḍa deg unadi n : $1',
 
 # Preferences page
 'preferences' => 'Isemyifiyen',
-'mypreferences' => 'Isemyifiyen inu',
+'mypreferences' => 'Isemyifiyen',
 'prefs-edits' => 'Amḍan n ibeddlilen :',
 'prefs-skin' => 'Aglim',
 'skin-preview' => 'Pre-timeẓriwt',
@@ -1106,18 +1135,20 @@ Tzemreḍ ad affeḍ tilɣa deg [{{fullurl:{{#Special:Log}}/delete|page={{FULLPA
 'prefs-email' => 'Tixtiṛiyin n tira',
 'prefs-rendering' => 'Tummant',
 'saveprefs' => 'Smekti',
-'restoreprefs' => 'Err akkw azalen s lexṣas',
+'restoreprefs' => 'Err akkw iɣewwaren s lexṣas (deg akkw tigezmiwin)',
 'prefs-editing' => 'Abedddil',
 'rows' => 'Ijerriḍen:',
 'columns' => 'Tigejda:',
 'searchresultshead' => 'Anadi',
-'resultsperpage' => 'Geddac n tiririyin i mkul asebter:',
 'stub-threshold' => 'Talast timinegt i <a href="#" class="stub">izdayen ɣer ibegzan</a> (itamḍanen) :',
 'stub-threshold-disabled' => 'Yensa',
 'recentchangesdays' => 'Amḍan n ussan an beqqeḍ deg ibeddilen ineggura.',
 'recentchangesdays-max' => 'Afellay $1 {{PLURAL:$1|ass|ussan}}',
 'recentchangescount' => 'Amḍan n ibeddilen i ubeqqeḍ s lexṣas :',
 'prefs-help-recentchangescount' => 'Wagi yesɛa deg-es ibeddilen ineggura, isebtar n umezruy d iɣmisen.',
+'prefs-help-watchlist-token2' => 'Hattan tasarut tufurt n usuddem Web n umuɣ inek/inem n uḍfar.
+Akkw amḍan yesɛan tasarut agi, ad yezmer ad i ɣer umuɣ inek/inem n uḍfar, ur d-sselɣu ara tasarut agi ihi.
+[[Special:ResetTokens|Nqer d-agi ma tebɣiḍ ad wennezeḍ tasarut agi]].',
 'savedprefs' => 'Isemyifiyen inek yettusmektan.',
 'timezonelegend' => 'Iẓḍi n ukud :',
 'localtime' => 'Asrag adigan :',
@@ -1148,9 +1179,9 @@ Tzemreḍ ad affeḍ tilɣa deg [{{fullurl:{{#Special:Log}}/delete|page={{FULLPA
 Wagi ur yezmer ara ad yetwekkes.',
 'prefs-emailconfirm-label' => 'Aragag n tirawt :',
 'youremail' => 'E-mail *:',
-'username' => 'Isem n wemseqdac:',
-'uid' => 'Amseqdac ID:',
-'prefs-memberingroups' => 'Aεeggal n {{PLURAL:$1|ugraw|igrawen}} :',
+'username' => '{{GENDER:$1|Isem n umseqdac|Isem n tamseqdact}} :',
+'uid' => 'Uḍḍun n {{GENDER:$1|umseqdac|tamseqdact}}:',
+'prefs-memberingroups' => '{{GENDER:$2|Aεeggal|Taɛggalt}} n {{PLURAL:$1|ugraw|igrawen}} :',
 'prefs-registration' => 'Azmez n tiggezt :',
 'yourrealname' => 'Isem n ṣṣeḥ *:',
 'yourlanguage' => 'Tutlayt:',
@@ -1161,10 +1192,10 @@ Wagi ur yezmer ara ad yetwekkes.',
 'badsig' => 'Azmul mačči d ṣaḥiḥ; Ssenqed tags n HTML.',
 'badsiglength' => 'Azmul inek/inem, teɣwzi-s tameqqṛant aṭas.
 Ur ilaq ara ad i sɛu ugar n $1 {{PLURAL:$1|asekkil|isekkilen}}.',
-'yourgender' => 'Tawsit :',
-'gender-unknown' => 'Ulac tumlin',
-'gender-male' => 'Amalay',
-'gender-female' => 'Untay',
+'yourgender' => 'Amek i tebɣiḍ ad n-ini fellak(m) ?',
+'gender-unknown' => 'Ur bɣiɣ ara ad iniɣ',
+'gender-male' => 'Yebeddel isebtar n wiki',
+'gender-female' => 'Tebeddel isebtar n wiki',
 'prefs-help-gender' => 'Axetṛan : yetseqdec iwakken ad yefk tawsit i inzan n ugrudem. Talɣut agi at illi tazayert.',
 'email' => 'E-mail',
 'prefs-help-realname' => '* Isem n ṣṣeḥ (am tebɣiḍ): ma textareḍ a t-tefkeḍ, ad yettuseqdac iwakken ad snen medden anwa yura tikkin inek.',
@@ -1176,7 +1207,9 @@ Ur ilaq ara ad i sɛu ugar n $1 {{PLURAL:$1|asekkil|isekkilen}}.',
 'prefs-signature' => 'Azmul',
 'prefs-dateformat' => 'Amasal n izemzan',
 'prefs-timeoffset' => 'Asekḥer n usrag',
-'prefs-advancedediting' => 'Tixtiṛiyin timahlanin',
+'prefs-advancedediting' => 'Tixtiṛiyin timuta',
+'prefs-editor' => 'Amaẓrag',
+'prefs-preview' => 'Azarskan',
 'prefs-advancedrc' => 'Tixtiṛiyin timahlanin',
 'prefs-advancedrendering' => 'Tixtiṛiyin timahlanin',
 'prefs-advancedsearchoptions' => 'Tixtiṛiyin timahlanin',
@@ -1184,7 +1217,9 @@ Ur ilaq ara ad i sɛu ugar n $1 {{PLURAL:$1|asekkil|isekkilen}}.',
 'prefs-displayrc' => 'Tixtiṛiyin n ubeqqeḍ',
 'prefs-displaysearchoptions' => 'Tixtiṛiyin n ubeqqeḍ',
 'prefs-displaywatchlist' => 'Tixtiṛiyin n ubeqqeḍ',
+'prefs-tokenwatchlist' => 'Tiddest',
 'prefs-diffs' => 'Timeẓliwin',
+'prefs-help-prefershttps' => 'Asmenyif agi, ad yelḥu ar tuqqna ay d-yetteddun.',
 
 # User preference: email validation using jQuery
 'email-address-validity-valid' => 'E-mail agi teɣbel',
@@ -1208,9 +1243,10 @@ Ur ilaq ara ad i sɛu ugar n $1 {{PLURAL:$1|asekkil|isekkilen}}.',
 'userrights-no-interwiki' => 'Ur tesɛiḍ ara turagt iwakken ad beddeleḍ izerfan n iseqdacen ɣef wiki nniḍen.',
 'userrights-nodatabase' => 'Taffa n isefka « $1 » ulac itt naɣ mačči d tadigant.',
 'userrights-nologin' => 'Ilaq ad [[Special:UserLogin|qqeneḍ]] s yiwen umiḍan anedbal iwakken ad beddeleḍ izerfan n useqdac.',
-'userrights-notallowed' => 'Amiḍan inek/inem ur yesɛa ara turagt iwakken ad beddeleḍ izerfan n useqdac.',
+'userrights-notallowed' => 'Ur tesɛiḍ ara turagt ad rnuḍ neɣ ad ekkeseḍ izerfan n umseqdac.',
 'userrights-changeable-col' => 'Igrawen i tzemreḍ ad beddeleḍ',
 'userrights-unchangeable-col' => 'Igrawen ur tzemreḍ ara ad beddeleḍ',
+'userrights-conflict' => 'Ccwal n ubeddel n izerfan n umseqdac ! Ilaq ad ɛzemeḍ tikelt nniḍen dɣa ad sergegeḍ ibeddilen.',
 
 # Groups
 'group' => 'Adrum:',
@@ -1275,12 +1311,16 @@ Ur ilaq ara ad i sɛu ugar n $1 {{PLURAL:$1|asekkil|isekkilen}}.',
 'right-ipblock-exempt' => 'Zizdew tansiwin IP yekyefen, ikyafen iwurmanen d ikyafen n tagrummiwin IP',
 'right-proxyunbannable' => 'Zizdew ikyafen iwurmanen n iqeddacen proxy',
 'right-unblockself' => 'Ad ekkesen akyaf imanen nsen',
-'right-protect' => 'Beddel aswir n umesten n isebtar dɣa beddel isebtar i gdelen',
-'right-editprotected' => 'Beddel isebtar i gdelen (war asegdel s uceṛcuṛ)',
+'right-protect' => 'Beddel iswiren n umesten dɣa beddel isebtar i gdelen s uceṛcuṛ',
+'right-editprotected' => 'Beddel isebtar i gdelen s « {{int:protect-level-sysop}} »',
+'right-editsemiprotected' => 'Beddel isebtar i gdelen s « {{int:protect-level-autoconfirmed}} »',
 'right-editinterface' => 'Beddel agrudem n useqdac',
 'right-editusercssjs' => 'Beddel ifuyla CSS d JavaScript n iseqdacen nniḍen',
 'right-editusercss' => 'Beddel ifuyla CSS n iseqdacen nniḍen',
 'right-edituserjs' => 'Beddel ifuyla JavaScript n iseqdacen nniḍen',
+'right-editmyusercss' => 'Beddel ifuyla CSS n umseqdac inek/inem',
+'right-editmyuserjs' => 'Beddel ifuyla Javascript n umseqdac inek/inem',
+'right-viewmywatchlist' => 'Zeṛ umuɣ inek/inem n uḍfar',
 'right-rollback' => 'Ekkes s urured ibeddilen n umedraw aneggaru deg yiwen asebter',
 'right-markbotedits' => 'Creḍ ibeddilen yetwekkesen am aken d aṛubut i tni beddelen.',
 'right-noratelimit' => 'Ur i tilli ara yeswaɣ sɣur tilisa n utug',
@@ -1332,8 +1372,8 @@ Ur ilaq ara ad i sɛu ugar n $1 {{PLURAL:$1|asekkil|isekkilen}}.',
 'action-block' => 'Kyef deg tira aseqdac agi',
 'action-protect' => 'beddel iswiren n umesten i usebter agi',
 'action-rollback' => 'ekkes s urured ibeddilen n umedraw aneggaru yebeddelen yiwen usebter',
-'action-import' => 'Kter asebter agi seg wiki nniḍen',
-'action-importupload' => 'Kter asebter agi seg ufaylu n wezdam (upload)',
+'action-import' => 'kter isebtar agi seg wiki nniḍen',
+'action-importupload' => 'kter isebtar agi seg ufaylu n wezdam',
 'action-patrol' => 'Creḍ abeddel n wiyaḍ nniḍen am aken tesɛa tacaggart',
 'action-autopatrol' => 'ad sɛuḍ tacaggart i ubeddil ik',
 'action-unwatchedpages' => 'Sken-d tabdart n isebtaren ur yettwalan ara.',
@@ -1342,9 +1382,15 @@ Ur ilaq ara ad i sɛu ugar n $1 {{PLURAL:$1|asekkil|isekkilen}}.',
 'action-userrights-interwiki' => 'Ẓreg izerfan n umseqdac deg wikis wiyaḍ',
 'action-siteadmin' => 'sekkweṛ naɣ kkes aseḍru i taffa n isefka',
 'action-sendemail' => 'Ceggaɛ tira',
+'action-editmywatchlist' => 'beddel umuɣ inek uḍfar',
+'action-viewmywatchlist' => 'zeṛ umuɣ inek/inem n uḍfar',
+'action-viewmyprivateinfo' => 'zeṛ tilɣa inek tusligin',
+'action-editmyprivateinfo' => 'beddel tilɣa inek tusligin',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|Abeddel|Ibeddlen}}',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|seg tarzaft taneggarut}}',
+'enhancedrc-history' => 'amezruy',
 'recentchanges' => 'Ibeddilen imaynuten',
 'recentchanges-legend' => 'Tifranin n ibeddilen imaynuten',
 'recentchanges-summary' => 'Ḍfer ibeddilen imaynuten n {{SITENAME}}.',
@@ -1358,7 +1404,7 @@ Ur ilaq ara ad i sɛu ugar n $1 {{PLURAL:$1|asekkil|isekkilen}}.',
 'rclistfrom' => 'Ssken ibeddlen imaynuten seg $1',
 'rcshowhideminor' => '$1 ibeddlen ifessasen',
 'rcshowhidebots' => '$1 irubuten',
-'rcshowhideliu' => '$1 n yimseqdacen i ikecmen',
+'rcshowhideliu' => '$1 imseqdacen imseklesen',
 'rcshowhideanons' => '$1 n yimseqdacen udrigen',
 'rcshowhidepatr' => '$1 n yibeddlen yettwassenqden',
 'rcshowhidemine' => '$1 ibeddlen inu',
@@ -1375,7 +1421,7 @@ Ur ilaq ara ad i sɛu ugar n $1 {{PLURAL:$1|asekkil|isekkilen}}.',
 'rc_categories_any' => 'Ulayɣer',
 'rc-change-size-new' => '$1 {{PLURAL:$1|atamḍan|itamḍanen}} sakin abeddel',
 'newsectionsummary' => '/* $1 */ tigezmi tamaynut',
-'rc-enhanced-expand' => 'Ẓeṛ tilɣa (yeḥwaǧ JavaScript)',
+'rc-enhanced-expand' => 'Ẓeṛ ttfaṣil',
 'rc-enhanced-hide' => 'Ffer tilɣa',
 'rc-old-title' => 'yesnulfad s uzwel « $1 »',
 
@@ -1394,8 +1440,7 @@ Ur ilaq ara ad i sɛu ugar n $1 {{PLURAL:$1|asekkil|isekkilen}}.',
 'reuploaddesc' => 'Semmewet dɣa uɣaled ar tiferkit n tuznin.',
 'upload-tryagain' => 'Ceggaɛ aglam n ufaylu ibeddelen',
 'uploadnologin' => 'Ur tekcimeḍ ara',
-'uploadnologintext' => 'Yessefk [[Special:UserLogin|ad tkecmeḍ]]
-iwakken ad tazneḍ afaylu.',
+'uploadnologintext' => 'Ilaq ad $1 iwakken ad ketreḍ ifuyla.',
 'upload_directory_missing' => 'Akaram n taktert n ufaylu ($1) ulac-it dɣa ur d-yesnulfa ara sɣur aqeddac web.',
 'upload_directory_read_only' => 'Weserver/serveur Web ur yezmir ara ad yaru deg ($1).',
 'uploaderror' => 'Agul deg usekcam',
@@ -1635,6 +1680,7 @@ Ma aseqdac as yernu tastayt, ala ifuyla s lqem taneggarut id yekter aseqdac nni
 'listfiles_size' => 'Tiddi (bytes/octets)',
 'listfiles_description' => 'Aglam',
 'listfiles_count' => 'Ileqman',
+'listfiles-latestversion' => 'Lqem amiran',
 'listfiles-latestversion-yes' => 'Ih',
 'listfiles-latestversion-no' => 'Ala',
 
@@ -1733,6 +1779,8 @@ Ur tettuḍ ara ad selkeneḍ ma ur llan ara izdayen nniḍen ɣer tilɣatin uqb
 'randompage-nopages' => 'Ulac isebtar deg {{PLURAL:$2|tallunt n isemawen|tallunin n isemawen}} : $1.',
 
 # Random page in category
+'randomincategory-invalidcategory' => '« $1 » mačči d-isem n taggayt yeɣblen.',
+'randomincategory-nopages' => 'Ulac asebtar deg [[:Category:$1]].',
 'randomincategory-selectcategory-submit' => 'Ruḥ',
 
 # Random redirect
@@ -1956,7 +2004,7 @@ iwakken ad tazneḍ email i imseqdacen wiyaḍ.',
 'emailuser-title-target' => 'Ceggaɛ tirawt i {{GENDER:$1|aseqdac agi|taseqdact agi}}',
 'emailuser-title-notarget' => 'Ceggaɛ tirawt i useqdac',
 'emailpage' => 'Ceggaɛ tirawt i useqdac',
-'emailpagetext' => 'Tzemreḍ ad seqdeceḍ tiferkit ddaw agi iwakken ad ceggɛeḍ tirawt i useqdac agi.
+'emailpagetext' => 'Tzemreḍ ad seqdeceḍ tiferkit ddaw agi iwakken ad ceggɛeḍ tirawt i {{GENDER:$1|umseqdac|tamseqdact}} agi.
 Tansa e-mail id ekfeḍ deg [[Special:Preferences|iɣewwaren inek/inem]] ad tban deg urti "Amceggaɛ" n izen ; akka, anermas ad yezmer ak/akem yefk tiririt.',
 'usermailererror' => 'Yella ugul deg uzwel n email:',
 'defemailsubject' => '{{SITENAME}} tirawt n useqdac « $1 »',
@@ -2027,6 +2075,16 @@ Ma tebɣiḍ ad tekkseḍ asebter seg wumuɣ n uɛessi inek, wekki ɣef \"Fakk a
 'enotif_mailer' => 'Email n talɣut n {{SITENAME}}',
 'enotif_reset' => 'Rcem akk isebtar mmeẓren',
 'enotif_impersonal_salutation' => 'Amseqdac n {{SITENAME}}',
+'enotif_subject_deleted' => 'Asebtar $1 ɣef {{SITENAME}} yetwakkes sɣur {{GENDER:$2|$2}}',
+'enotif_subject_created' => 'Asebtar $1 ɣef {{SITENAME}} yetwaxleq sɣur {{GENDER:$2|$2}}',
+'enotif_subject_moved' => 'Asebtar $1 ɣef {{SITENAME}} yetwabeddel isem sɣur {{GENDER:$2|$2}}',
+'enotif_subject_restored' => 'Asebtar $1 ɣef {{SITENAME}} yetwerr sɣur {{GENDER:$2|$2}}',
+'enotif_subject_changed' => 'Asebtar $1 ɣef {{SITENAME}} yetwabeddel sɣur {{GENDER:$2|$2}}',
+'enotif_body_intro_deleted' => 'Asebtar $1 ɣef {{SITENAME}} yetwasfeḍ ass n $PAGEEDITDATE sɣur {{GENDER:$2|$2}}, zeṛ $3 i lqem amiran',
+'enotif_body_intro_created' => 'Asebtar $1 ɣef {{SITENAME}} yetwaxleq ass n $PAGEEDITDATE sɣur {{GENDER:$2|$2}}, zeṛ $3 i lqem amiran.',
+'enotif_body_intro_moved' => 'Asebtar $1 ɣef {{SITENAME}} yetwabeddel isem ass n $PAGEEDITDATE sɣur {{GENDER:$2|$2}}, zeṛ $3 i lqem amiran.',
+'enotif_body_intro_restored' => 'Asebtar $1 ɣef {{SITENAME}} yetwerr ass n $PAGEEDITDATE sɣur {{GENDER:$2|$2}}, zeṛ $3 i lqem amiran.',
+'enotif_body_intro_changed' => 'Asebtar $1 ɣef {{SITENAME}} yetwabeddel ass n $PAGEEDITDATE sɣur {{GENDER:$2|$2}}, zeṛ $3 i lqem amiran.',
 'enotif_lastvisited' => 'Ẓer $1 i akk ibeddlen segwasmi tkecmeḍ tikelt taneggarut.',
 'enotif_lastdiff' => 'Ẓer $1 akken ad tmuqleḍ abeddel.',
 'enotif_anon_editor' => 'aseqdac ur i siggezen ara $1',
@@ -2104,6 +2162,7 @@ Amḥu n isebtar am wagi yesɛa akref iwakken {{SITENAME}} ur yesɛu ara arway.'
 'cantrollback' => 'Ur yezmir ara ad yessuɣal; yella yiwen kan amseqdac iwumi ibeddel/yexleq asebter-agi.',
 'editcomment' => "Agzul n ubeddel yella: \"''\$1''\".",
 'revertpage' => 'Yessuɣal ibeddlen n [[Special:Contributions/$2|$2]] ([[User talk:$2|Meslay]]); yettubeddel ɣer tasiwelt taneggarut n [[User:$1|$1]]',
+'revertpage-nouser' => 'Tiririt n ibeddilen sur amseqdac yeffren ar lqem aneggaru sɣur {{GENDER:$1|[[User:$1|$1]]}}',
 
 # Edit tokens
 'sessionfailure-title' => 'Anezri n tɣimit',
@@ -2129,7 +2188,8 @@ G leɛnayek wekki ɣef taqeffalt "Back/Précédent" n browser/explorateur inek,
 'protect_expiry_old' => 'Azmez n tasewti i ɛedda.',
 'protect-unchain-permissions' => 'Kkes aseḍru i aṭas n tixtiṛiyin n usegdel',
 'protect-default' => '(ameslugen)',
-'protect-fallback' => 'Yeḥweǧ atrug « $1 »',
+'protect-fallback' => 'Ssireg kan imseqdacen s uzref « $1 »',
+'protect-level-autoconfirmed' => 'Ssireg kan imseqdacen i sergegen iman-nsen',
 'protect-level-sysop' => 'Ssireg inedbalen kan',
 'protect-summary-cascade' => 'acercur',
 'protect-expiring' => 'yemmut deg $1 (UTC)',
@@ -2186,12 +2246,12 @@ G leɛnayek wekki ɣef taqeffalt "Back/Précédent" n browser/explorateur inek,
 'blanknamespace' => '(Amenzawi)',
 
 # Contributions
-'contributions' => 'Tikkin n wemseqdac',
+'contributions' => 'Ittekkiyen n {{GENDER:$1|umseqdac|tamseqdact}}',
 'contributions-title' => 'Umuɣ n tikkin n umseqdac $1',
-'mycontris' => 'Tikkin inu',
-'contribsub2' => 'n $1 ($2)',
+'mycontris' => 'Ittekkiyen',
+'contribsub2' => 'I {{GENDER:$3|$1}} ($2)',
 'nocontribs' => 'Ur yufi ara abddel i tebɣiḍ.',
-'uctop' => '(taneggarut)',
+'uctop' => '(amiran)',
 'month' => 'Seg uggur (d wid uqbel) :',
 'year' => 'Seg useggwas (d wid uqbel) :',
 
@@ -2228,7 +2288,7 @@ Asekcem aneggaru n useklas n ikyafen yella ddaw agi :',
 'whatlinkshere-hideredirs' => '$1 aceggeε ɣer',
 'whatlinkshere-hidetrans' => '$1 aseddu',
 'whatlinkshere-hidelinks' => '$1 izdayen',
-'whatlinkshere-hideimages' => '$1 tugniwin i qqenen',
+'whatlinkshere-hideimages' => '$1 ifuyla iqqenen',
 'whatlinkshere-filters' => 'Tistaytin',
 
 # Block/unblock
@@ -2281,6 +2341,9 @@ Asekcem aneggaru n useklas n ikyafen yella ddaw agi :',
 'blocklogentry' => 'yesewḥel [[$1]] ; alama : $2 $3',
 'block-log-flags-anononly' => 'Imseqdacen udrigen kan',
 'block-log-flags-nocreate' => 'asnulfu n umiḍan yessegdel',
+'block-log-flags-noautoblock' => 'akyaf awurman yensa',
+'block-log-flags-noemail' => 'e-mail yekyef',
+'block-log-flags-nousertalk' => 'ur yezmer ara ad yebeddel asebter-is n umeslay',
 'proxyblockreason' => 'Tansa n IP inek teɛkel axaṭer nettat "open proxy". G leɛnayek, meslay akk d provider inek.',
 'sorbsreason' => 'Tansa IP inek/inem tella deg yiwen umuɣ am "open proxy" deg DNSBL yettuseqdac deg {{SITENAME}}.',
 'sorbs_create_account_reason' => 'Tansa IP inek/inem tella deg yiwen umuɣ am "open proxy" deg DNSBL yettuseqdac deg {{SITENAME}}.
@@ -2288,6 +2351,7 @@ Ur tezmireḍ ara ad snulfuḍ amiḍan.',
 
 # Developer tools
 'lockdb' => 'Sekker database',
+'lockedbyandtime' => '(sɣur $1 ass n $2 af $3)',
 
 # Move page
 'move-page' => 'Beddel isem n $1',
@@ -2451,6 +2515,7 @@ Anda tebɣiḍ tesmimeḍ "[[:$1]]" yella yagi. tebɣiḍ ad temḥuḍ iwakken
 'tooltip-rollback' => '« Semmet » yesemmet s-yiwen asenned akk d-acu amseqdac aneggaru yebeddel deg usebter',
 'tooltip-undo' => '« Ssefsu » yesemmet abeddel agi dɣa i ldi asfaylu n ubeddel deg uskar n azaraskan. I ɛemmed an uɣal ar lqem n uqbel dɣa an rnu taɣẓint deg tanaka n ugzul.',
 'tooltip-summary' => 'Sekcem agzul awezzlan',
+'interlanguage-link-title' => '$1 — $2',
 
 # Attribution
 'anonymous' => '{{PLURAL:$1|Aseqdac udrig|Iseqdacen udrigen}} ɣef {{SITENAME}}',
@@ -2538,7 +2603,7 @@ Lukan a t-tesseqdceḍ yezmer ad yexsser aselkim inek/inem.",
 'file-info-size' => '$1 × $2 pixel, tiddi n ufaylu: $3, anaw n MIME: $4',
 'file-nohires' => 'Ulac resolution i tameqqrant fell-as.',
 'svg-long-desc' => 'Afaylu SVG, tabadut n $1 × $2 pixel, lqedd : $3',
-'show-big-image' => 'Resolution tameqqrant',
+'show-big-image' => 'Afaylu aneṣli',
 'file-info-png-looped' => 'deg taglult',
 'file-info-png-repeat' => 'yetwurar {{PLURAL:$1|tikelt|tikwal}}',
 'file-info-png-frames' => '$1 {{PLURAL:$1|tugna|tugniwin}}',
index 06a0898..087c5d6 100644 (file)
@@ -916,7 +916,7 @@ HTML tags لوڑے.',",
 'isredirect' => 'خور ژاغا آلدو صفحہ',
 'istemplate' => 'ٹرانسکلوژن',
 'isimage' => 'ھوٹوان لنک',
-'whatlinkshere-prev' => '{{Plural:$1|سابقہ|سابقہ $1}}',
+'whatlinkshere-prev' => '{{PLURAL:$1|سابقہ|سابقہ $1}}',
 'whatlinkshere-next' => '{{PLURAL:$1|پروشٹیو|پروشٹیو$1}}',
 'whatlinkshere-links' => '← لنکس',
 'whatlinkshere-hideredirs' => '$1 رجوع مکرر',
index 179cb3f..5676a99 100644 (file)
@@ -280,7 +280,7 @@ $1',
 'pool-errorunknown' => 'Xeta nêzanıtiye',
 
 # All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
-'aboutsite' => 'Heqdé {{SITENAME}}',
+'aboutsite' => 'Heqa {{SITENAME}} de',
 'aboutpage' => 'Project:Heqa',
 'copyright' => 'Zerrek bınê $1 dero.',
 'copyrightpage' => '{{ns:project}}:Telifheqiye',
@@ -762,7 +762,6 @@ Diqet kerê, beno ke tedeestê {{SITENAME}} uza endi rozane niyê.",
 'rows' => 'Rêji:',
 'columns' => 'Ustıni:',
 'searchresultshead' => 'Cıcêre',
-'resultsperpage' => 'Pelgê be vênıtun:',
 'stub-threshold' => 'Tertibê şêmıga <a href="#" class="stub">stub link</a> (\'\'bytes\'\'):',
 'recentchangesdays' => 'Rozê ke vurnaisunê peyênun de asenê:',
 'recentchangesdays-max' => 'Maksimum $1 {{PLURAL:$1|roze|roji}}',
index 709288c..815b471 100644 (file)
@@ -1125,7 +1125,6 @@ $3 كەلتىرىلگەن سەبەبى: ''$2''",
 'rows' => 'جولدار:',
 'columns' => 'باعاندار:',
 'searchresultshead' => 'ىزدەۋ',
-'resultsperpage' => 'بەت سايىن ناتىيجە سانى:',
 'stub-threshold' => '<a href="#" class="stub">بىتەمە سىلتەمەسىن</a> پىشىمدەۋ تابالدىرىعى (بايت):',
 'recentchangesdays' => 'جۇىقتاعى وزگەرىستەرىندە كورسەتپەك كۇن سانى:',
 'recentchangescount' => 'جۋىقتاعى وزگەرىستەردىندە, تارىيح جانە جۋرنال بەتتەرىندە كورسەتپەك وڭدەمە سانى:',
index 30fec09..1a5f4d5 100644 (file)
@@ -9,6 +9,7 @@
  *
  * @author AlefZet
  * @author Alibek Kisybay
+ * @author Amangeldy
  * @author Arystanbek
  * @author Bakytgul Salykhova
  * @author Daniyar
@@ -687,6 +688,7 @@ $1',
 'error' => 'Қате',
 'databaseerror' => 'Дерекқор қатесі',
 'databaseerror-query' => 'Сұрау:$1',
+'databaseerror-function' => 'Әрекет: $1',
 'databaseerror-error' => 'Қате:$1',
 'laggedslavemode' => "'''Ескерту:''' Бетте жуықтағы жаңартулар болмауы мүмкін.",
 'readonly' => 'Дерекқоры құлыпталған',
@@ -721,6 +723,7 @@ $1',
 'cannotdelete-title' => '«$1» бетін жою мүмкін емес',
 'delete-hook-aborted' => 'Түзету ілмек арқылы тоқтатылды.
 Қосымша түсіндірмелер көрсетілмеген.',
+'no-null-revision' => '"$1" беті үшін жаңа бос нұсқасын бастау мүмкін болмады.',
 'badtitle' => 'Жарамсыз тақырып аты',
 'badtitletext' => 'Сұралған бет тақырыбының аты жарамсыз, бос, тіларалық сілтемесі не уики-аралық тақырып аты бұрыс енгізілген.
 Мында тақырып атында қолдалмайтын бірқатар таңбалар болуы мүмкін.',
@@ -1389,7 +1392,6 @@ $1",
 'rows' => 'Жолдар:',
 'columns' => 'Бағандар:',
 'searchresultshead' => 'Іздеу',
-'resultsperpage' => 'Бет сайын нәтиже саны:',
 'stub-threshold' => '<a href="#" class="stub">Бастама сілтемесін</a> пішімдеу табалдырығы (байт):',
 'stub-threshold-disabled' => 'Ажыратылған',
 'recentchangesdays' => 'Жуықтағы өзгерістерде көрсетілетін күн саны:',
@@ -3587,6 +3589,8 @@ $5
 'version-hook-subscribedby' => 'Тұзақ тартқыштары',
 'version-version' => '(Нұсқасы: $1)',
 'version-license' => 'Лицензиясы',
+'version-ext-license' => 'Лицензия',
+'version-ext-colheader-credits' => 'Автор(лары)',
 'version-poweredby-others' => 'басқалар',
 'version-software' => 'Орнатылған бағдарламалық жасақтама',
 'version-software-product' => 'Өнім',
@@ -3685,7 +3689,7 @@ $5
 'revdelete-restricted' => 'әкімшілерге тиымдар қолдады',
 'revdelete-unrestricted' => 'әкімшілерден тиымдарды аластады',
 'logentry-move-move' => '$1 $3 бетін $4 бетіне {{GENDER:$2|жылжытты}}',
-'logentry-move-move-noredirect' => '$1 $3 бетін $4 бетіне {{GENDER:$2|жылжытты}} (айдатқыш қалдырылмады)',
+'logentry-move-move-noredirect' => '$1 $3 бетін $4 бетіне {{GENDER:$2|жылжытты}} (айдатқыш қалдырмады)',
 'logentry-move-move_redir' => '$1 $3 бетін $4 деген айдатқыш үстіне {{GENDER:$2|жылжытты}}',
 'logentry-move-move_redir-noredirect' => '$1 $3 бетін $4 деген айдатқыш үстіне {{GENDER:$2|жылжытты}} (айдатқыш қалдырылмады)',
 'logentry-newusers-newusers' => '$1 жаңадан қатысушы тіркелгісін {{GENDER:$2|жасады}}',
index f1c5e51..459af18 100644 (file)
@@ -1088,7 +1088,6 @@ Añğartpa: {{SITENAME}} torabınıñ mağlumat tizbeleri eskirgen bolwı mümki
 'rows' => 'Joldar:',
 'columns' => 'Bağandar:',
 'searchresultshead' => 'İzdew',
-'resultsperpage' => 'Bet saýın nätïje sanı:',
 'stub-threshold' => '<a href="#" class="stub">Biteme siltemesin</a> pişimdew tabaldırığı (baýt):',
 'recentchangesdays' => 'Jüıqtağı özgeristerinde körsetpek kün sanı:',
 'recentchangescount' => 'Jwıqtağı özgeristerdinde, tarïx jäne jwrnal betterinde körsetpek öñdeme sanı:',
index 76b06b2..5e525d7 100644 (file)
@@ -320,7 +320,7 @@ $messages = array(
 'monday' => 'ថ្ងៃច័ន្ទ',
 'tuesday' => 'ថ្ងៃអង្គារ',
 'wednesday' => 'ថ្ងៃពុធ',
-'thursday' => 'á\9e\90á\9f\83á\9f\92á\9e\84ព្រហស្បតិ៍',
+'thursday' => 'á\9e\90á\9f\92á\9e\84á\9f\83ព្រហស្បតិ៍',
 'friday' => 'ថ្ងៃសុក្រ',
 'saturday' => 'ថ្ងៃសៅរ៍',
 'sun' => 'អា',
@@ -405,7 +405,7 @@ $messages = array(
 'cancel' => 'បោះបង់',
 'moredotdotdot' => 'បន្ថែមទៀត...',
 'morenotlisted' => 'បញ្ជីនេះមិនទាន់ពេញលេញទេ។',
-'mypage' => 'ទំព័រ​ខ្ញុំ',
+'mypage' => 'ទំព័រ​',
 'mytalk' => 'ការពិភាក្សា​',
 'anontalk' => 'ទំព័រពិភាក្សាសំរាប់ IP នេះ',
 'navigation' => 'ការណែនាំ',
@@ -451,7 +451,7 @@ $messages = array(
 'updatedmarker' => 'ត្រូវបានបន្ទាន់សម័យបន្ទាប់ពីពេលខ្ញុំចូលមើលចុងក្រោយ',
 'printableversion' => 'ទម្រង់​សម្រាប់បោះពុម្ភ',
 'permalink' => 'តំណភ្ជាប់អចិន្ត្រៃយ៍',
-'print' => 'á\9e\94á\9f\84á\9f\87á\9e\96á\9e»á\9e\98á\9f\92á\9e\97',
+'print' => 'á\9e\94á\9f\84á\9f\87á\9e\96á\9e»á\9e\98á\9f\92á\9e\96',
 'view' => 'មើល',
 'edit' => 'កែប្រែ',
 'create' => 'បង្កើត',
@@ -463,7 +463,7 @@ $messages = array(
 'undelete_short' => 'ឈប់លុប{{PLURAL:$1|កំណែប្រែមួយ|កំណែប្រែចំនួន$1}}វិញ',
 'viewdeleted_short' => 'មើល{{PLURAL:$1|កំណែប្រែមួយដែលត្រូវបានលុបចោល|កំណែប្រែចំនួន $1 ដែលត្រូវបានលុបចោល}}',
 'protect' => 'ការពារ',
-'protect_change' => 'ផ្លាស់ប្តូរការការពារ',
+'protect_change' => 'ផ្លាស់ប្តូរ',
 'protectthispage' => 'ការពារទំព័រនេះ',
 'unprotect' => 'ប្ដូរការការពារ',
 'unprotectthispage' => 'ផ្លាស់ប្ដូរការការពារទំព័រនេះ',
@@ -519,7 +519,7 @@ $1',
 'policy-url' => 'Project:គោលការណ៍',
 'portal' => 'ផតថលសហគមន៍',
 'portal-url' => 'Project:​ផតថលសហគមន៍',
-'privacy' => 'គោលការណ៍​ភាពឯកជន',
+'privacy' => 'គោលការណ៍នៃ​ភាពឯកជន',
 'privacypage' => 'Project:គោលការណ៍ភាពឯកជន',
 
 'badaccess' => 'បញ្ហាច្បាប់អនុញ្ញាត',
@@ -570,7 +570,7 @@ $1',
 'sort-ascending' => 'តម្រៀបតាមលំដាប់ឡើង',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
-'nstab-main' => 'á\9e¢á\9e\8fá\9f\92á\9e\90á\9e\94á\9e\91',
+'nstab-main' => 'á\9e\91á\9f\86á\9e\96á\9f\90á\9e\9a',
 'nstab-user' => 'ទំព័រអ្នកប្រើប្រាស់',
 'nstab-media' => 'ទំព័រមេឌា',
 'nstab-special' => 'ទំព័រពិសេស',
@@ -773,7 +773,7 @@ $2',
 'passwordtooshort' => 'ពាក្យសម្ងាត់ត្រូវ​មាន​យ៉ាងតិចណាស់​ {{PLURAL:$1|១ តួអក្សរ|$1តួអក្សរ}}។',
 'password-name-match' => 'ពាក្យសម្ងាត់ត្រូវតែខុសគ្នាពីអត្តនាមរបស់អ្នក។',
 'password-login-forbidden' => 'ហាមប្រាមមិនអោយប្រើអត្តនាមនិងពាក្យសម្ងាត់នេះ។',
-'mailmypassword' => 'á\9e\95á\9f\92á\9e\89á\9e¾á\9e¢á\9f\8aá\9e¸á\9e\98á\9f\82á\9e\9bá\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92á\9e\84á\9e¶á\9e\8fá\9f\8bá\9e\90á\9f\92á\9e\98á\9e¸',
+'mailmypassword' => 'á\9e\80á\9f\86á\9e\8eá\9e\8fá\9f\8bâ\80\8bá\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92á\9e\84á\9e¶á\9e\8fá\9f\8bâ\80\8bá\9e\9fá\9e¶á\9e¡á\9e¾á\9e\84á\9e\9cá\9e·á\9e\89',
 'passwordremindertitle' => 'ពាក្យសម្ងាត់បណ្តោះអាសន្នថ្មីសម្រាប់{{SITENAME}}',
 'passwordremindertext' => 'មានអ្នកណាម្នាក់ (ប្រហែលជាអ្នក, ពីអាសយដ្ឋាន IP $1) បានស្នើសុំពាក្យសម្ងាត់ថ្មីមួយពី {{SITENAME}} ($4)។
 ពាក្យសម្ងាត់បណ្ដោះអាសន្នមួយសម្រាប់អ្នកប្រើប្រាស់ "$2" ត្រូវបានប្ដូរទៅជា "$3"។ បើសិនជានេះជាចេតនារបស់អ្នក សូមអ្នកកត់ឈ្មោះចូល​ហើយជ្រើសប្រើពាក្យសម្ងាត់ថ្មី។
@@ -1402,7 +1402,6 @@ $1",
 'rows' => 'ជួរដេក៖',
 'columns' => 'ជួរឈរ៖',
 'searchresultshead' => 'ស្វែងរក',
-'resultsperpage' => 'ចំនួនលទ្ធផលក្នុងមួយទំព័រ៖',
 'stub-threshold' => 'ទំហំអប្បបរមាសំរាប់ដាក់ជាទំរង់<a href="#" class="stub">តំណភ្ជាប់ទៅទំព័រកំប៉ិចកំប៉ុក</a> (គិតជាបៃ)៖',
 'stub-threshold-disabled' => 'មិនប្រើ',
 'recentchangesdays' => 'ចំនួនថ្ងៃបង្ហាញក្នុងទំព័របន្លាស់ប្តូរថ្មីៗ៖',
@@ -1656,7 +1655,7 @@ $1",
 'nchanges' => '$1 {{PLURAL:$1|បន្លាស់ប្ដូរ|បន្លាស់ប្ដូរ}}',
 'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|គិតតាំងពីការបើកមើលចុងក្រោយ}}',
 'enhancedrc-history' => 'ប្រវត្តិ',
-'recentchanges' => 'á\9e\94á\9e\93á\9f\92á\9e\9bá\9e¶á\9e\9fá\9f\8bá\9e\94á\9f\92á\9e\8aá\9e¼á\9e\9aâ\80\8bថ្មីៗ',
+'recentchanges' => 'á\9e\94á\9f\86á\9e\9bá\9e¶á\9e\9fá\9f\8bá\9e\94á\9f\92á\9e\8aá\9e¼á\9e\9aថ្មីៗ',
 'recentchanges-legend' => 'ជម្រើសនានា​ សម្រាប់ការបង្ហាញបន្លាស់ប្ដូរថ្មីៗ',
 'recentchanges-summary' => 'តាមដានរាល់បំលាស់ប្ដូរថ្មីៗបំផុតចំពោះវិគីនៅលើទំព័រនេះ។',
 'recentchanges-feed-description' => 'តាមដាន​បន្លាស់ប្ដូរថ្មីៗ​បំផុត​នៃ​វិគី​នេះក្នុង​មតិព័ត៌មាន​នេះ​។',
@@ -1664,12 +1663,12 @@ $1",
 'recentchanges-label-minor' => 'នេះជាការកែប្រែតិចតួចមួយប៉ុណ្ណោះ',
 'recentchanges-label-bot' => 'ការកែប្រែនេះត្រូវបានធ្វើឡើងដោយរូបយន្ត',
 'recentchanges-label-unpatrolled' => 'ការកែប្រែនេះមិនទាន់ត្រូវបានល្បាតទេ',
-'recentchanges-legend-newpage' => '$1 - ទំព័រថ្មី',
+'recentchanges-legend-newpage' => '(មើលផងដែរនូវ [[Special:NewPages|បញ្ជីទំព័រថ្មី]])',
 'rcnotefrom' => "ខាងក្រោមនេះជាបន្លាស់ប្ដូរនានាគិតចាប់តាំងពី '''$2''' (បង្ហាញអតិបរមាចំនួន '''$1''')។",
 'rclistfrom' => 'បង្ហាញបន្លាស់ប្ដូរថ្មីៗចាប់តាំងពី $1',
 'rcshowhideminor' => '$1កំណែប្រែ​តិចតួច',
 'rcshowhidebots' => '$1រូបយន្ត',
-'rcshowhideliu' => '$1á\9e¢á\9f\92á\9e\93á\9e\80á\9e\94á\9f\92á\9e\9aá\9e¾á\9e\94á\9f\92á\9e\9aá\9e¶á\9e\9fá\9f\8bá\9e\8aá\9f\82á\9e\9bá\9e\94á\9e¶á\9e\93á\9e\80á\9e\8fá\9f\8bá\9e\88á\9f\92á\9e\98á\9f\84á\9f\87á\9e\85á\9e¼á\9e\9b',
+'rcshowhideliu' => '$1á\9e¢á\9f\92á\9e\93á\9e\80á\9e\94á\9f\92á\9e\9aá\9e¾á\9e\94á\9f\92á\9e\9aá\9e¶á\9e\9fá\9f\8bá\9e\8aá\9f\82á\9e\9bá\9e\94á\9e¶á\9e\93á\9e\85á\9e»á\9f\87á\9e\88á\9f\92á\9e\98á\9f\84á\9f\87á\9e\9aá\9e½á\9e\85',
 'rcshowhideanons' => '$1អ្នកប្រើប្រាស់អនាមិក',
 'rcshowhidepatr' => '$1កំណែប្រែដែលបានល្បាត',
 'rcshowhidemine' => '$1កំណែប្រែរបស់ខ្ញុំ',
@@ -2925,7 +2924,7 @@ $1',
 'tooltip-t-contributions' => 'បង្ហាញបញ្ជីរួមចំណែករបស់អ្នកប្រើប្រាស់នេះ',
 'tooltip-t-emailuser' => 'ផ្ញើអ៊ីមែលទៅកាន់អ្នកប្រើប្រាស់នេះ',
 'tooltip-t-upload' => 'ឯកសារផ្ទុកឡើង',
-'tooltip-t-specialpages' => 'á\9e\94á\9e\89á\9f\92á\9e\87á\9e¸á\9e\91á\9f\86á\9e\96á\9f\90á\9e\9aá\9e\96á\9e·á\9e\9fá\9f\81á\9e\9fá\9f\97á\9e\91á\9e¶á\9f\86á\9e\84á\9e¢á\9e\9fá\9f\8b',
+'tooltip-t-specialpages' => 'á\9e\94á\9e\89á\9f\92á\9e\87á\9e¸á\9e\91á\9f\86á\9e\96á\9f\90á\9e\9aá\9e\96á\9e·á\9e\9fá\9f\81á\9e\9fá\9f\97á\9e\91á\9e¶á\9f\86á\9e\84á\9e\98á\9e¼á\9e\9b',
 'tooltip-t-print' => 'ទម្រង់សម្រាប់បោះពុម្ភរបស់ទំព័រនេះ',
 'tooltip-t-permalink' => 'តំណភ្ជាប់អចិន្ត្រៃយ៍ដែលភ្ជាប់មកកំណែនៃទំព័រនេះ',
 'tooltip-ca-nstab-main' => 'មើលទំព័រមាតិកា',
@@ -3101,7 +3100,7 @@ $1',
 'minutes' => '{{PLURAL:$1|$1 នាទី|$1 នាទី}}',
 'hours' => '{{PLURAL:$1|$1 ម៉ោង|$1 ម៉ោង}}',
 'days' => '{{PLURAL:$1|$1 ថ្ងៃ|$1 ថ្ងៃ}}',
-'weeks' => '{{PLURAL: $1|$1 សប្តាហ៍|$1 សប្តាហ៍}}',
+'weeks' => '{{PLURAL:$1|$1 សប្តាហ៍|$1 សប្តាហ៍}}',
 'months' => '{{PLURAL:$1|$1 ខែ|$1 ខែ}}',
 'years' => '{{PLURAL:$1|$1 ឆ្នាំ|$1 ឆ្នាំ}}',
 'ago' => '$1 មុន',
@@ -3506,6 +3505,9 @@ $5
 'imgmultigo' => 'ទៅ!',
 'imgmultigoto' => 'ទៅកាន់ទំព័រ$1',
 
+# Language selector for translatable SVGs
+'img-lang-go' => 'ទៅ',
+
 # Table pager
 'ascending_abbrev' => 'លំដាប់ឡើង',
 'descending_abbrev' => 'លំដាប់ចុះ',
@@ -3589,14 +3591,29 @@ $5
 'version-hook-name' => 'ឈ្មោះ​ Hook',
 'version-hook-subscribedby' => 'បានជាវ ជាប្រចាំ ដោយ',
 'version-version' => '(កំណែ $1)',
-'version-license' => 'អាជ្ញាប័ណ្ណ',
+'version-license' => 'អាជ្ញាបណ្ណ មេឌាវិគី',
+'version-ext-license' => 'អាជ្ញាបណ្ណ',
+'version-ext-colheader-version' => 'កំណែ',
+'version-ext-colheader-license' => 'អាជ្ញាបណ្ណ',
+'version-ext-colheader-description' => 'ការពិពណ៌នា',
+'version-ext-colheader-credits' => 'អ្នកនិពន្ធ',
+'version-license-title' => 'អាជ្ញាបណ្ណសម្រាប់ $1',
 'version-poweredby-credits' => "វិគីនេះឧបត្ថម្ភដោយ '''[https://www.mediawiki.org/ មេឌាវិគី]''', រក្សាសិទ្ធ © ២០០១-$1 $2។",
 'version-poweredby-others' => 'អ្នកដទៃទៀត',
+'version-poweredby-translators' => 'អ្នកបកប្រែ translatewiki.net',
 'version-software' => 'ផ្នែកទន់​ដែល​បានដំឡើង',
 'version-software-product' => 'ផលិតផល',
 'version-software-version' => 'កំណែ',
 'version-entrypoints-header-url' => 'URL',
 
+# Special:Redirect
+'redirect-submit' => 'ទៅ',
+'redirect-value' => 'តម្លៃ៖',
+'redirect-user' => 'អត្តលេខអ្នកប្រើប្រាស់',
+'redirect-page' => 'អត្តលេខទំព័រ',
+'redirect-file' => 'ឈ្មោះឯកសារ',
+'redirect-not-exists' => 'តម្លៃរ​រកមិនឃើញ​',
+
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'ស្វែងរកឯកសារដូចគ្នាបេះបិទ',
 'fileduplicatesearch-legend' => 'ស្វែងរកឯកសារដូចគ្នាបេះបិទ',
@@ -3638,7 +3655,10 @@ $5
 'tags-tag' => 'ឈ្មោះ​ស្លាក',
 'tags-display-header' => 'Appearance លើ​បញ្ជី​បំលាស់​ប្ដូរ​',
 'tags-description-header' => 'បរិយាយពេញលេញ​នៃអត្ថន័យ​',
+'tags-active-header' => 'សកម្ម?',
 'tags-hitcount-header' => 'បំលាស់​ប្ដូរ​ដែលមានស្លាក​',
+'tags-active-yes' => 'បាទ/ចាស',
+'tags-active-no' => 'ទេ',
 'tags-edit' => 'កែប្រែ',
 'tags-hitcount' => '$1 {{PLURAL:$1|បំលាស់ប្ដូរ|បំលាស់ប្ដូរ}}',
 
index f73e4ff..17e2f71 100644 (file)
@@ -950,7 +950,6 @@ $2',
 'prefs-editing' => 'ಸಂಪಾದನೆ',
 'rows' => 'ಸಾಲುಗಳು:',
 'searchresultshead' => 'ಹುಡುಕು',
-'resultsperpage' => 'ಪ್ರತಿ ಪುಟದಲ್ಲಿ ಫಲಿತಾಂಶಗಳು:',
 'recentchangesdays' => 'ಇತ್ತೀಚಿನ ಬದಲಾವಣೆಗಳಲ್ಲಿ ತೋರಿಸಬೇಕಾದ ದಿನಗಳು:',
 'recentchangescount' => 'ಇತ್ತೀಚೆಗಿನ ಬದಲಾವಣೆಗಳಲ್ಲಿರುವ ವಿಷಯಗಳ ಸಂಖ್ಯೆ',
 'savedprefs' => 'ನಿಮ್ಮ ಇಚ್ಛೆಗಳನ್ನು ಉಳಿಸಲಾಯಿತು.',
index 15e08e7..e6afc00 100644 (file)
  * @author ITurtle
  * @author Idh0854
  * @author Jmkim dot com
+ * @author Jskang
  * @author Kaganer
  * @author Klutzy
  * @author Kwj2772
  * @author LFM
+ * @author Leehoy
  * @author Mintz0223
  * @author Pi.C.Noizecehx
  * @author Priviet
@@ -373,7 +375,7 @@ $messages = array(
 'tog-editondblclick' => '더블 클릭으로 문서 편집하기',
 'tog-editsection' => '[편집] 링크로 부분 편집하기',
 'tog-editsectiononrightclick' => '제목을 오른쪽 클릭해서 문단 편집하기 활성화',
-'tog-showtoc' => '문서의 차례 보여주기 (머릿글이 4개 이상인 경우)',
+'tog-showtoc' => '문서의 목차 보여주기 (머릿글이 4개 이상인 경우)',
 'tog-rememberpassword' => '이 브라우저에서 로그인 상태를 저장하기 (최대 $1{{PLURAL:$1|일}})',
 'tog-watchcreations' => '내가 만드는 문서와 내가 올린 파일을 주시문서 목록에 추가',
 'tog-watchdefault' => '내가 편집하는 문서와 파일을 주시문서 목록에 추가',
@@ -784,7 +786,7 @@ $2',
 'yourname' => '사용자 이름:',
 'userlogin-yourname' => '사용자 이름',
 'userlogin-yourname-ph' => '사용자 이름을 입력하세요',
-'createacct-another-username-ph' => '사용자 이름을 입력하세요',
+'createacct-another-username-ph' => '사용자 이름(계정명)을 입력하세요',
 'yourpassword' => '비밀번호:',
 'userlogin-yourpassword' => '비밀번호',
 'userlogin-yourpassword-ph' => '비밀번호를 입력하세요',
@@ -1216,6 +1218,8 @@ IP 주소는 여러 사용자가 공유할 수 있습니다.
 'content-not-allowed-here' => '"$1" 내용은 [[$2]] 문서예 허용하지 않습니다',
 'editwarning-warning' => '이 페이지에서 벗어나면 저장하지 않은 바뀜이 모두 사라집니다.
 로그인을 했다면, 환경 설정의 "편집 상자"에서 이 경고를 띄우지 않도록 설정할 수 있습니다.',
+'editpage-notsupportedcontentformat-title' => '지원하지 않는 컨텐츠 형식',
+'editpage-notsupportedcontentformat-text' => '컨텐츠 모델 $2 에서는 컨텐츠형식 $1을 지원하지 않습니다.',
 
 # Content models
 'content-model-wikitext' => '위키텍스트',
@@ -1524,7 +1528,6 @@ $1",
 'rows' => '줄 수:',
 'columns' => '열 수:',
 'searchresultshead' => '검색',
-'resultsperpage' => '쪽마다 보이는 결과 수:',
 'stub-threshold' => '링크를 <a href="#" class="stub">토막글</a> 형식으로 보여줄 문서 크기 (바이트 수):',
 'stub-threshold-disabled' => '비활성화됨',
 'recentchangesdays' => '최근 바뀜에 보여줄 날짜 수:',
@@ -1582,7 +1585,9 @@ HTML 태그를 확인하세요.',
 'gender-unknown' => '밝히고 싶지 않습니다.',
 'gender-male' => '위키 문서를 편집하는 남자입니다',
 'gender-female' => '위키 문서를 편집하는 여자입니다',
-'prefs-help-gender' => '이 사용자 환경 설정은 선택 사항입니다. 소프트웨어에서 이 설정을 사용해 사용자를 가리키고 다른 사용자에게 자신을 언급하는데 적절한 문법적 성별을 사용합니다. 이 정보는 공개됩니다.',
+'prefs-help-gender' => '이 항목은 선택 사항입니다.
+적절한 문법적 성별을 사용하여 당신을 지칭하거나 다른 사람들에게 당신을 언급하는 경우에 이 항목의 값이 사용됩니다.
+이것은 공개 항목입니다.',
 'email' => '이메일',
 'prefs-help-realname' => '실명은 선택 사항입니다.
 실명을 입력하면 문서 기여에 자신의 이름이 들어가게 됩니다.',
@@ -1925,6 +1930,7 @@ $2 {{PLURAL:$3|형식만 사용할 수 있습니다}}.',
 [[File:$1|thumb|center|$1]]',
 'file-exists-duplicate' => '현재 올리고 있는 {{PLURAL:$1|파일}}이 아래 파일과 중복됩니다:',
 'file-deleted-duplicate' => '이 파일과 같은 파일 ([[:$1]])이 이전에 삭제된 적이 있습니다. 파일을 다시 올리기 전에 문서의 삭제 기록을 확인해 주시기 바랍니다.',
+'file-deleted-duplicate-notitle' => '이 파일과 같은 파일이 삭제된 이력이 있습니다. 업로드하기에 앞서, 삭제된 파일의 이력을 확인할 수 있는 권한을 가진 담당자에게 먼저 문의하기 바랍니다.',
 'uploadwarning' => '올리기 경고',
 'uploadwarning-text' => '아래의 파일 설명을 수정하고 다시 시도해 주세요.',
 'savefile' => '파일 저장',
@@ -2314,6 +2320,7 @@ URL이 맞고 해당 웹사이트가 작동하는지 확인해주세요.',
 'protectedpages' => '보호된 문서 목록',
 'protectedpages-indef' => '오른쪽 조건에 맞는 보호만 보기',
 'protectedpages-cascade' => '연쇄적 보호만 보기',
+'protectedpages-noredirect' => '넘겨주기 숨김',
 'protectedpagesempty' => '보호되어 있는 문서가 없습니다.',
 'protectedtitles' => '만들기 보호된 표제어 목록',
 'protectedtitlesempty' => '해당 조건에 맞는 만들기 금지 표제어가 없습니다.',
@@ -2593,6 +2600,7 @@ $UNWATCHURL
 'delete-warning-toobig' => '이 문서에는 {{PLURAL:$1|편집 역사}}가 $1개 있습니다.
 편집 역사가 긴 문서를 삭제하면 {{SITENAME}} 데이터베이스 동작에 큰 영향을 줄 수 있습니다.
 주의해 주세요.',
+'deleting-backlinks-warning' => "'''경고:''' 삭제하려는 문서로의 링크를 가진 다른 문서가 있습니다.",
 
 # Rollback
 'rollback' => '편집 되돌리기',
@@ -2835,6 +2843,7 @@ $1',
 차단된 사용자 목록은 [[Special:BlockList|여기]]에서 볼 수 있습니다.',
 'ipb-blockingself' => '자기 자신을 차단하려고 합니다! 정말로 실행할까요?',
 'ipb-confirmhideuser' => '사용자를 차단하면서 "사용자 숨기기" 설정을 선택했습니다. 모든 기록에서 이 사용자의 사용자 이름을 숨기게 됩니다. 정말로 계정을 숨기시겠습니까?',
+'ipb-confirmaction' => '그것을 정말로 하기 원한다면 아래에 있는 "{{int:ipb-confirm}}" 부분에 체크하세요',
 'ipb-edit-dropdown' => '차단 이유 목록 편집하기',
 'ipb-unblock-addr' => '$1 차단 해제하기',
 'ipb-unblock' => '사용자 또는 IP 주소 차단 해제하기',
@@ -4052,6 +4061,16 @@ $5
 'version-hook-subscribedby' => '훅이 사용된 위치',
 'version-version' => '(버전 $1)',
 'version-license' => '미디어위키 라이선스',
+'version-ext-license' => '라이선스',
+'version-ext-colheader-name' => '확장기능',
+'version-ext-colheader-version' => '버전',
+'version-ext-colheader-license' => '라이선스',
+'version-ext-colheader-description' => '설명',
+'version-ext-colheader-credits' => '저자',
+'version-license-title' => '$1 사용을 위한 라이센스',
+'version-license-not-found' => '이 확장기능에 대한 라이선스 세부 정보가 없습니다.',
+'version-credits-title' => '$1의 작성자',
+'version-credits-not-found' => '이 확장기능에 대한 크레딧 세부 정보가 없습니다.',
 'version-poweredby-credits' => "이 위키는 '''[https://www.mediawiki.org/ MediaWiki]'''(미디어위키)를 기반으로 작동합니다. Copyright © 2001-$1 $2.",
 'version-poweredby-others' => '그 외 다른 개발자',
 'version-poweredby-translators' => 'translatewiki.net 번역자',
@@ -4272,6 +4291,7 @@ $5
 'api-error-overwrite' => '이미 있는 파일을 덮어쓸 수 없습니다.',
 'api-error-stashfailed' => '내부 오류: 서버가 임시 파일을 저장하지 못했습니다.',
 'api-error-publishfailed' => '내부 오류: 서버가 임시 파일을 게시하지 못했습니다.',
+'api-error-stasherror' => '파일을 안전한 곳으로 업로드 하는 동안 오류가 발생했습니다.',
 'api-error-timeout' => '서버가 제 시간 내에 응답하지 않았습니다.',
 'api-error-unclassified' => '알 수 없는 오류가 발생했습니다.',
 'api-error-unknown-code' => '알 수 없는 오류: "$1"',
index 94720b8..d8b6b47 100644 (file)
@@ -117,14 +117,14 @@ $messages = array(
 'tog-hidepatrolled' => 'Джангы тюрлениулени тизмесинде тинтилген тюрлениулени кёргюзме',
 'tog-newpageshidepatrolled' => 'Джангы бетлени тизмесинде тинтилген бетлени кёргюзме',
 'tog-extendwatchlist' => 'Кёзде тургъан тизмени, къуру ахыр тюл, бютеу тюрлениулени кёрюр ючюн кенгерт',
-'tog-usenewrc' => 'Ахыр тюрлениуледе эм кёздеги тизмеде бетлени къауум тюрлениулери (JavaScript керекди)',
+'tog-usenewrc' => 'Ахыр тюрлениуледе эм кёздеги тизмеде бетлени тюрлениулерин къауумлашдыр',
 'tog-numberheadings' => 'Башлыкъланы (бёлюмлени атлары) автомат номерленсинле',
-'tog-showtoolbar' => 'ТÑ\8eÑ\80лендиÑ\80ген Ñ\81агÑ\8aаÑ\82да, Ð±Ð°Ñ\88Ñ\8bндагÑ\8aÑ\8b Ð°Ð´Ñ\8bÑ\80 Ð¿Ð°Ð½ÐµÐ»Ð½Ð¸ ÐºÑ\91Ñ\80гÑ\8eз (JavaScript)',
-'tog-editondblclick' => 'Эки басыу бла тюрлендириу бет ачылсын (JavaScript)',
+'tog-showtoolbar' => 'ТÑ\8eÑ\80лендиÑ\80иÑ\83 Ð°Ð´Ñ\8bÑ\80 Ð¿Ð°Ð½ÐµÐ»Ð½Ð¸ ÐºÑ\91Ñ\80гÑ\8eз',
+'tog-editondblclick' => 'Эки басыу бла бетлени тюрлендир',
 'tog-editsection' => 'Хар бёлюмге «тюрлендир» джибериуню кёргюз',
-'tog-editsectiononrightclick' => 'Бёлюмлени бёлюм башлыкъгъа басханлай тюрлендириу бетин ач',
+'tog-editsectiononrightclick' => 'Бёлюмлени бёлюм башлыкъгъа басханлай тюрлендир',
 'tog-showtoc' => 'Башларын кёргюз (3-ден кёб бёлюм башлыгъы болгъан бетлеге)',
-'tog-rememberpassword' => 'Ð\91Ñ\83 ÐºÐ¾Ð¼Ð¿Ñ\8cÑ\8eÑ\82еÑ\80де Ð¼ÐµÐ½Ð¸ Ñ\82еÑ\80геÑ\9e Ð´Ð¶Ð°Ð·Ñ\8bÑ\9eÑ\83мÑ\83 Ñ\81акÑ\8aла (Ñ\8dм ÐºÑ\91б $1 {{PLURAL:$1|1=кюн|кюн}})',
+'tog-rememberpassword' => 'Ð\91Ñ\83 Ð±Ñ\80аÑ\83зеÑ\80де Ð¼ÐµÐ½Ð¸ Ñ\82еÑ\80геÑ\9e Ð´Ð¶Ð°Ð·Ñ\8bÑ\9eÑ\83мÑ\83 Ñ\81акÑ\8aла (Ñ\8dм ÐºÑ\91б: $1 {{PLURAL:$1|биÑ\80 кюн|кюн}})',
 'tog-watchcreations' => 'Мен къурагъан (башлагъан) бетлени эм мен джюклеген файлланы кёзюмде тургъан тизмеме къош',
 'tog-watchdefault' => 'Мен тюрлендирген бетлени эм файлланы кёзюмде тургъан тизмеме къош',
 'tog-watchmoves' => 'Мен атларын ауушдургъан бетлени эм файлланы кёзюмде тургъан тизмеме къош',
@@ -152,6 +152,7 @@ $messages = array(
 'tog-showhiddencats' => 'Джашыртын категорияланы кёргюз',
 'tog-norollbackdiff' => 'Къайтарыудан сора версияланы башхалыкъларын кёргюзме',
 'tog-useeditwarning' => 'Тюрлендириулени сакълатмай редакторлау бетден кетген сагъатымда билдир',
+'tog-prefershttps' => 'Системагъа киргенден сора джакъланнган байламны хаманда хайырландыр',
 
 'underline-always' => 'Хаманда',
 'underline-never' => 'Бир заманда да',
@@ -229,18 +230,18 @@ $messages = array(
 'december-date' => '$1 декабрь',
 
 # Categories related messages
-'pagecategories' => '{{PLURAL:$1|1=Категория|Категорияла}}',
+'pagecategories' => '{{PLURAL:$1|Категория|Категорияла}}',
 'category_header' => '«$1» категориядагъы бетле',
 'subcategories' => 'Тюбкатегорияла',
 'category-media-header' => '«$1» категориядагъы файлла',
 'category-empty' => "''Бу категория бусагъатда бошду.''",
-'hidden-categories' => '{{PLURAL:$1|1=Джашырылгъан категория|Джашырылгъан категорияла}}',
+'hidden-categories' => '{{PLURAL:$1|Джашырылгъан категория|Джашырылгъан категорияла}}',
 'hidden-category-category' => 'Джашыртын категорияла',
-'category-subcat-count' => '{{PLURAL:$2|1=Бу категориягъа къуру баргъан тюбкатегория киреди.|$2 тюбкатегориядан $1 киреди бу категориягъа.}}',
-'category-subcat-count-limited' => 'Бу категорияда {{PLURAL:$1|$1 тюбкатегория}} барды.',
-'category-article-count' => '{{PLURAL:$2|1=Бу категорияда къуру бир бет барды.|Бу категориядагъы $2 бетден $1 кёргюзюлгенди.}}',
+'category-subcat-count' => '{{PLURAL:$2|Бу категориягъа къуру баргъан тюбкатегория киреди.|$2 тюбкатегориядан $1 киреди бу категориягъа.}}',
+'category-subcat-count-limited' => 'Бу категорияда {{PLURAL:$1|тюбкатегория|$1 тюбкатегория}} барды.',
+'category-article-count' => '{{PLURAL:$2|Бу категорияда къуру бир бет барды.|Бу категориядагъы $2 бетден {{PLURAL:$1|бет|$1 бет}} кёргюзюлгенди.}}',
 'category-article-count-limited' => 'Бу категорияда {{PLURAL:$1|$1 бет}} барды.',
-'category-file-count' => '{{PLURAL:$2|Бу категорияда къуру бир файл барды.|Категориядагъы $2 файлдан {{PLURAL:$1|$1 файлы кёргюзюлгенди}}.}}',
+'category-file-count' => '{{PLURAL:$2|Бу категорияда къуру бир файл барды.|Категориядагъы $2 файлдан {{PLURAL:$1|бир файл|$1 файлы}} кёргюзюлгенди.}}',
 'category-file-count-limited' => 'Бу категория да {{PLURAL:$1|$1 файл}} барды.',
 'listingcontinuesabbrev' => '(баргъаны)',
 'index-category' => 'Индексленнген бетле',
@@ -307,8 +308,9 @@ $messages = array(
 'create-this-page' => 'Бу бетни къура',
 'delete' => 'Кетер',
 'deletethispage' => 'Бу бетни кетер',
-'undelete_short' => '$1 {{PLURAL:$1|тюрлендириуню}} къайтар',
-'viewdeleted_short' => '{{PLURAL:$1|1=1|$1}} кетерилген тюрлендириуге къарау',
+'undeletethispage' => 'Бу бетни ызына сал',
+'undelete_short' => '{{PLURAL:$1|Бир тюрлендириуню$1 тюрлендириуню}} ызына сал',
+'viewdeleted_short' => '{{PLURAL:$1|Бир кетерилген тюрлендириуню|$1 кетерилген тюрлендириуню}} кёрюу',
 'protect' => 'Джакъла',
 'protect_change' => 'тюрлендир',
 'protectthispage' => 'Бу бетни джакъла',
@@ -336,7 +338,7 @@ $messages = array(
 'redirectedfrom' => '(«$1» бетден джиберилгенди)',
 'redirectpagesub' => 'Башха бетге джибериучю бет',
 'lastmodifiedat' => 'Бу бетни ахыр тюрленнгени: $2, $1.',
-'viewcount' => 'Бу бетге {{PLURAL:$1|1=1|$1}} кере киргендиле.',
+'viewcount' => 'Бу бетге {{PLURAL:$1|бир|$1}} кере киргендиле.',
 'protectedpage' => 'Джакъланнган бет',
 'jumpto' => 'Бери кёчерге:',
 'jumptonavigation' => 'навигация',
@@ -521,14 +523,14 @@ $2',
 'yourpasswordagain' => 'Паролну джангыдан джаз:',
 'createacct-yourpasswordagain' => 'Паролну бегит',
 'createacct-yourpasswordagain-ph' => 'Паролну энтда бир кере джаз',
-'remembermypassword' => 'Ð\91Ñ\83 ÐºÐ¾Ð¼Ð¿Ñ\8cÑ\8eÑ\82еÑ\80де Ð¼ÐµÐ½Ð¸ Ñ\82еÑ\80геÑ\9e Ð´Ð¶Ð°Ð·Ñ\8bÑ\9eÑ\83мÑ\83 Ñ\83нÑ\83Ñ\82ма (Ñ\8dм ÐºÑ\91б $1 {{PLURAL:$1|1=кюн|кюн}})',
+'remembermypassword' => 'Ð\91Ñ\83 ÐºÐ¾Ð¼Ð¿Ñ\8cÑ\8eÑ\82еÑ\80де Ð¼ÐµÐ½Ð¸ Ñ\82еÑ\80геÑ\9e Ð´Ð¶Ð°Ð·Ñ\8bÑ\9eÑ\83мÑ\83 Ñ\81акÑ\8aлаб Ñ\82Ñ\83Ñ\80 (Ñ\8dм ÐºÑ\91б: $1 {{PLURAL:$1|биÑ\80 кюн|кюн}})',
 'userlogin-remembermypassword' => 'Системада туруу',
 'userlogin-signwithsecure' => 'Джакъланнган байлам',
 'yourdomainname' => 'Сизни доменигиз:',
 'password-change-forbidden' => 'Бу викиде паролугъузну тюрлендиреллик тюлсюз.',
 'externaldberror' => 'Тыш информация базаны болушлугъу бла аутентификация, халатлы болду, неда тыш аккаунтугъузну тюрлендирирге хакъларагъыз джетмейди.',
-'login' => 'Ð\9aириу',
-'nav-login-createaccount' => 'Ð\9aиÑ\80иÑ\83 / Ñ\80егиÑ\81Ñ\82Ñ\80аÑ\86иÑ\8f Ñ\8dÑ\82иу',
+'login' => 'СиÑ\81Ñ\82емагÑ\8aа Ðºириу',
+'nav-login-createaccount' => 'СиÑ\81Ñ\82емагÑ\8aа ÐºÐ¸Ñ\80иÑ\83 / Ð\90ккаÑ\83нÑ\82 ÐºÑ\8aÑ\83Ñ\80ау',
 'loginprompt' => '{{SITENAME}} сайтха кирир ючюн «cookies» эркин этерге керексиз.',
 'userlogin' => 'Кир / регистрация эт',
 'userloginnocreate' => 'Кириу',
@@ -539,9 +541,9 @@ $2',
 'userlogin-joinproject' => '{{SITENAME}} сайтха къошул',
 'nologin' => 'Тергеу джазыуугъуз (аккаунтугъуз) джокъмуду? $1.',
 'nologinlink' => 'Тергеу джазыу (аккаунт) къурагъыз',
-'createaccount' => 'Ð\94жангÑ\8b ÐºÑ\8aоÑ\88Ñ\83лÑ\83Ñ\83Ñ\87Ñ\83нÑ\83 Ñ\80егиÑ\81Ñ\82Ñ\80аÑ\86иÑ\8f Ñ\8dÑ\82',
+'createaccount' => 'Ð\90ккаÑ\83нÑ\82 ÐºÑ\8aÑ\83Ñ\80аÑ\83',
 'gotaccount' => 'Тергеу джазыуугъуз (аккаунтугъуз) энди бармыды? $1.',
-'gotaccountlink' => 'Ð\9aиÑ\80иÑ\83',
+'gotaccountlink' => 'СиÑ\81Ñ\82емагÑ\8aа ÐºÐ¸Ñ\80',
 'userlogin-resetlink' => 'Кирир ючюн билгилеригизни унутхан этгенмисиз?',
 'userlogin-resetpassword-link' => 'Паролну джибериу',
 'helplogin-url' => 'Help:Кириу',
@@ -565,7 +567,7 @@ $2',
 'badretype' => 'Джазгъан паролларыгъыз бир-бирине келишмейдиле.',
 'userexists' => 'Джазылгъан ат хайырландырылады.
 Башха ат сайлагъыз.',
-'loginerror' => 'Кириу хата',
+'loginerror' => 'Кириуде халат',
 'createacct-error' => 'Тергеу джазыу къурауда халат',
 'createaccounterror' => 'Быллай тергеу джазыу (аккаунт) къураргъа болмайды: $1',
 'nocookiesnew' => 'Къошлуучу регистрацияны ётгенди, алай кирмегенди. {{SITENAME}} къошулуучуланы таныр ючюн «cookies»-ни хайырландырады. Сиз «cookies»-ни эркин этмегенсиз. «Cookies»-ни эркин этигиза да, андан сора джангы атыгъыз эм паролюгъуз бла киригиз.',
@@ -586,7 +588,7 @@ $2',
 'passwordtooshort' => '$1 {{PLURAL:$1|символдан}} аз болмазгъа керекди пароль.',
 'password-name-match' => 'Пароль къошулуучу атдан башха тюрлю болургъа керекди.',
 'password-login-forbidden' => 'Бу къошулуучу ат бла паролну хайырландыргъан джарамайды.',
-'mailmypassword' => 'Ð\9cеннге e-mail Ð±Ð»Ð° Ð´Ð¶Ð°Ð½Ð³Ñ\8b Ð¿Ð°Ñ\80олÑ\8c джибер',
+'mailmypassword' => 'Ð\9fаÑ\80олнÑ\83 джибер',
 'passwordremindertitle' => '{{SITENAME}}  къошулуучугъа джангы болджаллы пароль',
 'passwordremindertext' => 'Ким эседа (сиз болургъа боллукъсуз, IP-адрес: $1) {{SITENAME}} ($4) къошулуучугъа джангы пароль къураргъа соргъанды. $2 къошулуучугъа джангы пароль: $3. Сорууну джиберген сиз болгъан эсегиз, системагъа кирирге эм паролну алышдырыргъа тыйычлыды. Джангы паролну $5 {{PLURAL:$5|кюнню}} ичинде амалы боллукъду.
 
@@ -748,7 +750,7 @@ $2',
 'nosuchsectiontext' => 'Сиз болмагъан бетни тюрлендирирге кюрешесиз.
 Бу бетге къарагъан заманыгъызда, кетерилирге неда башха джерге кёчюрюлюрге боллукъду.',
 'loginreqtitle' => 'Кирирге керекди',
-'loginreqlink' => 'Ð\9aириу',
+'loginreqlink' => 'кириу',
 'loginreqpagetext' => 'Сиз башха бетлеге къарар ючюн $1 керексиз.',
 'accmailtitle' => 'Пароль джиберилди',
 'accmailtext' => "[[User talk:$1|$1]] къошулуучугъа къуралгъан пароль $2 адресине джиберилгенди.
@@ -834,12 +836,12 @@ $2',
 'cascadeprotectedwarning' => "'''Эсгертиу:''' Бу бетни къуру Администраторла къауумдагъы къошулуучула тюрлендирирге боллукъду. Каскад джакълау {{PLURAL:$1|1=бетде|бетде}} хайырланнганы себебли:",
 'titleprotectedwarning' => "'''Эсгертиу: Бу бет джакъланыбды. Джангыз [[Special:ListGroupRights|энчи хакълары]] болгъанла текстни салыргъа боллукъдула.'''
 Тюбюнде, билги ючюн журналдан ахыр джазыу берилгенди:",
-'templatesused' => 'Бу бетде хайырланылгъан {{PLURAL:$1|1=шаблон|шаблонла}}:',
+'templatesused' => 'Бу бетде хайырланылгъан {{PLURAL:$1|шаблон|шаблонла}}:',
 'templatesusedpreview' => 'Ал къаралыучу бетде хайырланнган {{PLURAL:$1|1=шаблон|шаблонла}}:',
 'templatesusedsection' => 'Бу бетде хайырланнган {{PLURAL:$1|1=шаблон|шаблонла}}:',
 'template-protected' => '(джакъланнган)',
 'template-semiprotected' => '(джарты джакъланыбды)',
-'hiddencategories' => 'Бу бет $1 {{PLURAL:$1|1=1 джашырылыннган категориягъа|$1 джашырылыннган категориялагъа}} киреди:',
+'hiddencategories' => 'Бу бет $1 {{PLURAL:$1|1 джашырылгъан категориягъа|$1 джашырылгъан категориягъа}} киреди:',
 'edittools' => '<!-- Былайда орналгъан текст тюрлениу эмда джюклениу формада кёрюннюкдю. -->',
 'nocreatetext' => 'Бу сайтда джангы бет къуралыу тыйылгъанды.
 Ызына къайтыб болгъан бетни тюрлендирирге боллукъсуз, [[Special:UserLogin|системагъа кесигизни танытыргъа неда джангы тергеу джазыу (аккаунт) къураргъа]].',
@@ -930,8 +932,8 @@ $3 джанындан берилген сылтау: ''$2''",
 'histlegend' => "Ангылатыула: '''({{int:cur}})''' — бусагъатдагъы версиядан башхалыгъы, '''({{int:last}})''' — алдагъы версиядан башхалыгъы; '''({{int:last}})''' — гитче тюрлениу",
 'history-fieldset-title' => 'Тарихине къара',
 'history-show-deleted' => 'Къуру кетерилгенле',
-'histfirst' => 'Эм эски',
-'histlast' => 'Эм джангы',
+'histfirst' => 'эм эскиле',
+'histlast' => 'эм джангыла',
 'historysize' => '($1 {{PLURAL:$1|1=байт|байт}})',
 'historyempty' => '(бош)',
 
@@ -1078,7 +1080,7 @@ $1",
 'compareselectedversions' => 'Сайланнган версияланы тенглешдириу',
 'showhideselectedversions' => 'Сайланнган версияланы кёргюз/джашыр',
 'editundo' => 'ызына алыу',
-'diff-multi' => '({{PLURAL:$2|1=Бир къошулуучу|$2 къошулуучу}} этген {{PLURAL:$1|1=$1 аралыкъ тюрлениу|$1 аралыкъ тюрлениу}} кёргюзюлмегенди)',
+'diff-multi' => '({{PLURAL:$2|Бир къошулуучу|$2 къошулуучу}} этген {{PLURAL:$1|Бир аралыкъ тюрлениу|$1 аралыкъ тюрлениу}} кёргюзюлмегенди)',
 'diff-multi-manyusers' => '($2 къошулуучудан кёб {{PLURAL:$2|1=Бир къошулуучу|къошулуучу}} этген {{PLURAL:$1|1=бир аралыкъ тюрлениу|$1 аралыкъ тюрлениу}} кёргюзюлмегенди)',
 'difference-missing-revision' => 'Бу тенглешдириу ($1) ючюн {{PLURAL:$2|1=$2 версия}} {{PLURAL:$2|табылмады}}.
 
@@ -1095,8 +1097,8 @@ $1",
 'notextmatches' => 'Бетлени текстлеринде бирчалыкъ джокъду',
 'prevn' => 'алдагъы {{PLURAL:$1|$1}}',
 'nextn' => 'эндиги {{PLURAL:$1|$1}}',
-'prevn-title' => 'Алдагъы $1 {{PLURAL:$1|1=эсеб|эсеб}}',
-'nextn-title' => 'Ð\90Ñ\80Ñ\82дагÑ\8aÑ\8b $1 {{PLURAL:$1|1=эсеб|эсеб}}',
+'prevn-title' => 'Алдагъы $1 {{PLURAL:$1|эсеб|эсеб}}',
+'nextn-title' => 'Эндиги $1 {{PLURAL:$1|эсеб|эсеб}}',
 'shown-title' => 'Бетде $1 {{PLURAL:$1|джазыуну}} кёргюз',
 'viewprevnext' => 'Къара: ($1 {{int:pipe-separator}} $2) ($3)',
 'searchmenu-exists' => "'''Бу викиде «[[:$1]]» бет барды'''",
@@ -1111,7 +1113,7 @@ $1",
 'searchprofile-images-tooltip' => 'Файлланы изле',
 'searchprofile-everything-tooltip' => 'Бютеу бетледе изле (сюзюу бетледе да)',
 'searchprofile-advanced-tooltip' => 'Энчи ат аланладада изле',
-'search-result-size' => '$1 ({{PLURAL:$2|$2 сёз}})',
+'search-result-size' => '$1 ({{PLURAL:$2|1 сёз|$2 сёз}})',
 'search-result-category-size' => '{{PLURAL:$1|1=1 элемент|$1 элемент}} ({{PLURAL:$2|1=1 тюбкатегория|$2 тюбкатегория}}, {{PLURAL:$3|1=1 файл|$3 файл}})',
 'search-result-score' => 'Келишиулюк: $1%',
 'search-redirect' => '(Джиберилиниу $1)',
@@ -1169,7 +1171,6 @@ $1",
 'rows' => 'Тизгинле:',
 'columns' => 'Колонкала:',
 'searchresultshead' => 'Излеу',
-'resultsperpage' => 'Бетде кёргюзюллюк табылгъан джазыуланы саны:',
 'stub-threshold' => '<a href="#" class="stub">Стаблагъа джибериуню</a> формат этер ючюн марда (байтлада):',
 'stub-threshold-disabled' => 'Джукъланыбды',
 'recentchangesdays' => 'Ахыр тюрлениуледе кёргюзюллюк кюнле:',
@@ -1409,7 +1410,7 @@ $1 {{PLURAL:$1|1=символдан|символладан}} кеб болург
 'action-sendemail' => 'E-mail джибериу',
 
 # Recent changes
-'nchanges' => '$1 {{PLURAL:$1|1=тюрлениу|тюрлениу}}',
+'nchanges' => '$1 {{PLURAL:$1|тюрлениу|тюрлениу}}',
 'recentchanges' => 'Ахыр тюрлениуле',
 'recentchanges-legend' => 'Ахыр тюрлениулени джарашдырыулары',
 'recentchanges-summary' => 'Тюбюнде, Википедияда этилген ахыр тюрлениуле хронология бла тизилиб турадыла.',
@@ -1418,12 +1419,13 @@ $1 {{PLURAL:$1|1=символдан|символладан}} кеб болург
 'recentchanges-label-minor' => 'Бу гитче тюрлениудю',
 'recentchanges-label-bot' => 'Бу тюрлендириуню бот этгенди',
 'recentchanges-label-unpatrolled' => 'Бу тюрлендириу алкъын патруль этилинмегенди',
-'recentchanges-legend-newpage' => '$1 — джангы бет',
+'recentchanges-label-plusminus' => 'Бетни ёлчеми быллай бир байтха тюрленнгенди',
+'recentchanges-legend-newpage' => '(къарагъыз: [[Special:NewPages|джангы бетлени тизмеси]])',
 'rcnotefrom' => 'Тюбюрекде <strong>$2</strong> башлаб (<strong>$1</strong> дери) тюрлендириуле кёрюнедиле',
 'rclistfrom' => '$1 башлаб джангы тюрлениулени кёргюз',
 'rcshowhideminor' => 'гитче тюрлендириулени $1',
 'rcshowhidebots' => 'ботланы $1',
-'rcshowhideliu' => 'кирген къошулуучуланы $1',
+'rcshowhideliu' => '$1 системагъа кирген къошулуучу',
 'rcshowhideanons' => 'анонимлени $1',
 'rcshowhidepatr' => '$1 патруль этилиннген тюрлендириуле',
 'rcshowhidemine' => 'кесими тюрлендириулерими $1',
@@ -1441,14 +1443,14 @@ $1 {{PLURAL:$1|1=символдан|символладан}} кеб болург
 'rc-change-size' => '$1',
 'rc-change-size-new' => 'Тюрлениуден сора ёлчеми: $1 {{PLURAL:$1|байт}}',
 'newsectionsummary' => '/* $1 */ Джангы бёлюм',
-'rc-enhanced-expand' => 'Ð\9aÑ\8aоÑ\88акÑ\8aланÑ\8b ÐºÑ\91Ñ\80гÑ\8eз (JavaScript Ñ\85айÑ\8bÑ\80ланадÑ\8b)',
+'rc-enhanced-expand' => 'ТолÑ\83Ñ\81Ñ\83 Ð±Ð»Ð° ÐºÑ\91Ñ\80гÑ\8eз',
 'rc-enhanced-hide' => 'Къошакъланы джашыр',
 'rc-old-title' => 'биринчи «$1» деб къуралгъан',
 
 # Recent changes linked
 'recentchangeslinked' => 'Байламлы тюрлениуле',
-'recentchangeslinked-feed' => 'Ð\91айламлÑ\8b Ñ\82Ñ\8eÑ\80лендиÑ\80иÑ\83ле',
-'recentchangeslinked-toolbox' => 'Байламлы тюрлендириуле',
+'recentchangeslinked-feed' => 'Байламлы тюрлениуле',
+'recentchangeslinked-toolbox' => 'Байлам тюрлениуле',
 'recentchangeslinked-title' => '$1 бет бла байламлы тюрлендириуле',
 'recentchangeslinked-summary' => "Белгиленнген бет (неда белгиленнген категориягъа киргенле) джиберген бетледе джангы тюрлениулени тизмеси.
 [[Special:Watchlist|Кёзде тургъан тизмеге]] кирген бетле '''чертилибдиле'''.",
@@ -1819,10 +1821,10 @@ URL-ни тюз , сайтны ачыкъ болгъанына ишексиз б
 'fewestrevisions' => 'Эм аз версиясы болгъан бетле',
 
 # Miscellaneous special pages
-'nbytes' => '$1 {{PLURAL:$1|байт}}',
+'nbytes' => '$1 {{PLURAL:$1|байт|байт}}',
 'ncategories' => '$1 {{PLURAL:$1|1=категория|категорияла}}',
 'nlinks' => '$1 {{PLURAL:$1|1=джибериу|джибериу}}',
-'nmembers' => '$1 {{PLURAL:$1|объект}}',
+'nmembers' => '$1 {{PLURAL:$1|объект|объект}}',
 'nrevisions' => '$1 {{PLURAL:$1|1=версия|версия}}',
 'nviews' => '$1 {{PLURAL:$1|1=къарау|къарау}}',
 'nimagelinks' => '$1 {{PLURAL:$1|1=бетде|бетде}} хайырланады',
@@ -1876,8 +1878,8 @@ URL-ни тюз , сайтны ачыкъ болгъанына ишексиз б
 'notargettext' => 'Бу функцияны ишлетир ючюн нюзюр бетни неда къошулуучуну белгилемегенсиз.',
 'nopagetitle' => 'Быллай нюзюр бет джокъду',
 'nopagetext' => 'Белгиленнген нюзюр бет джокъду.',
-'pager-newer-n' => '{{PLURAL:$1|1=1 джангыракъ|$1 джангыракъ}}',
-'pager-older-n' => '{{PLURAL:$1|1=1 эскирек|$1 эскирек}}',
+'pager-newer-n' => '{{PLURAL:$1|1 джангыракъ|$1 джангыракъ}}',
+'pager-older-n' => '{{PLURAL:$1|1 эскирек|$1 эскирек}}',
 'suppress' => 'Джашырыу',
 
 # Book sources
@@ -2014,7 +2016,7 @@ URL-ни тюз , сайтны ачыкъ болгъанына ишексиз б
 'usermessage-editor' => 'Система билдириучю',
 
 # Watchlist
-'watchlist' => 'Кёзюмде тургъан тизмем',
+'watchlist' => 'Кёздеги тизме',
 'mywatchlist' => 'Кёздеги тизме',
 'watchlistfor2' => '$1 ючюн $2',
 'nowatchlist' => 'Кёзюгюзде тургъан тизмегиз бошду.',
@@ -2032,7 +2034,7 @@ URL-ни тюз , сайтны ачыкъ болгъанына ишексиз б
 'unwatchthispage' => 'Кёзде тутууну тохтат',
 'notanarticle' => 'Статья тюлдю',
 'notvisiblerev' => 'Версия кетерилгенди',
-'watchlist-details' => 'Кёзюгюзде тургъан тизмегизде, сюзюу бетлери саналмай {{PLURAL:$1|1=$1 бет|$1 бет}} барды.',
+'watchlist-details' => 'Кёздеги тизмегизде сюзюу бетлери саналмай {{PLURAL:$1|бет|бет}} барды.',
 'wlheader-enotif' => 'Эл. почта бла хапар бериу джандырылыбды.',
 'wlheader-showupdated' => "Ахыр кириуюгюзден сора бетни тюрлениулери '''къалын''' джазыу бла кёргюзюлгенди.",
 'watchmethod-recent' => 'кёзде тургъан бетледе этилген ахыр тюрлениуле кёрюу',
@@ -2255,12 +2257,12 @@ $1',
 'blanknamespace' => '(Баш)',
 
 # Contributions
-'contributions' => 'Къошулуучуну къошханы',
+'contributions' => '{{GENDER:$1|Къошулуучуну}} къошуму',
 'contributions-title' => '$1 къошулуучуну къошагъы',
 'mycontris' => 'Къошум',
-'contribsub2' => '$1 ($2) къошакъ',
+'contribsub2' => '{{GENDER:$3|$1}} къошуму ($2)',
 'nocontribs' => 'Бу критерийлеге келишген тюрлениуле табылмадыла',
-'uctop' => '(аÑ\85Ñ\8bÑ\80гъы)',
+'uctop' => '(бÑ\83Ñ\81агÑ\8aаÑ\82дагъы)',
 'month' => 'Айдан башлаб (эм алгъаракъ):',
 'year' => 'Джылдан башлаб (эм алгъаракъ):',
 
@@ -2282,7 +2284,7 @@ $1',
 'sp-contributions-submit' => 'Таб',
 
 # What links here
-'whatlinkshere' => 'Былайгъа джибериуле',
+'whatlinkshere' => 'Бетге джибериуле',
 'whatlinkshere-title' => '«$1» бетге джиберген бетле',
 'whatlinkshere-page' => 'Бет:',
 'linkshere' => "'''[[:$1]]''' битге джиберген бетле:",
@@ -2291,8 +2293,8 @@ $1',
 'isredirect' => 'джибериу бет',
 'istemplate' => 'къошуу',
 'isimage' => 'файлгъа джибериу',
-'whatlinkshere-prev' => '{{PLURAL:$1|1=алдагъы|алдагъы $1}}',
-'whatlinkshere-next' => '{{PLURAL:$1|1=эндиги|эндиги $1}}',
+'whatlinkshere-prev' => '{{PLURAL:$1|алдагъы|алдагъы $1}}',
+'whatlinkshere-next' => '{{PLURAL:$1|эндиги|эндиги $1}}',
 'whatlinkshere-links' => '← джибериуле',
 'whatlinkshere-hideredirs' => 'джибериуле $1',
 'whatlinkshere-hidetrans' => 'Къошулуулары $1',
@@ -2783,7 +2785,7 @@ $1',
 'file-info-size' => '$1 × $2 пиксель, файлны ёлчеми: $3, MIME типи: $4',
 'file-nohires' => 'Мындан ары ачыкъланнган версиясы джокъду',
 'svg-long-desc' => 'SVG файл, шартлы $1 × $2 пиксель, файлны ёлчеми: $3',
-'show-big-image' => 'ТолÑ\83 Ð°Ñ\87Ñ\8bкÑ\8aлаÑ\83',
+'show-big-image' => 'ЧÑ\8bкÑ\8aгÑ\8aан Ñ\84айл',
 'show-big-image-preview' => 'Ал къарауда уллулугъу: $1.',
 'show-big-image-size' => '$1 × $2 пиксель',
 'file-info-gif-looped' => 'тогъайланнганды',
@@ -3442,7 +3444,7 @@ $5
 # Special:Version
 'version' => 'Версия',
 'version-extensions' => 'Салыннган кенгертиуле',
-'version-specialpages' => 'Къуллукъчу бетле',
+'version-specialpages' => 'Къуллукъ бетле',
 'version-parserhooks' => 'Синтаксис анализаторну тутуучула',
 'version-variables' => 'Тюрленнгенле',
 'version-antispam' => 'Антиспам',
@@ -3482,13 +3484,13 @@ MediaWiki хайырлы боллукъду деген умут бла джай
 'fileduplicatesearch-noresults' => '«$1» деген файл табылмады.',
 
 # Special:SpecialPages
-'specialpages' => 'Къуллукъчу бетле',
+'specialpages' => 'Къуллукъ бетле',
 'specialpages-note' => '* Тюз къуллукъчу бетле.
 * <span class="mw-specialpagerestricted">Кирирге эркинлик чекленнген къуллукъчу бетле.</span>
 * <span class="mw-specialpagecached">Кэш этилген къуллукъчу бетле (эски болургъа боллукъдула).</span>',
 'specialpages-group-maintenance' => 'Техника баджарыуну отчетлары',
 'specialpages-group-other' => 'Башха къуллукъчу бетле',
-'specialpages-group-login' => 'Ð\9aиÑ\80 / Ñ\80егиÑ\81Ñ\82Ñ\80аÑ\86иÑ\8f Ñ\8dÑ\82',
+'specialpages-group-login' => 'СиÑ\81Ñ\82емагÑ\8aа ÐºÐ¸Ñ\80иÑ\83 / Ð\90ккаÑ\83нÑ\82 ÐºÑ\8aÑ\83Ñ\80аÑ\83',
 'specialpages-group-changes' => 'Ахыр тюрлендириуле бла журналла',
 'specialpages-group-media' => 'Медиа-материалланы юсюнден отчетла бла джюклеуле',
 'specialpages-group-users' => 'Къошулуучула эм хакълары',
index 2f92588..99b17cc 100644 (file)
@@ -438,7 +438,7 @@ $messages = array(
 'viewtalkpage' => 'Klaaf aanluure',
 'otherlanguages' => 'En ander Schprooche',
 'redirectedfrom' => '(Ömjeleit vun $1)',
-'redirectpagesub' => 'Ömleitungssigg',
+'redirectpagesub' => 'Ömleidongssigg',
 'lastmodifiedat' => 'Heh di Sigg es et letz aam $1 öm $2 Uhr jeändert woode.',
 'viewcount' => 'De Sigg es bes jetz {{PLURAL:$1|eimol|$1 Mol|keijmol}} avjerofe woode.',
 'protectedpage' => 'Jeschötzte Sigg',
@@ -627,6 +627,7 @@ Dä Wiki_Köbes dovun hät beim Deeschmaache als Jrond aanjejovve: „$3“',
 'invalidtitle-unknownnamespace' => '„$2“ es ene onjöltijje Tittel för e Appachtemang met dä verkehte Nommer $1.',
 'exception-nologin' => 'Nit enjelogg',
 'exception-nologin-text' => 'Heh di Sigg udder heh dä Opdraach jeiht blooß, wann De heh em Wiki enjelogg bes.',
+'exception-nologin-text-manual' => 'De mööds ald $1, öm heh di Sigg udder di Axjuhn zohjriife ze dörve.',
 
 # Virus scanner
 'virus-badscanner' => "Fääler en de Enstellunge: Dat Projramm ''$1'' fö noh Kompjuterwiere ze söke, dat kenne mer nit.",
@@ -1399,7 +1400,7 @@ Mieh doh drövver fengk mer em [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAG
 'search-nonefound' => 'Mer han nix zopaß jefonge för Ding Aanfrohch.',
 'powersearch-legend' => 'Extra Söhke',
 'powersearch-ns' => 'Söök en de Apachtemangs:',
-'powersearch-redir' => 'Ömleidunge aanzeije',
+'powersearch-redir' => 'Ömleidonge aanzeije',
 'powersearch-togglelabel' => '&nbsp;',
 'powersearch-toggleall' => 'Övverall Höhksche draan maache',
 'powersearch-togglenone' => 'All Höhksche fott nämme',
@@ -1447,7 +1448,6 @@ dat dänne ehr Daate topaktoell sin,
 'rows' => 'Reihe:',
 'columns' => 'Spalte:',
 'searchresultshead' => 'Beim Söhke',
-'resultsperpage' => 'Zeich Treffer pro Sigg:',
 'stub-threshold' => 'Links passend för <a href="#" class="stub">klein Sigge</a> fomateere av esu vill Bytes:',
 'stub-threshold-disabled' => 'Ußjeschalldt',
 'recentchangesdays' => 'Aanzahl Dage en de Liss met de „Neuste Änderunge“ — als Standad:',
@@ -1587,7 +1587,7 @@ dat dänne ehr Daate topaktoell sin,
 'right-move-subpages' => 'Sigge, un ier Ungersigge, zosamme ömnenne',
 'right-move-rootuserpages' => '(Houp)-Metmaacher-Sigg Ömnänne',
 'right-movefile' => 'Dateie ömnenne',
-'right-suppressredirect' => 'Kein automatesche Ömleidung aanlääje beim Ömnenne',
+'right-suppressredirect' => 'Kein automatesche Ömleidong aanlääje beim Ömnenne',
 'right-upload' => 'Dateie huhlade',
 'right-reupload' => 'En Datei ußtuusche, di ussem Wiki kütt',
 'right-reupload-own' => 'En selvs huhjelade Datei ußtuusche',
@@ -1617,6 +1617,7 @@ dat dänne ehr Daate topaktoell sin,
 'right-unblockself' => 'Retuur nämme, wam_mer sellver jesperrt woode es',
 'right-protect' => 'Sigge schöze, jeschözde Sigge änndere, un der iere Schoz widder ophevve',
 'right-editprotected' => 'Sigge ändere, di met „{{int:protect-level-sysop}}“ jezöz sin',
+'right-editsemiprotected' => 'Sigge met däm Schoz „{{int:protect-level-autoconfirmed}}“ ändere',
 'right-editinterface' => 'Sigge met de Texte ändere, die et Wiki kallt',
 'right-editusercssjs' => 'Anderlücks CSS- un JS-Dateie ändere',
 'right-editusercss' => 'Anderlücks CSS-Dateie ändere',
@@ -1624,6 +1625,7 @@ dat dänne ehr Daate topaktoell sin,
 'right-editmyusercss' => 'De eije <i lang="en" xml:lang="en">CSS</i> Datteije aanlääje un ändere',
 'right-editmyuserjs' => 'Eije JaavaSkrepp-Datteije aanlääje un ändere',
 'right-viewmywatchlist' => 'De eije Oppaßleß beloore',
+'right-editmywatchlist' => 'De eije Oppaßleß ändere. Opjepaß: e paa axjuhne donn Sigge en di Liss-eren, och der ohne dat Rääsch.',
 'right-viewmyprivateinfo' => 'ding eije päsöhnlesche Dahte belohre, wi de Adräß för de <i lang="en" xml:lang="en">e-mail</i> udder Dinge ääschte Nahme',
 'right-editmyprivateinfo' => 'ding eije päsöhnlesche Dahte ändere, wi de Adräß för de <i lang="en" xml:lang="en">e-mail</i> udder der ääschte Nahme',
 'right-editmyoptions' => 'De eije Enschtällonge ändere',
@@ -1707,7 +1709,9 @@ dat dänne ehr Daate topaktoell sin,
 'recentchanges-label-bot' => 'Di Änderung es fun enem Bot jemaat woode',
 'recentchanges-label-unpatrolled' => 'Heh di Änderung es noch nit nohjeloort',
 'recentchanges-label-plusminus' => 'Der Ömvang vun dä Sigg hät sesch öm di Aanzahl Bytes verändert.',
+'recentchanges-legend-heading' => "'''Lejänd:'''",
 'recentchanges-legend-newpage' => '(Loor och noh de [[Special:NewPages|Leß met de neue Sigge]])',
+'recentchanges-legend-plusminus' => "(''±123'')",
 'rcnotefrom' => 'Hee {{PLURAL:$1|es ein|sin bes op <strong>$1</strong>|es keine}} fun de Änderunge zick dem <strong>$3</strong> öm <strong>$4</strong> Uhr opjelėß.',
 'rclistfrom' => 'Zeich de Änderunge vum $1 aan',
 'rcshowhideminor' => '$1 klein Mini-Änderunge',
@@ -2138,13 +2142,14 @@ wääde, un luur Der der iehr ander Links aan!',
 
 # Random page in category
 'randomincategory' => 'En zohfälleje Sigg us ener Saachjropp',
+'randomincategory-invalidcategory' => '„$1“ es keine jölteje Nahme för en Saachjropp.',
 'randomincategory-nopages' => 'et sinn er kein Sigge en dä Saachjropp [[:Category:$1|$1]] dren.',
 'randomincategory-selectcategory' => 'Holl en zohfälleje Sigg us dä Saachjropp: $1 $2.',
 'randomincategory-selectcategory-submit' => 'Lohß Jonn!',
 
 # Random redirect
 'randomredirect' => 'Zofällije Ömleitung',
-'randomredirect-nopages' => 'En däm Appachtemang „$1“ sin ja kein Ömleidunge dren.',
+'randomredirect-nopages' => 'En däm Appachtemang „$1“ sin ja kein Ömleidonge dren.',
 
 # Statistics
 'statistics' => 'Schtatistike',
@@ -2180,8 +2185,8 @@ zweite Ömleitung hin jeiht. För jewöhnlich es dat dann och de richtije Sigg,
 <del>Ußjeshtreshe</del> Reije sin ald äleedesh.
 Met däm „(Ändere)“-Link kanns De de eetste Sigg tirek aanpacke.
 Tipp: Merk Der dä Tittel vun dä Sigg dovör.',
-'double-redirect-fixed-move' => 'dubbel Ömleidung nohm Ömnenne automattesch opjelös: [[$1]] → [[$2]]',
-'double-redirect-fixed-maintenance' => 'De dubbelte Ömleidung vun [[$1]] noh [[$2]] wood opjelühß.',
+'double-redirect-fixed-move' => 'dubbel Ömleidong nohm Ömnenne automattesch opjelös: [[$1]] → [[$2]]',
+'double-redirect-fixed-maintenance' => 'De dubbelte Ömleidong vun [[$1]] noh [[$2]] wood opjelühß.',
 'double-redirect-fixer' => '(Opjaveleß)',
 
 'brokenredirects' => 'Ömleitunge, die en et Leere jonn',
@@ -2244,12 +2249,14 @@ Di sin dann <del>dorschjeschtresche</del>.',
 'protectedpages' => 'Jeschötzte Sigge',
 'protectedpages-indef' => 'Nor de Sigge zeije, woh alleins de Wiki-Köbesse draan dörrve',
 'protectedpages-cascade' => 'Nur Sigge en ener Schotz-Kaskad',
+'protectedpages-noredirect' => 'Ömleidonge verschteische',
 'protectedpagesempty' => 'Op di Aat sin jrad kein Sigge jeschötz.',
 'protectedtitles' => 'Verbodde Titele för Sigge',
 'protectedtitlesempty' => 'Op di Aat sin jrad kein Sigge jäje et neu Aanlääje jeschötz.',
 'listusers' => 'De Metmaacherleß',
 'listusers-editsonly' => 'Donn nor Metmaacher zeije, di och ens jät jeschrevve han.',
 'listusers-creationsort' => 'Noh em Dattum vum Aanmellde zoteere',
+'listusers-desc' => 'Vun onge noch bove zoteere',
 'usereditcount' => '{{PLURAL:$1|Ein Änderung|$1 Änderunge|Nix jedonn}}',
 'usercreated' => '{{GENDER:$3|}}Aanjemelldt aam $1 öm $2 Uhr',
 'newpages' => 'Neu Sigge',
@@ -2316,7 +2323,7 @@ Bei de Name moß mer op Jruß- un Kleinschreff aachjävve.",
 'allpagesbadtitle' => 'Dä Siggename es nit ze jebruche. Dä hät e Köözel för en Sproch oder för ne Interwiki Link am Aanfang, oder et kütt e Zeiche dren för, wat en Siggename nit jeiht, villeich och mieh wie
 eins vun all däm op eimol.',
 'allpages-bad-ns' => "Dat Appachtemeng „$1“ ha'mer nit.",
-'allpages-hide-redirects' => 'Ömleidunge fott lohße',
+'allpages-hide-redirects' => 'Ömleidonge fott lohße',
 
 # SpecialCachedPage
 'cachedspecial-viewing-cached-ttl' => 'Dat heh küdd ussem Zewescheschpeischer un kann bes op $1 alt sin.',
@@ -2723,13 +2730,13 @@ De neuste Sperr ier Enndraach em Logbooch es:',
 'linkshere' => 'Dat sin de Sigge, die op <strong>„[[:$1]]“</strong> linke dun:',
 'nolinkshere' => 'Kein Sigg link noh <strong>„[[:$1]]“</strong>.',
 'nolinkshere-ns' => 'Nix link op <strong>„[[:$1]]“</strong> en dämm Appachtemang.',
-'isredirect' => 'Ömleidungssigg',
+'isredirect' => 'Ömleidongssigg',
 'istemplate' => 'weed enjeföch',
 'isimage' => 'weed aanjezeisch',
 'whatlinkshere-prev' => 'de vörijje {{PLURAL:$1||$1|noll}} zeije',
 'whatlinkshere-next' => 'de nächste {{PLURAL:$1||$1|noll}} zeije',
 'whatlinkshere-links' => '← Links',
-'whatlinkshere-hideredirs' => '$1 de Ömleidunge',
+'whatlinkshere-hideredirs' => '$1 de Ömleidonge',
 'whatlinkshere-hidetrans' => '$1 de Oproofe',
 'whatlinkshere-hidelinks' => '$1 de nommale Links',
 'whatlinkshere-hideimages' => '$1 de Links op Dateie',
@@ -2901,19 +2908,19 @@ Wat beim Ömnenne erus kütt, künnt en opfällije un villeisch stüürende Änd
 Alsu bes secher, dat De verschteihs, wat De heh am maache bes, ih dat De et mähs!",
 'movepagetext-noredirectfixer' => "Heh kanns De en Sigg ömnenne.
 Domet kritt die Sigg ene neue Name, un all vörherije Versione vun dä Sigg och.
-Unger däm ahle Tittel weed automatisch en Ömleitung op dä neue Tittel enjedrage.
+Onger däm ahle Tittel weed automatisch en Ömleidong op dä neue Tittel enjedrare.
 
-Links op dä ahle Tittel blieve ävver, wie se wore.
-Dat heiß, Do muss selver nohluure, ov do jetz [[Special:DoubleRedirects|dubbelde]] oder [[Special:BrokenRedirects|kapodde Ömleidunge]] bei eruskumme.
-Wann De en Sigg ömnenne deis, häs Do och doför ze sorje, dat de betroffe Links do henjonn, wo se hen jonn solle.
-Alsu holl Der de Liss „Wat noh heh link“ fun dä Sigg heh un jangk se durch!
+Lenks op dä ahle Tittel bliive ävver, wie se wohre.
+Dat heiß, Do moß selver nohloore, ov doh jetz [[Special:DoubleRedirects|dubbelde]] oder [[Special:BrokenRedirects|kapodde Ömleidonge]] bei eruskumme.
+Wann De en Sigg ömnenne deiß, häs Do och doför ze sorje, dat de betroffe Links doh henjonn, wo se hen jonn solle.
+Alsu holl Der di Liss „Wat noh heh link“ fun dä Sigg heh un jangk se dorsch!
 
-De Sigg weed '''nit''' ömjenannt, wann et met däm neue Tittel ald en Sigg jitt, '''ußer''' do es nix drop, oder et es en Ömleitung un se es noch nie jeändert woode.
-Esu kam_mer en Sigg jlich widder retuur ömnenne, wam_mer sich mem Ömnenne verdonn hät, un mer kann och kein Sigge kapottmaache, wo ald jet drop steiht.
+Di Sigg weed '''nit''' ömjenannt, wann et met däm neue Tittel ald en Sigg jitt, '''ußer''' doh es nix drop, oder et es en Ömleidong un se es noch nie jeändert woode.
+Esu kam_mer en Sigg jlich widder retuur ömnänne, wam_mer sich mem Ömnänne verdonn hät, un mer kann och kein Sigge kapottmaache, wo ald jet drop schteiht.
 
-'''Oppjepass!'''
-Wat beim Ömnenne erus kütt, künnt en opfällije un villeich stürende Änderung aam Wiki sin, besönders bei öff jebruchte Sigge.
-Alsu bes secher, dat De versteihs, wat De heh am maache bes, ih dat De et mähs!",
+'''Oppjepaß!'''
+Wat beim Ömnänne erus kütt, künnt en opfällije un villeich stührende Änderung aam Wikki sin, besönders bei öff jebruchte Sigge.
+Alsu bes secher, dat De verschteihs, wat De heh am maache bes, ih dat De et mähs!",
 'movepagetalktext' => "Dä Sigg ehr Klaafsigg, wann se ein hät, weed automatisch met  ömjenannt, '''usser''' wann:
 * de Sigg en en ander Appachtemeng kütt,
 * en Klaafsigg met däm neue Name ald do es, un et steiht och jet drop,
@@ -2931,8 +2938,8 @@ En dänne Fäll, muss De Der dä Enhald vun dä Klaafsigge selvs vörnemme, un e
 'movepagebtn' => 'Ömnenne',
 'pagemovedsub' => 'Dat Ömnenne hät jeflupp',
 'movepage-moved' => "'''De Sigg „$1“ es jez en „$2“ ömjenannt.'''",
-'movepage-moved-redirect' => 'En Ömleidung es aanjelaat woode.',
-'movepage-moved-noredirect' => 'Kein Ömleidung woodt aanjelaat.',
+'movepage-moved-redirect' => 'En Ömleidong es aanjelaat woode.',
+'movepage-moved-noredirect' => 'Kein Ömleidong woodt aanjelaat.',
 'articleexists' => "De Sigg met däm Name jitt et ald, oder dä Name ka'mer oder darf mer nit bruche.<br />Do muss Der ene andere Name ussöke.",
 'cantmove-titleprotected' => 'Die Sigg ömzenänne es esu nit möjjelesch, dänn dä neu Name vun dä Sigg es jäje et Neu-Aanlääje jeschötz.',
 'movetalk' => 'dä ehr Klaafsigg met ömnenne, wat et jeiht',
@@ -2967,8 +2974,8 @@ Di Sigg „[[:$1]]“ jitt et ald. Wollts De se fottschmieße, öm heh di Sigg 
 'nonfile-cannot-move-to-file' => 'Mer kann nix uußer Datteije esu ömnänne, dat et em Appachtemang „{{ns:file}}“ landt',
 'imagetypemismatch' => 'De neu Datei-Endong moß met däm Datei-Tüp zesamme passe',
 'imageinvalidfilename' => 'Dä Ziel-Name för de Datei es verkeht',
-'fix-double-redirects' => 'Don noh em Ömnenne de Ömleidunge automattesch ändere, di noch op dä ahle Tittel zeije, also de neu entshtande dubbelte Ömleidunge oplöse.',
-'move-leave-redirect' => 'Donn en Ömleidung doför ennreschte',
+'fix-double-redirects' => 'Don noh em Ömnenne de Ömleidonge automattesch ändere, di noch op dä ahle Tittel zeije, also de neu entshtande dubbelte Ömleidonge oplöse.',
+'move-leave-redirect' => 'Donn en Ömleidong doför ennreschte',
 'protectedpagemovewarning' => "'''Opjepaß:''' Heh di Sigg es jespert su dat blooß de Wiki-Kööbeße se ömnänne künne.
 Heh kütt der neuste Enndrach em Logbooch doh drövver:",
 'semiprotectedpagemovewarning' => "'''Opjepaß:''' Heh di Sigg es jespert su dat blooß aanjemeldte Metmaacher se ömnänne künne.
@@ -3222,7 +3229,7 @@ Esu kam_mer noch en Aanmärkong en „{{int:summary}}“ maache.',
 'spam_reverting' => 'De letzte Version ohne de Links op „$1“ widder zerröckjehollt.',
 'spam_blanking' => 'All die Versione hatte Links op „$1“, die sin jetz erus jemaht.',
 'spam_deleting' => 'All di Versione met Lenks op „$1“ wääde fott jeschmeße',
-'simpleantispam-label' => 'SPAMschotz — donn hee nix endraare!',
+'simpleantispam-label' => 'Donn heh nix endraare!',
 
 # Info page
 'pageinfo-title' => 'Övver di Sigg: „$1“',
@@ -3931,6 +3938,8 @@ Wells Do jetz met en neu Version die Sigg widder neu aanläje?',
 'imgmultigoto' => 'Jang noh de Sigg „$1“',
 
 # Language selector for translatable SVGs
+'img-lang-default' => '(Schtandatt_Schprohch)',
+'img-lang-info' => 'Zeisch heh dat Beld aan en $1. $2',
 'img-lang-go' => 'Lohß Jonn!',
 
 # Table pager
@@ -4057,7 +4066,14 @@ Dä Shtanndat-Zoot-Schlößel „$1“ övverschriif dä älldere Zoot-Schlöße
 'version-hook-name' => 'De Schnettstelle ier Name',
 'version-hook-subscribedby' => 'Opjeroofe vun',
 'version-version' => '(Väsjohn $1)',
-'version-license' => 'Lėzänz',
+'version-license' => 'MediaWiki sing Lėzänz',
+'version-ext-license' => '‎Lėzänz',
+'version-ext-colheader-name' => 'Zohsazprojramm',
+'version-ext-colheader-version' => 'Väsjohn',
+'version-ext-colheader-license' => 'Lėzänz',
+'version-ext-colheader-description' => 'Beschrevve',
+'version-ext-colheader-credits' => 'Schriiver',
+'version-license-title' => '‎Lėzänz för $1',
 'version-poweredby-credits' => "Dat Wiki heh löp met '''[https://www.mediawiki.org/ MediaWiki]''', copyright © 2001–$1 $2.",
 'version-poweredby-others' => 'sönß wää',
 'version-poweredby-translators' => 'de Övversäzer em translatewiki.net',
@@ -4077,7 +4093,7 @@ Do sullts en [{{SERVER}}{{SCRIPTPATH}}/COPYING Kopie vun dä <i lang="en">GNU Ge
 'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath Der Pad noh de Skrepte]',
 
 # Special:Redirect
-'redirect' => 'Ömleite op en Dattei, ene Metmaacher udder de Väsjohn vun ener Sigg',
+'redirect' => 'Ömleide op en Dattei, ene Metmaacher udder de Väsjohn vun ener Sigg',
 'redirect-legend' => 'Ömleide ob_en Dattei udder Sigg',
 'redirect-summary' => 'Heh di {{int:specialpage}} leidt öm ob_en Dattei — doh mößd_Er ene Nahme aanjävve — udder en Sigg — doh mößd_Er en Kännong för en Väsjoh aanjävve — udder en Metmaachersigg — doh mößd_Er enem Metmaacher sing Kännong aanjävve.',
 'redirect-submit' => 'Lohß Jonn!',
@@ -4101,6 +4117,7 @@ Do sullts en [{{SERVER}}{{SCRIPTPATH}}/COPYING Kopie vun dä <i lang="en">GNU Ge
 
 # Special:SpecialPages
 'specialpages' => '{{int:nstab-special}}e',
+'specialpages-note-top' => 'Lejänd',
 'specialpages-note' => '* {{int:nstab-special}}e för jede Metmaacher.
 * <span class="mw-specialpagerestricted">{{int:nstab-special}}e för Metmaacher met besönder Räächde.</span>
 * <span class="mw-specialpagecached">Em Zwescheshpeisher jehallde {{int:nstab-special}}e. Di künnte ovverhollt sind.</span>',
@@ -4141,6 +4158,7 @@ Do sullts en [{{SERVER}}{{SCRIPTPATH}}/COPYING Kopie vun dä <i lang="en">GNU Ge
 'tags-tag' => 'Dä Makeerung iere Name',
 'tags-display-header' => 'Kennzeiche en de Leßte met Änderunge',
 'tags-description-header' => 'Bedüggtening',
+'tags-active-header' => 'Aktiiv?',
 'tags-hitcount-header' => 'Makeete Änderunge',
 'tags-active-yes' => 'Joh',
 'tags-active-no' => 'Näh',
@@ -4163,6 +4181,7 @@ Do sullts en [{{SERVER}}{{SCRIPTPATH}}/COPYING Kopie vun dä <i lang="en">GNU Ge
 'dberr-problems' => 'Deit uns leid, die Sigg heh häd för der Momang e teschnisch Problem.',
 'dberr-again' => 'Versök eijfach en e paa Menutte, norr_ens die Sigg afzeroofe.',
 'dberr-info' => '(Mer han kei Verbindung noh_m Datebank-ẞööver krijje künne: $1)',
+'dberr-info-hidden' => '(Mer han kei Verbindung noh_m Datebank-ẞööver krijje künne)',
 'dberr-usegoogle' => 'De künnß zweschedorsch ad met <i lang="en">Google</i> söke.',
 'dberr-outofdate' => 'Müjjelesch, dat dat Verzeichnes vun uns Sigge do nit janß om neuste Shtannd es.',
 'dberr-cachederror' => 'Wat heh noh kütt es en Kopi vum Zwescheshpeisher vun dä Sigg,
@@ -4336,10 +4355,12 @@ Derbei jehüüere enschtalleete Paaserfunxjuhne, alsu esu jät wi
 'expand_templates_input' => 'Wat De üvverpröfe wells:',
 'expand_templates_output' => 'Wat erus kütt es',
 'expand_templates_xml_output' => 'XML ußjevve',
+'expand_templates_html_output' => 'Röh HTML Ußjaav',
 'expand_templates_ok' => 'Lohß Jonn!',
 'expand_templates_remove_comments' => 'De ėnner Kommentare fottloohße',
 'expand_templates_remove_nowiki' => 'Donn de <nowiki>-Befähle ongerdröcke en dämm, wadd_eruß kütt',
 'expand_templates_generate_xml' => 'Och dä XML-Parser-Boum zeije',
+'expand_templates_generate_rawhtml' => 'Donn de Röh HTML Ußjaav aanzeije',
 'expand_templates_preview' => 'Vör-Aansich',
 
 );
index 1333393..ba2c0cc 100644 (file)
@@ -935,7 +935,6 @@ Titulus: '''({{int:cur}})''' = dissimilis ab emendatione novissima,
 'rows' => 'Lineae:',
 'columns' => 'Columnae:',
 'searchresultshead' => 'Figuratio eventorum investigationis',
-'resultsperpage' => 'Eventus per paginam:',
 'recentchangesdays' => 'Quot dies in nuper mutatis monstrandi:',
 'recentchangescount' => 'Quantum rerum in nuper mutatis, historiis et actis:',
 'savedprefs' => 'Praeferentiae tuae servatae sunt.',
@@ -2360,7 +2359,7 @@ Quaesumus, adfirma ut iterum hanc paginam crees.",
 'version-parser-function-hooks' => 'Extensiones functionum programmatis analysis lexicalis',
 'version-hook-name' => 'Nomen extensionis',
 'version-hook-subscribedby' => 'Subscriptum ab',
-'version-version' => '(Versio $1)',
+'version-version' => '($1)',
 'version-license' => 'Permissio',
 'version-software-product' => 'Productum',
 'version-software-version' => 'Versio',
index 3694171..c059edf 100644 (file)
@@ -189,9 +189,9 @@ $messages = array(
 'tog-newpageshidepatrolled' => 'Esconder las hojas surveyadas de la lista de las hojas muevas',
 'tog-extendwatchlist' => 'Anchar mi lista de akavidamiento afín de àmostrar todos los trocamientos, no sólo los muevos',
 'tog-usenewrc' => 'Agrupar kambios por pajinas en kambios resiente y lista',
-'tog-numberheadings' => 'Numerotar otomatika mente los títůlos de los kapítůlos',
-'tog-showtoolbar' => 'Àmostrar el chibuk de aparatos',
-'tog-editondblclick' => 'Trocar las pajinas con doble klik',
+'tog-numberheadings' => 'Numerotar otomatika mente los títolos de los kapítolos',
+'tog-showtoolbar' => 'Amostrar el chibuk de aparatos',
+'tog-editondblclick' => 'Trocar las hojas con doble klik',
 'tog-editsection' => 'Ofrir la possibilidad de trocar los kapítůlos con el atamiento [trocar]',
 'tog-editsectiononrightclick' => 'Pueder trocar los kapítůlos, en pizando el botón derecho del ratón encima el títůlo',
 'tog-showtoc' => 'Àmostrar el cuadro de contènidos (para las hojas que tienen más de 3 títůlos de capítůlo)',
@@ -199,13 +199,13 @@ $messages = array(
 'tog-watchcreations' => 'Anyadir lad pajinas ke kree i archivos ke karge a mi lista',
 'tog-watchdefault' => 'Anyadir pajinas i archivos ke edite a mi lista',
 'tog-watchmoves' => 'Anyadir pajinas i archivo ke move a mi lista',
-'tog-watchdeletion' => 'Akavidar las hojas que efasso',
+'tog-watchdeletion' => 'Anyadir pajinas i archivos que efasso a mi lista',
 'tog-minordefault' => 'Yir marcando todos los trocamientos como chiquiticos',
 'tog-previewontop' => 'Àmostar el previsteo enriva del cuadro de trocamiento',
 'tog-previewonfirst' => 'Àmostar el previsteo al primer trocamiento',
-'tog-enotifwatchlistpages' => 'Cada vez que y ay un trocamiento en una hoja que está en mi lista de akavidamiento, mándame una letral (e-mail)',
+'tog-enotifwatchlistpages' => 'Embiame un korreo elektroniko kuando una pajina o archivo kambia en mi lista',
 'tog-enotifusertalkpages' => 'Cuando y ay un trocamineto en mi hoja de diskusyón, mándame una letral (e-mail)',
-'tog-enotifminoredits' => 'I para los trocamientos chiquiticos de las hojas, mándame una letral (e-mail)',
+'tog-enotifminoredits' => 'Tambien embiame un korreo elektroniko para los trocamientos chiquiticos de pajnas i archivos',
 'tog-enotifrevealaddr' => 'En las letrales de avizo, amóstrame á mi el adresso de letral mío',
 'tog-shownumberswatching' => 'Àmostrar el kadhar de usadores que están akavidando las hojas',
 'tog-oldsig' => 'La firma presente',
@@ -223,10 +223,11 @@ $messages = array(
 'tog-showhiddencats' => 'Amostrar las katēggorías escondidas',
 'tog-norollbackdiff' => 'No amostrar la diff doeśpués de aboltar',
 'tog-useeditwarning' => 'Avirteme kuando desho la pajina sin guardar los kambios',
+'tog-prefershttps' => 'Siempre uza un koneksyon segura kuando entra al sistema',
 
 'underline-always' => 'Siempre',
 'underline-never' => 'Nunca',
-'underline-default' => 'Que dessidde el navigador',
+'underline-default' => 'Aspekto o opsyon prederminada del navegador',
 
 # Font style option in Special:Preferences
 'editfont-style' => 'Modo de tipografía de la rējión de trocamiento',
@@ -324,10 +325,10 @@ $messages = array(
 'cancel' => 'Anular',
 'moredotdotdot' => 'Mas...',
 'morenotlisted' => 'Esta lista no esta kompleta',
-'mypage' => 'Pajina',
+'mypage' => 'Hoja',
 'mytalk' => 'Mi diskusyon',
 'anontalk' => 'Diskusyón para este adresso de IP',
-'navigation' => 'Navigación',
+'navigation' => 'Navigasyon',
 'and' => '&#32;i',
 
 # Cologne Blue skin
@@ -345,9 +346,9 @@ $messages = array(
 'vector-action-move' => 'Taşirear',
 'vector-action-protect' => 'Guardar',
 'vector-action-undelete' => 'Traer atrás',
-'vector-action-unprotect' => 'Kambiar proteksyon',
-'vector-simplesearch-preference' => 'Aktivar consejos de búsqueda adelantada (sólo pelejo Vector)',
-'vector-view-create' => 'Criar',
+'vector-action-unprotect' => 'Trocar proteksyon',
+'vector-simplesearch-preference' => 'Aktivar barra de buskida simplifikada (solamente kon aspekto Vector)',
+'vector-view-create' => 'Krear',
 'vector-view-edit' => 'Trocar',
 'vector-view-history' => 'Ver la istoria',
 'vector-view-view' => 'Meldar',
@@ -362,9 +363,9 @@ $messages = array(
 'tagline' => 'De {{SITENAME}}',
 'help' => 'Ayudo',
 'search' => 'Buxcar',
-'searchbutton' => 'Buxcar',
-'go' => 'Vate',
-'searcharticle' => 'Vate',
+'searchbutton' => 'Bushkar',
+'go' => 'Ir',
+'searcharticle' => 'Ir',
 'history' => 'La istoria de la hoja',
 'history_short' => 'Istoria',
 'updatedmarker' => 'trocado desde mi visita de alcavo',
@@ -373,11 +374,12 @@ $messages = array(
 'print' => 'Imprimir',
 'view' => 'Ver',
 'edit' => 'Trocar',
-'create' => 'Criar',
+'create' => 'Krear',
 'editthispage' => 'Trocar esta hoja',
-'create-this-page' => 'Crîar esta hoja',
-'delete' => 'Efaçar',
+'create-this-page' => 'Criar esta hoja',
+'delete' => 'Efasar',
 'deletethispage' => 'Efassar esta hoja',
+'undeletethispage' => 'Restorar esta pajina',
 'undelete_short' => 'Traer atrás $1 {{PLURAL:$1|trocamientos|trocamientos}}',
 'viewdeleted_short' => 'Ver {{PLURAL:$1|un trocamiento efassado|$1 trocamientos efassados}}',
 'protect' => 'Guardar',
@@ -407,16 +409,24 @@ $messages = array(
 'redirectedfrom' => '(Redirigido desde $1)',
 'redirectpagesub' => 'Hoja redirigida',
 'lastmodifiedat' => 'Esta hoja fue trocada por la dal cavo vez el $1, a las $2.',
+'viewcount' => 'Este pajina fue vijitado {{PLURAL:$1|una vez|$1 vezes}}.',
 'protectedpage' => 'Hoja guardada',
 'jumpto' => 'Saltar a:',
-'jumptonavigation' => 'navigación',
-'jumptosearch' => 'buxcar',
+'jumptonavigation' => 'navigasyon',
+'jumptosearch' => 'bushkar',
+'view-pool-error' => 'Diskulpe, los servidores estan sovrekargado en est momento.
+Ay demaziado usuarios estan aprovando a ver esta pajina.
+Aspera un momento antes de aprovar esta pajina de muevo.
+
+$1',
+'pool-timeout' => 'Tiempo de asperar esta asperando por el kandado',
+'pool-queuefull' => 'Kola de lavoro esta yeno',
 'pool-errorunknown' => 'Yerro deskonosido',
 
 # All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Encima de {{SITENAME}}',
 'aboutpage' => 'Project:Encima de',
-'copyright' => 'El contenido se puede topar debaxo de la <i>$1</i>',
+'copyright' => 'El kontenido se puede topar debasho de la $1 salvo ke indika al kontrario.',
 'copyrightpage' => '{{ns:project}}:Derechos de autor',
 'currentevents' => 'Novedades',
 'currentevents-url' => 'Project:Novedades',
@@ -433,10 +443,17 @@ $messages = array(
 'privacypage' => 'Project:Principio de particòlaridad',
 
 'badaccess' => 'Yerro de permissión',
+'badaccess-group0' => 'No estas autorizado a egzekutir el aksyon que a demandado.',
+'badaccess-groups' => 'El aksyon ke a demandado esta limitado a los usuarios ke estan en {{PLURAL:$2|el grupo|uno de los grupos}}: $1',
+
+'versionrequired' => 'Se nesesite la versyon $1 de MediaWiki',
+'versionrequiredtext' => 'Se nesesita versyon $1 de MediaWiki para uzar este pajina. Ver [[Special:Version|La pajina de versyon]].',
 
 'ok' => 'DE ACORDDO',
 'retrievedfrom' => 'Acòjido del adhresso "$1"',
 'youhavenewmessages' => '{{PLURAL:$3|Tienes}} $1 ($2).',
+'youhavenewmessagesfromusers' => '{{PLURAL:$4|Tiene}} $1 de {{PLURAL:$3|otro usuario|$3 usuarios}}($2).',
+'youhavenewmessagesmanyusers' => 'Tiene $1 de munchos usuarios ($2).',
 'newmessageslinkplural' => '{{PLURAL:$1|un muevo mesaje|999=mesajes muevos}}',
 'newmessagesdifflinkplural' => '{{PLURAL:$1|ulitmo kambio|999=ultimos kambios}}',
 'youhavenewmessagesmulti' => 'Tienes messajes nuevos en $1',
@@ -449,65 +466,128 @@ $messages = array(
 'toc' => 'Contènidos',
 'showtoc' => 'Amostrar',
 'hidetoc' => 'esconder',
+'collapsible-collapse' => 'Eskonder',
+'collapsible-expand' => 'Revelar',
 'thisisdeleted' => 'Ver o restorar $1?',
 'viewdeleted' => 'Desea ver $1?',
+'restorelink' => '{{PLURAL:$1|un edisyon efasada|$1 edisyones efasadas}}',
 'feedlinks' => 'Kanal:',
+'feed-invalid' => 'Tipo de kanal de subskripsyon es invalido.',
+'feed-unavailable' => 'Kanales de subskripsyon no estan disponibles',
 'site-rss-feed' => 'Fuente de RSS de $1',
-'site-atom-feed' => 'Alimentela de Atom de $1',
+'site-atom-feed' => 'Kanal Atom de $1',
 'page-rss-feed' => '"$1" Fuente RSS',
 'page-atom-feed' => '"$1" Subscripción Atom',
 'red-link-title' => '$1 (la hoja no egziste)',
+'sort-descending' => 'Atakanar en orden desendente',
+'sort-ascending' => 'Atakanar en orden asendente',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
-'nstab-main' => 'Pajina',
-'nstab-user' => 'Hoja del kullaneador',
+'nstab-main' => 'Hoja',
+'nstab-user' => 'Pajina de usuario',
 'nstab-media' => 'Hoja de Meddia',
 'nstab-special' => 'Hoja especial',
 'nstab-project' => 'Hoja del proyecto',
-'nstab-image' => 'Dosya',
+'nstab-image' => 'Archivo',
 'nstab-mediawiki' => 'Messaj',
 'nstab-template' => 'Şablón',
 'nstab-help' => 'Ayudo',
 'nstab-category' => 'Kategoriya',
 
 # Main script and global functions
+'nosuchaction' => 'No egziste esa aksyon',
+'nosuchactiontext' => 'La aksyon espesefikada por el URL es invalido.
+Es posivle ke el URL fue eskrito mal, o ke segite un enlase inkorrecto.
+Tambiem puede indikar un yerro en la programa uzado por {{SITENAME}}.',
 'nosuchspecialpage' => 'No ay tala hoja especial',
+'nospecialpagetext' => '<strong>Demandaste una pajina espesial invalida.</strong>
+
+Puede topar una lista de pajinas espesiales validas en[[Special:SpecialPages|{{int:specialpages}}]].',
 
 # General errors
 'error' => 'Yerro',
 'databaseerror' => 'Yerro de la Databasa',
+'databaseerror-text' => 'Afito un yerro en la demanda del base de data.
+Esto puede indikar un yerro en la programa.',
+'databaseerror-textcl' => 'Afito un yerro en la demanda del base de data.',
 'databaseerror-query' => 'Demanda: $1',
 'databaseerror-function' => 'Fonksyon: $1',
 'databaseerror-error' => 'Yerro: $1',
-'missing-article' => 'La basa de dados no topó el teksto de la hoja llamada "$1" $2.
+'laggedslavemode' => "'''Aviso:''' Puede ke la pajina no kontiene las aktualizasyones mas resientes.",
+'readonly' => 'Base de datos blokeada',
+'enterlockreason' => 'Eskrive un razon por el blokeo,incluyendo un estimasyon de kuando libera el blokeo',
+'readonlytext' => 'La base de datos esta blokeada a muevas entradas i otras modifikasyones,probablemente para mantenemento rutinas, Kuando akava se enkontra dispozible.
+
+El administrador ke blokeo dio esta esplikasyon: $1',
+'missing-article' => 'La base de datos no topó el teksto de una pajina ke se debe topar, llamada "$1" $2.
 
-En lo mas muncho, esto se cavsa de un "dif" anakróniko ou de un atamiento a la istoria de una hoja que se efaçó.
+Jeneralmente, esto se cavsa de un "dif" anakróniko o de una enlase de la istoria de una pajina que se efaso.
 
-Si esto no es el cavso, puede ser que topates una chincha en el lojikal.
-Si puede ser mete un [[Special:ListUsers/sysop|administrador]] en corriente y también anota la URL.',
+Si esto no es el cavso, puede ser que topates un yerro en la programa.
+Si puede avisar [[Special:ListUsers/sysop|administrador]], anotando la URL.',
 'missingarticle-rev' => '(nº. de revisión: $1)',
 'missingarticle-diff' => '(Dif.: $1, $2)',
+'readonly_lag' => 'La base de datos se a blokeado mientres los servidores se sinkronizan',
+'internalerror' => 'Yerro enterno',
+'internalerror_info' => 'Yerro enterno: $1',
+'fileappenderrorread' => 'No se pudo meldar "$1" durante enkashyon.',
+'fileappenderror' => 'No se pudo enkashar "$1" a "$2".',
 'filecopyerror' => 'No se pudo copiar el arxiv "$1" a "$2".',
+'filerenameerror' => 'No se pudo renombrar archivo "$1" a "$2".',
+'filedeleteerror' => 'No se pudo efasar archivo "$1".',
+'directorycreateerror' => 'No se pudo krear direktorio "$1".',
+'filenotfound' => 'No se pudo topar archivo "$1".',
+'fileexistserror' => 'No se pudo eskrivir al archivo "$1": Archivo ya egziste.',
+'unexpected' => 'Valor enasperado: "$1"="$2".',
+'formerror' => 'Yerro: No se pudo embiar fomulario.',
+'badarticleerror' => 'No se puede azer esta aksyon en este pajina.',
+'cannotdelete' => 'No pudo efasar esta pajina o archivo "$1".
+Puede ser ke ya a efasado otra persona.',
+'cannotdelete-title' => 'No se puede efasar pajina "$1"',
+'delete-hook-aborted' => 'Efasyon fue anulado por "hook".',
+'no-null-revision' => 'No pudo krear la mueva revizyon nula para la pajina "$1"',
 'badtitle' => 'Titolo negro',
 'badtitletext' => 'El título de la hoja demandada está vazío, no es valible, o es un link interlingua o interwiki incorrecto.
 Puede ser que contiene uno o más caracteres que no se pueden usar en los títulos.',
+'perfcached' => 'Los sigiente datos se enkontra en el cache i puede ser ke no esta aktualizada. Un maksimo de {{PLURAL:$1|un resultado esta|$1 resultados estan}} enkontrado en el cache.',
+'perfcachedts' => 'Los sigiente datos se enkontra en el cache, i fue aktualizado $1. Un maksimo de {{PLURAL:$4|un resultado esta|$1 resultados estan}} enkontrado en el cache.',
+'querypage-no-updates' => 'Las aktualizasyones de esta pajina esta desaktivado.
+Las datos no va aktualizar agora.',
 'viewsource' => 'Ver su manadero',
+'viewsource-title' => 'Ver la fuente de $1',
+'actionthrottled' => 'Aksyon limitada',
+'actionthrottledtext' => 'Komo prekosyon kontra el spam, ay un limite de kuanto vezes puede azer este aksyon en poko tiempo, i sovrepasaste este limite.
+Aprovar de muevo en unos minutos.',
+'protectedpagetext' => 'La pajina esta guardado kontra esdisyones i otras aksyones.',
+'viewsourcetext' => 'Puede ver i kopiar la fuente de este pajina:',
+'viewyourtext' => 'Puede ver i kopiar la fuente de "tus edisyones" a esta pajina:',
+'protectedinterface' => 'Esta pajina abastese teksto de la interfaz para la programa de este viki, i es guardado para empedir abuso.
+Para anyadir o kambiar traduksyones para todos los vikis, uza [//translatewiki.net/translatewiki.net], el projecto de lokalizasyon de MediaWiki.',
+'editinginterface' => "'''Aviso:''' Estas editando una pajina uzada para abasteser teksto de la interfaz para la programa.
+Kambios a esta pajina afectara la aparesemiento de la interfaz de usuario para los otros usuarios en este viki.
+Para anyadir o kambiar traduksyones para todos los vikis, uza [//translatewiki.net/translatewiki.net], el projecto de lokalizasyon de MediaWiki.",
+
+# Virus scanner
+'virus-unknownscanner' => 'antivirus deskonosido:',
 
 # Login and logout pages
 'welcomeuser' => 'Bienvinidos, $1',
-'yourname' => 'Su nombre de usuario',
+'yourname' => 'Nombre de usuario:',
 'userlogin-yourname' => 'Nombre de usuario',
 'userlogin-yourname-ph' => 'Eskrive tu nombre de usuario',
 'createacct-another-username-ph' => 'Eskrive el nombre de usuario',
-'yourpassword' => 'Parola',
+'yourpassword' => 'Kontrasenya:',
 'userlogin-yourpassword' => 'Kontrasenya',
 'userlogin-yourpassword-ph' => 'Eskriva tu kontrasenya',
 'createacct-yourpassword-ph' => 'Eskriva una kontrasenya',
-'yourpasswordagain' => 'Entra de muevo la parola',
+'yourpasswordagain' => 'Entra de muevo la kontrasenya',
+'createacct-yourpasswordagain' => 'Konfirme contrasenya',
 'createacct-yourpasswordagain-ph' => 'Eskrive la kontrasenya de muevo',
 'remembermypassword' => 'Acórdate de mi entrada de usador en este bilgisayar/orddênador (por un maksimum de {{PLURAL:$1|día|días}})',
+'yourdomainname' => 'Tu dominyo:',
+'password-change-forbidden' => 'No se puede kambiar contrasenyas en este viki.',
 'login' => 'Entrar',
-'nav-login-createaccount' => 'Entrar / Criar un cuento',
+'nav-login-createaccount' => 'Entrar / krear un kuento',
 'loginprompt' => 'Kale tener "cookies" aktivadas enel navegador para enrejistrarse en {{SITENAME}}',
 'userlogin' => 'Entrar / Registrarse',
 'logout' => 'Salir',
@@ -515,8 +595,8 @@ Puede ser que contiene uno o más caracteres que no se pueden usar en los títul
 'userlogin-noaccount' => 'No tiene un kuento?',
 'userlogin-joinproject' => 'Abonar {{SITENAME}}',
 'nologin' => "¿No tienes un cuento? '''$1'''.",
-'nologinlink' => 'Crea un cuento',
-'createaccount' => 'Crea un nuevo cuento',
+'nologinlink' => 'Krear un kuento',
+'createaccount' => 'Krear un kuento',
 'gotaccount' => "¿Ya tienes un cuento? '''$1'''.",
 'gotaccountlink' => 'Entrar',
 'userlogin-resetlink' => 'Olvidates tus detalyos de akseso?',
@@ -524,35 +604,48 @@ Puede ser que contiene uno o más caracteres que no se pueden usar en los títul
 'userlogin-createanother' => 'Krear otro kuento',
 'createacct-join' => 'Eskrive abasho tu informasyon',
 'createacct-emailrequired' => 'Adreso de korreo elektroniko',
+'createacct-emailoptional' => 'Korreo elektroniko (opsyonal)',
 'createacct-email-ph' => 'Eskrive tu adreso de korreo elektroniko',
 'createacct-another-email-ph' => 'Eskrive el adreso de korreo elektronico',
-'createaccountmail' => 'por una letra electrónica',
+'createaccountmail' => 'Uzar una contrasenya temporal y embiarla al korreo elektronico espesificado',
+'createacct-realname' => 'Nombre verdadero (opsyonal)',
 'createaccountreason' => 'Razon:',
 'createacct-reason' => 'Razon',
 'createacct-submit' => 'Krear tu cuento',
 'createacct-another-submit' => 'Krear otro kuento',
 'createacct-benefit-heading' => '{{SITENAME}} es izo por djente komo tu.',
+'createacct-benefit-body1' => '{{PLURAL:$1|edisyon|edisyones}}',
 'createacct-benefit-body2' => '{{PLURAL:$1|pajina|pajinas}}',
-'userexists' => 'El nombre que entrates ya se usa.
-Si puede ser, escoge un otro nombre.',
+'userexists' => 'El nombre de usuario que eskrivites ya se uza.
+Eskoje un nombre diferente.',
+'createacct-error' => 'Yerro de kreasyon de kuento',
 'createaccounterror' => 'No se pudo crear el cuento: $1',
+'password-name-match' => 'Tu contrasenya kale ser diferente de tu usuario.',
 'mailmypassword' => 'Restableser kontrasenya',
 'mailerror' => 'Falta al embiar korreo: $1',
 'emailconfirmlink' => 'Confirma su adderesso de letra electrónica',
 'accountcreated' => 'Cuento creado',
-'accountcreatedtext' => 'El cuento del usuario para $1 fue creado.',
+'accountcreatedtext' => 'El kuento de usuario para [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|talk]]) fue kreado.',
 'loginlanguagelabel' => 'Lingua: $1',
 
 # Change password dialog
 'changepassword' => 'Trocar el kóddiche',
+'resetpass_header' => 'Kambiar kontrasenya del kuento',
 'oldpassword' => 'Kóddiche viejo:',
 'newpassword' => 'Kóddiche muevo:',
+'retypenew' => 'Eskrive de muevo la kontrasenya mueva',
+'resetpass_forbidden' => 'No se puede kambiar las kontrasenyas',
+'resetpass-submit-loggedin' => 'Kambiar kontrasenya',
 'resetpass-submit-cancel' => 'Anular',
 
 # Special:PasswordReset
+'passwordreset' => 'Restableser kontrasenya',
+'passwordreset-legend' => 'Restableser kontrasenya',
 'passwordreset-username' => 'Nombre de usador:',
 'passwordreset-domain' => 'Dominio:',
 'passwordreset-email' => 'Adresso de letral:',
+'passwordreset-emailelement' => 'Usuario: $1
+Kontrasenya temporal: $2',
 
 # Special:ChangeEmail
 'changeemail' => 'Kambiar adreso de korreo elektroniko',
@@ -568,20 +661,20 @@ Si puede ser, escoge un otro nombre.',
 'resettokens-token-label' => '$1(valor aktual: $2)',
 
 # Edit page toolbar
-'bold_sample' => 'Teksto gordo',
-'bold_tip' => 'Teksto gordo',
-'italic_sample' => 'Teksto cursivo',
-'italic_tip' => 'Teksto en cursiva',
-'link_sample' => 'Título del link',
+'bold_sample' => 'Teksto reforçado',
+'bold_tip' => 'Teksto reforçado',
+'italic_sample' => 'Teksto aladado',
+'italic_tip' => 'Teksto aladado',
+'link_sample' => 'Título del enlase',
 'link_tip' => 'Link interno',
-'extlink_sample' => 'http://www.example.com Título del link',
+'extlink_sample' => 'http://www.example.com Títolo del atamiento',
 'extlink_tip' => 'Link eksterno (acόrdate de ajustar el prefiks http://)',
-'headline_sample' => 'Escrituria de títůlo',
+'headline_sample' => 'Escritura de títolo',
 'headline_tip' => 'Titular de nivel 2',
 'nowiki_sample' => 'Escribid aquí texto sin formato',
 'nowiki_tip' => 'Iñorar el formato wiki',
 'image_tip' => 'Imagen incorporada',
-'media_tip' => 'Link al arxivo multimedia',
+'media_tip' => 'Enlase de archivo',
 'sig_tip' => 'Firma, data i ora',
 'hr_tip' => 'Liña orizontala (úsala de vez en cuando)',
 
@@ -606,7 +699,7 @@ Tu adresso de IP va ser enrejjistrado en la istoria de la hoja.",
 'loginreqlink' => 'entrar',
 'loginreqpagetext' => 'Tienes que $1 para pueder ver otras hojas.',
 'accmailtitle' => 'La kontrasenya ha sido embiada.',
-'accmailtext' => 'La kontrasenya para "$1" se ha embiado a $2.',
+'accmailtext' => "Se a embiado a $2 una kontrasenya jenerado por [[User talk:$1|$1]]. Se puede kambiar en la pajina ''[[Special:ChangePassword|cambiar kontrasenya]]'' al entrar.",
 'newarticle' => '(Muevo)',
 'newarticletext' => 'Arrivates a una hoja que daínda no egziste.
 Para crear esta hoja, empeça a escribir en la caxa de abaxo. Mira [[{{MediaWiki:Helppage}}|la hoja de ayudo]] para saber más.
@@ -619,6 +712,7 @@ ou [{{fullurl:{{FULLPAGENAME}}|action=edit}} trocar esta hoja]</span>.',
 Puedes [[Special:Search/{{PAGENAME}}|bushkar este titolo de oja]] en otras pajinas,
 o <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} bushkar en los rejistros relasyonados]</span>.',
 'userpage-userdoesnotexist-view' => 'El cuento del usador $1 no está enrejistrado.',
+'updated' => '(Aktualizado)',
 'note' => "'''Nota:'''",
 'previewnote' => "¡Akórdate ke esto es sólo una previsualizasion i aínda no se enrejistró!'''
 Los tus trokamientos no se tienen guadrados!",
@@ -630,7 +724,7 @@ Los tus trokamientos no se tienen guadrados!",
 'copyrightwarning' => "Si puede ser, observa que todas las contribuciones a {{SITENAME}} se consideran hechas públicas abaxo la $2 (ver detalyos en $1). Si no queres que la gente endereche tus tekstos escritos sin piadad i los esparta libberamente, alora no los metas aquí. También nos estás asegurando ansí que escribites este teksto tu mismo i sos el dueño de los derechos de autor, o lo copiates desde el dominio público u otra fuente libbero.'''¡QUE N0 USES TEKSTOS ESCRITOS CON COPYRIGHT SIN PERMISSIÓN!'''<br />",
 'templatesused' => '{{PLURAL:$1|El şablón usado|Los şablones usados}} en esta hoja:',
 'templatesusedpreview' => '{{PLURAL:$1|El xabblón usado|Los xabblones usados}} en esta vista:',
-'template-protected' => '(guardada)',
+'template-protected' => '(guadrada)',
 'template-semiprotected' => '(media guardada)',
 'hiddencategories' => 'Esta hoja es un miembro de {{PLURAL:$1|1 kateggoría escondida|$1 kateggorías escondidas}}:',
 'nocreate-loggedin' => 'No tienes el permisso de creas hojas nuevas.',
@@ -646,6 +740,8 @@ Ya egziste.',
 
 # Content models
 'content-model-wikitext' => 'vikiteksto',
+'content-model-text' => 'teksto simple',
+'content-model-javascript' => 'JavaScript',
 'content-model-css' => 'CSS',
 
 # Parser/template warnings
@@ -670,13 +766,13 @@ Este o estos kampos no van ser amostrados",
 'currentrevisionlink' => 'Revisión actual',
 'cur' => 'act',
 'next' => 'venidero',
-'last' => 'de alcabo',
+'last' => 'de alcavo',
 'page_first' => 'primeras',
 'page_last' => 'de alcabo',
 'histlegend' => "Selección de diferencias: marca los selectores de las versiones a comparar y pulsa ''enter'' o el botón de abajo.<br />
 Leyenda: (act) = diferencias con la versión actual,
 (prev) = diferencias con la versión previa, M = edición menor",
-'history-fieldset-title' => 'Buscar en la istoria',
+'history-fieldset-title' => 'Navegar en la istoria',
 'history-show-deleted' => 'Sólamente efassado',
 'histfirst' => 'Lo mas antiko',
 'histlast' => 'Lo mas muevo',
@@ -688,6 +784,7 @@ Leyenda: (act) = diferencias con la versión actual,
 'history-feed-item-nocomment' => '$1 en $2',
 
 # Revision deletion
+'rev-deleted-user' => '(se kito el nombre de usuario)',
 'rev-delundel' => 'mostra/esconde',
 'rev-showdeleted' => 'mostra',
 'revdelete-show-file-submit' => 'Si',
@@ -695,7 +792,7 @@ Leyenda: (act) = diferencias con la versión actual,
 'revdelete-hide-user' => 'Nombre de usuario/adreso de IP del Redaktor',
 'revdelete-radio-same' => '(no troques)',
 'revdelete-radio-set' => 'Eskondido',
-'revdelete-radio-unset' => 'No',
+'revdelete-radio-unset' => 'Visible',
 'revdelete-log' => 'Razon:',
 'revdel-restore' => 'troca la visibilitá',
 'pagehist' => 'La storia de la hoja',
@@ -703,6 +800,7 @@ Leyenda: (act) = diferencias con la versión actual,
 'revdelete-reasonotherlist' => 'Otra razón',
 
 # History merging
+'mergehistory-from' => 'Pajina de orijen',
 'mergehistory-reason' => 'Razon:',
 
 # Merge log
@@ -716,8 +814,8 @@ Leyenda: (act) = diferencias con la versión actual,
 'diff-multi' => '(No {{PLURAL:$1|es amostrado un trokamiento intermedio echo|son amostrados $1 trokamientos intermedios echos}} por {{PLURAL:$2|un usador|$2 usadores}})',
 
 # Search results
-'searchresults' => 'Resultados de la búsquida',
-'searchresults-title' => 'Resultados de la búsquida de «$1»',
+'searchresults' => 'Resultados de la bushkida',
+'searchresults-title' => 'Resultados de la bushkida de «$1»',
 'notextmatches' => 'No se pudo topar en dinguna hoja.',
 'prevn' => '{{PLURAL:$1|$1}} de antes',
 'nextn' => '{{PLURAL:$1|$1}} venideras',
@@ -727,15 +825,15 @@ Leyenda: (act) = diferencias con la versión actual,
 'viewprevnext' => 'Ver ($1 {{int:pipe-separator}} $2) ($3).',
 'searchmenu-exists' => 'Egziste una oja yamada "[[:$1]]" en esta viki',
 'searchmenu-new' => "'''Krear la pajina «[[:$1]]» en esta viki!'''{{PLURAL:$2|0=|Tambien ver la pajina topado kon tu bushkida.|Tambier ver la resulta de tu bushkida.}}",
-'searchprofile-articles' => 'Hojas de contènido',
+'searchprofile-articles' => 'Pajinas de kontenido',
 'searchprofile-project' => 'Hojas de ayudo y hojas de projeto',
 'searchprofile-images' => 'Multimedya',
 'searchprofile-everything' => 'Todo',
 'searchprofile-advanced' => 'Adelantado',
-'searchprofile-articles-tooltip' => 'Buxca en $1',
-'searchprofile-project-tooltip' => 'Buxca en $1',
-'searchprofile-images-tooltip' => 'Buxca las dosyas',
-'searchprofile-everything-tooltip' => 'Buxca en todo el contènido (y mismo en las hojas de diskusyón)',
+'searchprofile-articles-tooltip' => 'Bushkar en $1',
+'searchprofile-project-tooltip' => 'Bushkar en $1',
+'searchprofile-images-tooltip' => 'Bushkar archivos',
+'searchprofile-everything-tooltip' => 'Bushkar en todo el kontenido (i mismo en las hojas de diskusyón)',
 'searchprofile-advanced-tooltip' => 'Buscar en espacios de nombres particůlares',
 'search-result-size' => '$1 ({{PLURAL:$2|1 biervo|$2 biervos}})',
 'search-result-category-size' => '{{PLURAL:$1|1 miembro|$1 miembros}} ({{PLURAL:$2|1 basho-kateggoria|$2 basho-kateggoria}}, {{PLURAL:$3|1 dossia|$3 dossias}})',
@@ -759,6 +857,7 @@ Leyenda: (act) = diferencias con la versión actual,
 # Preferences page
 'preferences' => 'Preferencias',
 'mypreferences' => 'Las mis preferensias',
+'prefs-edits' => 'Numero de edisyones:',
 'prefs-skin' => 'Vista',
 'skin-preview' => 'Previstear',
 'prefs-datetime' => 'Data i ora',
@@ -794,8 +893,10 @@ Leyenda: (act) = diferencias con la versión actual,
 'gender-male' => 'El redakto pajinas de viki',
 'gender-female' => 'Eya redakto pajinas de viki',
 'email' => 'Korreo elektroniko',
-'prefs-help-email' => 'El adreso de e-posta es menester para alimpiar la tu parola, si la olvidates',
+'prefs-help-email' => 'El adreso de korreo elektroniko es opsional, ma es menester para alimpiar la tu kontrasenya, si la olvidates',
 'prefs-help-email-others' => 'Endemas puedes eskojer si keres dar pueder a otros usadores de azer kontakto kon ti por modre de e-posta, a  traverso de un atamiento en tus ojas de usador i de diskusyon.',
+'prefs-help-email-required' => 'Se nesesita adreso de korreo elektroniko.',
+'prefs-info' => 'Informasyon basiko',
 'prefs-i18n' => 'Internasionalisasyion',
 'prefs-signature' => 'Firma',
 'prefs-editor' => 'Redaktor',
@@ -831,6 +932,7 @@ Leyenda: (act) = diferencias con la versión actual,
 'right-move' => 'Mover pajinas',
 'right-movefile' => 'Mover archivo',
 'right-delete' => 'Efassar hojas',
+'right-sendemail' => 'Embiar korreo elektroniko a otro usuario',
 
 # Special:Log/newusers
 'newuserlogpage' => 'Registro de creación de usuarios',
@@ -858,20 +960,20 @@ Leyenda: (act) = diferencias con la versión actual,
 'recentchanges-label-newpage' => 'Este trokamiento krio una mueva ója',
 'recentchanges-label-minor' => 'Esta es un trocamiento chiquitico',
 'recentchanges-label-bot' => 'Este trokamiento fue echo por un bot',
-'recentchanges-label-unpatrolled' => 'Estre trokamiento no esta akavidado',
+'recentchanges-label-unpatrolled' => 'Este trocamiento no está akavidado',
 'recentchanges-legend-plusminus' => "(''±123'')",
 'rcnotefrom' => "Debasho se amostran los trokamientos desde '''$2''' (amostrados fina <b>$1</b>)",
 'rclistfrom' => 'Mostra los trocamientos nuevos empeçando desde $1',
 'rcshowhideminor' => '$1 trocamientos chiquiticos',
 'rcshowhidebots' => '$1 bots',
-'rcshowhideliu' => '$1 usuarios enrējjistrados',
-'rcshowhideanons' => '$1 empleadores anonimes',
+'rcshowhideliu' => '$1 kullaneadores enrezhistrados',
+'rcshowhideanons' => '$1 kullaneadores anonimes',
 'rcshowhidepatr' => '$1 trokamientos akavidados',
 'rcshowhidemine' => '$1 mis ediciones',
-'rclinks' => 'Ver los dal cabo $1 trocamientos en los dal cabo $2 días.<br />$3',
+'rclinks' => 'Ver los dal cavo $1 trocamientos en los dal cavo $2 días.<br />$3',
 'diff' => 'dif',
 'hist' => 'ist',
-'hide' => 'Esconder',
+'hide' => 'Eskonder',
 'show' => 'Amostrar',
 'minoreditletter' => 'ch',
 'newpageletter' => 'N',
@@ -885,17 +987,18 @@ Leyenda: (act) = diferencias con la versión actual,
 'recentchangeslinked-feed' => 'Trocamientos conectados',
 'recentchangeslinked-toolbox' => 'Trocamientos relatados',
 'recentchangeslinked-title' => 'Los trocamientos relacionados con "$1"',
-'recentchangeslinked-summary' => "Esto es la lista de los trocamientos de alcavo de las hojas que relatan á una hoja spēcifik (ou de los miembros de la katēggoría spēcifikada).
-Las hojas en tu [[Special:Watchlist|lista de akavidamiento]] son escritas '''con letras grexas'''.",
+'recentchangeslinked-summary' => "Esto es la lista de los trocamientos de alcavo de las hojas que relatan a una hoja particòlar (o de los miembros de la kategoriya particòlar).
+Las hojas en tu [[Special:Watchlist|lista de akavidamiento]] son '''reforçadas'''.",
 'recentchangeslinked-page' => 'Nombre de la hoja',
 'recentchangeslinked-to' => 'Amostra los trocamientos freskos en lugar de la hoja indicada',
 
 # Upload
-'upload' => 'Suvir una dosya',
+'upload' => 'Suvir un archivo',
 'uploadlogpage' => 'Subidas de arxivos',
 'filename' => 'Nombre de archivo',
 'filedesc' => 'Somario',
 'filereuploadsummary' => 'Kambios de archivo:',
+'filesource' => 'Fuente:',
 'filename-tooshort' => 'El nombre del archivo es muy kurto.',
 'savefile' => 'Guardar archivo',
 'uploadedimage' => 'subió «[[$1]]»',
@@ -904,11 +1007,16 @@ Las hojas en tu [[Special:Watchlist|lista de akavidamiento]] son escritas '''con
 'backend-fail-notexists' => 'El archivo $1 no egziste.',
 'backend-fail-alreadyexists' => 'El archivo "$1" ya egziste.',
 
+# img_auth script messages
+'img-auth-nofile' => 'El archivo "$1" no egziste.',
+
 'license' => 'Lesensia:',
 'license-header' => 'Lesensiamyénto',
 
 # Special:ListFiles
 'imgfile' => 'archivo',
+'listfiles' => 'Lista de archivos',
+'listfiles_thumb' => 'Minyatura',
 'listfiles_date' => 'Data',
 'listfiles_name' => 'Nombre',
 'listfiles_user' => 'Usuario',
@@ -917,25 +1025,27 @@ Las hojas en tu [[Special:Watchlist|lista de akavidamiento]] son escritas '''con
 'listfiles-latestversion-no' => 'No',
 
 # File description page
-'file-anchor-link' => 'Dosya',
+'file-anchor-link' => 'Archivo',
 'filehist' => 'La istoria de la dosya',
-'filehist-help' => 'Klika encima de una data/ora para vel el arxivo de esta data.',
+'filehist-help' => 'Klika encima de una data/ora para vel la dosya desta data.',
 'filehist-revert' => 'aboltar',
 'filehist-current' => 'actual',
 'filehist-datetime' => 'Data/Ora',
 'filehist-thumb' => 'Minyatura',
 'filehist-thumbtext' => 'Minyatura de la versión á las $1',
-'filehist-user' => 'Kullaneador',
+'filehist-nothumb' => 'Sin minyatura',
+'filehist-user' => 'Usuario',
 'filehist-dimensions' => 'Dimensiones',
 'filehist-filesize' => 'El boy de la dosya',
 'filehist-comment' => 'Comentario',
 'filehist-missing' => 'No se topa el archivo',
 'imagelinks' => 'El uso del dosya',
-'linkstoimage' => '{{PLURAL:$1|La hoja venidera da link|Las hojas venideras dan link}} a este arxivo:',
-'nolinkstoimage' => 'Dinguna ója tiene atamientos a esta imej',
+'linkstoimage' => '{{PLURAL:$1|La hoja venidera da link|Las hojas venideras dan link}} a esta dosya:',
+'nolinkstoimage' => 'No ay hojas con atamientos a esta dosya.',
 'sharedupload' => 'Este arxivo es de $1 i puede ser usado por otros proyectos.',
 'sharedupload-desc-here' => 'Esta hoja es de $1 y puede ser usado por otros projetos.
 La descripción en su [$2 hoja de descripción del arxivo] está amostrada debaxo.',
+'filepage-nofile' => 'No egziste dingun archivo de este nombre.',
 'uploadnewversion-linktext' => 'Subir una nueva versión de este arxivo',
 'shared-repo-from' => 'de $1',
 
@@ -952,6 +1062,9 @@ La descripción en su [$2 hoja de descripción del arxivo] está amostrada debax
 'mimesearch' => 'bushkida por MIME',
 'download' => 'deskargar',
 
+# Unused templates
+'unusedtemplateswlh' => 'otros enlases',
+
 # Random page
 'randompage' => 'Hoja por azardo',
 
@@ -962,11 +1075,16 @@ La descripción en su [$2 hoja de descripción del arxivo] está amostrada debax
 'statistics' => 'Estatísticas',
 'statistics-articles' => 'Pajinas de kontenido',
 'statistics-pages' => 'Pajinas',
+'statistics-users-active' => 'Usuarios aktivos',
 
 'pageswithprop-submit' => 'Ir',
 
+'doubleredirects' => 'Redireksyones dobles',
+
 'brokenredirects-edit' => 'trocar',
+'brokenredirects-delete' => 'efasar',
 
+'withoutinterwiki' => 'Pajinas sin enlases de lenguas',
 'withoutinterwiki-submit' => 'Amostrar',
 
 # Miscellaneous special pages
@@ -993,7 +1111,7 @@ La descripción en su [$2 hoja de descripción del arxivo] está amostrada debax
 # Book sources
 'booksources' => 'Fuentes de livros',
 'booksources-search-legend' => 'Buscar fuentes de libros',
-'booksources-go' => 'Yir',
+'booksources-go' => 'Ir',
 
 # Special:Log
 'log' => 'Rejistros',
@@ -1021,6 +1139,7 @@ La descripción en su [$2 hoja de descripción del arxivo] está amostrada debax
 
 # Special:ListUsers
 'listusers-submit' => 'Amostrar',
+'listusers-noresult' => 'No se topo usuario',
 
 # Special:ActiveUsers
 'activeusers-hidebots' => 'Eskonder bots',
@@ -1030,10 +1149,12 @@ La descripción en su [$2 hoja de descripción del arxivo] está amostrada debax
 'listgrouprights' => 'Derechos del grupo de usuario',
 'listgrouprights-group' => 'Grupo',
 'listgrouprights-rights' => 'Derechos',
-'listgrouprights-helppage' => 'Ayudo:Derechos de grupo',
+'listgrouprights-helppage' => 'Help:Derechos de grupo',
 'listgrouprights-members' => '(ver los miembros de este grupo)',
 'listgrouprights-addgroup' => 'Anyadir {{PLURAL:$2|grupo|grupos}}: $1',
 'listgrouprights-removegroup' => 'Kitar {{PLURAL:$2|grupo|grupos}}: $1',
+'listgrouprights-addgroup-all' => 'Anyadir todos los grupos',
+'listgrouprights-removegroup-all' => 'Kitar todos los grupos',
 
 # Email user
 'emailuser' => 'Embia korreo elektroniko a este usuario',
@@ -1047,14 +1168,13 @@ La descripción en su [$2 hoja de descripción del arxivo] está amostrada debax
 'emailsubject' => 'Sujeto:',
 'emailmessage' => 'Mesaje:',
 'emailsend' => 'Embiar',
+'emailsent' => 'Korreo elektroniko embiado',
 
 # Watchlist
 'watchlist' => 'Lista de akavidamiento',
 'mywatchlist' => 'Mi lista de akavidamientos',
 'watchlistfor2' => 'Para $1 $2',
-'addedwatchtext' => "La hoja «[[:$1]]» fue ajustada a tu [[Special:Watchlist|lista de escogidas]]. Los trocamientos venideros en esta hoja i en tu hoja de diskussión associada se van indicar aí, i la hoja va aparecer '''gordo''' en la hoja de [[Special:RecentChanges|trocamientos freskos]] para hazerla más kolay de detektar.
-
-Cuando queres eliminar la hoja de tu lista de escogidas, piza «Dexar de cudiar» en el menú.",
+'addedwatchtext' => 'La pajina "[[:$1]]" fue anyadido a tu [[Special:Watchlist|lista de escogidas]]. Los trocamientos venideros en esta pajina i en tu pajina de diskusyon assosiada va apareser ayi.',
 'removedwatchtext' => 'La hoja «[[:$1]]» fue eliminada de tu [[Special:Watchlist|lista de escogidas]].',
 'watch' => 'cudiar',
 'watchthispage' => 'Cudia esta hoja',
@@ -1083,10 +1203,12 @@ Mira $2 para un registro de los efassados nuevos.',
 'deletecomment' => 'Razón:',
 'deleteotherreason' => 'Otra razon/razon adisiyonal:',
 'deletereasonotherlist' => 'Otra razón',
-'deletereason-dropdown' => '* Motivos generales de efassamientos
-** La demanda del criador de la hoja
-** Violación de copyright
-** Vandalismo',
+'deletereason-dropdown' => '* Razones komunes de efassamientos
+** Spam
+** Vandalismo
+** Violasyon del derecho de otor
+** Demande del otor mizmo
+** Redireksyon rota',
 
 # Rollback
 'rollbacklink' => 'aboltar',
@@ -1105,15 +1227,16 @@ Mira $2 para un registro de los efassados nuevos.',
 A continuación se mostran las opciones actuales de la hoja '''$1''':",
 'protect-cascadeon' => 'Esta hoja está guardada en momento porque está incluida en {{PLURAL:$1|la hoja venidera|las hojas venideras}}, que tienen activada la opción de protección en grados. Puedes trocar el nivel de protección de esta hoja, ma no va afectar a la protección en grados.',
 'protect-default' => 'Permitir todos los usuarios',
-'protect-fallback' => 'Tiene menester del permiso «$1»',
-'protect-level-autoconfirmed' => 'Bloquear usuarios nuevos y no registrados',
-'protect-level-sysop' => 'Sólo administradores',
+'protect-fallback' => 'Solo permitir usuarios kon permiso "$1"',
+'protect-level-autoconfirmed' => 'Solo permitir usuarios otokonfirmados',
+'protect-level-sysop' => 'Solo permitir administradores',
 'protect-summary-cascade' => 'con grados',
 'protect-expiring' => 'caduca el $1 (UTC)',
 'protect-cascade' => 'Protección en cascada - guardar todas las hojas incluidas en ésta.',
 'protect-cantedit' => 'No puedes trocar el nivel de protección porque no tienes permissión para hazer ediciones.',
 'protect-otherreason' => 'Otra razon/razon adisiyonal',
 'protect-otherreason-op' => 'Otra razon',
+'protect-expiry-options' => '1 ora:1 hour,1 diya:1 day,1 semana:1 week,2 semanas:2 weeks,1 mez:1 month,3 mezes:3 months,6 mezes:6 months,1 anyo:1 year,para siempre:infinite',
 'restriction-type' => 'Permiso:',
 'restriction-level' => 'Nivel de restricción:',
 
@@ -1159,23 +1282,26 @@ A continuación se mostran las opciones actuales de la hoja '''$1''':",
 'nolinkshere' => "Dinguna ója tiene atamientos kon '''[[:$1]]'''",
 'isredirect' => 'Hoja redirigida',
 'istemplate' => 'inclusión',
-'isimage' => 'Atamiento de la dossia',
+'isimage' => 'enlase de archivo',
 'whatlinkshere-prev' => '{{PLURAL:$1|de antes|de antes $1}}',
 'whatlinkshere-next' => '{{PLURAL:$1|venidera|venideras $1}}',
-'whatlinkshere-links' => '← linkes',
+'whatlinkshere-links' => '← enlases',
 'whatlinkshere-hideredirs' => '$1 redirecciones',
 'whatlinkshere-hidetrans' => '$1 inclusiones',
-'whatlinkshere-hidelinks' => '$1 linkes',
+'whatlinkshere-hidelinks' => '$1 enlases',
 'whatlinkshere-hideimages' => '$1 atamientos a imejes',
 'whatlinkshere-filters' => 'Filtres',
 
 # Block/unblock
 'blockip' => 'Bloquear usuario',
+'ipadressorusername' => 'Adreso de IP o nombre de usuario:',
 'ipbreason' => 'Razon:',
 'ipboptions' => '2 oras:2 hours,1 día:1 day,3 días:3 days,1 semana:1 week,2 semanas:2 weeks,1 mes:1 month,3 meses:3 months,6 meses:6 months,1 anyo:1 year,para siempre:infinite',
-'ipblocklist' => 'Usadores bloqueados',
+'badipaddress' => 'Adreso de IP invalido',
+'ipblocklist' => 'Usuarios blokeados',
 'blocklist-reason' => 'Razon',
 'ipblocklist-submit' => 'Bushkar',
+'infiniteblock' => 'para siempre',
 'blocklink' => 'blokar',
 'unblocklink' => 'quitar el bloko',
 'change-blocklink' => 'trocar el bloko',
@@ -1184,22 +1310,25 @@ A continuación se mostran las opciones actuales de la hoja '''$1''':",
 'blocklogpage' => 'Bloqueos de usuarios',
 'blocklogentry' => 'bloqueó a [[$1]] $3 durante un tiempo de $2',
 'unblocklogentry' => 'desbloqueó a "$1"',
-'block-log-flags-nocreate' => 'desactivada la creación de cuentos',
+'block-log-flags-nocreate' => 'desactivada la kreasyon de kuentos',
 'block-log-flags-hiddenname' => 'nombre de usuario eskondido',
 
+# Developer tools
+'lockedbyandtime' => '(por {{GENDER:$1|$1}} el $2 a la $3)',
+
 # Move page
-'movepagetext' => "Usando el formulario venidero se va renombrar una hoja, quitando todo su istoria a su nuevo nombre.
-El título de antes se va convertir en una redirección al nuevo título.
-Los linkes al antiguo título de la hoja no se van trocar.
-Asegúrate de no dexar [[Special:DoubleRedirects|redirecciones dobles]] o [[Special:BrokenRedirects|rotas]].
-Tú sos responsable de aranjjar los linkes de manera menesterosa.
-
-Acórdate que la hoja '''no''' va ser renombrada si ya egziste una hoja con esta nuevo título, a no ser que sea una hoja vazía o una redirección sin istoria.
-Esto siñifica que vas pueder renombrar una hoja a su título original si hazes un yerro, ma que no vas pueder sobrescribir una hoja que ya existe.
-
-'''¡Atansión!'''
-Este puede ser un trocamiento muy muy emportante e inesperado para una hoja popular;
-si puede ser, asegúrate de entender las resultados del lo que hazes antes de yir endelantre.",
+'movepagetext' => "Uzando el sigiente formulario va renombrar una pajina, kitando todo su istoria a su nuevo nombre.
+El titulo orijinal se va convertir en una redireksyon al muevo titulo.
+Puede aktualizar otomatikamente las redireksyones al titulo orijinal.
+Si eskoje no azerlo, asegurate de verifikar ke no ay  [[Special:DoubleRedirects|redireksyones dobles]] o [[Special:BrokenRedirects|rotas]].
+Tú sos responsable de asegurar ke los enlases funksyonan korrectamente.
+
+Nota ke la pajina '''no''' va ser renombrada si ya egziste una hoja con esta muevo título, a no ser que sea una redireksyon sin istoria.
+Esto sinyifica que vas pueder renombrar una pajina a su titulo orijinal si hazes un yerro, ma que no vas pueder sobreskrivir una pajina que ya existe.
+
+'''Aviso!'''
+Este puede ser un trocamiento muy muy emportante e inesperado para una pajina popular;
+asegurate de entender las resultados del lo que azes antes de ir endelantre.",
 'movepagetalktext' => "La hoja de diskussión associada, si egziste, va ser renombrada otomáticamente '''a menos que:'''
 *Esté renombrando la hoja entre espacios de nombres diferentes,
 *Una hoja de diskussión no vazía ya egziste con el nombre nuevo, o
@@ -1221,6 +1350,8 @@ Si puede ser, escoge otro nombre.',
 
 # Export
 'export' => 'Eksportar las hojas',
+'export-addcat' => 'Anyadir',
+'export-addns' => 'Anyadir',
 'export-download' => 'Guardar komo archivo',
 
 # Namespace 8 related
@@ -1234,13 +1365,15 @@ Si puede ser, escoge otro nombre.',
 
 # Thumbnails
 'thumbnail-more' => 'Engrandece',
-'thumbnail_error' => 'Yerro kriando la imej chika: $1',
+'thumbnail_error' => 'Yerro kriando la minyatura: $1',
 
 # Special:Import
+'import-interwiki-submit' => 'Importar',
 'import-upload-filename' => 'Nombre de archivo:',
+'importnopages' => 'No ay pajinas para importar.',
 
 # Tooltip help for the actions
-'tooltip-pt-userpage' => 'Tu hoja de usador',
+'tooltip-pt-userpage' => 'Tu pajina de usuario',
 'tooltip-pt-mytalk' => 'Tu hoja de diskusyón',
 'tooltip-pt-preferences' => 'Mis preferencias',
 'tooltip-pt-watchlist' => 'La lista de los trocamientos acontècidos en las hojas akavidadas.',
@@ -1257,17 +1390,17 @@ Puedes ver su manadero',
 'tooltip-ca-delete' => 'Efassar esta hoja',
 'tooltip-ca-move' => 'Taxirea (renombra) esta hoja',
 'tooltip-ca-watch' => 'Ajustar esta hoja a tu lista de akavidamientos',
-'tooltip-ca-unwatch' => 'Quita esta hoja de tu lista de escogidos',
-'tooltip-search' => 'Buxca en {{SITENAME}}',
-'tooltip-search-go' => 'Si ay una hoja con este nombre egzakto, vate allá.',
+'tooltip-ca-unwatch' => 'Kita esta pajina de tu lista de escogidos',
+'tooltip-search' => 'Bushka en {{SITENAME}}',
+'tooltip-search-go' => 'Ir a la pajina con este nombre egzakto, si egziste.',
 'tooltip-search-fulltext' => 'Buxca este teksto en las hojas',
 'tooltip-p-logo' => 'Vate a la primera hoja',
-'tooltip-n-mainpage' => 'Vate a la primera hoja',
-'tooltip-n-mainpage-description' => 'Vate a la primera hoja',
+'tooltip-n-mainpage' => 'Vijitar a la primera hoja',
+'tooltip-n-mainpage-description' => 'Vijitar a la primera hoja',
 'tooltip-n-portal' => 'Encima del projeto, lo que puedes hazer y ánde topar todo',
 'tooltip-n-currentevents' => 'Jhaberes y acontècimientos de oy día',
 'tooltip-n-recentchanges' => 'Lista de los trocamientos muevos en el viki',
-'tooltip-n-randompage' => 'Carga una hoja por asardo',
+'tooltip-n-randompage' => 'Carga una hoja por azardo',
 'tooltip-n-help' => 'Para saver mas',
 'tooltip-t-whatlinkshere' => 'La lista de todas las hojas del viki que se atan con esta hoja',
 'tooltip-t-recentchangeslinked' => 'Los trocamientos muevos en las hojas atadas con esta hoja',
@@ -1275,12 +1408,12 @@ Puedes ver su manadero',
 'tooltip-feed-atom' => "Fuente de Atom d'esta hoja",
 'tooltip-t-contributions' => 'Ver la lista de ajustamientos de este usuario',
 'tooltip-t-emailuser' => 'A este usuario, mándale una letra electrόnica (ímey)',
-'tooltip-t-upload' => 'Suve las dosyas por aquí',
+'tooltip-t-upload' => 'Suvir un archivo',
 'tooltip-t-specialpages' => 'Lista de todas las hojas especiales',
 'tooltip-t-print' => 'Forma apropiada para imprimir esta hoja',
 'tooltip-t-permalink' => 'Atamiento permanente a este enderechamiento de la hoja',
 'tooltip-ca-nstab-main' => 'Ve el artíkolo de contènido',
-'tooltip-ca-nstab-user' => 'Ve la hoja de usuario',
+'tooltip-ca-nstab-user' => 'Ver la pajina de usuario',
 'tooltip-ca-nstab-special' => 'Esta es una hoja especial, la hoja ya no se puede trocar',
 'tooltip-ca-nstab-project' => 'Ver la hoja del prodjekto',
 'tooltip-ca-nstab-image' => 'Ver la hoja de la dosya',
@@ -1311,7 +1444,7 @@ Puedes ver su manadero',
 'file-info-size' => '$1 × $2 píkseles; boy de la dosya: $3; tipo MIME: $4',
 'file-nohires' => 'No disponible a mayor resolución.',
 'svg-long-desc' => 'arxivo SVG, nominalmente $1 × $2 píkseles, boy del arxivo: $3',
-'show-big-image' => 'Archivo orijinal',
+'show-big-image' => 'Dosya orijinal',
 
 # Special:NewFiles
 'showhidebots' => '($1 bots)',
@@ -1351,7 +1484,7 @@ Los atamientos venideros que están en la misma liña se konsidheran como ekseps
 
 # Metadata
 'metadata' => 'Metadatos',
-'metadata-help' => 'Este arxivo contiene enformación adicional (metadatos), probablemente ajustada por la cámara digital, el escáner o el programa usado para crearlo o digitalizarlo. Si el arxivo fue modificado desde su estado original, puede aver perdido algunos detalyos.',
+'metadata-help' => 'Esta dosya contiene mas información (metadatos), probablemente ajustada por la kamera dizhital, el eskáner o la proǵrama kullaneado para criarlo o dizhitalizarlo. Si la dosya fue trocada de su estado orizhinal, puede aver pèryido algunos detalyos.',
 'metadata-expand' => 'Mostra los detalyos ekstendidos',
 'metadata-collapse' => 'Esconder los detalyos ekstendidos',
 'metadata-fields' => 'Los campos de metadatos que se listan en este messaje se van a amostrar en la hoja de la deskripsión de la foto daínda cuando la tabla de metadatos está cerrada.
@@ -1379,6 +1512,8 @@ Los otros campos se van a guardar por defecto.
 
 'exif-copyrighted-true' => 'Kon derechos del otor',
 
+'exif-componentsconfiguration-0' => 'no egziste',
+
 'exif-exposureprogram-1' => 'Giya',
 
 'exif-meteringmode-255' => 'Otro',
@@ -1409,7 +1544,7 @@ Los otros campos se van a guardar por defecto.
 'confirmemail' => 'Konfirmar adreso de korreo elektronika',
 'confirmemail_send' => 'Embiar el kodigo de konfirmasion.',
 'confirmemail_sent' => 'Konfirmasion de pósta embiada.',
-'confirmemail_success' => 'Su adreso de korreo elektronika a sido konfirmada. Agóra puedes registrarse e kolaborar en el wiki.',
+'confirmemail_success' => 'Su adreso de korreo elektronika a sido konfirmada. Agóra puedes [[Special:UserLogin|entrar]] e kolaborar en el wiki.',
 
 # Delete conflict
 'recreate' => 'Krear de muevo',
@@ -1429,6 +1564,9 @@ Los otros campos se van a guardar por defecto.
 'imgmultipagenext' => 'siguiente pajina →',
 'imgmultigo' => 'Ir!',
 
+# Language selector for translatable SVGs
+'img-lang-go' => 'Ir',
+
 # Table pager
 'table_pager_next' => 'Pajina siguiente',
 'table_pager_prev' => 'Pajina anterior',
@@ -1458,11 +1596,18 @@ Los otros campos se van a guardar por defecto.
 'version-specialpages' => 'Pajinas espesiales',
 'version-other' => 'Otros',
 'version-version' => '(Versión $1)',
+'version-ext-colheader-credits' => 'Otores',
 'version-poweredby-others' => 'otros',
 'version-software-version' => 'Versión',
 'version-entrypoints-header-url' => 'URL',
 
+# Special:Redirect
+'redirect-submit' => 'Ir',
+'redirect-value' => 'Valor:',
+'redirect-file' => 'Nombre de archivo',
+
 # Special:FileDuplicateSearch
+'fileduplicatesearch-filename' => 'Nombre de archivo:',
 'fileduplicatesearch-submit' => 'Bushkar',
 
 # Special:SpecialPages
@@ -1483,7 +1628,9 @@ Los otros campos se van a guardar por defecto.
 'tag-filter' => 'Filtro de [[Special:Tags|etiquetas]]:',
 'tag-filter-submit' => 'Filtro',
 'tags-active-yes' => 'Si',
+'tags-active-no' => 'No',
 'tags-edit' => 'trocar',
+'tags-hitcount' => '$1 {{PLURAL:$1|kambio|kambios}}',
 
 # Special:ComparePages
 'compare-page1' => 'Hoja 1',
@@ -1494,10 +1641,11 @@ Los otros campos se van a guardar por defecto.
 
 # HTML forms
 'htmlform-selectorother-other' => 'Otro',
+'htmlform-no' => 'No',
 'htmlform-yes' => 'Si',
 
 # New logging system
-'logentry-newusers-autocreate' => 'El cuento $1 fue crîado otomatika mente',
+'logentry-newusers-autocreate' => 'El cuento de usuario $1 fue {{GENDER:$2|kreado}} otomatikamente',
 'rightsnone' => '(dinguno)',
 
 # Feedback
index 311d322..19c4b9e 100644 (file)
@@ -1020,6 +1020,7 @@ Si gouf anscheinend geläscht.",
 'content-not-allowed-here' => '"$1"-Inhalt ass op der Säit [[$2]] net erlaabt',
 'editwarning-warning' => 'Wann Dir dës Säit verloosst kann dat dozou féieren datt Dir all Ännerungen, déi Dir gemaach hutt, verléiert.
 Wann Dir ageloggt sidd, kënnt Dir dës Warnung an der Sektioun "Änneren" vun Ären Astellungen ausschalten.',
+'editpage-notsupportedcontentformat-text' => 'De Format vum Inhalt $1 gëtt net vum Modell vum Inhalt $2 ënnerstëtzt.',
 
 # Content models
 'content-model-wikitext' => 'Wikitext',
@@ -1054,6 +1055,9 @@ Et däerfen net méi wéi $2 {{PLURAL:$2|Ufro|Ufroe}} sinn, aktuell {{PLURAL:$2|
 'cantcreateaccount-text' => 'D\'Opmaache vu Benotzerkonten vun dëser IP Adress (\'\'\'$1\'\'\') gouf vum [[User:$3|$3]] gespaart.
 
 De Benotzer $3 huet "$2" als Grond uginn.',
+'cantcreateaccount-range-text' => "D'Uleeë vu Benotzerkonte vun IP-Adressen aus dem Beräich \"\$1\", zu deem Är IP-Adress ('''\$4''') gehéiert, gouf vum [[User:\$3|\$3]] gespaart.
+
+De Grond den den \$3 uginn huet ass ''\$2''",
 
 # History pages
 'viewpagelogs' => 'Logbicher fir dës Säit weisen',
@@ -1319,7 +1323,6 @@ Detailer fannt Dir am [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}
 'rows' => 'Zeilen',
 'columns' => 'Kolonnen',
 'searchresultshead' => 'Sichen',
-'resultsperpage' => 'Zuel vun de Resultater pro Säit:',
 'stub-threshold' => 'Maximum (a Byte) bei deem e Link nach ëmmer am <a href="#" class="stub">Skizze-Format</a> gewise gëtt:',
 'stub-threshold-disabled' => 'Desaktivéiert',
 'recentchangesdays' => 'Deeg déi an de Rezenten Ännerungen ugewise ginn:',
@@ -2589,6 +2592,7 @@ $1',
 Kuckt d'[[Special:BlockList|Spär-Lëscht]] fir all Spären nozekucken.",
 'ipb-blockingself' => 'Dir sidd am gaang Iech selwer ze spären! Sidd Dir sécher datt Dir dat maache wëllt?',
 'ipb-confirmhideuser' => 'Dir sidd am Gaang e Benotzer ze späre mat der Funktioun "Benotzer verstoppen" ageschalt. Dëst hëlt den Numm vum Benotzer aus alle Lëschten a Logbicher eraus. Sidd Dir sécher datt Dir dat maache wëllt?',
+'ipb-confirmaction' => 'Wann Dir sécher sidd datt Dir dat wierklech maache wëllt da markéiert w.e.g. d\'"{{int:ipb-confirm}}" hei drënner.',
 'ipb-edit-dropdown' => 'Spärgrënn änneren',
 'ipb-unblock-addr' => 'Spär vum $1 ophiewen',
 'ipb-unblock' => 'Spär vun enger IP-Adress oder engem Benotzer ophiewen',
@@ -3138,7 +3142,7 @@ Duerch d'Opmaache vum Fichier kann Äre System beschiedegt ginn.",
 'minutes' => '{{PLURAL:$1|enger Minutt|$1 Minutten}}',
 'hours' => '{{PLURAL:$1|enger Stonn|$1 Stonnen}}',
 'days' => '{{PLURAL:$1|engem Dag|$1 Deeg}}',
-'weeks' => '{{PLURAL: $1|eng Woch|$1 Wochen}}',
+'weeks' => '{{PLURAL:$1|eng Woch|$1 Wochen}}',
 'months' => '{{PLURAL:$1|ee Mount|$1 Méint}}',
 'years' => '{{PLURAL:$1|ee Joer|$1 Joer}}',
 'ago' => 'viru(n) $1',
@@ -3496,8 +3500,8 @@ Déi aner sinn am Standard verstoppt.
 'exif-gpslongitude-w' => 'westlech Längt',
 
 # Pseudotags used for GPSAltitudeRef
-'exif-gpsaltitude-above-sealevel' => '$1 {{PLURAL:$1|Meter|Meter}} iwwer dem Niveau vum Mier',
-'exif-gpsaltitude-below-sealevel' => '$1 {{PLURAL:$1|Meter|Meter}} ënner dem Niveau vum Mier',
+'exif-gpsaltitude-above-sealevel' => '$1 {{PLURAL:$1|Meter}} iwwer dem Niveau vum Mier',
+'exif-gpsaltitude-below-sealevel' => '$1 {{PLURAL:$1|Meter}} ënner dem Niveau vum Mier',
 
 'exif-gpsstatus-a' => 'Miessung am Gaang',
 'exif-gpsstatus-v' => 'Interoperabilitéit vu der Miessung',
@@ -3741,7 +3745,14 @@ Dir kënnt och [[Special:EditWatchlist|de Standard Editeur benotzen]].",
 'version-hook-name' => 'Numm vun der Klamer',
 'version-hook-subscribedby' => 'Opruff vum',
 'version-version' => '(Versioun $1)',
-'version-license' => 'Lizenz',
+'version-license' => 'MediaWiki-Lizenz',
+'version-ext-license' => 'Lizenz',
+'version-ext-colheader-name' => 'Erweiderung',
+'version-ext-colheader-version' => 'Versioun',
+'version-ext-colheader-license' => 'Lizenz',
+'version-ext-colheader-description' => 'Beschreiwung',
+'version-ext-colheader-credits' => 'Auteuren',
+'version-license-title' => 'Lizenz fir $1',
 'version-poweredby-credits' => "Dës Wiki funktionéiert mat '''[https://www.mediawiki.org/ MediaWiki]''', Copyright © 2001-$1 $2.",
 'version-poweredby-others' => 'anerer',
 'version-poweredby-translators' => 'translatewiki.net Iwwersetzer',
index eba2499..503787f 100644 (file)
@@ -630,7 +630,6 @@ $messages = array(
 'rows' => 'ЦIарар',
 'columns' => 'Гулар:',
 'searchresultshead' => 'Ахтармишун',
-'resultsperpage' => 'Са ччиниз талукь тир жагъанвай нетижаяр',
 'stub-threshold-disabled' => 'Галуднава',
 'timezonelegend' => 'Вахтунин минзил',
 'localtime' => 'Чкадин вахт',
index 89562eb..0e0a733 100644 (file)
@@ -1154,7 +1154,6 @@ Mèrk op dat hun indexe van {{SITENAME}} content e bietje gedatierd kint zien.',
 'rows' => 'Regels',
 'columns' => 'Kolomme',
 'searchresultshead' => 'Insjtèllinge veur zeukresultate',
-'resultsperpage' => 'Aantal te tuine zeukresultate per pagina',
 'stub-threshold' => 'Drempel veur markering <a href="#" class="stub">begske</a>:',
 'stub-threshold-disabled' => 'Oetgezatj',
 'recentchangesdays' => 'Aantal daag te tuine in de recènte verangeringe:',
index 0d21e12..c9a6c61 100644 (file)
@@ -255,7 +255,7 @@ $messages = array(
 'aboutsite' => 'دباره {{SITENAME}}',
 'aboutpage' => 'پروجه:دباره',
 'copyright' => 'محتوا د دسرس هئ سی $1 مر وه شلک هنی نوشته بوئه',
-'copyrightpage' => '{{ns:پروجه}}:کپی رایت',
+'copyrightpage' => '{{ان اس:پروجه}}:کپی رایت',
 'currentevents' => 'پيشومدل تازه باو',
 'currentevents-url' => 'پروجه:پيشومدل تازه باو',
 'disclaimers' => 'منكرون',
@@ -326,7 +326,12 @@ $1',
 
 # Main script and global functions
 'nosuchaction' => 'چنو كاری وجود ناره',
+'nosuchactiontext' => 'کاری که وا یو آر ال مشقص بیه معتور نئ.
+شایت شما یو آر ال نه دروس ننشتیته، یا یه گل هوم پیوند نادرست وارد بیه.
+وه شاید وه یه گل باگ د نرم افزار استفاده بیه وا {{نوم مالگه}} هشاره داشتوه.',
 'nosuchspecialpage' => 'چنو بلگه خاصی وجود ناره',
+'nospecialpagetext' => '<strong>شما سی یه گل بلگه نامعتور درحاست داشتیته.</strong>
+یه گل نوم گه سی  اعتوار بلگه یا بوئه د [[ویجه:بلگه یا ویجه|{{رقم:بلگه یا ویجه}}]] پیدا با.',
 
 # General errors
 'error' => 'خطا',
@@ -339,10 +344,13 @@ $1',
 'laggedslavemode' => 'زنهار:بلگه شايت شومل روزامديا تازه باو نبوئه',
 'readonly' => 'جاگه دونسمنيا بسه بيه',
 'enterlockreason' => 'دلیل قلف کردن نه بنیست،یه وختی سی وا کردن قلف د ویر داشتویت.',
-'missing-article' => 'پاگا داده نتونه بلگه ای با پیدا بکه بجوره.که نومش $1 و $2 هئ.
+'readonlytext' => 'پایگا دونسمنیا ایسه سی دئن ورودی یا تازه یا آلشتگریا هنی قلف بیه،شایت سی منن معمولی پایگا دونسمنی نها وه که ورئرده وه حالت عادیش.
+مدیری که ونه قلف کرده ونه گوته:$1',
+'missing-article' => 'پاگا دونمسمنی نتونه بلگه ای با پیدا بکه بجوره.که نومش $1 و $2 هئ.
 معمولند یه سی یه که فرخ ویرگار رئته دش بیه پاک بیه.',
 'missingarticle-rev' => '(دوواره ديئن#: $1)',
 'missingarticle-diff' => '(فرخ: $1، $2)',
+'readonly_lag' => 'ای پاگا دونسمنی قلف بیه تا اوسه که سرور پایگا دونسمنیا وه مینجاون برسه.',
 'internalerror' => 'خطا داخلی',
 'internalerror_info' => 'خطا داخلی:$1',
 'fileappenderrorread' => 'نبوئه $1 نه اوسه که پیوست بوئه بحونیت.',
@@ -356,13 +364,19 @@ $1',
 'unexpected' => 'ارزایشت ناحاسته: "$1"="$2".',
 'formerror' => 'خطا:نبوئه فرم وه مو بئيت',
 'badarticleerror' => 'ای انجوم دئنی د ای بلگه انجوم نگره.',
+'cannotdelete' => 'بلگه یا فایل$1 نبوئه پاک با.
+شایت یه ایسه وا کسی هنی پاک بیه.',
 'cannotdelete-title' => 'نبوئه بلگه $1 حذف بو',
+'delete-hook-aborted' => 'پاک بیئن وا قلاو جلوگری بیه.
+هیچ توضیئ سیش نئ.',
+'no-null-revision' => 'سی بلگه$1 دوواره خنثی دیئن راس بکید',
 'badtitle' => 'موضو گن',
 'badtitletext' => 'عنوان بلگه حاسته بیه معتور نی،یا  یه گل مئن زونی یا مئن ویکی عنوان غلطه.
 یه شایت شومل یکی با یا بیشتر کاراکتریا نبوئه سی ای موضوعیا استفاده بوئن',
 'viewsource' => 'سرچشمه نه بوينيت',
 'viewsource-title' => 'سرچشمه $1 بوينيت',
 'actionthrottled' => 'عمل جلوگئری بیه',
+'protectedpagetext' => 'دای بلگه نبوئه ویرایشت یا کاریا هنی بکید',
 'viewsourcetext' => 'شما تونیت سرچشمه ای بلگه نه بوینیت و دش ورداریت:',
 'viewyourtext' => 'شما تونیت سرچشمه ویرایشتیا تونه ای د بلگه بوینیت و دشو ورداریت',
 'mycustomcssprotected' => 'شما حق ناریت ای بلگه سی اس اس نه ویرایشت بکید',
@@ -460,12 +474,15 @@ $1',
 'noemail' => 'هیچ نشونی ایمیلی سی کارور $1 ضفط نبیه.',
 'noemailcreate' => 'شما باید یه نشونی نومه معتور فراهم بکید',
 'mailerror' => 'خطا داره کل موئه:$1',
+'emailauthenticated' => 'نشونی ایمیلتو د $2 سی 3$ مئکم بیه.',
 'emailconfirmlink' => 'نشونی ايملتو نه محكم بكيد',
 'cannotchangeemail' => 'نشونی ایمیل حساو نتونه د ای ویکی آلشت بوئه.',
 'emaildisabled' => 'ای مالگه نتونه ایمیل بفرسنه',
 'accountcreated' => 'حساو راس بی',
 'createaccount-title' => 'حساو راس کرده سی  {{SITENAME}}',
 'usernamehasherror' => 'نوم کاربری نتونه شومل نیسه یا هش بوئه',
+'login-throttled' => 'شما ایسنی فره سی وامین اومائن تلاش کردیته.
+$1 لطفن سی تلاش هنی صبر بکید',
 'login-abort-generic' => 'اومائن وامین تو شکست حرد-شکست حرده',
 'loginlanguagelabel' => 'زون:$1',
 
@@ -482,6 +499,7 @@ $1',
 'resetpass_submit' => 'پاسور بنیت و وامین بیایت',
 'changepassword-success' => 'پاسورد شما وا موفقیت آلشت بی',
 'resetpass_forbidden' => 'پاسوردیا نتونن آلشت بوئن',
+'resetpass-no-info' => 'شما با بیایت د سیستم تا د ای بلگه دسرسی داشتویت',
 'resetpass-submit-loggedin' => 'پاسورد نه آلشت بكيت',
 'resetpass-submit-cancel' => 'رد كردن',
 'resetpass-temp-password' => 'رمز موقت:',
@@ -572,6 +590,9 @@ $1',
    [{{fullurl:{{FULLPAGENAME}}|action=edit}} یای ای بلگه نه ویرایشت بکیدpage]</span>.',
 'noarticletext-nopermission' => 'د تازه یا د ای بلگه متن نی.
 شما تونید د[[Special:Search/{{PAGENAME}}|search for this page title]] بگردید د ای بلگه یا د بلگیا هنی یا<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}}   د هنی پی جوری بوئه  logs]</span>      اما شما حق ناریتو ای بلگه نه راس بکیت',
+'userpage-userdoesnotexist-view' => 'حساو کارور"$1" ثوت نبیه.',
+'blocked-notice-logextract' => 'ای کارور ایسنی دسرسی ناره.
+آخری نشون قلف ورودی د هار ایچه سی سرچشمه آماده بیه:',
 'updated' => '(تازه بيه)',
 'note' => "'''نيسنن:'''",
 'previewnote' => 'فقط ای پیش سیل د ویرتو با.
@@ -581,14 +602,28 @@ $1',
 'creating' => 'راس كردن $1',
 'editingsection' => 'د حال ویرایشت$1(بشخ)',
 'editingcomment' => 'د حال ویرایشت$1(بشخ تازه)',
+'editconflict' => 'تضاد د ویرایشت:$1',
+'explainconflict' => 'داوسه که شما شرو د ویرایشت ای بلگه کردیته، یه نفر هنی ای بلگه نه آلشت دئه.
+راساگه روئی متن بلگه متن نه چی یه که وجود داشتوه د ور میئره.
+آلشتیا شما د متن هاری نشو دئه هئ.
+شما با آلشتیاتونه د متن که هئش یکی بکید.
+فقط متنی که ها د رو د وختی که شما"{{رقم:ذخیره گوتار}}" نه گزارشت می کید ذخیره بوئه',
 'yourtext' => 'متن شما',
+'storedversion' => 'دوواره دیئن انبار بیه.',
 'yourdiff' => 'فرخيا',
 'templatesused' => '{{جمی:$1|قالو|قالویا}}د ای بلگه استفاده بیه:',
+'templatesusedpreview' => '{{جمی:$1|قالو|قالویا}}استفاده بیه د ای پیش سیل:',
+'templatesusedsection' => '{{جمی:$1|قالو|قالویا}} استفاده بیه د ای بخش:',
 'template-protected' => '(حمايت بيه)',
 'template-semiprotected' => '(نيم-حفاظت بيه)',
 'hiddencategories' => 'ای بلگه يه اندوم د{{PLURAL:$1|1 hidden category|$1 hidden categories}}: هئ',
+'nocreatetext' => '{{نوم مالگه}} سی راس کردن بلگه یا تازه محدود بیه.
+شما تونید روئیت وادما و بلگه ای که هئیش ویرایشت بکید ، یا [[ویجه:وامین اومائن کارور|بیایت وامین یا یه گل حساو بسازیت]].',
+'nocreate-loggedin' => 'شما حق ناریت  که بلگه یا تازه نه راس بکید.',
 'sectioneditnotsupported-title' => 'ویرایشت بخش حمایت نبوئه',
+'sectioneditnotsupported-text' => 'ویرایشت بشقی د ای بلگه نئیش.',
 'permissionserrors' => 'خطا اجازه دئین',
+'permissionserrorstext' => 'شما حق ناریت ونه انجوم بیئت, سی{{جمی:$1|دلیل|دلیلیا}} نهایی:',
 'permissionserrorstext-withaction' => 'شما سی $2 اجازه ناریت
 سی دمال کردن{{PLURAL:$1|reason|reasons}}:',
 'recreate-moveddeleted-warn' => "'''زنهار شما بلگه ای که وادما پاک بیه هنی راس کردیته'''
@@ -598,7 +633,10 @@ $1',
 پاک بین و جمشت ای بلگه سی سرچشمه دئین فراهم بیه',
 'edit-conflict' => 'مخالفت نه ویرایشت بکید',
 'postedit-confirmation' => 'ویرایشتتو ذخیره بی',
+'edit-already-exists' => 'نبوئه یه گل بلگه تازه راس بکید.
+وه هئیش.',
 'defaultmessagetext' => 'متن پیغوم پیش فرض',
+'content-failed-to-parse' => 'د یک تیچیسن چیا مئن $2 د مدل $1:$3',
 
 # Content models
 'content-model-wikitext' => 'ويكی متن',
@@ -612,12 +650,14 @@ $1',
 'post-expand-template-argument-warning' => 'زنهار ای بلگه شومل حداقل یه قالو سی چک چنه یه که انازه فره گپه.
 گپسنیا پاک بینه.',
 'post-expand-template-argument-category' => 'بلگه شومل قالو چک چنیا د بین رئته',
+'parser-template-loop-warning' => 'حلقه قالو کشف بیه:[[$1]]',
 
 # Account creation failure
 'cantcreateaccounttitle' => 'نبوئه حساو راس بکید',
 
 # History pages
 'viewpagelogs' => 'سی ای بلگه بوینتو.',
+'nohistory' => 'هیچ ویرگار ویرایشتی د ای بلگه نئ.',
 'currentrev' => 'آخرین دوواره دیئن',
 'currentrev-asof' => 'آخرين دووار ديئن چی $1',
 'revisionasof' => 'دوواره ديئن $1',
@@ -636,19 +676,30 @@ $1',
 'history-show-deleted' => 'فقط پاك بيه',
 'histfirst' => 'قديمي تري',
 'histlast' => 'تازه تري',
+'historysize' => '({{جمی:$1|1 بایت|$1 بایتیا}})',
 'historyempty' => '(حالی)',
 
 # Revision feed
 'history-feed-title' => 'ویرگار دوواره دیئن',
+'history-feed-description' => 'دوواره دیئن ویرگار سی بلگه د ویکی',
 'history-feed-item-nocomment' => '$1 د
 $2',
+'history-feed-empty' => 'بلگه حاسته بیه وجود ناره.
+شایت وه د ویکی پاک بیه، یا نومش آلشت بیه.
+سی بلگیا مرتوط تازه [[ویجه:پی جوری|پی جوری د ویکی]] کوششت بکید.',
 
 # Revision deletion
+'rev-deleted-comment' => '(ویرایشت چکسته جا وه جا بیه)',
 'rev-deleted-user' => '(نوم کاروری جا وه جا بیه)',
+'rev-deleted-user-contribs' => '[نوم کاروری یا نشونی آی پی جا وه جا بیه - چیا قام بیه د ور هوم یاریانه ویرایشت بکید]',
 'rev-delundel' => 'آلشت وضئيت ديئن',
 'rev-showdeleted' => 'نشو دائن',
 'revdelete-show-file-submit' => 'هری',
+'revdelete-hide-text' => 'متن دوواره دیئن',
+'revdelete-hide-image' => 'چی یا مئن فایل قام کو',
+'revdelete-hide-name' => 'آرمون و انجوم گر نه قام بکید',
 'revdelete-hide-comment' => 'چکسه نه ویرایشت بکید',
+'revdelete-hide-user' => 'نوم کاروری ویرایشتگر/نشونی آی پی',
 'revdelete-radio-same' => 'آلشت نکید',
 'revdelete-radio-set' => 'قام بیه',
 'revdelete-radio-unset' => 'دیینی',
@@ -661,8 +712,12 @@ $2',
 'revdelete-edit-reasonlist' => 'دلیلیا پاک کردنه نه ویرایشت بکید',
 
 # History merging
+'mergehistory' => 'ویرگاریا بلگه نه یکی بکید',
 'mergehistory-from' => 'بلگه سرچشمه:',
 'mergehistory-into' => 'بلگه مقصد:',
+'mergehistory-no-source' => 'سرچشمه بلگه $1 وجود ناره.',
+'mergehistory-autocomment' => ' [[:$1]]وا[[:$2]] یکی بیه',
+'mergehistory-comment' => ' [[:$1]]وا[[:$2]] یکی بیه:$3',
 'mergehistory-reason' => 'دليل:',
 
 # Merge log
@@ -670,6 +725,7 @@ $2',
 
 # Diffs
 'history-title' => 'دوواره دیئن ویرگار$1',
+'difference-multipage' => '(فرخ مینجا بلگه یا)',
 'lineno' => 'خط $1:',
 'compareselectedversions' => 'دوبار دیئنیایی که انتخاو بینه مقایسه بکیتو',
 'editundo' => 'رد كردن',
@@ -684,7 +740,7 @@ $2',
 'nextn' => 'نيايی {{PLURAL:$1|$1}}',
 'prevn-title' => 'پيشتر $1 {{PLURAL:$1|نتيجه|نتيجيا}}',
 'nextn-title' => 'نيايی $1 {{PLURAL:$1|نتيجه|نتيجيا}}',
-'shown-title' => 'نشون دئن $1 {{PLURAL:$1|نتيجه|نتيجه}} سی هر بلگه',
+'shown-title' => 'نشون دئن $1 {{جمی:$1|نتيجه|نتيجه}} سی هر بلگه',
 'viewprevnext' => 'ديئن ($1 {{int:pipe-separator}} $2) ($3)',
 'searchmenu-exists' => "'''ایچه بلگه ای هئ وه نوم\"[[:\$1]]\" که ها د ای ویکی'''",
 'searchmenu-new' => "'''ای بلگه نه راس كو \"[[:\$1]]\" د ای  ويكي!'''",
@@ -698,18 +754,22 @@ $2',
 'searchprofile-images-tooltip' => 'بگرد سی فايليا',
 'searchprofile-everything-tooltip' => 'همه محتوا نه پی جوری كو (شاملا بلگيا چك چنه)',
 'searchprofile-advanced-tooltip' => 'نوم جايا نوم ديار بگرد',
-'search-result-size' => '$1 ({{PLURAL:$2|بی واچه يل|واچه تكی|واچه يل|$2 واچه يل|$2 واچه}})',
-'search-result-category-size' => '{{جمی:$1|1 اندوم|$1 اندومیا}} ({{جمی:$2|1 زیردسه|$2 زیردسه یا}}, {{جمی:$3|1 فایل|$3 فایلیا}})',
+'search-result-size' => '$1 ({{جمی:$2|بی واچه يل|واچه تكی|واچه يل|$2 واچه يل|$2 واچه}})',
+'search-result-category-size' => '{{جمی:$1|1 اندوم|$1 اندومیا}} ({{جمی:$2|1 زیردسه|$2 زیردسه یا}}, {{جمی:$3|1 فایل|$3 فایلیا}}',
 'search-redirect' => '(ورگشتن $1)',
 'search-section' => '(بشق $1)',
 'search-suggest' => 'منظورت يه بی:$1',
+'search-interwiki-caption' => 'پروجه یا خوئر',
+'search-interwiki-default' => '$1 نتیجه یا:',
 'search-interwiki-more' => '(بیشتر)',
 'search-relatedarticle' => 'مرتوط',
+'searcheverything-enable' => 'همه نوم جايا نوم ديار بگرد',
 'searchrelated' => 'مرتوط',
 'searchall' => 'همه',
 'showingresultsheader' => "{{PLURAL:$5|نتيجه '''$1''' د'''$3'''|نتيجه يا '''$1 - $2''' د'''$3'''}} سيli'''$4'''",
 'search-nonefound' => 'هیژ نتیجه یی سی پی جست تو مطاوقت نکرده',
 'powersearch-legend' => 'پی جوری پیشبرده',
+'powersearch-ns' => 'نوم جايا نوم ديار بگرد:',
 'powersearch-togglelabel' => 'چك كردن:',
 'powersearch-toggleall' => 'همه',
 'powersearch-togglenone' => 'هيش كوم',
@@ -726,20 +786,27 @@ $2',
 'prefs-personal' => 'پروفایل کارور',
 'prefs-rc' => 'آلشتیا تازه باو',
 'prefs-watchlist' => 'سیل برگ',
+'prefs-watchlist-days' => 'روزیا نه د سیل برگ نشو دئه بو:',
+'prefs-watchlist-edits-max' => 'فره تری شماره:1000',
 'prefs-misc' => 'شيوسن',
 'prefs-resetpass' => 'پاسورد نه آلشت بكيت',
 'prefs-changeemail' => 'نشونی ایمیل تو نه آلشت بکید',
+'prefs-setemail' => 'يه گل ايميل بنیت',
+'prefs-rendering' => 'شلک و ری',
 'saveprefs' => 'ذخيره كردن',
 'prefs-editing' => 'د حالت ويرايشت',
 'rows' => 'رديفيا:',
 'columns' => 'ستينا:',
 'searchresultshead' => 'پی جوری',
 'stub-threshold-disabled' => 'د كار ونن',
+'recentchangesdays' => 'روزیا آلشتیا تازه باو نه نشو بیه:',
+'recentchangesdays-max' => 'فره ترین $1 {{جمی:$1|روز|روزیا}}',
 'savedprefs' => 'ویجه گیا هنی تو ذخیره بیه.',
 'timezonelegend' => 'وخت راساگه',
 'localtime' => 'وخت ولاتی:',
 'timezoneuseserverdefault' => 'وخت راساگه',
 'servertime' => 'وخت سرور:',
+'guesstimezone' => 'وا جاگرد پر بوئه',
 'timezoneregion-africa' => 'افرقا',
 'timezoneregion-america' => 'امركا',
 'timezoneregion-antarctica' => 'قطو هار ونه',
@@ -750,16 +817,22 @@ $2',
 'timezoneregion-europe' => 'اوروپا',
 'timezoneregion-indian' => 'جهوناو هند',
 'timezoneregion-pacific' => 'جهوناو آروم',
+'allowemail' => 'ایمیل سی کاروریا هنی فعال کو',
 'prefs-searchoptions' => 'پی جوری',
 'prefs-namespaces' => 'نوم جایا',
 'default' => 'پيش فرض',
 'prefs-files' => 'فايلا',
 'prefs-emailconfirm-label' => 'مئکم کردن ایمیل:',
 'youremail' => 'ايميل:',
+'username' => '{{جنس:$1|نوم کاروری}}:',
+'uid' => '{{جنس:$1|کارور}}آی دی:',
+'prefs-memberingroups' => '{{جنس:$2|اندوم}}  {{جمی:$1|گرویا|گرویا}}:',
 'prefs-registration' => 'موقع ثوت نام:',
 'yourrealname' => 'نوم راستكی:',
 'yourlanguage' => 'زون:',
+'yourvariant' => 'محتوا آلشتگر زون:',
 'yournick' => 'امضا تازه:',
+'yourgender' => 'شما بیشتر میهایت که چه جوری گوته بوئه؟',
 'gender-unknown' => 'مه میهام چی یی نموئم',
 'gender-male' => 'وه(پیا) بلگه یا ویکی نه ویرایشت می که',
 'gender-female' => 'وه(زئنه)بلگه یا ویکی نه ویرایشت می که',
@@ -771,10 +844,23 @@ $2',
 'prefs-info' => 'دونسمنیا اولیه',
 'prefs-i18n' => 'جهون ولاتمنی',
 'prefs-signature' => 'امضا',
+'prefs-dateformat' => 'شلک وخت',
+'prefs-advancedediting' => 'گزینه یا عمومی',
 'prefs-editor' => 'ويرايشتگر',
 'prefs-preview' => 'پیش سیل',
+'prefs-advancedrc' => 'گزینه یا پیشکرده',
+'prefs-advancedrendering' => 'گزینه یا پیشکرده',
+'prefs-advancedsearchoptions' => 'گزینه یا پیشکرده',
+'prefs-advancedwatchlist' => 'گزینه یا پیشکرده',
+'prefs-displayrc' => 'گزینه یا نه نشو بیه',
+'prefs-displaysearchoptions' => 'گزینه یا نه نشو بیه',
+'prefs-displaywatchlist' => 'گزینه یا نه نشو بیه',
 'prefs-diffs' => 'فرخیا',
 
+# User preference: email validation using jQuery
+'email-address-validity-valid' => 'نشونی ایمیل دیار بیه خوئه',
+'email-address-validity-invalid' => 'یه گل نشونی ایمیل خو وارد بکید',
+
 # User rights
 'userrights-user-editname' => 'نوم كاروری ته وارد كو',
 'editusergroup' => 'ویرایشت گرویا کاروری',
@@ -802,7 +888,26 @@ $2',
 # Rights
 'right-read' => 'حنن بلگیا',
 'right-edit' => 'ویرایشت بلگیا',
+'right-move' => 'بلگه یا جا وه جا کو',
+'right-move-subpages' => 'بلگه یا و زیر بلگه یا شونه جا وه جا کو',
+'right-move-rootuserpages' => 'بلگه یا ریشه ای کارور نه جا وه جا کو',
+'right-movefile' => 'فایلیا نه جا وه جا کو',
+'right-upload' => 'سوار کردن فايلا',
 'right-delete' => 'بلگیا نه پاک کو',
+'right-browsearchive' => 'بلگه یا پاک بیه نه پی جوری کو',
+'right-undelete' => 'ای بلگه نه حذف نكيد',
+'right-editinterface' => 'راوط کارور نه ویرایشت کو',
+'right-editusercssjs' => 'فایلیا جاوا اسکریپت و سی اس اس کاروریا هنی نه ویرایشت کو',
+'right-editusercss' => 'فایلیا سی اس اس کاروریا هنی نه ویرایشت کو',
+'right-edituserjs' => 'فایلیا جاوا اسکریپت کاروریا هنی نه ویرایشت کو',
+'right-editmyusercss' => 'فایلیا سی اس اس کارور خوتو نه ویرایشت کو',
+'right-editmyuserjs' => 'فایلیا جاوا اسکریپت کارور خوتو نه ویرایشت کو',
+'right-viewmywatchlist' => 'سیل برگ خوتونه بوینیت',
+'right-viewmyprivateinfo' => 'دونسمنیا شصقی خوتونه بوینیت(چی نشونی ایمیل،نوم راستکی)',
+'right-editmyprivateinfo' => 'دونسمنیا شصقی خوتونه ویرایشت بکید(چی نشونی ایمیل،نوم راستکی)',
+'right-siteadmin' => 'پاگا دونسمنی نه قلف بکید یا نکید',
+'right-sendemail' => 'سی کاروریا هنی ایمیل کل بکید',
+'right-passwordreset' => 'پاسورد ایمیلیا د نو دئه بیه نه بوینیت',
 
 # Special:Log/newusers
 'newuserlogpage' => 'راس بیه وا کارور',
@@ -811,14 +916,34 @@ $2',
 'action-read' => 'ای بلگه نه بحون',
 'action-edit' => 'ای بلگه نه ويرايشت بكيد',
 'action-createpage' => 'راس کردن بلگیا',
+'action-createtalk' => 'بلگه یا چک چنه نه راس بکید',
+'action-createaccount' => 'حساو ای کارور نه راس بکید',
+'action-minoredit' => 'ای ویرایشت نه چی یه حیرده ویرایشت نشو بیئت',
 'action-move' => 'لی بلگه جا وه جا کو',
+'action-move-subpages' => 'ای بلگه و زیر بلگه یاشه جا وه جا بکید',
+'action-move-rootuserpages' => 'بلگه یا ریشه ای کارور نه جا وه جا بکید',
+'action-movefile' => 'ای فایل جا وه جا بکید',
+'action-upload' => 'ای فایل سوار بکید',
+'action-upload_by_url' => 'ای فایله نه د یو آر ال سوار بکید',
+'action-writeapi' => 'د نیسنن ای پی آی استفاده بکید',
 'action-delete' => 'ای بلگه نه پاک کو',
 'action-deleterevision' => 'ای بازدئین پاک کو',
+'action-deletedhistory' => 'ویرگار پاک بیه ای بلگه نه بوینیت',
+'action-browsearchive' => 'بلگه یا پاک بیه نه پی جوری بکید',
 'action-undelete' => 'ای بلگه نه پاک نکو',
+'action-block' => 'ای کارور نه د ویرایشت کردن منع کو',
+'action-import' => 'بلگه یا نه د ویکی هنی وارد بکید',
+'action-importupload' => 'بلگه یا نه د فایل سوار بیه وارد بکید',
+'action-siteadmin' => 'پاگا دونسمنی نه قلف بکید یا نکید',
 'action-sendemail' => 'ایمیلیانه کل کو',
+'action-editmywatchlist' => 'سیل برگ خوتونه ویرایشت بکید',
+'action-viewmywatchlist' => 'سیل برگ خوتونه بوینیت',
+'action-viewmyprivateinfo' => 'دونسمنیا خوتونه بوینیت',
+'action-editmyprivateinfo' => 'دونسمنیا شصقی خوتونه ویرایشت بکید',
 
 # Recent changes
 'nchanges' => '$1 {{جمی:$1|آلشت|آلشتیا}}',
+'enhancedrc-since-last-visit' => '$1 {{جمی:$1|د آخری دیئن}}',
 'enhancedrc-history' => 'ويرگار',
 'recentchanges' => 'تغيريا تازه',
 'recentchanges-legend' => 'گزينه يا آلشتيا تازه',
@@ -827,6 +952,7 @@ $2',
 'recentchanges-label-minor' => 'يه ويرايشت كؤچكيه',
 'recentchanges-label-bot' => 'ای ويرايشت نه يه بوت انجوم ديئه',
 'recentchanges-label-unpatrolled' => 'ای ويرايشت هنی تيه واداشت نبيه',
+'recentchanges-legend-newpage' => '(همچنو بوینیت [[ویجه:بلگیا تازه|نوم گه بلگیا تازه]])',
 'rcnotefrom' => 'د هار آلشتیا د $2 هیئن(د بال د $1 نشون دئه بیه)',
 'rclistfrom' => 'آلشتیا تازه ایی که وا $1 شرو بیه نشونش بئه',
 'rcshowhideminor' => 'ويرايشتيا کؤچک $1',
@@ -843,12 +969,18 @@ $2',
 'minoreditletter' => 'م',
 'newpageletter' => 'ن',
 'boteditletter' => 'ب',
+'number_of_watching_users_pageview' => '[$1 دینه {{جمی:$1|کارور|کاروریا}}]',
+'rc_categories' => 'دسه یا نه محدود کو(وا "|" جگا بوئن',
 'rc_categories_any' => 'هرکوم',
+'rc-change-size-new' => '$1 {{جمی:$1|بایت|بایتیا}} نها آلشت',
+'newsectionsummary' => '/* $1 */ بخش تازه',
 'rc-enhanced-expand' => 'جزيات نشون بيئه',
 'rc-enhanced-hide' => 'جزياته قام كو',
+'rc-old-title' => 'ذاتا چی "$1" راس بیه',
 
 # Recent changes linked
 'recentchangeslinked' => 'تغيريا مرتبط',
+'recentchangeslinked-feed' => 'آلشتیا مرتبط',
 'recentchangeslinked-toolbox' => 'تغيريا مرتبط',
 'recentchangeslinked-title' => 'آلشتيا مرتوط وا $1',
 'recentchangeslinked-summary' => 'ای نوم گه تازه د بلگیایی که وا بلگیا ویجه هوم پیوند بینه آلشت بیه(یا سی اندومیا دسه بنی بیه)
@@ -860,17 +992,34 @@ $2',
 'upload' => 'بلم گير كردن فايلا',
 'uploadbtn' => 'سوار کردن فایل',
 'uploadnologin' => 'وارد نبیه',
+'uploadnologintext' => 'لطفن $1 سی سوارکرد فایلیا.',
 'uploaderror' => 'خطا د سوار کردن',
 'uploadlogpage' => 'سوارکرد',
 'filename' => 'نوم فایل',
 'filedesc' => 'چكسته',
 'fileuploadsummary' => 'چکسه',
 'filesource' => 'سرچشمه:',
+'uploadedfiles' => 'فایلیا سواربیه',
+'unknown-error' => 'یه گل خطا ناشناس ری ون کرده.',
+'savefile' => 'فایل نه ذخیره کو',
 'uploadedimage' => 'سوارکرد"[[$1]]"',
 'upload-source' => 'سرچشمه فایل',
+'sourcefilename' => 'سرچشمه نوم فایل:',
+'sourceurl' => 'سرچشمه يو آر ال:',
+'watchthisupload' => 'ای فایل بوینیت',
+'upload-success-subj' => 'سوار کرد خوش سرانجوم',
+'upload-failure-subj' => 'مشگل د سوارکردن',
+
+'upload-file-error' => 'خطا داخلی',
+'upload-unknown-size' => 'انازه نادیار',
 
 # img_auth script messages
 'img-auth-accessdenied' => 'دسرسی منع بی',
+'img-auth-nofile' => 'فایل $1 وجود ناره.',
+
+# HTTP errors
+'http-invalid-url' => 'یو آر ال نامعتور:$1',
+'http-read-error' => 'خطا د حنن اچ تی تی پی.',
 
 'license' => 'ليانس دار بيئن',
 'license-header' => 'د شكل ليسانس دار بيئن',
@@ -907,10 +1056,18 @@ $2',
 'nolinkstoimage' => 'ایچه هیژ بلگه ای سی هوم پیوند بیئن وا ای فایل نی',
 'sharedupload-desc-here' => 'فایلی که د $1 شایت د مئن پروجیا هنی استفاده بیه.
 توضی دباره[$2 file description page] د هار نشو دئئه بیه',
+'shared-repo-from' => 'د $1',
+
+# File reversion
+'filerevert-comment' => 'دليل:',
+'filerevert-submit' => 'ورگنین',
 
 # File deletion
 'filedelete-comment' => 'دليل:',
 'filedelete-submit' => 'پاك كردن',
+'filedelete-nofile' => "'''$1''' وجود ناره.",
+'filedelete-reason-otherlist' => 'دليل هنی',
+'filedelete-edit-reasonlist' => 'دلیلیا پاک کردنه نه ویرایشت بکید',
 
 # MIME search
 'download' => 'گرتن',
@@ -926,6 +1083,9 @@ $2',
 
 # Statistics
 'statistics' => 'آماريا',
+'statistics-header-pages' => 'بلگه آماریا',
+'statistics-header-edits' => 'آماریا نه ویرایشت بکید',
+'statistics-header-views' => 'آماریا نه بوینیت',
 'statistics-pages' => 'بلگیا',
 'statistics-users-active' => 'کاروریا کارکو',
 
@@ -938,7 +1098,8 @@ $2',
 'withoutinterwiki-submit' => 'نشون دائن',
 
 # Miscellaneous special pages
-'nbytes' => '$1{{PLURAL:$1|كلی|بايت|بايت}}',
+'nbytes' => '$1{{جمی:$1|كلی|بايت|بايت}}',
+'nlinks' => '$1 {{جمی:$1|هوم پیوند|هوم پیوندیا}}',
 'nmembers' => '$1 {{PLURAL:$1|اندوم|اندوميا}}',
 'prefixindex' => 'همه بلگيا وا پيشون',
 'usercreated' => '{{جنسیت:$3|راس بیه}}د $1 at $2',
@@ -1172,6 +1333,12 @@ $2',
 # Core parser functions
 'duplicate-defaultsort' => 'زنهار کلیت پیش فرض جور بیه $2 تازه ای یا کلید پیش فرض جوربیه $1 رد بیه.',
 
+# Special:Version
+'version-ext-license' => 'ليسانس',
+'version-ext-colheader-version' => 'نسقه',
+'version-ext-colheader-license' => 'ليسانس',
+'version-ext-colheader-credits' => 'نیسنه یا',
+
 # Special:SpecialPages
 'specialpages' => 'بلگيا ويجه',
 
index 5fb9199..d2460db 100644 (file)
@@ -1268,7 +1268,6 @@ Prašome patikrinti sąrašus.',
 'rows' => 'Eilutės:',
 'columns' => 'Stulpeliai:',
 'searchresultshead' => 'Paieškos nustatymai',
-'resultsperpage' => 'Rezultatų puslapyje:',
 'stub-threshold' => 'Puslapį žymėti <a href="#" class="stub">nebaigtu</a>, jei mažesnis nei:',
 'stub-threshold-disabled' => 'Išjungtas',
 'recentchangesdays' => 'Rodomos dienos paskutinių keitimų sąraše:',
index 666db50..6f7cf4f 100644 (file)
@@ -783,7 +783,6 @@ Google hmangin i lo zawng hrih thei ang.
 'rows' => 'Tlar:',
 'columns' => 'Thlur:',
 'searchresultshead' => 'Zawnna',
-'resultsperpage' => 'Phêk khat tawh zât:',
 'stub-threshold-disabled' => 'Tihnun a ni lo',
 'recentchangesdays' => 'Tihdanglam thar ni tihlan tùr chin:',
 'recentchangesdays-max' => 'A tam berah ni $1 {{PLURAL:$1||}}',
index fc16e97..3145fc3 100644 (file)
@@ -82,7 +82,7 @@ $messages = array(
 'tog-shownumberswatching' => 'Rādīt uzraudzītāju skaitu',
 'tog-oldsig' => 'Pašreizējais paraksts:',
 'tog-fancysig' => 'Vienkāršs paraksts (bez automātiskās saites)',
-'tog-uselivepreview' => "Lietot tūlītējo priekšskatījumu (izmanto ''JavaScript''; eksperimentāla iespēja)",
+'tog-uselivepreview' => 'Lietot tūlītējo priekšskatījumu (eksperimentāla iespēja)',
 'tog-forceeditsummary' => 'Atgādināt man, ja kopsavilkuma ailīte ir tukša',
 'tog-watchlisthideown' => 'Paslēpt manus labojumus uzraugāmo lapu sarakstā',
 'tog-watchlisthidebots' => 'Paslēpt botu labojumus uzraugāmo lapu sarakstā',
@@ -322,8 +322,9 @@ $1',
 'ok' => 'Labi',
 'retrievedfrom' => 'Saturs iegūts no "$1"',
 'youhavenewmessages' => 'Tev ir $1 (skatīt $2).',
-'newmessageslinkplural' => '{{PLURAL:$1|jauns vēstījums|jauni vēstījumi}}',
-'newmessagesdifflinkplural' => '{{PLURAL:$1|pēdējā izmaiņa|pēdējās izmaiņas}}',
+'youhavenewmessagesmanyusers' => 'Jums ir $1 no daudziem lietotājiem ($2).',
+'newmessageslinkplural' => '{{PLURAL:$1|jauns vēstījums|999=jauni vēstījumi}}',
+'newmessagesdifflinkplural' => '{{PLURAL:$1|pēdējā izmaiņa|999=pēdējās izmaiņas}}',
 'youhavenewmessagesmulti' => 'Tev ir jauns ziņojums: $1',
 'editsection' => 'labot',
 'editold' => 'labot',
@@ -374,6 +375,8 @@ Derīgo īpašo lapu saraksts atrodas te: [[Special:SpecialPages|{{int:specialpa
 # General errors
 'error' => 'Kļūda',
 'databaseerror' => 'Datu bāzes kļūda',
+'databaseerror-text' => 'Datu bāzes vaicājuma kļūda.
+Iespējams, tā ir programmatūras kļūda.',
 'databaseerror-textcl' => 'Datu bāzes vaicājuma kļūda.',
 'databaseerror-query' => 'Vaicājums: $1',
 'databaseerror-function' => 'Funkcija: $1',
@@ -515,7 +518,7 @@ Lūdzu, izvēlieties citu vārdu.',
 Tajā jābūt vismaz {{PLURAL:$1|1 zīmei|$1 zīmēm}}.',
 'password-name-match' => 'Tava parole nedrīkst būt tāda pati kā tavs lietotājvārds.',
 'password-login-forbidden' => 'Šī lietotājvārda un paroles izmantošana ir aizliegta.',
-'mailmypassword' => 'Atsūtīt man jaunu paroli',
+'mailmypassword' => 'Atiestatīt paroli',
 'passwordremindertitle' => 'Jauna pagaidu parole no {{SITENAME}}s',
 'passwordremindertext' => 'Kads (iespejams, Tu pats, no IP adreses $1)
 ludza, lai nosutam Tev jaunu {{SITENAME}} ($4) paroli.
@@ -897,8 +900,8 @@ Sīkāku informāciju var atrast [{{fullurl:{{#Special:Log}}/delete|page={{FULLP
 'revdelete-hide-user' => 'Autora lietotājvārds/IP adrese',
 'revdelete-hide-restricted' => 'Paslēpt datus arī no administratoriem',
 'revdelete-radio-same' => '(nemainīt)',
-'revdelete-radio-set' => '',
-'revdelete-radio-unset' => '',
+'revdelete-radio-set' => 'Slēpts',
+'revdelete-radio-unset' => 'Redzams',
 'revdelete-suppress' => 'Paslēpt datus arī no administratoriem',
 'revdelete-unsuppress' => 'Atcelt ierobežojumus atjaunotajām versijām',
 'revdelete-log' => 'Iemesls:',
@@ -1038,12 +1041,11 @@ Pagaidām vari meklēt, izmantojot Google vai Yahoo.
 'prefs-email' => 'E-pasta uzstādījumi',
 'prefs-rendering' => 'Izskats',
 'saveprefs' => 'Saglabāt',
-'restoreprefs' => 'Atjaunot noklusētos uzstādījumus',
+'restoreprefs' => 'Atjaunot noklusētos uzstādījumus (visās sadaļās)',
 'prefs-editing' => 'Rediģēšana',
 'rows' => 'Rindiņu skaits:',
 'columns' => 'Simbolu skaits rindiņā:',
 'searchresultshead' => 'Meklēšana',
-'resultsperpage' => 'Lappusē parādāmo rezultātu skaits',
 'stub-threshold' => 'Slieksnis <a href="#" class="stub">aizmetņa saites</a> formatēšanai (baiti):',
 'stub-threshold-disabled' => 'Atslēgts',
 'recentchangesdays' => 'Dienu skaits, kuru rādīt pēdējās izmaiņās:',
@@ -1288,7 +1290,7 @@ Ja tu izvēlies to norādīt, tas tiks izmantots, lai identificētu tavu darbu (
 'rclistfrom' => 'Parādīt jaunas izmaiņas kopš $1',
 'rcshowhideminor' => '$1 maznozīmīgos',
 'rcshowhidebots' => '$1 botus',
-'rcshowhideliu' => '$1 reģistrētos',
+'rcshowhideliu' => '$1 reģistrēti lietotāji',
 'rcshowhideanons' => '$1 anonīmos',
 'rcshowhidepatr' => '$1 pārbaudītie labojumi',
 'rcshowhidemine' => '$1 manus',
@@ -1697,6 +1699,7 @@ Katrā rindiņā ir saites uz pirmo un otro pāradresācijas lapu, kā arī pirm
 'protectedpages' => 'Aizsargātās lapas',
 'protectedpages-indef' => 'Tikai bezgalīgas aizsardzības',
 'protectedpages-cascade' => 'Tikai kaskādes aizsardzības',
+'protectedpages-noredirect' => 'Paslēpt pāradresācijas',
 'protectedtitles' => 'Aizsargātie nosaukumi',
 'protectedtitlesempty' => 'Pagaidām nevienas lapas nosaukums nav aizsargāts ar šiem paraametriem.',
 'listusers' => 'Lietotāju uzskaitījums',
@@ -1935,6 +1938,7 @@ Papildinformācija:
 'delete-edit-reasonlist' => 'Izmainīt dzēšanas iemeslus',
 'delete-toobig' => 'Šai lapai ir liela izmaiņu hronoloģija, vairāk nekā $1 {{PLURAL:$1|versija|versijas}}.
 Šādu lapu dzēšana ir atslēgta, lai novērstu nejaušus traucējumus {{grammar:lokatīvs|{{SITENAME}}}}.',
+'deleting-backlinks-warning' => "'''Brīdinājums:''' uz lapu, ko grasies izdzēst, ved saites no citām lapām.",
 
 # Rollback
 'rollback' => 'Novērst labojumus',
@@ -2562,7 +2566,7 @@ $1',
 'file-nohires' => 'Augstāka izšķirtspēja nav pieejama.',
 'svg-long-desc' => 'SVG fails, definētais izmērs $1 × $2 pikseļi, faila izmērs: $3',
 'svg-long-error' => 'Nederīgs SVG fails: $1',
-'show-big-image' => 'Pilnā izmērā',
+'show-big-image' => 'Sākotnējais fails',
 'show-big-image-preview' => 'Šī priekšskata izmērs: $1.',
 'show-big-image-other' => '{{PLURAL:$2|Cits izmērs|Citi izmēri}}: $1.',
 'show-big-image-size' => '$1 × $2 pikseļi',
@@ -3047,7 +3051,7 @@ Var arī lietot [[Special:EditWatchlist|standarta izmainīšanas lapu]].',
 'version-hooks' => 'Aizķeres',
 'version-hook-name' => 'Aizķeres nosaukums',
 'version-version' => '(Versija $1)',
-'version-license' => 'Licence',
+'version-license' => 'MediaWiki licence',
 'version-poweredby-credits' => "Šis viki darbojas ar '''[https://www.mediawiki.org/ MediaWiki]''' programmatūru, autortiesības © 2001-$1 $2.",
 'version-poweredby-others' => 'citi',
 'version-poweredby-translators' => 'translatewiki.net tulkotāji',
@@ -3209,7 +3213,7 @@ Var arī lietot [[Special:EditWatchlist|standarta izmainīšanas lapu]].',
 
 # Limit report
 'limitreport-title' => 'Parsētāja profilēšanas dati:',
-'limitreport-postexpandincludesize-value' => '$1/$2 baiti',
+'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|baits|baiti}}',
 'limitreport-templateargumentsize' => 'Veidnes argumenta izmērs',
 'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|baits|baiti}}',
 
index 68bcd3d..2dce02c 100644 (file)
@@ -1093,7 +1093,6 @@ $1",
 'rows' => '行數:',
 'columns' => '列數:',
 'searchresultshead' => '尋',
-'resultsperpage' => '頁示尋',
 'stub-threshold' => '<a href="#" class="stub">短頁連</a>格式門檻(位元組):',
 'stub-threshold-disabled' => '禁',
 'recentchangesdays' => '近易示日:',
index 2950ff9..84664d9 100644 (file)
@@ -1024,7 +1024,6 @@ $3 द्वारा देल कारण अछि ''$2''",
 'rows' => 'पाँती सभ',
 'columns' => 'स्तम्भ सभ',
 'searchresultshead' => 'ताकू',
-'resultsperpage' => 'एक पन्ना एतेक बेर देखल गेल:',
 'stub-threshold' => 'सीमा <a href="#" class="stub">काटल लागि</a> सँचियाएल (अष्टक):',
 'stub-threshold-disabled' => 'अशक्त कएल',
 'recentchangesdays' => 'आइ-काल्हिक परिवर्तनमे कतेक दिन देखाएल गेल:',
index 519be62..83bf6f4 100644 (file)
@@ -1024,7 +1024,6 @@ $3 макссь туфталсь - ''$2''",
 'rows' => 'Луфт (строкат):',
 'columns' => 'Орват (столбанят):',
 'searchresultshead' => 'Вешендема',
-'resultsperpage' => 'Муфкст фкя лопаса:',
 'stub-threshold' => 'Оторсь (лимитсь) <a href="#" class="stub">-нь керф сюлмафкснень</a> латцемаснонды (байтт):',
 'recentchangesdays' => 'Мъзяра шит няфтемс мекольце полафнемаса:',
 'recentchangesdays-max' => '(максимум $1 {{PLURAL:$1|ши|шит}})',
index b864dc9..ce2d03f 100644 (file)
@@ -1345,7 +1345,6 @@ $3 santiôna{{PLURAL:}} natsonika tamin'ny [[:$2]]",
 'rows' => 'Filaharana :',
 'columns' => 'Tsanganana/Tioba :',
 'searchresultshead' => 'Fikarohana',
-'resultsperpage' => "Isa ny valiny isakin'ny pejy :",
 'stub-threshold' => 'Fetra ambony ho an\'i <a href="#" class="stub">rohim-bangovango</a> (oktety):',
 'stub-threshold-disabled' => 'Tsy alefa',
 'recentchangesdays' => "Isa ny andro ho ampiseho eo amin'ny fanovàna farany",
index 8bf5dc1..1e97034 100644 (file)
@@ -1213,7 +1213,6 @@ Ingek indeks Google untuak {{SITENAME}} mungkin lah kadaluarsa.',
 'rows' => 'Barih:',
 'columns' => 'Kolom:',
 'searchresultshead' => 'Cari',
-'resultsperpage' => 'Hasil per laman:',
 'stub-threshold' => 'Ambang bateh untuak format <a href="#" class="stub">pautan rancangan</a>:',
 'stub-threshold-disabled' => 'Nonaktifkan',
 'recentchangesdays' => 'Jumlah hari nan ditunjuakan di parubahan baru:',
index 52caa7f..9920f8c 100644 (file)
@@ -1210,6 +1210,8 @@ $2
 'content-not-allowed-here' => 'Содржините од моделот „$1“ не се допуштени на страницата [[$2]]',
 'editwarning-warning' => 'Ако ја напуштите страницата ќе ги изгубите сите промени кои сте ги направиле.
 Ако сте најавени, можете да го исклучите ова предупредување во одделот „Уредување“ во вашите нагодувања.',
+'editpage-notsupportedcontentformat-title' => 'Форматот на содржината не е поддржан',
+'editpage-notsupportedcontentformat-text' => 'Форматот $1 is не е поддржан од содржинскиот модел $2.',
 
 # Content models
 'content-model-wikitext' => 'викитекст',
@@ -1514,7 +1516,6 @@ $1",
 'rows' => 'Редови:',
 'columns' => 'Колони:',
 'searchresultshead' => 'Пребарување',
-'resultsperpage' => 'Резултати по страница:',
 'stub-threshold' => 'Праг за <a href="#" class="stub">никулци</a> (бајти):',
 'stub-threshold-disabled' => 'Оневозможено',
 'recentchangesdays' => 'Денови за приказ во скорешните промени:',
@@ -2827,6 +2828,7 @@ $1',
 Блоковите можете да ги прегледате на [[Special:BlockList|списокот на блокови]].',
 'ipb-blockingself' => 'Се спремате да се блокирате самите себеси! Сигурни сте дека го сакате ова?',
 'ipb-confirmhideuser' => 'Сакате да блокирате корисник со можноста „скриј корисник“. Ова ќе го затаи името на корисникот во сите списоци и дневнички записи. Дали сте сигурни дека сакате да го направите тоа?',
+'ipb-confirmaction' => 'Ако сте сигурни дека навистина сакате да го направите ова, штиклирајте го полето „{{int:ipb-confirm}}“ најдолу.',
 'ipb-edit-dropdown' => 'Наведи причина за блокирање',
 'ipb-unblock-addr' => 'Одблокирај го $1',
 'ipb-unblock' => 'Одблокирај корисник или IP-адреса',
index e27e3e3..f686417 100644 (file)
@@ -1469,7 +1469,6 @@ $1",
 'rows' => 'വരി:',
 'columns' => 'നിര:',
 'searchresultshead' => 'തിരയൂ',
-'resultsperpage' => 'ഒരു താളിലുള്ള ശരാശരി സന്ദർശനം:',
 'stub-threshold' => '<a href="#" class="stub">അപൂർണ്ണമായ കണ്ണിയെന്നു</a> സ്ഥാപിക്കാനുള്ള ത്വരകം (ബൈറ്റുകൾ):',
 'stub-threshold-disabled' => 'നിർജ്ജീവമാക്കപ്പെട്ടിരിക്കുന്നു',
 'recentchangesdays' => 'പുതിയ മാറ്റങ്ങളിൽ കാണിക്കേണ്ട ദിവസങ്ങളുടെ എണ്ണം:',
@@ -1865,6 +1864,8 @@ $2 {{PLURAL:$3|തരത്തിലുള്ള പ്രമാണം|തരങ
 'file-exists-duplicate' => 'ഈ പ്രമാണം ഇനി പറയുന്ന {{PLURAL:$1|പ്രമാണത്തിന്റെ|പ്രമാണങ്ങളുടെ}} പകർപ്പാണ്‌:',
 'file-deleted-duplicate' => 'ഈ പ്രമാണത്തിനു സദൃശമായ പ്രമാണം ([[:$1]]) മുമ്പ് മായ്ക്കപ്പെട്ടിട്ടുണ്ട്.
 ആ പ്രമാണത്തിന്റെ മായ്ക്കൽ ചരിത്രം എടുത്തു പരിശോധിച്ച ശേഷം മാത്രം വീണ്ടും അപ്‌‌ലോഡ് ചെയ്യുക.',
+'file-deleted-duplicate-notitle' => 'ഈ പ്രമാണത്തിന് സദൃശമായ ഒന്ന് മുമ്പ് മായ്ക്കപ്പെട്ടിട്ടുണ്ട്, ആ തലക്കെട്ടിന്റെ ഉപയോഗം ഒതുക്കിയിരിക്കുന്നു.
+പുനർ-അപ്‌ലോഡിങ് ചെയ്യുന്നതിനു മുമ്പ് ഒതുക്കപ്പെട്ട പ്രമാണവിവരങ്ങൾ സംശോധനം ചെയ്ത് സാഹചര്യം വിശകലനം ചെയ്യാൻ അനുമതിയുള്ള ആരെയെങ്കിലും സമീപിച്ച് പ്രവൃത്തി ഉറപ്പാക്കുക.',
 'uploadwarning' => 'അപ്‌ലോഡ് മുന്നറിയിപ്പ്',
 'uploadwarning-text' => 'ദയവായി താഴെയുള്ള പ്രമാണ വിവരണങ്ങൾ പുതുക്കി വീണ്ടും ശ്രമിക്കുക.',
 'savefile' => 'പ്രമാണം കാത്ത് സൂക്ഷിക്കുക',
@@ -2743,6 +2744,7 @@ $1',
 തടയൽ പുനഃപരിശോധിക്കാൻ [[Special:BlockList|തടയൽ പട്ടിക]] കാണുക.',
 'ipb-blockingself' => 'താങ്കൾ താങ്കളെ തന്നെ തടയാൻ പോകുകയാണ്! അത് ചെയ്യണം എന്ന് താങ്കൾക്കുറപ്പാണോ?',
 'ipb-confirmhideuser' => 'താങ്കൾ "ഉപയോക്താവിനെ മറച്ചുകൊണ്ട്" ഒരു തടയൽ ചെയ്യാൻ പോവുകയാണ്. ഇത് എല്ലാ പട്ടികകളിൽ നിന്നും രേഖകളിൽ നിന്നും ഉപയോക്താവിന്റെ പേര് മറച്ച് വെയ്ക്കും. ഇപ്രകാരം വേണമെന്ന് തീർച്ചയാണോ?',
+'ipb-confirmaction' => 'ഇത് ചെയ്തേ മതിയാവൂ എന്നുണ്ടെങ്കിൽ താഴെയുള്ള "{{int:ipb-confirm}}" കാണുക.',
 'ipb-edit-dropdown' => 'തടഞ്ഞതിന്റെ കാരണം തിരുത്തുക',
 'ipb-unblock-addr' => '$1 അംഗത്വത്തിനുള്ള തടയൽ നീക്കുക',
 'ipb-unblock' => 'ഒരു ഐ.പി. വിലാസത്തിനോ ഉപയോക്താവിനോ ഉള്ള തടയൽ നീക്കംചെയ്യുക',
@@ -3927,7 +3929,17 @@ $5
 'version-hook-name' => 'കൊളുത്തിന്റെ പേര്',
 'version-hook-subscribedby' => 'വരിക്കാരനായത്',
 'version-version' => '(പതിപ്പ് $1)',
-'version-license' => 'അനുമതി',
+'version-license' => 'മീഡിയവിക്കി ഉപയോഗാനുമതി',
+'version-ext-license' => 'അനുമതി',
+'version-ext-colheader-name' => 'അനുബന്ധം',
+'version-ext-colheader-version' => 'പതിപ്പ്',
+'version-ext-colheader-license' => 'ഉപയോഗാനുമതി',
+'version-ext-colheader-description' => 'വിവരണം',
+'version-ext-colheader-credits' => 'രചയിതാക്കൾ',
+'version-license-title' => '$1 ഉപയോഗാനുമതി',
+'version-license-not-found' => 'ഈ അനുബന്ധത്തോടൊപ്പം ഉപയോഗാനുമതി വിവരങ്ങൾ കണ്ടെത്താനായില്ല.',
+'version-credits-title' => '$1 കടപ്പാട്',
+'version-credits-not-found' => 'ഈ അനുബന്ധത്തോടൊപ്പം കടപ്പാട് വിവരങ്ങൾ കണ്ടെത്താനായില്ല.',
 'version-poweredby-credits' => "ഈ വിക്കി പ്രവർത്തിക്കാൻ '''[https://www.mediawiki.org/ മീഡിയവിക്കി]''' ഉപയോഗിക്കുന്നു. പകർപ്പവകാശം © 2001-$1 $2.",
 'version-poweredby-others' => 'മറ്റുള്ളവർ',
 'version-poweredby-translators' => 'പരിഭാഷാവിക്കിയിലെ പരിഭാഷകർ',
index b0ef1e3..53384e8 100644 (file)
@@ -1122,7 +1122,6 @@ $1",
 'rows' => 'Мөр:',
 'columns' => 'Багана:',
 'searchresultshead' => 'Хайлт',
-'resultsperpage' => 'Хуудас тус бүр дээрх илэрцийн тоо:',
 'stub-threshold' => '<a href="#" class="stub">Түүхий холбоосийг</a> форматлах босго (байт):',
 'stub-threshold-disabled' => 'Идэвхигүйжүүлсэн',
 'recentchangesdays' => 'Сүүлийн өөрчлөлтүүдэд үзүүлэх өдрийн тоо:',
index e993eb8..a4ddf99 100644 (file)
@@ -600,7 +600,7 @@ $1',
 'youhavenewmessagesfromusers' => 'तुमच्यासाठी {{PLURAL:$3|इतर सदस्याकडून|$3 सदस्यांकडून}} $1 आहेत. ($2)',
 'youhavenewmessagesmanyusers' => 'तुमच्यासाठी बऱ्याच सदस्यांकडून $1 आहेत. ($2)',
 'newmessageslinkplural' => '{{PLURAL:$1|एक नवीन संदेश|९९९=नवीन संदेश}}',
-'newmessagesdifflinkplural' => 'मागील {{PLURAL:$1|बदल}}',
+'newmessagesdifflinkplural' => 'मागील {{PLURAL:$1|999=बदल}}',
 'youhavenewmessagesmulti' => '$1 वर तुमच्यासाठी नवीन संदेश आहेत.',
 'editsection' => 'संपादन',
 'editold' => 'संपादन',
@@ -840,7 +840,7 @@ $2',
 'mailerror' => 'विपत्र पाठवण्यात त्रुटी: $1',
 'acct_creation_throttle_hit' => 'माफ करा, तुम्ही आत्तापर्यंत {{PLURAL:$1|१ खाते उघडले आहे|$1 खाती उघडली आहेत}}. तुम्हाला आणखी खाती उघडता येणार नाहीत.',
 'emailauthenticated' => 'तुमचा विपत्रपत्ता $2 ला $3 यावेळी तपासण्यात आला आहे.',
-'emailnotauthenticated' => 'तà¥\81मà¤\9aा à¤\88-मà¥\87ल à¤ªà¤¤à¥\8dता à¤\85दà¥\8dयाप à¤\85धिपà¥\8dरमाणित(à¤\91थà¥\87à¤\82à¤\9fिà¤\95à¥\87à¤\9fà¥\87ड) à¤¨à¤¾à¤¹à¥\80. à¤\96ालà¥\80ल à¤\95à¥\8bणतà¥\8dयाहà¥\80 à¤«à¤¿à¤\9aरà¥\8dसà¤\95रिता ई-मेल पाठविला जाणार नाही.',
+'emailnotauthenticated' => 'तà¥\81मà¤\9aà¥\8dया à¤\88-मà¥\87ल à¤ªà¤¤à¥\8dतà¥\8dयाà¤\9aà¥\80 à¤\85दà¥\8dयाप à¤¨à¤¿à¤¶à¥\8dà¤\9aितà¥\80 à¤\9dालà¥\87लà¥\80 à¤¨à¤¾à¤¹à¥\80. à¤\96ालà¥\80ल à¤\95à¥\8bणतà¥\8dयाहà¥\80 à¤«à¤¿à¤\9aरà¥\8dससाठà¥\80 ई-मेल पाठविला जाणार नाही.',
 'noemailprefs' => 'खालील सुविधा कार्यान्वित करण्यासाठी,पसंतीक्रमात ई-मेल पत्ता नमूद करा.',
 'emailconfirmlink' => 'आपला ई-मेल पत्ता निश्चित करा.',
 'invalidemailaddress' => 'तुम्ही दिलेला ई-मेल पत्ता चुकीचा आहे, कारण तो योग्यप्रकारे लिहिलेला नाही. कृपया योग्यप्रकारे ई-मेल पत्ता लिहा अथवा ती जागा मोकळी सोडा.',
@@ -968,7 +968,7 @@ $2',
 'showdiff' => 'बदल दाखवा',
 'anoneditwarning' => "'''इशारा:''' तुम्ही विकिपीडियाचे सदस्य म्हणून सनोंद-प्रवेश (लॉग-इन) केलेला नाही. या पानाच्या संपादन इतिहासात तुमचा अंकपत्ता (आयपी) नोंदला जाईल.",
 'anonpreviewwarning' => "\"'''सावधान:''' तुम्ही विकिपीडियाचे सदस्य म्हणून सनोंद-प्रवेश (लॉग-इन) केलेला नाही. या पानाच्या संपादन इतिहासात तुमचा अंकपत्ता (आय.पी. ॲड्रेस) नोंदला जाईल.\"",
-'missingsummary' => "'''à¤\86ठवण:''' à¤¤à¥\81मà¥\8dहà¥\80 à¤¸à¤\82पादन à¤¸à¤¾à¤°à¤¾à¤\82श à¤ªà¥\81रवलà¥\87ला à¤¨à¤¾à¤¹à¥\80.à¤\86पण 'à¤\9cतन à¤\95रा' à¤µà¤° à¤ªà¥\81नà¥\8dहा à¤\9fिà¤\9aà¤\95à¥\80 à¤®à¤¾à¤°à¤²à¥\80 à¤¤à¤° à¤¤à¥\87 à¤¤à¥\8dयाशिवाय जतन होईल.",
+'missingsummary' => "'''à¤\86ठवण:''' à¤\86पण à¤¸à¤\82पादन à¤¸à¤¾à¤°à¤¾à¤\82श à¤ªà¥\81रवलà¥\87ला à¤¨à¤¾à¤¹à¥\80.à¤\86पण 'à¤\9cतन à¤\95रा' à¤µà¤° à¤ªà¥\81नà¥\8dहा à¤\9fिà¤\9aà¤\95à¥\80 à¤®à¤¾à¤°à¤²à¥\80 à¤¤à¤°, à¤¤à¥\87 à¤¤à¥\8dयाशिवायà¤\9a जतन होईल.",
 'missingcommenttext' => 'कृपया खाली प्रतिक्रिया भरा.',
 'missingcommentheader' => "'''आठवण:''' आपण या लेखनाकरिता विषय किंवा मथळा दिलेला नाही. आपण पुन्हा \"{{int:savearticle}}\" वर टिचकले तर, तुमचे संपादन त्याशिवायच जतन होईल.",
 'summary-preview' => 'आढाव्याची झलक:',
@@ -1420,7 +1420,6 @@ $1",
 'rows' => 'ओळी:',
 'columns' => 'स्तंभ:',
 'searchresultshead' => 'शोध',
-'resultsperpage' => 'प्रति पान धडका:',
 'stub-threshold' => '<a href="#" class="stub">अंकुरीत दुव्यांच्या</a> रचनेची नांदी (बाईट्स):',
 'stub-threshold-disabled' => 'अक्षम केले',
 'recentchangesdays' => 'अलीकडील बदल मधील दाखवावयाचे दिवस:',
@@ -1684,12 +1683,14 @@ $1",
 'recentchanges-label-bot' => 'हे संपादन एका सांगकाम्याकडून केले गेले आहे',
 'recentchanges-label-unpatrolled' => 'हे संपादन अजून तपासल्या गेले नाही',
 'recentchanges-label-plusminus' => 'या पानाचा आकार इतक्या बाइट्स ने बदलला',
+'recentchanges-legend-heading' => "'''विवरण:'''",
 'recentchanges-legend-newpage' => '([[Special:NewPages|नविन पानांची यादी]] हेही पाहा)',
+'recentchanges-legend-plusminus' => "(''±१२३'')",
 'rcnotefrom' => "खाली <b>$2</b> पासूनचे ('''$1''' पर्यंत) बदल दाखविले आहेत.",
 'rclistfrom' => '$1 नंतर केले गेलेले बदल दाखवा.',
 'rcshowhideminor' => 'छोटे बदल $1',
 'rcshowhidebots' => 'सांगकामे(बॉट्स) $1',
-'rcshowhideliu' => 'सनोंद प्रवेशित सदस्य $1',
+'rcshowhideliu' => '$1नोंदणीकृत सदस्य',
 'rcshowhideanons' => 'अनामिक सदस्य $1',
 'rcshowhidepatr' => '$1 पहारा असलेली संपादने',
 'rcshowhidemine' => 'माझे बदल $1',
@@ -1722,7 +1723,7 @@ $1",
 
 # Upload
 'upload' => 'संचिका चढवा',
-'uploadbtn' => 'सà¤\82à¤\9aिà¤\95ा à¤\9aढवा',
+'uploadbtn' => 'सà¤\82à¤\9aिà¤\95à¥\87à¤\9aà¥\87 à¤\85पभारण à¤\95रा',
 'reuploaddesc' => 'अपभारण रद्द करुन ,अपभारणाच्या अर्जाकडे परत जा',
 'upload-tryagain' => 'बदललेले संचिका वर्णन पाठवा',
 'uploadnologin' => 'सनोंद-प्रवेशित नाही',
@@ -1769,14 +1770,14 @@ $1",
 'filename-tooshort' => 'संचिकानाम खूपच छोटे आहे',
 'filetype-banned' => 'याप्रकारची संचिका प्रतिबंधित आहे.',
 'verification-error' => 'संचिका पडताळणीत ही संचिका अनुत्तीर्ण झाली.',
-'hookaborted' => 'तà¥\81मà¥\8dहà¥\80 à¤\95रà¥\82 à¤\87à¤\9aà¥\8dà¤\9bिणारà¥\87 à¤¸à¤\82पादन à¤¬à¤¾à¤¹à¥\8dय à¤¹à¥\81à¤\95 à¤¦à¥\8dवारà¥\87 à¤¥ंबवण्यात आले.',
+'hookaborted' => 'तà¥\81मà¥\8dहà¥\80 à¤\95रà¥\82 à¤\87à¤\9aà¥\8dà¤\9bिणारà¥\87 à¤¬à¤¦à¤² à¤µà¤¿à¤¸à¥\8dतारà¤\95ादà¥\8dवारà¥\87 à¤¥à¤¾ंबवण्यात आले.',
 'illegal-filename' => 'या संचिकानामास परवानगी नाही.',
 'overwrite' => 'अस्तित्वात असलेल्या संचिकेवर पुनर्लेखन प्रतिबंधित आहे.',
 'unknown-error' => 'एक अज्ञात चूक उद्भवली.',
 'tmp-create-error' => 'तात्पुरती संचिका बनवता आली नाही.',
 'tmp-write-error' => 'तात्पुरती संचिका लिहीतांना चूकी',
 'large-file' => 'संचिका $1 पेक्षा कमी आकाराची असण्याची अपेक्षा आहे, ही संचिका $2 एवढी आहे.',
-'largefileserver' => 'सेवा संगणकावर (सर्वर) निर्धारित केलेल्या आकारापेक्षा या संचिकेचा आकार मोठा आहे.',
+'largefileserver' => 'सà¥\87वा à¤¸à¤\82à¤\97णà¤\95ावर (सरà¥\8dवà¥\8dहर) à¤¨à¤¿à¤°à¥\8dधारित à¤\95à¥\87लà¥\87लà¥\8dया à¤\86à¤\95ारापà¥\87à¤\95à¥\8dषा à¤¯à¤¾ à¤¸à¤\82à¤\9aिà¤\95à¥\87à¤\9aा à¤\86à¤\95ार à¤®à¥\8bठा à¤\86हà¥\87.',
 'emptyfile' => 'चढवलेली संचिका रिकामी आहे.असे संचिकानाम चुकीचे लिहिल्याने होउ शकते. कृपया तुम्हाला हीच संचिका चढवायची आहे का ते तपासा.',
 'windows-nonascii-filename' => 'या विकिवर विशेष वर्ण असलेल्या संचिकानामाचा आधार घेता येणार नाही.',
 'fileexists' => 'या नावाची संचिका आधीच अस्तित्वात आहे, कृपया ही संचिका बदलण्याबद्दल तुम्ही साशंक असाल तर <strong>[[:$1]]</strong> तपासा.
@@ -1791,8 +1792,8 @@ $1",
 कृपया <strong>[[:$1]]</strong> ही संचिका तपासा.
 जर तपासलेली संचिका ही याच आकाराची असेल तर नवीन प्रतिकृती चढविण्याची गरज नाही.",
 'file-thumbnail-no' => 'या संचिकेचे नाव <strong>$1</strong> पासून सुरू होत आहे. ही कदाचित झलक असू शकते.
-जर तुमच्या कडे पूर्ण रिझोल्यूशनची संचिका असेल तर चढवा अथवा संचिकेचे नाव बदला.',
-'fileexists-forbidden' => 'या à¤¨à¤¾à¤µà¤¾à¤\9aà¥\80 à¤¸à¤\82à¤\9aिà¤\95ा à¤\85à¤\97à¥\8bदरà¤\9a à¤\85सà¥\8dतितà¥\8dतà¥\8dवात à¤\86हà¥\87; à¤\95à¥\83पया à¤ªà¥\81नà¥\8dहा à¤®à¤¾à¤\97à¥\87 जाऊन ही संचिका नवीन नावाने चढवा.
+जर तुमच्याकडे पूर्ण रिझोल्यूशनची संचिका असेल तर चढवा अथवा संचिकेचे नाव बदला.',
+'fileexists-forbidden' => 'या à¤¨à¤¾à¤µà¤¾à¤\9aà¥\80 à¤¸à¤\82à¤\9aिà¤\95ा à¤\85à¤\97à¥\8bदरà¤\9a à¤\85सà¥\8dतितà¥\8dतà¥\8dवात à¤\86हà¥\87; à¤\95à¥\83पया à¤ªà¥\81नà¥\8dहा à¤ªà¤°à¤¤ जाऊन ही संचिका नवीन नावाने चढवा.
 [[File:$1|thumb|center|$1]]',
 'fileexists-shared-forbidden' => 'हे नाव असलेली एक संचिका शेअर्ड संचिका कोशात आधी पासून आहे; कृपया परत मागे जा आणि नवीन, वेगळ्या नावाने ही संचिका पुन्हा चढवा. [[File:$1|thumb|center|$1]]',
 'file-exists-duplicate' => 'ही संचिका खालील {{PLURAL:$1|संचिकेची|संचिकांची}} प्रत आहे:',
@@ -1822,8 +1823,8 @@ $1",
 'watchthisupload' => 'या पानावर बदलांसाठी लक्ष ठेवा.',
 'filewasdeleted' => 'या नावाची संचिका या पूर्वी एकदा चढवून नंतर वगळली होती.तुम्ही ती पुन्हा चढवण्या अगोदर $1 तपासा.',
 'filename-bad-prefix' => "तुम्ही चढवत असलेल्या संचिकेचे नाव '''\"\$1\"''' पासून सुरू होते, जे की अंकीय छाउ (कॅमेरा) ने दिलेले अवर्णनात्मक नाव आहे.कृपया तुमच्या संचिकेकरिता अधिक वर्णनात्मक नाव निवडा.",
-'upload-success-subj' => 'यशसà¥\8dवà¥\80रà¥\80तà¥\8dया à¤\9aढवले',
-'upload-success-msg' => 'तुमचे [$2] येथून्ब चढवणे यशस्वी ठरले. ते येथे उपलब्ध आहे: [[:{{ns:file}}:$1]]',
+'upload-success-subj' => 'यशसà¥\8dवà¥\80रà¥\80तà¥\8dया à¤\85पभारित à¤\95à¥\87ले',
+'upload-success-msg' => 'तुमचे [$2] येथून अपभारण यशस्वी ठरले. ते येथे उपलब्ध आहे: [[:{{ns:file}}:$1]]',
 'upload-failure-subj' => 'चढवण्यातील त्रूटि:',
 'upload-failure-msg' => '[$2] येथून तुमच्या चढवण्यात चूक झाली:
 
@@ -1846,7 +1847,7 @@ $1',
 'backend-fail-stream' => '$1 या संचिकेचा स्त्रोत शोधता आला नाही.',
 'backend-fail-backup' => '$1 या संचिकेची आधारप्रत बनविता आली नाही.',
 'backend-fail-notexists' => '$1 ही संचिका अस्तित्वात नाही.',
-'backend-fail-hashes' => 'तà¥\81लना à¤\95रणà¥\8dयासाठà¥\80 à¤«à¤¾à¤\87ल à¤¹à¤¾शेस मिळाले नाही',
+'backend-fail-hashes' => 'तà¥\81लना à¤\95रणà¥\8dयासाठà¥\80 à¤«à¤¾à¤\87ल à¤¹à¥\85शेस मिळाले नाही',
 'backend-fail-notsame' => ' $1 येथे यापेक्षा विभिन्न असलेली संचिका पूर्वीच विद्यमान आहे',
 'backend-fail-invalidpath' => '$1 हा वैध संग्राहक-पथ नाही.',
 'backend-fail-delete' => '$1 ही संचिका (फाईल) बनवता आली नाही.',
@@ -1860,13 +1861,13 @@ $1',
 'backend-fail-closetemp' => 'तात्पुरती संचिका बंद करणे जमले नाही.',
 'backend-fail-read' => '$1 ही संचिका वाचता आली नाही.',
 'backend-fail-create' => '$1 ही संचिका लिहिता आली नाही.',
-'backend-fail-maxsize' => '$1 ही संचिका लिहिता आली नाही कारण ती {{PLURAL:$2|one byte|$2 bytes}} पेक्षा मोठी आहे.',
+'backend-fail-maxsize' => '$1 ही संचिका लिहिता आली नाही कारण ती {{PLURAL:$2|एक बाइट|$2 बाइट्स}} पेक्षा मोठी आहे.',
 'backend-fail-readonly' => 'पार्श्वभौमीक साठवण "$1" “फक्त वाचा” असे आहे. दिलेले कारण "$2" आहे.',
 'backend-fail-synced' => 'अंतर्गत पार्श्वभौमीक साठवणीतील फाईल "$1" विसंगत आहे.',
 'backend-fail-connect' => 'पार्श्वभौमीक साठा "$1"शी संबंध जोडू शकत नाही.',
 'backend-fail-internal' => 'पार्श्वभौमीक साठा "$1" यात अज्ञात चूक झाली आहे.',
 'backend-fail-contenttype' => '"$1" मध्ये ठेवलेल्या फाईलचा महितीचा प्रकार कळत नाही',
-'backend-fail-batchsize' => 'पार्श्वभौमीक साठयातील बॅच $1 फाईल{{PLURAL:$1|operation|operations}}; मधे मर्यादित कस्त $२ {{PLURAL:$2|operation|operations}} असू शकते',
+'backend-fail-batchsize' => 'पार्श्वभौमीक साठयातील बॅच $1 फाईल{{PLURAL:$1|क्रियेत|क्रियांमध्ये}}; मर्यादित कस्त $२ {{PLURAL:$2|क्रिया}} असू शकते',
 'backend-fail-usable' => 'अपुऱ्या परवानगीमुळे किंवा निर्देशिकेच्या/धारिकेच्या(डिरेक्टरीज/कंटेनर्स) अभावामुळे "$1" संचिका वाचु अथवा लिहू शकत नाही.',
 
 # File journal errors
@@ -1880,7 +1881,7 @@ $1',
 'lockmanager-fail-acquirelock' => '"$1" साठी लॉक फाइल मिळवू शकत नाही',
 'lockmanager-fail-openlock' => '"$1" साठी लॉक फाइल उघडू शकत नाही',
 'lockmanager-fail-releaselock' => '"$1" साठी लॉक उघडू शकत नाही',
-'lockmanager-fail-db-bucket' => '$1 à¤¬à¤¾à¤¸à¥\8dà¤\95à¥\87à¤\9f à¤®à¤§à¥\80ल à¤\95à¥\81लà¥\82प à¤¬à¤\82द à¤¡à¥\87à¤\9fाबà¥\87सशà¥\80 à¤ªà¥\81रà¥\87सा à¤¸à¤\82परà¥\8dà¤\95 à¤¹à¥\8bवà¥\82 à¤¶à¤\95त à¤¨à¤¾à¤¹à¥\80',
+'lockmanager-fail-db-bucket' => '$1 à¤¬à¤\95à¥\87à¤\9f à¤®à¤§à¥\80ल à¤\95à¥\81लà¥\82प à¤¬à¤\82द à¤¡à¥\87à¤\9fाबà¥\87सशà¥\80 à¤ªà¥\81रà¥\87सा à¤¸à¤\82परà¥\8dà¤\95 à¤¹à¥\8bवà¥\82 à¤¶à¤\95त à¤¨à¤¾à¤¹à¥\80.',
 'lockmanager-fail-db-release' => '"$1" डाटाबेस वरील लॉक उघडू शकत नाही',
 'lockmanager-fail-svr-acquire' => 'सर्व्हर "$1" वरील कुलूप उघडू शकत नाही',
 'lockmanager-fail-svr-release' => 'सर्व्हर "$1" वरील् लॉक उघडू शकत नाही',
@@ -1890,21 +1891,21 @@ $1',
 'zip-wrong-format' => 'ही संचिका "झिप" प्रकारची नाही.',
 'zip-bad' => 'ही संचिका दूषित किंवा न वाचता येणारी झिप संचिका आहे.
 ती सुरक्षिततेसाठी नीट तपासता आली नाही.',
-'zip-unsupported' => 'हि à¤¸à¤\82à¤\9aिà¤\95ा à¤\8fà¤\95 ZIP à¤¸à¤\82à¤\9aिà¤\95ा à¤\86हà¥\87 à¤\9cà¥\80 à¤®à¤¿à¤¡à¥\80याविà¤\95à¥\80 à¤¦à¥\8dवरे  (support) न केलेले ZIP वैशिष्ट्ये (features) वापरते.
-या संचिकेची सुरक्षा पडताळणीसाठी व्यवस्थितरीत्या होऊ शकत नाही.',
+'zip-unsupported' => 'हà¥\80 à¤¸à¤\82à¤\9aिà¤\95ा à¤\8fà¤\95 ZIP à¤¸à¤\82à¤\9aिà¤\95ा à¤\86हà¥\87 à¤\9cà¥\80 à¤®à¤¿à¤¡à¥\80याविà¤\95à¥\80 à¤¦à¥\8dवारे  (support) न केलेले ZIP वैशिष्ट्ये (features) वापरते.
+या संचिकेची सुरक्षा पडताळणी व्यवस्थितरीत्या होऊ शकत नाही.',
 
 # Special:UploadStash
 'uploadstash' => 'चढवणे लपवा',
 'uploadstash-summary' => 'या पानावर अश्या संचिका पहावयास् मिळतात ज्या चढवल्या आहेत (अथवा चढवल्या जात आहेत) परंतु अजून विकी वर प्रकाशित केल्या नाहित. या संचिका फक्त त्या सदस्यास् दिसतील ज्याने त्या चढवल्या आहेत, इतर सदस्यांस् त्या दिसणार नाहीत.',
 'uploadstash-clear' => 'लपवलेल्या संचिका काढा',
 'uploadstash-nofiles' => 'तुमच्याकडे लपवलेल्या संचिका नाहीत.',
-'uploadstash-badtoken' => 'हि कृती अयशस्वी होती. कदाचित आपल्या संपादन अधिकारपत्राची (editing credentials) मुदत संपली.',
+'uploadstash-badtoken' => 'हà¥\80 कृती अयशस्वी होती. कदाचित आपल्या संपादन अधिकारपत्राची (editing credentials) मुदत संपली.',
 'uploadstash-errclear' => 'संचिका स्वच्छ करणे अयशस्वी.',
 'uploadstash-refresh' => 'संचिकांची यादी ताजीतवानी करा',
 'invalid-chunk-offset' => 'अग्राह्य चंक ऑफसेट',
 
 # img_auth script messages
-'img-auth-accessdenied' => 'परवानà¤\97à¥\80 à¤¨à¤¾à¤¹à¥\80',
+'img-auth-accessdenied' => 'पà¥\8bहà¥\8bà¤\9a à¤¨à¤¾à¤\95ारलà¥\8dया à¤\97à¥\87लà¥\80.',
 'img-auth-nopathinfo' => 'मार्ग माहिती आढळली नाही.
 आपला सर्व्हर ही माहिती पोचवू शकत नाही.
 तो सीजीआय-आधारित व इमेज_ऑथला समर्थन न देऊ शकणारा असू शकतो.
@@ -1917,8 +1918,8 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization कृपया हे
 फक्त संचिका वापरण्याची परवानगी आहे.',
 'img-auth-streaming' => 'स्ट्रीमिंग "$1".',
 'img-auth-public' => 'img_auth.php हे  वैयक्तिक विकीमधून  माहिती प्रदान करण्याचे कार्य करते.
-हा विकि सार्वजनिक विकि म्हणून सब्चित करण्यात आला आ.े.
-à¤\89à¤\9aित à¤¸à¥\81रà¤\95à¥\8dषा à¤\95à¥\87 à¤²à¤¿à¤\8f img_auth.php à¤\95à¥\8b à¤¨à¤¿à¤·à¥\8dà¤\95à¥\83य à¤\95िया à¤¹à¥\81à¤\86 à¤¹à¥\88।',
+हा विकि सार्वजनिक विकि म्हणून सब्चित करण्यात आला आे.
+à¤\95िमान à¤¸à¥\81रà¤\95à¥\8dषà¥\87साठà¥\80 img_auth.php à¤²à¤¾ à¤\85à¤\95à¥\8dषम à¤\95à¥\87लà¥\87 à¤\86हà¥\87.',
 'img-auth-noread' => 'तुम्हाला "$1" वाचण्याची परवानगी नाही',
 'img-auth-bad-query-string' => 'या दुव्यामध्ये (URL) अवैध query string आहे.',
 
@@ -1949,7 +1950,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization कृपया हे
 'listfiles_search_for' => 'चित्र नावाने शोध:',
 'imgfile' => 'संचिका',
 'listfiles' => 'चित्र यादी',
-'listfiles_thumb' => 'पà¥\8dरारà¥\81प',
+'listfiles_thumb' => 'नà¤\96à¥\81लà¥\87',
 'listfiles_date' => 'दिनांक',
 'listfiles_name' => 'नाव',
 'listfiles_user' => 'सदस्य',
@@ -1972,7 +1973,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization कृपया हे
 'filehist-datetime' => 'दिनांक/वेळ',
 'filehist-thumb' => 'नखुले',
 'filehist-thumbtext' => '$1 च्या आवृत्तीचे नखुले',
-'filehist-nothumb' => 'पà¥\8dरारà¥\81प नाही',
+'filehist-nothumb' => 'नà¤\96à¥\81लà¥\87à¤\9aितà¥\8dर नाही',
 'filehist-user' => 'सदस्य',
 'filehist-dimensions' => 'आकार',
 'filehist-filesize' => 'संचिकेचा आकार (बाईट्स)',
@@ -1995,7 +1996,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization कृपया हे
 'sharedupload-desc-edit' => "संचिका $1 मधील आहे व ती इतर प्रकल्पांमध्ये वापरली जाऊ शकते.आपणास हवे असल्यास,या पानाच्या[$2 'संचिका वर्णन पान'] येथे,त्याची माहिती संपादु शकता.",
 'sharedupload-desc-create' => "संचिका $1 मधील आहे व ती इतर प्रकल्पांमध्ये वापरली जात असल्याची शक्यता आहे.आपणास हवे असल्यास,या पानाच्या[$2 'संचिका वर्णन पान'] येथे,त्याची माहिती संपादु शकता",
 'filepage-nofile' => 'या नावाची संचिका अस्तित्वात नाही.',
-'filepage-nofile-link' => 'या à¤¨à¤¾à¤µà¤¾à¤\9aà¥\80 à¤¸à¤\82à¤\9aिà¤\95ा à¤\85सà¥\8dतितà¥\8dयà¥\8dवात à¤¨à¤¾à¤¹à¥\80, à¤ªà¤£ à¤¤à¥\81मà¥\8dहà¥\80 à¤¤à¥\80 [$1 à¤\9aढवà¥\82 à¤¶à¤\95ता].',
+'filepage-nofile-link' => 'या नावाची संचिका अस्तित्वात नाही, पण तुम्ही ती [$1 चढवू शकता].',
 'uploadnewversion-linktext' => 'या संचिकेची नवीन आवृत्ती चढवा',
 'shared-repo-from' => '$1 पासून',
 'shared-repo' => 'एक मुक्त कोश',
@@ -2022,13 +2023,13 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization कृपया हे
 'filedelete-success-old' => '<span class="plainlinks">$3, $2 वेळी \'\'\'[[Media:$1|$1]]\'\'\' चे आवर्तन वगळण्यात आले आहे .</span>',
 'filedelete-nofile' => "'''$1''' अस्तित्वात नाही.",
 'filedelete-nofile-old' => "सांगितलेल्या गुणधर्मानुसार  '''$1'''चे कोणतेही विदा आवर्तन संचित नाही.",
-'filedelete-otherreason' => 'à¤\87तर/शिवाय à¤\85धिà¤\95 कारण:',
+'filedelete-otherreason' => 'दà¥\81सरà¥\87/à¤\85तिरिà¤\95à¥\8dत कारण:',
 'filedelete-reason-otherlist' => 'इतर कारण',
 'filedelete-reason-dropdown' => '*वगळण्याची सामान्य कारणे
 ** प्रताधिकार उल्लंघन
 ** जुळी संचिका',
 'filedelete-edit-reasonlist' => 'वगळण्याची कारणे संपादित करा',
-'filedelete-maintenance' => 'फाà¤\88ल à¤µà¤\97ळनà¥\87 à¤\86णि à¤ªà¥\81नà¥\8d:सà¥\8dथापित à¤\95रणà¥\8d',
+'filedelete-maintenance' => 'दà¥\87à¤\96भालà¥\80दरमà¥\8dयान, à¤¸à¤\82à¤\9aिà¤\95ा à¤µà¤\97ळणà¥\87 à¤µ à¤ªà¥\81नरà¥\8dसà¥\8dथापित à¤\95रणà¥\87 à¤¤à¤¾à¤¤à¥\8dपà¥\81रतà¥\87 à¤\85à¤\95à¥\8dषम à¤\95à¥\87लà¥\8dया à¤\97à¥\87लà¥\87 à¤\86हà¥\87.',
 'filedelete-maintenance-title' => 'संचिका (फाईल) वगळू शकत नाही.',
 
 # MIME search
@@ -2036,13 +2037,13 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization कृपया हे
 'mimesearch-summary' => 'हे पान विविधामाप (माईम)-प्रकारांकरिता संचिकांची चाळणी करण्याची सुविधा पुरवते:
 Input:contenttype/subtype, e.g. <code>image/jpeg</code>.',
 'mimetype' => 'विविधामाप (माईम) प्रकार:',
-'download' => 'à¤\89तरवा',
+'download' => 'à¤\85धिभारण à¤\95रा',
 
 # Unwatched pages
-'unwatchedpages' => 'लà¤\95à¥\8dष नसलेली पाने',
+'unwatchedpages' => 'दà¥\87à¤\96रà¥\87à¤\96 नसलेली पाने',
 
 # List redirects
-'listredirects' => 'पà¥\81नरà¥\8dनिरà¥\8dदà¥\87शनà¥\87 à¤¦à¤¾à¤\96वा',
+'listredirects' => 'पà¥\81नरà¥\8dनिरà¥\8dदà¥\87शनाà¤\82à¤\9aà¥\80 à¤¯à¤¾à¤¦à¥\80',
 
 # Unused templates
 'unusedtemplates' => 'न वापरलेले साचे',
@@ -2071,14 +2072,14 @@ Input:contenttype/subtype, e.g. <code>image/jpeg</code>.',
 'statistics-header-views' => 'सांख्यिकी पहा',
 'statistics-header-users' => 'सदस्य सांख्यिकी',
 'statistics-header-hooks' => 'इतर सांख्यिकी',
-'statistics-articles' => 'सà¤\82बà¤\82धित पाने',
+'statistics-articles' => 'à¤\86शय पाने',
 'statistics-pages' => 'पाने',
 'statistics-pages-desc' => 'विकीमधील सर्व पाने, पुनर्निर्देशने, चर्चापानांसहित.',
-'statistics-files' => 'à¤\9aढवलà¥\87लà¥\8dया संचिका',
+'statistics-files' => 'à¤\85पभारà¥\80त संचिका',
 'statistics-edits' => '{{SITENAME}} च्या सुरुवातीपासूनची पानांची संपादने',
 'statistics-edits-average' => 'प्रतिपान सरासरी संपादने',
 'statistics-views-total' => 'सर्व दाखवते',
-'statistics-views-total-desc' => 'à¤\9cà¥\87 à¤ªà¤¾à¤¨à¥\87 à¤¯à¤¾à¤®à¤§à¥\8dदà¥\87 à¤¨à¤¾à¤¹à¥\80त à¤¤à¥\87 à¤ªà¤¾à¤¹à¤¾ à¤\86नि à¤\96ास à¤ªà¤¾à¤¨à¥\87 à¤¸à¤¾à¤®à¤¿à¤²à¤¾ à¤\95रà¥\82 à¤¨à¤\95ा.',
+'statistics-views-total-desc' => 'à¤\85सà¥\8dतितà¥\8dवात à¤¨à¤¸à¤²à¥\87लà¥\80 à¤ªà¤¾à¤¨à¥\87 à¤µ à¤µà¤¿à¤¶à¥\87ष à¤ªà¤¾à¤¨à¥\87 à¤¯à¤¾à¤\82à¤\9aà¥\80 à¤¦à¥\83षà¥\8dयता à¤¯à¤¾à¤¤ à¤\85à¤\82तरà¥\8dभà¥\82त à¤¨à¤¾à¤¹à¥\80',
 'statistics-views-peredit' => 'प्रति संपादनामागे पाहणे',
 'statistics-users' => 'नोंदणीकृत [[Special:ListUsers|सदस्य]]',
 'statistics-users-active' => 'कार्यरत सदस्य',
@@ -2094,13 +2095,16 @@ Input:contenttype/subtype, e.g. <code>image/jpeg</code>.',
 'pageswithprop-prophidden-binary' => 'बायनरी गुणधर्माची किंमत लपविलेली आहे ($1)',
 
 'doubleredirects' => 'दुहेरी-पुनर्निर्देशने',
-'doubleredirectstext' => 'हे पान अशा पानांची सूची पुरवते की जी पुर्ननिर्देशीत पाने दुसऱ्या पुर्ननिर्देशीत पानाकडे निर्देशित झाली आहेत.प्रत्येक ओळीत पहिल्या आणि दुसऱ्या पुर्ननिर्देशनास दुवा दिला आहे सोबतच दुसरे पुर्ननिर्देशन ज्या पानाकडे पोहचते ते पण दिले आहे, जे की बरोबर असण्याची शक्यता आहे ,ते वस्तुतः पहिल्या पानापासूनचेही पुर्ननिर्देशन असावयास हवे.',
+'doubleredirectstext' => 'हे पान, अशा पानांची यादी पुरवते की जी पाने, दुसऱ्या पुर्ननिर्देशीत पानाकडे पुर्ननिर्देशीत झाली आहेत.प्रत्येक ओळीत पहिल्या आणि दुसऱ्या पुर्ननिर्देशनाचा दुवा दिला आहे,तसेच, दुसऱ्या  पुर्ननिर्देशनाचे लक्ष्य पान पण दिले आहे,जे मुळात ते 
+लक्ष्यपान आहे ज्याकडे, पहिले पुनर्निर्देशन असावयास हवे.
+
+<del>खोडलेल्या प्रविष्टी</del>समायोजित करण्यात आलेल्या आहेत.',
 'double-redirect-fixed-move' => '[[$1]] हलवले गेले आहे.
-ते [[$2]] येथे निर्देशित होते.',
-'double-redirect-fixed-maintenance' => '[[$1]] à¤¤à¥\87 [[$2]] à¤¹à¥\87 à¤\9aà¥\81à¤\95à¥\80à¤\9aà¥\87 à¤ªà¥\81नरà¥\8dनिरà¥\8dदà¥\87शन à¤¨à¥\80à¤\9f केले.',
-'double-redirect-fixer' => 'पà¥\81नरà¥\8dनिरà¥\8dदà¥\87शन à¤¨à¥\80à¤\9f करणारा',
+ते आता [[$2]] येथे निर्देशित होते.',
+'double-redirect-fixed-maintenance' => '[[$1]] à¤¤à¥\87 [[$2]] à¤¹à¥\87 à¤\9aà¥\81à¤\95à¥\80à¤\9aà¥\87 à¤ªà¥\81नरà¥\8dनिरà¥\8dदà¥\87शन à¤ à¤¿à¤\95ठाà¤\95 केले.',
+'double-redirect-fixer' => 'पà¥\81नरà¥\8dनिरà¥\8dदà¥\87शन à¤ à¤¿à¤\95ठाà¤\95 करणारा',
 
-'brokenredirects' => 'मà¥\8bडà¤\95à¥\87 à¤ªà¥\81नरà¥\8dनिरà¥\8dदà¥\87शन',
+'brokenredirects' => 'मà¥\8bडà¤\95à¥\80 à¤ªà¥\81नरà¥\8dनिरà¥\8dदà¥\87शनà¥\87',
 'brokenredirectstext' => 'खालील पुनर्निर्देशने अस्तित्वात नसलेली पाने जोडतात:',
 'brokenredirects-edit' => 'संपादन',
 'brokenredirects-delete' => 'वगळा',
@@ -2156,6 +2160,7 @@ Input:contenttype/subtype, e.g. <code>image/jpeg</code>.',
 'protectedpages' => 'सुरक्षित पाने',
 'protectedpages-indef' => 'फक्त अनंत काळासाठी सुरक्षित केलेले',
 'protectedpages-cascade' => 'केवळ एकामेकांवर अवलंबून कास्केडींग सुरक्षा (सुरक्षा शिडी)',
+'protectedpages-noredirect' => 'पुनर्निर्देशने लपवा',
 'protectedpagesempty' => 'सध्या या नियमावलीने कोणतीही पाने सुरक्षित केलेली नाहीत.',
 'protectedtitles' => 'सुरक्षीत शीर्षके',
 'protectedtitlesempty' => 'या नियमावलीने सध्या कोणतीही शीर्षके सुरक्षित केलेली नाहीत.',
@@ -2269,14 +2274,14 @@ Input:contenttype/subtype, e.g. <code>image/jpeg</code>.',
 'listgrouprights-rights' => 'अधिकार',
 'listgrouprights-helppage' => 'Help:गट अधिकार',
 'listgrouprights-members' => '(सदस्यांची यादी)',
-'listgrouprights-addgroup' => '{{PLURAL:$2|गट|गट}} वाढवा: $1',
-'listgrouprights-removegroup' => '{{PLURAL:$2|गट|गट}} वगळा: $1',
+'listgrouprights-addgroup' => '{{PLURAL:$2|गट}} वाढवा: $1',
+'listgrouprights-removegroup' => '{{PLURAL:$2|गट}} वगळा: $1',
 'listgrouprights-addgroup-all' => 'सर्व गट वाढवा',
-'listgrouprights-removegroup-all' => 'सरà¥\8dव à¤¸à¤®à¥\82ह काढून टाका',
-'listgrouprights-addgroup-self' => 'स्वतःच्या खात्यात हे {{PLURAL:$2|गट|गट}} मिळवा: $1',
-'listgrouprights-removegroup-self' => 'स्वतःच्या खात्यातून हे {{PLURAL:$2|गट|गट}} वगळा: $1',
-'listgrouprights-addgroup-self-all' => 'सरà¥\8dव à¤¸à¤®à¥\82ह à¤¸à¥\8dवतà¤\83à¤\9aà¥\8dया à¤\96ातà¥\8dयात à¤®à¤¿à¤³à¤µा',
-'listgrouprights-removegroup-self-all' => 'सरà¥\8dव à¤¸à¤®à¥\82ह स्वतःच्या खात्यातून काढून टाका',
+'listgrouprights-removegroup-all' => 'सरà¥\8dव à¤\97à¤\9f काढून टाका',
+'listgrouprights-addgroup-self' => 'स्वतःच्या खात्यात हे {{PLURAL:$2|गट}} मिळवा: $1',
+'listgrouprights-removegroup-self' => 'स्वतःच्या खात्यातून हे {{PLURAL:$2|गट}} वगळा: $1',
+'listgrouprights-addgroup-self-all' => 'सरà¥\8dव à¤\97à¤\9f à¤¸à¥\8dवतà¤\83à¤\9aà¥\8dया à¤\96ातà¥\8dयात à¤\9cà¥\8bडा',
+'listgrouprights-removegroup-self-all' => 'सरà¥\8dव à¤\97à¤\9f स्वतःच्या खात्यातून काढून टाका',
 
 # Email user
 'mailnologin' => 'पाठविण्याचा पत्ता नाही',
@@ -2295,22 +2300,22 @@ Input:contenttype/subtype, e.g. <code>image/jpeg</code>.',
 'noemailtitle' => 'विपत्र पत्ता नाही',
 'noemailtext' => 'या सदस्याने वैध विपत्र पत्ता नमूद केलेला नाही.',
 'nowikiemailtitle' => 'विपत्र प्रतिबंधित',
-'nowikiemailtext' => 'हा à¤ªà¥\8dरयà¥\8bà¤\95à¥\8dता à¤\85नà¥\8dय à¤ªà¥\8dरयà¥\8bà¤\95à¥\8dता à¤\95डà¥\82न  à¤\88-मà¥\87ल à¤\98à¥\87à¤\8a à¤\87à¤\9aà¥\8dà¤\9bित à¤¨à¤¾à¤¹à¥\80.',
-'emailnotarget' => 'पà¥\8dरापà¥\8dतà¤\95रà¥\8dता à¤\95रà¥\80ता à¤\85सà¥\8dतितà¥\8dवात à¤¨à¤¸à¤²à¥\87लà¥\87  à¤\95िà¤\82वा à¤\85वà¥\88ध à¤¸à¤¦à¤¸à¥\8dय',
-'emailtarget' => 'पà¥\8dरापà¥\8dतà¤\95रà¥\8dता à¤ªà¥\8dरयà¥\8bà¤\95à¥\8dताà¤\9aà¥\87 à¤¨à¤¾à¤\82व à¤\9fाà¤\95ा.',
+'nowikiemailtext' => 'या à¤¸à¤¦à¤¸à¥\8dयानà¥\87 à¤\85नà¥\8dय à¤¸à¤¦à¤¸à¥\8dयाà¤\82à¤\95डà¥\82न  à¤\88-मà¥\87ल à¤¯à¥\87à¤\8a à¤¨ à¤¦à¥\87णà¥\8dयाà¤\9aà¥\87 (à¤\90à¤\9aà¥\8dà¤\9bिà¤\95) à¤¨à¤¿à¤µà¤¡à¤²à¥\87 à¤\86हà¥\87.',
+'emailnotarget' => 'पà¥\8dरापà¥\8dतà¤\95रà¥\8dतà¥\8dयाà¤\9aà¥\87 à¤\85सà¥\8dतितà¥\8dवात à¤¨à¤¸à¤²à¥\87लà¥\87  à¤\95िà¤\82वा à¤\85वà¥\88ध à¤¸à¤¦à¤¸à¥\8dयनाम.',
+'emailtarget' => 'पà¥\8dरापà¥\8dतà¤\95रà¥\8dतà¥\8dयाà¤\9aà¥\87 à¤¸à¤¦à¤¸à¥\8dयनाम à¤\9fाà¤\95ा',
 'emailusername' => 'सदस्यनाम:',
 'emailusernamesubmit' => 'पाठवा',
-'email-legend' => 'à¤\88मà¥\87ल à¤\85नà¥\8dय à¤¸à¤¦à¤¸à¥\8dयाला पाठवा',
-'emailfrom' => 'प्रेषक',
+'email-legend' => 'à¤\85नà¥\8dय {{SITENAME}} à¤µà¤°à¥\80ल à¤¸à¤¦à¤¸à¥\8dयाला à¤\88मà¥\87ल पाठवा',
+'emailfrom' => 'प्रेषक:',
 'emailto' => 'प्रति:',
 'emailsubject' => 'विषय:',
 'emailmessage' => 'संदेश:',
 'emailsend' => 'पाठवा',
-'emailccme' => 'माà¤\9dà¥\8dया à¤¸à¤\82दà¥\87शाà¤\9aà¥\80 à¤®à¤²à¤¾ à¤µà¤¿à¤ªà¤¤à¥\8dर à¤ªà¥\8dरत पाठवा.',
-'emailccsubject' => 'तुमच्या विपत्राची प्रत कडे $1: $2',
+'emailccme' => 'माà¤\9dà¥\8dया à¤¸à¤\82दà¥\87शाà¤\9aà¥\80 à¤ªà¥\8dरत à¤®à¤²à¤¾ à¤µà¤¿à¤ªà¤¤à¥\8dरादà¥\8dवारà¥\87 पाठवा.',
+'emailccsubject' => '$1 ला पाठविलेल्या आपल्या विपत्राची प्रत: $2',
 'emailsent' => 'विपत्र पाठवले',
 'emailsenttext' => 'तुमचा विपत्र संदेश पाठवण्यात आला आहे.',
-'emailuserfooter' => 'हे विपत्र $1 ने $2 ला {{SITENAME}} वरील "सदस्यास विपत्र पाठवा" वापरुन पाठवले आहे.',
+'emailuserfooter' => '$1 ने $2 ला हे विपत्र, {{SITENAME}} वरील, "सदस्यास विपत्र पाठवा" ही प्रक्रिया वापरुन पाठवले आहे.',
 
 # User Messenger
 'usermessage-summary' => 'प्रणाली संदेश देत आहे.',
@@ -2322,8 +2327,8 @@ Input:contenttype/subtype, e.g. <code>image/jpeg</code>.',
 'watchlistfor2' => '$1 $2 साठी',
 'nowatchlist' => 'तुमची पहाऱ्याची सूची रिकामी आहे.',
 'watchlistanontext' => 'तुमच्या पहाऱ्याच्या सूचीमधील बाबी पाहण्याकरता किंवा संपादित करण्याकरता, कृपया $1.',
-'watchnologin' => 'पà¥\8dरवà¥\87श à¤\95à¥\87लà¥\87ला नाही',
-'watchnologintext' => 'तà¥\81मà¤\9aà¥\80 à¤ªà¤¹à¤¾à¤±à¥\8dयाà¤\9aà¥\80 à¤¸à¥\82à¤\9aà¥\80 à¤¬à¤¦à¤²à¤¾à¤¯à¤\9aà¥\80 à¤\85सà¥\87ल à¤¤à¤° à¤¤à¥\81मà¥\8dहà¥\80 [[Special:UserLogin|पà¥\8dरवà¥\87श à¤\95à¥\87लà¥\87ला]] à¤\85सलाà¤\9a à¤ªà¤¾à¤¹à¥\80à¤\9cà¥\87.',
+'watchnologin' => 'सनà¥\8bà¤\82द-पà¥\8dरवà¥\87शित नाही',
+'watchnologintext' => 'à¤\86पलà¥\80 à¤ªà¤¹à¤¾à¤±à¥\8dयाà¤\9aà¥\80 à¤¸à¥\82à¤\9aà¥\80 à¤¬à¤¦à¤²à¤µà¤¾à¤¯à¤\9aà¥\80 à¤\85सà¥\87ल à¤¤à¤° à¤\86पणास [[Special:UserLogin|सनà¥\8bà¤\82द-पà¥\8dरवà¥\87शित]] à¤\85सावà¥\87 à¤²à¤¾à¤\97à¥\87ल.',
 'addwatch' => 'पहाऱ्याच्या सूचीमध्ये टाका',
 'addedwatchtext' => '"[[:$1]]"  हे पान तुमच्या  [[Special:Watchlist|\'माझी निरीक्षणसूची\']]मध्ये टाकले आहे. या पानावरील तसेच त्याच्या चर्चा पानावरील भविष्यातील बदल तेथे दाखवले जातील',
 'removewatch' => 'पहाऱ्याच्या सूचीतून वगळा',
@@ -2332,7 +2337,7 @@ Input:contenttype/subtype, e.g. <code>image/jpeg</code>.',
 'watchthispage' => 'या पानावर बदलांसाठी लक्ष ठेवा.',
 'unwatch' => 'पहारा काढा',
 'unwatchthispage' => 'पहारा काढून टाका',
-'notanarticle' => 'मà¤\9cà¤\95à¥\81र à¤µà¤¿à¤°à¤¹à¤¿à¤¤ à¤ªà¤¾à¤¨',
+'notanarticle' => 'हà¥\87 à¤\86शयपान à¤¨à¤¾à¤¹à¥\80',
 'notvisiblerev' => 'आवृत्ती वगळण्यात आलेली आहे',
 'watchlist-details' => 'पहाऱ्याच्या सूचीमधील {{PLURAL:$1|$1 पान|$1 पाने}}, यात चर्चा पाने मोजलेली नाहीत.',
 'wlheader-enotif' => 'विपत्र अधिसूचना सुविधा शक्य केली.',
@@ -2340,17 +2345,17 @@ Input:contenttype/subtype, e.g. <code>image/jpeg</code>.',
 'watchmethod-recent' => 'पहाऱ्यातील पानांकरिता अलीकडील बदलांचा तपास',
 'watchmethod-list' => 'अलीकडील बदलांकरिता पहाऱ्यातील पानांचा तपास',
 'watchlistcontains' => 'तुमचा $1 {{PLURAL:$1|पानावर|पानांवर}} पहारा आहे.',
-'iteminvalidname' => "'$1'बाबà¥\80स à¤¸à¤®à¤¸à¥\8dया, à¤\85मानà¥\8dय नाव...",
+'iteminvalidname' => "'$1'या à¤¬à¤¾à¤¬à¥\80साठà¥\80 à¤¸à¤®à¤¸à¥\8dया, à¤\85वà¥\88ध नाव...",
 'wlnote' => "खाली $3, $4 पर्यंतचे गेल्या {{PLURAL:$2| '''१''' तासातील|'''$2''' तासातील}} {{PLURAL:$1|शेवटचा बदल दिला आहे|शेवटाचे '''$1'''बदल दिले आहेत}}.",
 'wlshowlast' => 'मागील $1 तास $2 दिवस $3 पहा',
 'watchlist-options' => 'पहाऱ्याच्या सूचीचे पर्याय',
 
 # Displayed when you click the "watch" button and it is in the process of watching
-'watching' => 'पाहताहे...',
+'watching' => 'पहारा à¤¦à¥\87त à¤\86हे...',
 'unwatching' => 'पहारा काढत आहे...',
 'watcherrortext' => '$1 साठीच्या तुमच्या पहाऱ्याच्या सूचीमधील मांडणीत (watchlist settings) बदल करताना त्रुटी आली.',
 
-'enotif_mailer' => '{{SITENAME}} सूचना विपत्र',
+'enotif_mailer' => '{{SITENAME}} à¤\85धिसà¥\82à¤\9aना à¤µà¤¿à¤ªà¤¤à¥\8dर',
 'enotif_reset' => 'सर्व पानास भेट दिल्याचे नमूद करा',
 'enotif_impersonal_salutation' => '{{SITENAME}} सदस्य',
 'enotif_subject_deleted' => '{{SITENAME}} पानाला $1 {{gender:$2|$2}} ने वगळले',
@@ -2363,9 +2368,9 @@ Input:contenttype/subtype, e.g. <code>image/jpeg</code>.',
 'enotif_body_intro_moved' => '{{SITENAME}} हे $1 या लेखनामाचे पान या $PAGEEDITDATE (या संपादनाच्या तारखेस)$2 ने {{GENDER:$2|हलविले.}} अद्यतन आवृत्तीसाठी कृपया $3 बघा.',
 'enotif_body_intro_restored' => '{{SITENAME}} हे $1 या लेखनामाचे पान या $PAGEEDITDATE (या संपादनाच्या तारखेस)$2 ने {{GENDER:$2|पुनर्स्थापित केले.}}अद्यतन आवृत्तीसाठी कृपया $3 बघा.',
 'enotif_body_intro_changed' => '{{SITENAME}} हे $1 या लेखनामाचे पान या $PAGEEDITDATE (या संपादनाच्या तारखेस)$2 ने {{GENDER:$2|बदलविले.}} अद्यतन आवृत्तीसाठी कृपया $3 बघा.',
-'enotif_lastvisited' => 'तà¥\81मà¤\9aà¥\8dया à¤¶à¥\87वà¤\9fà¤\9aà¥\8dया à¤­à¥\87à¤\9fà¥\80नà¤\82तरà¤\9aà¥\87 à¤¬à¤¦à¤² à¤¬à¤\98णयासाठà¥\80 à¤ªà¤¹à¤¾ - $1.',
+'enotif_lastvisited' => 'तà¥\81मà¤\9aà¥\8dया à¤¶à¥\87वà¤\9fà¤\9aà¥\8dया à¤­à¥\87à¤\9fà¥\80नà¤\82तरà¤\9aà¥\87 à¤¬à¤¦à¤² à¤¬à¤\98णà¥\8dयासाठà¥\80 $1 à¤ªà¤¹à¤¾.',
 'enotif_lastdiff' => 'हा बदल पहाण्याकरिता $1 पहा.',
-'enotif_anon_editor' => 'à¤\85नामिà¤\95 à¤\89पयà¥\8bà¤\97à¤\95रà¥\8dता $1',
+'enotif_anon_editor' => 'à¤\85नामिà¤\95 à¤¸à¤¦à¤¸à¥\8dय $1',
 'enotif_body' => 'प्रिय $WATCHINGUSERNAME,
 
 {{SITENAME}}या लेखनावाचे $PAGETITLE (या मथळ्याचे) पान $PAGEEDITOR ने $PAGEEDITDATE ( या तारखेस) $CHANGEDORCREATED तयार केले किंवा बदलले आहे. सध्याची आवृत्ती पाहण्यासाठी खालील दुव्यावर टिचकी मारा.
@@ -2405,8 +2410,8 @@ $UNWATCHURL
 'delete-confirm' => '"$1" वगळा',
 'delete-legend' => 'वगळा',
 'historywarning' => 'सूचना: तुम्ही वगळत असलेल्या पानाला $1 {{PLURAL:$1|आवर्तनाचा|आवर्तनांचा}} इतिहास आहे:',
-'confirmdeletetext' => 'तुम्ही एक लेख त्याच्या सर्व इतिहासासोबत वगळण्याच्या तयारीत आहात.
-कृपया तुम्ही करत असलेली कृती ही मीडियाविकीच्या [[{{MediaWiki:Policy-url}}|नीतीनुसार]] आहे ह्याची खात्री करा. तसेच तुम्ही करित असलेल्या कृतीचे परिणाम कृती करण्यापूर्वी जाणून घ्या.',
+'confirmdeletetext' => 'तुम्ही एक लेखपान त्याच्या सर्व इतिहासासोबत वगळण्याच्या तयारीत आहात.
+कृपया, तुम्ही करीत असलेली कृती ही मीडियाविकीच्या [[{{MediaWiki:Policy-url}}|नीतीनुसार]] आहे ह्याची खात्री करा. तसेच, तुम्ही करीत असलेल्या कृतीचे परिणाम, कृती करण्यापूर्वी जाणून घ्या.',
 'actioncomplete' => 'काम पूर्ण',
 'actionfailed' => 'कृती अयशस्वी झाली',
 'deletedtext' => '"$1" हा लेख वगळला. अलीकडे वगळलेले लेख पाहण्यासाठी $2 पहा.',
@@ -2424,17 +2429,16 @@ $UNWATCHURL
 ** लेखकाची(लेखिकेची) विनंती
 ** तुटकी पुनर्निर्देशने',
 'delete-edit-reasonlist' => 'वगळण्याची कारणे संपादित करा',
-'delete-toobig' => 'या पानाला खूप मोठी इतिहास यादी आहे, तसेच हे पान $1 {{PLURAL:$1|पेक्षा|पेक्षा}}पेक्षा जास्त वेळा बदलण्यात आलेले आहे. अशी पाने वगळणे हे {{SITENAME}} ला धोकादायक ठरू नये म्हणून शक्य केलेले नाही.',
-'delete-warning-toobig' => 'या पानाला खूप मोठी इतिहास यादी आहे, तसेच हे पान $1 {{PLURAL:$1|पेक्षा|पेक्षा}} पेक्षा जास्त वेळा बदलण्यात आलेले आहे.
-अशी पाने वगळणे हे {{SITENAME}} ला धोकादायक ठरू शकते;
-कृपया काळजीपूर्वक हे पान वगळा.',
+'delete-toobig' => 'या पानाला, $1 {{PLURAL:$1|आवृत्ती|आवृत्त्यां}}मुळे तयार झालेला खूप मोठा संपादन इतिहास आहे. {{SITENAME}} वर आकस्मिक होणारी उलथापालथ वाचविण्यासाठी, अश्या पानांचे वगळणे प्रतिबंधित केल्या गेले आहे.',
+'delete-warning-toobig' => 'या पानाला, $1 {{PLURAL:$1|आवृत्ती|आवृत्त्यां}}मुळे तयार झालेला खूप मोठा संपादन इतिहास आहे.त्याचे वगळण्याने {{SITENAME}} वर डाटाबेसच्या क्रियांची उलथापालथ होऊ शकते; सावधगिरीने पुढे जा.',
+'deleting-backlinks-warning' => "'''ईशारा:'''आपण वगळत असणाऱ्या पानास इतर पानांचे दुवे आहेत.",
 
 # Rollback
 'rollback' => 'बदल वेगात माघारी न्या',
 'rollback_short' => 'द्रुतमाघार',
 'rollbacklink' => 'द्रुतमाघार',
 'rollbacklinkcount' => 'उलटवा $1 {{PLURAL:$1|संपादन|संपादने}}',
-'rollbacklinkcount-morethan' => '$1 पेक्षा अधिक उलटवा {{PLURAL:$1|संपादन|संपादने}}',
+'rollbacklinkcount-morethan' => '$1 पेक्षा अधिक {{PLURAL:$1|संपादन|संपादने}} उलटवा',
 'rollbackfailed' => 'द्रूतमाघार फसली',
 'cantrollback' => 'जुन्या आवृत्तीकडे परतवता येत नाही; शेवटचा संपादक या पानाचा एकमात्र लेखक आहे.',
 'alreadyrolled' => '[[User:$2|$2]] ([[User talk:$2|Talk]] [[Special:Contributions/$2|{{int:contribslink}}]])चे शेवटाचे [[:$1]]वे संपादन माघारी परतवता येत नाही; पान आधीच कुणी माघारी परतवले आहे किंवा संपादित केले आहे.
@@ -2442,12 +2446,13 @@ $UNWATCHURL
 शेवटचे संपादन [[User:$3|$3]] ([[User talk:$3|Talk]] [[Special:Contributions/$3|{{int:contribslink}}]])-चे होते.',
 'editcomment' => "संपादन सारांश \"''\$1''\" होता.",
 'revertpage' => '[[Special:Contributions/$2|$2]] ([[User talk:$2|चर्चा]]) यांनी केलेले बदल [[User:$1|$1]] यांच्या आवृत्तीकडे पूर्वपदास नेले.',
-'revertpage-nouser' => 'लपविलेल्या सदस्याची संपादने उलटवून {{GENDER:$1|[[सदस्य:$1|$1]]}} यांच्या आवृत्तीप्रमाणे पूर्ववत केले.',
+'revertpage-nouser' => 'लपविलेल्या सदस्याची संपादने उलटवून मागील आवृत्तीप्रमाणे पूर्ववत केले{{GENDER:$1|[[सदस्य:$1|$1]]}}',
 'rollback-success' => '$1 ने उलटवलेली संपादने;$2 च्या आवृत्तीस परत नेली.',
 
 # Edit tokens
 'sessionfailure-title' => 'सत्र त्रुटी',
-'sessionfailure' => 'तुमच्या दाखल सत्रात काही समस्या दिसते;सत्र अपहारणा पासून काळजी घेण्याच्या दृष्टीने ही कृती रद्द केली गेली आहे.कपया आपल्या विचरकाच्या "back" कळीवर टिचकी मारा आणि तुम्ही ज्या पानावरून आला ते पुन्हा चढवा,आणि प्रत प्रयत्न करा.',
+'sessionfailure' => 'तुमच्या दाखल सत्रात काही समस्या दिसते;सत्र अपहारणापासून 
+वाचविण्याचे दृष्टीने ही कृती रद्द केल्या गेली आहे.कृपया आपल्या विचरकाच्या "back" कळीवर टिचकी मारा आणि तुम्ही ज्या पानावरून आला ते पुन्हा चढवा,आणि परत प्रयत्न करा.',
 
 # Protect
 'protectlogpage' => 'सुरक्षा नोंदी',
@@ -2481,7 +2486,7 @@ $UNWATCHURL
 'protect-level-sysop' => 'केवळ प्रचालकांना परवानगी आहे',
 'protect-summary-cascade' => 'शिडी',
 'protect-expiring' => '$1 (UTC) ला संपेल',
-'protect-expiring-local' => '$1 à¤²à¤¾ à¤¸à¤®à¥\8dपते',
+'protect-expiring-local' => '$1 à¤²à¤¾ à¤¸à¤\82पते',
 'protect-expiry-indefinite' => 'अनंत',
 'protect-cascade' => 'या पानात असलेली पाने सुरक्षित करा (सुरक्षा शिडी)',
 'protect-cantedit' => 'तुम्ही या पानाची सुरक्षा पातळी बदलू शकत नाही कारण तुम्हाला तसे करण्याची परवानगी नाही.',
@@ -2519,17 +2524,18 @@ $UNWATCHURL
 'undeletepage' => 'वगळलेली पाने पहा आणि पुनर्स्थापित करा',
 'undeletepagetitle' => "'''खाली [[:$1]] च्या वगळलेल्या आवृत्त्या समाविष्ट केलेल्या आहेत'''.",
 'viewdeletedpage' => 'काढून टाकलेले लेख पहा',
-'undeletepagetext' => 'à¤\96ालà¥\80ल {{PLURAL:$1|पान à¤µà¤\97ळलà¥\87 à¤\86हà¥\87 à¤¤à¤°à¥\80सà¥\81दà¥\8dधा à¤µà¤¿à¤¦à¤¾à¤\97ारात à¤\9cतन à¤\86हà¥\87 à¤\86णि à¤ªà¥\81रà¥\8dनà¥\8dसà¥\8dथापित à¤\95रणà¥\87 à¤¶à¤\95à¥\8dय à¤\86हà¥\87|$1 à¤ªà¤¾à¤¨à¥\87 à¤µà¤\97ळलà¥\80 à¤\86हà¥\87त à¤¤à¤°à¥\80 à¤¸à¥\81दà¥\8dधा à¤µà¤¿à¤¦à¤¾à¤\97ारात à¤\9cतन à¤\86हà¥\87त à¤\86णि à¤ªà¥\81रà¥\8dन्स्थापित करणे शक्य आहेत}}. विदागारातील साठवण ठरावीक कालावधीने स्वच्छ करता येते.',
+'undeletepagetext' => 'à¤\96ालà¥\80ल {{PLURAL:$1|पान à¤µà¤\97ळलà¥\87 à¤\86हà¥\87 à¤¤à¤°à¥\80सà¥\81दà¥\8dधा à¤µà¤¿à¤¦à¤¾à¤\97ारात à¤\9cतन à¤\86हà¥\87 à¤\86णि à¤ªà¥\81नरà¥\8dसà¥\8dथापित à¤\95रणà¥\87 à¤¶à¤\95à¥\8dय à¤\86हà¥\87|$1 à¤ªà¤¾à¤¨à¥\87 à¤µà¤\97ळलà¥\80 à¤\86हà¥\87त à¤¤à¤°à¥\80 à¤¸à¥\81दà¥\8dधा à¤µà¤¿à¤¦à¤¾à¤\97ारात à¤\9cतन à¤\86हà¥\87त à¤\86णि à¤ªà¥\81नर्स्थापित करणे शक्य आहेत}}. विदागारातील साठवण ठरावीक कालावधीने स्वच्छ करता येते.',
 'undelete-fieldset-title' => 'आवर्तने पुनर्स्थापित करा',
-'undeleteextrahelp' => "संपूर्ण पान पुनर्स्थापित करण्याकरिता,सारे रकाने रिकामे ठेवा आणि '''''पुनर्स्थापन'''''वर टिचकी मारा. निवडक पुनर्स्थापन करण्याकरिता, ज्या आवर्तनांचे पुनर्स्थापन करावयाचे त्यांचे रकाने निवडा , आणि '''''पुनर्स्थापन'''''वर टिचकी मारा. '''''पुनर्योजन ''''' वर टिचकी मारल्यास सारे रकाने आणि प्रतिक्रिया खिडकी रिकामी होईल.",
+'undeleteextrahelp' => "पानाचा संपूर्ण इतिहास पुनर्स्थापित करण्यासाठी,साऱ्या चौकटपेट्या (चेकबॉक्सेस) रिकाम्या ठेवा
+आणि  '''''{{int:undeletebtn}}''''' वर टिचकी मारा. निवडक पुनर्स्थापन करण्याकरिता, ज्या आवर्तनांचे पुनर्स्थापन करावयाचे त्यांचेशी सुसंगत चौकटपेट्या (चेकबॉक्सेस) निवडा , आणि '''''{{int:undeletebtn}}''''' वर टिचकी मारा.",
 'undeleterevisions' => '$1 {{PLURAL:$1|आवर्तन|आवर्तने}}विदागारात संचीत',
 'undeletehistory' => 'जर तुम्ही पान पुनर्स्थापित केले तर ,सारी आवर्तने इतिहासात पुनर्स्थापित होतील.
 वगळल्या पासून त्याच नावाचे नवे पान तयार केले गेले असेले तर, पुनर्स्थापित आवर्तने पाठीमागील इतिहासात दिसतील. पुनर्स्थापना नंतर संचिकांच्या आवर्तनांवरील बंधने गळून पडतील याची नोंद घ्या.',
 'undeleterevdel' => 'पृष्ठ पानाचे आवर्तन अर्धवट वगळले जाणार असेल तर पुनर्स्थापनाची कृती केली जाणार नाही.
 अशा प्रसंगी, तुम्ही अगदी अलीकडील वगळलेली आवर्तने अनचेक किंवा अनहाईड केलीच पाहिजे.',
-'undeletehistorynoadmin' => 'हà¥\87 à¤ªà¤¾à¤¨ à¤µà¤\97ळलà¥\87 à¤\97à¥\87लà¥\87 à¤\86हà¥\87.वà¤\97ळणà¥\8dयाà¤\9aà¥\87 à¤\95ारण à¤\96ालà¥\80ल à¤\86ढावà¥\8dयात,वà¤\97ळणà¥\8dयापà¥\82रà¥\8dवà¥\80 à¤¸à¤\82पादित à¤\95रणाऱà¥\8dया à¤¸à¤\82पादà¤\95ाà¤\82à¤\9aà¥\8dया à¤®à¤¾à¤¹à¤¿à¤¤à¥\80 à¤¸à¥\8bबत,दाà¤\96वलà¥\87 à¤\86हà¥\87. à¤µà¤\97ळलà¥\87लà¥\8dया à¤\86वरà¥\8dतà¥\8dनाà¤\82à¤\9aा à¤¨à¥\87मà¤\95ा à¤®à¤\9cà¤\95à¥\82र à¤\95à¥\87वळ à¤ªà¥\8dरà¤\9aालà¤\95ाà¤\82ना à¤\89पलबà¥\8dध à¤\85सà¥\87ल.',
+'undeletehistorynoadmin' => 'हे पान वगळले गेले आहे.वगळण्याचे कारण खालील आढाव्यात,वगळण्यापूर्वी संपादित करणाऱ्या संपादकांच्या माहिती सोबत,दाखवले आहे. वगळलेल्या आवर्तनांचा नेमका मजकूर केवळ प्रचालकांना उपलब्ध असेल.',
 'undelete-revision' => '$1चे($4चे, $5 येथील) आवर्तन $3 ने वगळले:',
-'undeleterevision-missing' => 'अयोग्य अथवा नसापडणारे आवर्तन. तुमचा दुवा कदाचित चुकीचा असेल, किंवा आवर्तन पुनर्स्थापित केले गेले असेल किंवा विदागारातून वगळले असेल.',
+'undeleterevision-missing' => 'अयोग्य अथवा न सापडणारे आवर्तन. तुमचा दुवा कदाचित चुकीचा असेल, किंवा आवर्तन पुनर्स्थापित केले गेले असेल किंवा विदागारातून वगळले गेले असेल.',
 'undelete-nodiff' => 'पूर्वीचे कोणतेही आवर्तन आढळले नाही.',
 'undeletebtn' => 'वगळण्याची क्रिया रद्द करा',
 'undeletelink' => 'पहा/पुनर्स्थापित करा',
@@ -2553,7 +2559,7 @@ $UNWATCHURL
 'undelete-bad-store-key' => '$1 वेळ दिलेली संचिका आवर्तन पुनर्स्थापित करता येत नाही:संचिका वगळण्यापूर्वी पासून मिळाली नव्हती.',
 'undelete-cleanup-error' => 'न वापरलेली विदा संचिका "$1" वगळताना त्रुटी दाखवते.',
 'undelete-missing-filearchive' => 'संचिका विदास्मृती ID $1 पुनर्स्थापित करू शकत नाही कारण ती विदागारात उपलब्ध नाही. ती आधीच पुनर्स्थापित केली असण्याची शक्यता सुद्धा असू शकते.',
-'undelete-error' => 'à¤\9cर à¤ªà¤¾à¤¨à¤¾ à¤\95ाढà¥\82न à¤¨à¤¾à¤¹à¥\80 à¤\9fाà¤\95लà¥\87 à¤¤à¤° à¤ªà¤¾à¤¨ à¤¶à¥\80रà¥\8dषà¤\95',
+'undelete-error' => 'पान à¤ªà¥\81नरà¥\8dसà¥\8dथापनात à¤¤à¥\8dरà¥\82à¤\9fà¥\80',
 'undelete-error-short' => 'संचिकेचे वगळणे उलटवताना त्रूटी: $1',
 'undelete-error-long' => 'संचिकेचे वगळणे उलटवताना त्रुटींचा अडथळा आला:
 
@@ -2564,7 +2570,7 @@ $1',
 # Namespace form on various pages
 'namespace' => 'नामविश्व:',
 'invert' => 'निवडीचा क्रम उलटा करा',
-'tooltip-invert' => 'निवडलेल्या नामविश्वातील (आणि तसे निवडल्यास संबंधित नामविश्वातील)  पानांचे बदल  अदृष्य करण्या साटी टिचकी मारा',
+'tooltip-invert' => 'निवडलेल्या नामविश्वातील (आणि तसे निवडल्यास संबंधित नामविश्वातील)  पानांचे बदल  अदृष्य करण्यासाठी टिचकी मारा',
 'namespace_association' => 'सहभागी नामविश्वे',
 'tooltip-namespace_association' => 'निवडलेल्या नामविश्वासंबधीत विषय अथवा चर्चा नामविश्वसुद्धा आंतर्भूत करण्याकरिता हा बॉक्स टिचकवून चिह्नित करा',
 'blanknamespace' => '(मुख्य)',
@@ -2617,9 +2623,9 @@ $1',
 'whatlinkshere-filters' => 'गाळण्या',
 
 # Block/unblock
-'autoblockid' => '#$1ला स्वयंचलितपणे प्रतिबंधित करा',
+'autoblockid' => 'स्वयंचलितपणे #$1ला प्रतिबंधित करा',
 'block' => 'सदस्यास प्रतिबंध करा',
-'unblock' => 'सदस्य सोडवा',
+'unblock' => 'सदस्यप्रतिबंध काढा',
 'blockip' => 'हा अंकपत्ता अडवा',
 'blockip-legend' => 'सदस्यास प्रतिबंध करा',
 'blockiptext' => 'एखाद्या विशिष्ट अंकपत्त्याची किंवा सदस्याची लिहिण्याची क्षमता प्रतिबंधित  करण्याकरिता खालील सारणी वापरा.
@@ -2647,7 +2653,7 @@ $1',
 'ipbwatchuser' => 'या सदस्याच्या सदस्य तसेच चर्चा पानावर पहारा ठेवा',
 'ipb-disableusertalk' => 'सदस्यास स्वत:चे चर्चापान संपादण्यापासून प्रतिबंधित करा',
 'ipb-change-block' => 'या सेटींग्जसह सदस्यास पुन्हा प्रतिबंधित करा.',
-'ipb-confirm' => 'à¤\85डथाळा सुनिश्चित करा.',
+'ipb-confirm' => 'पà¥\8dरतिबà¤\82ध सुनिश्चित करा.',
 'badipaddress' => 'अंकपत्ता बरोबर नाही.',
 'blockipsuccesssub' => 'अडवणूक यशस्वी झाली',
 'blockipsuccesstext' => '[[Special:Contributions/$1|$1]]ला प्रतिबंधित केले.<br />
@@ -2695,7 +2701,7 @@ $1',
 'change-blocklink' => 'रोध बदला',
 'contribslink' => 'योगदान',
 'emaillink' => 'ई-मेल पाठवा.',
-'autoblocker' => 'स्वयंचलितप्रतिबंधन केले गेले कारण तुमचा अंकपत्ता अलीकडे "[[User:$1|$1]]"ने वापरला होता. $1 च्या प्रतिबंधनाकरिता दिलेले कारण: "$2" आहे.',
+'autoblocker' => 'स्वयंचलित प्रतिबंधन केले गेले कारण तुमचा अंकपत्ता अलीकडे "[[User:$1|$1]]"ने वापरला होता. $1 च्या प्रतिबंधनाकरिता दिलेले कारण: "$2" आहे.',
 'blocklogpage' => 'रोध नोंदी',
 'blocklog-showlog' => 'हा सदस्य पूर्वी प्रतिबंधित अथवा लपविल्या गेला होता.
 लपविलेल्या नोंदी  संदर्भाकरिता खाली उपलब्ध आहेत.',
@@ -2717,7 +2723,7 @@ $1',
 'range_block_disabled' => 'प्रचालकांची पल्ला बंधने घालण्याची क्षमता अनुपलब्ध केली आहे.',
 'ipb_expiry_invalid' => 'अयोग्य समाप्ती काळ.',
 'ipb_expiry_temp' => 'लपविलेले सदस्यनाम प्रतिबंधन कायमस्वरूपी असले पाहिजे.',
-'ipb_hide_invalid' => 'हà¥\87 à¤\96ात à¤¦à¤¾à¤¬à¤¨à¥\8dयासाथि à¤\85समरà¥\8dथ: à¤¤à¥\87 à¤¸à¥\81धà¥\8dदा à¤¬à¤¦à¤² à¤\95रनà¥\8dयाà¤\9aि à¤¸कतात.',
+'ipb_hide_invalid' => 'हà¥\87 à¤\96ात à¤¦à¤¾à¤¬à¤£à¥\8dयासाठà¥\80 à¤\85समरà¥\8dथ; à¤¤à¥\8dयानà¥\87 à¤\85नà¥\87à¤\95 à¤¸à¤\82पादनà¥\87 à¤\95à¥\87लà¥\87लà¥\80 à¤\85सà¥\82 à¤¶कतात.',
 'ipb_already_blocked' => '"$1" आधीच अवरूद्ध केलेले आहे.',
 'ipb-needreblock' => '$1 आधीच प्रतिबंधित आहे . तुम्हाला त्याची सेटींग्स बदलण्याची इच्छा आहे का ?',
 'ipb-otherblocks-header' => '{{PLURAL:$1|दुसरे प्रतिबंधन|इतर प्रतिबंधने}}',
@@ -2725,25 +2731,25 @@ $1',
 'ipb_cant_unblock' => 'त्रूटी: प्रतिबंधन क्र.$1 मिळाला नाही. त्यावरील प्रतिबंधन कदाचित आधीच उठवले असेल.',
 'ipb_blocked_as_range' => 'त्रूटी:अंकपत्ता IP $1 हा प्रत्यक्षपणे प्रतिबंधित केलेला नाही आणि अप्रतिबंधीत करता येत नाही.तो,अर्थात,$2पल्ल्याचा भाग म्हाणून तो प्रतिबंधित केलेला आहे,जो की अप्रतिबंधीत करता येत नाही.',
 'ip_range_invalid' => 'अंकपत्ता अयोग्य टप्प्यात.',
-'ip_range_toolarge' => '/$1 पेक्षा मोठ्या Range प्रतिबंधनाची परवानगी नाह् are not allowed.',
-'proxyblocker' => 'प्रातिनिधी(प्रॉक्झी)प्रतिबंधक',
-'proxyblockreason' => 'तुमचा अंकपत्ता प्रतिबंधित केला आहे कारण तो उघड-उघड प्रतिनिधी आहे.कृपया तुमच्या आंतरजाल सेवा दात्यास किंवा तंत्रज्ञास पाचारण संपर्क करा आणि त्यांचे या गंभीर सुरक्षाप्रश्ना कडे लक्ष वेधा.',
+'ip_range_toolarge' => '/$1 पेक्षा मोठ्या रेंज प्रतिबंधनाची परवानगी नाही.',
+'proxyblocker' => 'प्रातिनिधी(प्रॉक्झी)प्रतिबंधक',
+'proxyblockreason' => 'तुमचा अंकपत्ता प्रतिबंधित केला आहे कारण तो उघड-उघड प्रतिनिधी आहे.कृपया तुमच्या आंतरजाल सेवा दात्यास किंवा तंत्रज्ञास पाचारण संपर्क करा आणि त्यांचे या गंभीर सुरक्षाप्रश्नाकडे लक्ष वेधा.',
 'sorbsreason' => '{{SITENAME}}ने वापरलेल्या DNSBL मध्ये तुमच्या अंकपत्त्याची नोंद उघड-उघड प्रतिनिधी म्हणून सूचित केली आहे.',
 'sorbs_create_account_reason' => '{{SITENAME}}च्या DNSBLने तुमचा अंकपत्ता उघड-उघड प्रतिनिधी म्हणून सूचित केला आहे.तुम्ही खाते उघडू शकत नाही',
 'xffblockreason' => '(X-Forwarded-For header) मधील अंकपत्ता,आपला किंवा आपण वापरत असलेल्या सर्व्हरचा,प्रतिबंधित केल्या गेला आहे.प्रतिबंधित करण्याचे मुळ कारण होते:$1',
-'cant-see-hidden-user' => 'तà¥\81मà¥\8dहà¥\80 à¤ªà¥\8dरतिबà¥\8dà¤\82धकरण्याचा प्रयत्न करत असलेले सदस्य खाते आधीपासूनच प्रतिबंधित आणि लपविले गेले आहे.
-तुमच्याकडे सदस्य लपविण्याचे अधिकार नसल्यामुळे , तुम्ही सदस्य प्रतिबंधन  पाहू अथवा संपादित करू शकत नाही',
+'cant-see-hidden-user' => 'तà¥\81मà¥\8dहà¥\80 à¤ªà¥\8dरतिबà¤\82ध करण्याचा प्रयत्न करत असलेले सदस्य खाते आधीपासूनच प्रतिबंधित आणि लपविले गेले आहे.
+तुमच्याकडे सदस्य लपविण्याचे अधिकार नसल्यामुळे , तुम्ही सदस्य प्रतिबंधन  पाहू अथवा संपादित करू शकत नाही.',
 'ipbblocked' => 'तुमचे स्वत:चेच खाते प्रतिबंधित असल्यामुळे तुम्ही इतर सदस्यांना प्रतिबंधित किंवा अप्रतिबंधीत करू शकत नाही',
-'ipbnounblockself' => 'तुम्ही स्वतः अप्रतिबंधित करू शकत नाही',
+'ipbnounblockself' => 'तुम्ही स्वतः अप्रतिबंधित करू शकत नाही',
 
 # Developer tools
 'lockdb' => 'विदागारास ताळे ठोका',
 'unlockdb' => 'विदागाराचे ताळे उघडा',
 'lockdbtext' => 'विदागारास ताळे ठोकल्याने सर्व सदस्यांची संपादन क्षमता, त्यांच्या सदस्य पसंती बदलणे,त्यांच्या पहाऱ्याच्या सूची संपादित करणे,आणि विदेत बदल घडवणाऱ्या इतर गोष्टी संस्थगित होतील.
-à¤\95à¥\83पया à¤¤à¥\81मà¥\8dहाला à¤¹à¥\87à¤\9a à¤\95रावयाà¤\9aà¥\87 à¤\86हà¥\87 à¤\86णि à¤­à¤°à¤£-पà¥\8bषणा à¤¨à¤\82तर विदागाराचे ताळे उघडावयाचे आहे हे निश्चित करा.',
+à¤\95à¥\83पया à¤¤à¥\81मà¥\8dहाला à¤¹à¥\87à¤\9a à¤\95रावयाà¤\9aà¥\87 à¤\86हà¥\87 à¤\86णि à¤\85नà¥\81रà¤\95à¥\8dषणानà¤\82तर (मà¥\87à¤\82à¤\9fà¥\87ननà¥\8dस)विदागाराचे ताळे उघडावयाचे आहे हे निश्चित करा.',
 'unlockdbtext' => 'विदागाराचे ताळे उघडल्याने सर्व सदस्यांची संपादन क्षमता, त्यांच्या सदस्य पसंती बदलणे,त्यांच्या पहाऱ्याच्या सूची संपादित करणे,आणि विदेत बदल घडवणाऱ्या इतर गोष्टीची क्षमता पुन्हा उपलब्ध होईल.
 कृपया तुम्हाला हेच करावयाचे आहे हे निश्चित करा.',
-'lockconfirm' => 'होय,मला खरेच विदागारास ताळे ठोकायच आहे.',
+'lockconfirm' => 'होय,मला खरेच विदागारास ताळे ठोकायच आहे.',
 'unlockconfirm' => 'होय,मला खरेच विदागाराचे ताळे उघडवयाचे आहे.',
 'lockbtn' => 'विदागारास ताळे ठोका',
 'unlockbtn' => 'विदागारचे ताळे काढा',
@@ -2751,7 +2757,7 @@ $1',
 'lockdbsuccesssub' => 'विदागरास ताळे यशस्वी',
 'unlockdbsuccesssub' => 'विदागाराचे ताळे काढले',
 'lockdbsuccesstext' => 'विदागारास ताळे ठोकण्यात आले आहे.<br />
-तà¥\81मà¤\9aà¥\8dयाà¤\95डà¥\82न à¤­à¤°à¤£-पà¥\8bषण à¤ªà¥\82रà¥\8dण à¤\9dालà¥\8dया नंतर [[Special:UnlockDB|ताळे उघडण्याचे]] लक्षात ठेवा.',
+तà¥\81मà¤\9aà¥\8dयाà¤\95डà¥\82न à¤\85नà¥\81रà¤\95à¥\8dषण à¤ªà¥\82रà¥\8dण à¤\9dालà¥\8dयानंतर [[Special:UnlockDB|ताळे उघडण्याचे]] लक्षात ठेवा.',
 'unlockdbsuccesstext' => 'विदागाराचे ताळे उघडण्यात आले आहे.',
 'lockfilenotwritable' => 'विदा ताळे संचिका लेखनीय नाही.विदेस ताळे लावण्याकरिता किंवा उघडण्याकरिता, ती आंतरजाल विदादात्याकडून लेखनीय असावयास हवी.',
 'databasenotlocked' => 'विदागारास ताळे नही',
@@ -2787,15 +2793,15 @@ $1',
 'movepagetalktext' => "संबंधित चर्चा पृष्ठ याबरोबर स्थानांतरीत होणार नाही '''जर:'''
 * तुम्ही पृष्ठ दुसऱ्या नामविश्वात स्थानांतरीत करत असाल
 * या नावाचे चर्चा पान अगोदरच अस्तित्वात असेल तर, किंवा
-* à¤\96ालà¥\80ल à¤\9aà¥\87à¤\95बà¥\89à¤\95à¥\8dस à¤¤à¥\81मà¥\8dहà¥\80 à¤\95ाढà¥\82न à¤\9fाà¤\95ला तर.
+* à¤\96ालà¥\80ल à¤\9aà¥\8cà¤\95à¤\9fपà¥\87à¤\9fà¥\80 (à¤\9aà¥\87à¤\95बà¥\89à¤\95à¥\8dस) à¤°à¤¿à¤\95ामà¥\80 à¤ à¥\87वलà¥\80 तर.
 
 या बाबतीत तुम्हाला स्वतःला ही पाने एकत्र करावी लागतील.",
 'movearticle' => 'पृष्ठाचे स्थानांतरण',
-'moveuserpage-warning' => "'''सावधान:''' आपण एक सदस्य पान स्थलांतरित करत आहात. कृपया लक्षात घ्या की, फक्त हे पान स्थलांतरित होइल, सदस्य नाम बदलले जणार नाही.",
-'movenologintext' => 'पान à¤¸à¥\8dथानाà¤\82तरित à¤\95रणà¥\8dयासाठà¥\80 à¤¤à¥\81मà¥\8dहाला [[Special:UserLogin|प्रवेश]] करावा लागेल.',
-'movenotallowed' => '{{SITENAME}}वरà¥\80ल à¤ªà¤¾à¤¨à¥\87 à¤¸à¥\8dथानाà¤\82तरà¥\80त à¤\95रणà¥\8dयाà¤\9aà¥\80 à¤\86पलà¥\8dयापाशà¥\80 परवानगी नाही.',
-'movenotallowedfile' => 'तà¥\81मà¥\8dहाला à¤¦à¤¸à¥\8dतावà¥\88à¤\9c स्थानांतरीत करण्याची परवानगी नाही.',
-'cant-move-user-page' => 'तà¥\81मà¥\8dहाला à¤¸à¤¦à¤¸à¥\8dयाà¤\9aà¥\87 à¤¦à¤¸à¥\8dतावà¥\88à¤\9c à¤¸à¥\8dथानाà¤\82तरà¥\80त à¤\95रणà¥\8dयाà¤\9aà¥\80 à¤ªà¤°à¤µà¤¾à¤¨à¤\97à¥\80 à¤¨à¤¾à¤¹à¥\80.',
+'moveuserpage-warning' => "'''सावधान:''' à¤\86पण à¤\8fà¤\95 à¤¸à¤¦à¤¸à¥\8dय à¤ªà¤¾à¤¨ à¤¸à¥\8dथलाà¤\82तरित à¤\95रत à¤\86हात. à¤\95à¥\83पया à¤²à¤\95à¥\8dषात à¤\98à¥\8dया à¤\95à¥\80, à¤«à¤\95à¥\8dत à¤¹à¥\87 à¤ªà¤¾à¤¨ à¤¸à¥\8dथलाà¤\82तरित à¤¹à¥\8bà¤\87ल, à¤¸à¤¦à¤¸à¥\8dय à¤¨à¤¾à¤® à¤¬à¤¦à¤²à¤²à¥\87 à¤\9cाणार à¤¨à¤¾à¤¹à¥\80.",
+'movenologintext' => 'पान à¤¸à¥\8dथानाà¤\82तरित à¤\95रणà¥\8dयासाठà¥\80 à¤¤à¥\81मà¥\8dहà¥\80 à¤¨à¥\8bà¤\82दà¥\80à¤\95à¥\83त à¤¸à¤¦à¤¸à¥\8dय à¤¹à¤µà¥\87 à¤µ à¤¤à¥\81मà¥\8dहाला [[Special:UserLogin|सनà¥\8bà¤\82द-प्रवेश]] करावा लागेल.',
+'movenotallowed' => '{{SITENAME}}वरà¥\80ल à¤ªà¤¾à¤¨à¥\87 à¤¸à¥\8dथानाà¤\82तरà¥\80त à¤\95रणà¥\8dयाà¤\9aà¥\80 à¤\86पलà¥\8dयास परवानगी नाही.',
+'movenotallowedfile' => 'तà¥\81मà¥\8dहाला à¤¸à¤\82à¤\9aिà¤\95ा स्थानांतरीत करण्याची परवानगी नाही.',
+'cant-move-user-page' => 'तà¥\81मà¥\8dहाला à¤¸à¤¦à¤¸à¥\8dयपान à¤¸à¥\8dथानाà¤\82तरà¥\80त à¤\95रणà¥\8dयाà¤\9aà¥\80 à¤ªà¤°à¤µà¤¾à¤¨à¤\97à¥\80 à¤¨à¤¾à¤¹à¥\80.(à¤\89पपानावà¥\8dयतिरिà¤\95à¥\8dत)',
 'cant-move-to-user-page' => 'तुम्हाला एखाद्या पानास सदस्य पानांवर (सदस्य उप-पाने सोडून) घेऊन जाण्यास परवानगी नाही.',
 'newtitle' => 'नवीन शीर्षकाकडे:',
 'move-watch' => 'स्रोत पान व लक्ष  पानांवर निगराणी ठेवा',
@@ -2803,12 +2809,12 @@ $1',
 'pagemovedsub' => 'स्थानांतरण यशस्वी',
 'movepage-moved' => '\'\'\'"$1" ला "$2" मथळ्याखाली स्थानांतरीत केले\'\'\'',
 'movepage-moved-redirect' => 'एक पुनर्निर्देशन तयार केले आहे.',
-'movepage-moved-noredirect' => 'पà¥\81नà¤\83निरà¥\8dदà¥\87शà¥\80त à¤ªà¤¾à¤¨ à¤¤à¤¯à¤¾à¤° à¤\95à¥\87लà¥\87लà¥\87 à¤¨à¤¾à¤¹à¥\80',
-'articleexists' => 'त्या नावाचे पृष्ठ अगोदरच अस्तित्वात आहे, किंवा तुम्ही निवडलेले
-नाव योग्य नाही आहे.
+'movepage-moved-noredirect' => 'पà¥\81नरà¥\8dनिरà¥\8dदà¥\87शन à¤¤à¤¯à¤¾à¤° à¤\95रणà¥\87 à¤¦à¤¡à¤ªà¤£à¥\8dयात à¤\86लà¥\87 à¤\86हà¥\87.',
+'articleexists' => 'त्या नावाचे पृष्ठ अगोदरच अस्तित्वात आहे, किंवा तुम्ही निवडलेले नाव योग्य नाही.
+
 कृपया दुसरे नाव शोधा.',
 'cantmove-titleprotected' => 'नवे शीर्षक निर्मित करण्या पासून सुरक्षित केलेले असल्यामुळे,तुम्ही या जागी एखादे पान स्थानांतरीत करू शकत नाही.',
-'movetalk' => 'शà¤\95à¥\8dय à¤\85सलà¥\8dयास "à¤\9aरà¥\8dà¤\9aा à¤ªà¥\83षà¥\8dठ" स्थानांतरीत करा',
+'movetalk' => 'सà¤\82लà¤\97à¥\8dन "à¤\9aरà¥\8dà¤\9aा à¤ªà¤¾à¤¨" स्थानांतरीत करा',
 'move-subpages' => 'उपपाने स्थानांतरीत करा (जास्तीतजास्त $1)',
 'move-talk-subpages' => 'चर्चा पानाची सर्व उपपाने स्थानांतरीत करा (जास्तीतजास्त $1)',
 'movepage-page-exists' => '$1 पान अगोदरच अस्तित्त्वात आहे व त्याच्यावर आपोआप पुनर्लेखन करता येणार नाही.',
@@ -2823,15 +2829,15 @@ $1',
 'movereason' => 'कारण:',
 'revertmove' => 'पूर्वपदास न्या',
 'delete_and_move' => 'वगळा आणि स्थानांतरित करा',
-'delete_and_move_text' => '==वगळण्याची आवशकता==
+'delete_and_move_text' => '==वà¤\97ळणà¥\8dयाà¤\9aà¥\80 à¤\86वशà¥\8dयà¤\95ता==
 
-लक्ष्यपान  "[[:$1]]" आधीच अस्तित्वात आहे.स्थानांतराचा मार्ग मोकळाकरण्या करिता तुम्हाला ते वगळावयाचे आहे काय?',
+लक्ष्यपान  "[[:$1]]" आधीच अस्तित्वात आहे.स्थानांतराचा मार्ग मोकळा करण्याकरिता तुम्हाला ते वगळावयाचे आहे काय?',
 'delete_and_move_confirm' => 'होय, पान वगळा',
 'delete_and_move_reason' => '"[[$1]]" पासून वगळून स्थानांतर केले.',
 'selfmove' => 'स्रोत आणि लक्ष्य पाने समान आहेत; एखादे पान स्वत:च्याच जागी स्थानांतरीत करता येत नाही.',
 'immobile-source-namespace' => 'नामविश्व "$1" मधील पाने हलवता आली नाहीत.',
 'immobile-target-namespace' => 'नामविश्व "$1" मध्ये पाने हलवता आली नाहीत.',
-'immobile-target-namespace-iw' => 'पà¥\81ढà¥\87 à¤\9aाल à¤\95रणà¥\8dयासाठà¥\80 à¤¹à¤¾ à¤µà¤¿à¤\95िà¤\85à¤\82तरà¥\8dà¤\97त à¤¦à¥\81वा à¤¯à¥\8bà¤\97à¥\8dय à¤²à¤\95à¥\8dष à¤¨à¤¾à¤¹à¥\80',
+'immobile-target-namespace-iw' => 'पान à¤¸à¥\8dथानाà¤\82तरासाठà¥\80, à¤¹à¤¾ à¤µà¤¿à¤\95िà¤\9aा à¤\85à¤\82तरà¥\8dà¤\97त à¤¦à¥\81वा à¤¯à¥\8bà¤\97à¥\8dय à¤²à¤\95à¥\8dषà¥\8dय à¤¨à¤¾à¤¹à¥\80.',
 'immobile-source-page' => 'हे पान हलवता येत नाही',
 'immobile-target-page' => 'लक्ष्य मथळा हलवता येत नाही.',
 'bad-target-model' => 'तुमचे ईच्छित स्थानक हे वेगळे आशय नमुना (कंटेंट मॉडेल) वापरते.  $1 चे $2 मध्ये रुपांतर करु शकत नाही.',
@@ -3486,8 +3492,7 @@ $1',
 'exif-lightsource-255' => 'इतर प्रकाश स्रोत',
 
 # Flash modes
-'exif-flash-fired-0' => 'Flash did not fire
-फ्लॅशदिवा प्रज्ज्वलित झाला नाही',
+'exif-flash-fired-0' => 'फ्लॅशदिवा प्रज्ज्वलित झाला नाही',
 'exif-flash-fired-1' => 'क्षणदीप(फ्लेशदिवा)प्रज्ज्वलित झाला',
 'exif-flash-return-0' => 'लखलखाट (फ्लॅश) - प्रकाश परावर्तन नोंदणीची सुविधा अनुपलब्ध',
 'exif-flash-return-2' => 'लखलखाटाच्या (फ्लॅश)   परावर्तन प्रकाशाची नोंद झाली नाही',
@@ -3510,19 +3515,19 @@ $1',
 
 'exif-filesource-3' => 'स्थिरचित्र  अंकीय छाउ (डिजीटल स्टील कॅमेरा)',
 
-'exif-scenetype-1' => 'डायरà¥\87à¤\95à¥\8dà¤\9fलà¥\80 छायाचित्रीत चित्र',
+'exif-scenetype-1' => 'थà¥\87à¤\9f छायाचित्रीत चित्र',
 
 'exif-customrendered-0' => 'नियमीत प्रक्रीया',
-'exif-customrendered-1' => 'à¤\86वडà¥\80नà¥\81सार प्रक्रीया',
+'exif-customrendered-1' => 'पारà¤\82पारिà¤\95 प्रक्रीया',
 
-'exif-exposuremode-0' => 'सà¥\8dवयà¤\82à¤\9aलित à¤\9bायाà¤\82à¤\95न',
+'exif-exposuremode-0' => 'सà¥\8dवयà¤\82à¤\9aलित à¤\85नावरण',
 'exif-exposuremode-1' => 'अस्वयंचलित छायांकन',
 'exif-exposuremode-2' => 'स्वयंसिद्ध कंस',
 
 'exif-whitebalance-0' => 'ऍटो व्हाईट बॅलेन्स',
 'exif-whitebalance-1' => 'मॅन्यूअल व्हाईट बॅलेन्स',
 
-'exif-scenecapturetype-0' => 'दरà¥\8dà¤\9cा',
+'exif-scenecapturetype-0' => 'दरà¥\8dà¤\9cà¥\87दार',
 'exif-scenecapturetype-1' => 'आडवे',
 'exif-scenecapturetype-2' => 'उभे',
 'exif-scenecapturetype-3' => 'रात्रीचे दृश्य',
@@ -3538,8 +3543,8 @@ $1',
 'exif-contrast-2' => 'कठीण',
 
 'exif-saturation-0' => 'सर्व साधारण',
-'exif-saturation-1' => 'à¤\95मà¥\80 à¤¸à¥\85à¤\9aà¥\82रà¥\87शन',
-'exif-saturation-2' => 'à¤\9cासà¥\8dत à¤¸à¥\85à¤\9aà¥\82रà¥\87शन',
+'exif-saturation-1' => 'निमà¥\8dन à¤¸à¤\82तà¥\83पà¥\8dति',
+'exif-saturation-2' => 'à¤\89à¤\9aà¥\8dà¤\9a à¤¸à¤\82तà¥\83पà¥\8dति',
 
 'exif-sharpness-0' => 'सर्वसाधारण',
 'exif-sharpness-1' => 'मृदू',
@@ -3559,7 +3564,7 @@ $1',
 'exif-gpslongitude-w' => 'पश्चिम रेखांश',
 
 # Pseudotags used for GPSAltitudeRef
-'exif-gpsaltitude-above-sealevel' => 'समुद्रपातळीच्यावर $1 {{PLURAL:$1|मीटर|मीटर}}',
+'exif-gpsaltitude-above-sealevel' => 'समुद्रपातळीच्यावर $1 {{PLURAL:$1|मीटर}}',
 'exif-gpsaltitude-below-sealevel' => 'समुद्रपातळीच्याखाली $1 {{PLURAL:$1|मीटर|मीटर}}',
 
 'exif-gpsstatus-a' => 'मोजणी काम चालू आहे',
@@ -3712,7 +3717,7 @@ $5
 # action=watch/unwatch
 'confirm-watch-button' => 'ठीक आहे',
 'confirm-watch-top' => 'हे पान तुमच्या पहारा सूचीमध्ये टाकायचे?',
-'confirm-unwatch-button' => 'ठà¥\80à¤\95',
+'confirm-unwatch-button' => 'ठिà¤\95 à¤\86हà¥\87',
 'confirm-unwatch-top' => 'हे पान तुमच्या नित्य पहाण्याच्या सूचीतून काढायचे?',
 
 # Multipage image navigation
@@ -3801,8 +3806,12 @@ $5
 'version-parser-function-hooks' => 'पृथकक कार्य अंकुश',
 'version-hook-name' => 'अंकुश नाव',
 'version-hook-subscribedby' => 'वर्गणीदार',
-'version-version' => '(आवृत्ती $1)',
-'version-license' => 'परवाना',
+'version-version' => '($1)',
+'version-license' => 'मिडियाविकि परवाना',
+'version-ext-colheader-name' => 'विस्तारक',
+'version-ext-colheader-version' => 'आवृत्ती',
+'version-ext-colheader-license' => 'परवाना',
+'version-ext-colheader-description' => 'वर्णन',
 'version-poweredby-credits' => "हा विकी '''[https://www.mediawiki.org/ मीडियाविकी]'''द्वारे संचालित आहे, प्रताधिकारित © २००१-$1 $2.",
 'version-poweredby-others' => 'इतर',
 'version-poweredby-translators' => 'ट्रांसलेटविकि.नेट वरील भाषांतरकार',
@@ -3822,7 +3831,8 @@ $5
 # Special:Redirect
 'redirect' => 'संचिका,सदस्य किंवा आवृत्ती या ओळखणीनुसार पुनर्निर्देशन',
 'redirect-legend' => 'संचिका अथवा पानास पुनर्निर्देशन',
-'redirect-summary' => 'हे विशेष पान एक संचिकेस पुनर्निर्देशित करते(दिलेले संचिकानाम),एक पान(दिलेली आवृत्ती ओळ्खण) किंवा एक सदस्यपान(दिलेला सदस्य अंक).',
+'redirect-summary' => 'हे विशेष पान एक संचिकेस पुनर्निर्देशित करते(दिलेले संचिकानाम),एक पान(दिलेली आवृत्ती किंवा पान ओळखण) किंवा एक सदस्यपान(दिलेला सदस्य अंक).
+वापर:[[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], किंवा [[{{#Special:Redirect}}/user/101]].',
 'redirect-submit' => 'जा',
 'redirect-lookup' => 'बघा:',
 'redirect-value' => 'मुल्य:',
@@ -3844,8 +3854,9 @@ $5
 
 # Special:SpecialPages
 'specialpages' => 'विशेष पृष्ठे',
+'specialpages-note-top' => 'विवरण',
 'specialpages-note' => '* सर्वसाधारण विशेष पृष्ठे.
-* <strong class="mw-specialpagerestricted">प्रतिबंधित विशेष पृष्ठे.</strong>',
+* <span class="mw-specialpagerestricted">प्रतिबंधित विशेष पृष्ठे.</span>',
 'specialpages-group-maintenance' => 'व्यवस्थापन अहवाल',
 'specialpages-group-other' => 'इतर विशेष पृष्ठे',
 'specialpages-group-login' => 'प्रवेश / नवीन सदस्य नोंदणी',
@@ -4048,10 +4059,9 @@ $5
 
 # Special:ExpandTemplates
 'expandtemplates' => 'साचे वाढवा',
-'expand_templates_intro' => 'हà¥\87 à¤ªà¤¾à¤¨ à¤\95ाहà¥\80 à¤®à¤\9cà¤\95à¥\82र à¤\98à¥\87à¤\8aन à¤¤à¥\8dयातिल सर्व साचे वाढविते. तसेच हे पान पार्सर फंक्शन्स जसे की
+'expand_templates_intro' => 'हà¥\87 à¤ªà¤¾à¤¨ à¤\95ाहà¥\80 à¤®à¤\9cà¤\95à¥\82र à¤\98à¥\87à¤\8aन à¤\86वरà¥\8dतà¥\80 à¤ªà¤¦à¥\8dधतà¥\80नà¥\87 à¤¤à¥\8dयातà¥\80ल सर्व साचे वाढविते. तसेच हे पान पार्सर फंक्शन्स जसे की
 <nowiki>{{</nowiki>#language:...}}, व बदलणार्‍या किमती (variables) जसे की
-<nowiki>{{</nowiki>CURRENTDAY}}&mdash;म्हणजेच दोन ब्रेसेसमधील सर्व मजकूर वाढविते.
-मीडियाविकिमधून पार्सर स्टेज मागवून हे केले जाते.',
+<nowiki>{{</nowiki>CURRENTDAY}}&mdash;म्हणजेच दोन ब्रेसेसमधील बरेच काही वाढविते.',
 'expand_templates_title' => '{{FULLPAGENAME}} वगैरे करीता, कन्टेक्स्ट शीर्षक:',
 'expand_templates_input' => 'इनपुट मजकूर:',
 'expand_templates_output' => 'निकाल',
index d686649..b79a9fd 100644 (file)
@@ -1322,7 +1322,6 @@ Butirannya boleh didapati di [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGEN
 'rows' => 'Baris:',
 'columns' => 'Lajur:',
 'searchresultshead' => 'Cari',
-'resultsperpage' => 'Jumlah padanan bagi setiap halaman:',
 'stub-threshold' => 'Ambang bagi pemformatan <a href="#" class="stub">pautan ke rencana ringkas</a> (bait):',
 'stub-threshold-disabled' => 'Dimatikan',
 'recentchangesdays' => 'Bilangan hari dalam perubahan terkini:',
index d2e7a5a..ad5013c 100644 (file)
@@ -1319,7 +1319,6 @@ Innota però li l-werreja tal-kontenut ta' {{SITENAME}} f'dawn is-siti, jistgħu
 'rows' => 'Fillieri:',
 'columns' => 'Kolonni:',
 'searchresultshead' => 'Fittex',
-'resultsperpage' => "Numru ta' riżultati għal kull paġna:",
 'stub-threshold' => 'Valur minimu għall-<a href="#" class="stub">ħoloq għall-abozzi</a>, f\'bytes:',
 'stub-threshold-disabled' => 'Diżattivat',
 'recentchangesdays' => "Numru ta' ġranet li għandhom jintwerew fit-tibdil riċenti:",
index 43c1dd7..e5afd9c 100644 (file)
@@ -737,7 +737,6 @@ Legend: '''({{int:cur}})''' = နောက်ဆုံးမူနှင့် 
 'rows' => 'အလျားလိုက်တန်း -',
 'columns' => 'ဒေါင်လိုက်တန်း -',
 'searchresultshead' => 'ရှာ​ဖွေ​ရန်​',
-'resultsperpage' => 'စာတစ်မျက်နှာလျှင် ဝင်ကြည့်နှုန်း -',
 'stub-threshold-disabled' => 'ပိတ်ထားသည်',
 'recentchangesdays' => 'လတ်တလောအပြောင်းအလဲများကို ပြရန်နေ့များ -',
 'recentchangesdays-max' => 'အများဆုံး $1 {{PLURAL:$1|ရက်|ရက်}}',
index cf6ab2e..95d8581 100644 (file)
@@ -936,7 +936,6 @@ IP-тешкстэть — $3, саймас совавтоманть ID-сь —
 'rows' => 'Валчилькстнэ (строкатне):',
 'columns' => 'Палманть:',
 'searchresultshead' => 'Вешнема',
-'resultsperpage' => 'Зяроксть вастневи ве лопасо:',
 'recentchangesdays' => 'Зяро чить невтемс чиень полавтнематнесэ-лиякстомтоматнесэ:',
 'recentchangesdays-max' => 'Весемеде куватьс $1 {{PLURAL:$1|1=чис|чис}}',
 'recentchangescount' => 'Васень аравтоматнень коряс зяро витнемат-петнемат невтемс:',
index 565253f..7ac970f 100644 (file)
@@ -85,9 +85,9 @@ $messages = array(
 'tog-hidepatrolled' => 'Motlàtìs tlapîpialli tlayèktlàlilistli ìpan welok tlapảtlalistli',
 'tog-newpageshidepatrolled' => 'Mokintlàtis tlapîpialtlaìxtlapaltìn ìwikpa ìtlapòpòwaltekpànal in yâyankuik tlaìxtlapaltìn',
 'tog-extendwatchlist' => 'Mìxmảnas in tlapòpòwaltekpàntlachialli ìka mỏtas nochi in tlapảtlalistli, âmò in san okachi yankuik.',
-'tog-usenewrc' => 'Quimolōloāz in tlapatlaliztli yancuīc tlapatlaliztli āmapan īhuān in tlachiyaliztli tlapōhualāmapan (monequi JavaScript)',
+'tog-usenewrc' => 'Molōloāzqueh in tlapatlaliztli in yancuīc tlapatlaliztli āmapan īhuān in tlachiyaliztli tlapōhualāmapan (monequi JavaScript)',
 'tog-showtoolbar' => 'Motlaīxtlatīz in tlachihchīhualōni pāntli',
-'tog-editondblclick' => 'Tiquimpatlāz in zāzaniltin intlā ōme tiquimpachoa',
+'tog-editondblclick' => 'Tiquimpatlāz in zāzanilli intlā ōme tiquimpachoa',
 'tog-showtoc' => 'Tiquittāz in tlein cah zāzotlahcuilōlco',
 'tog-rememberpassword' => 'Ticpiyāz moMotlatequitiltilīltōca īhuān motlahtōlichtacāyo inīn chīuhpōhualhuazco (īxquich {{PLURAL:$1|tōnalli}})',
 'tog-watchcreations' => 'Moaquiāz in āmatl mā niquinyōcoya īhuān in tlahcuilōlli mā niquinquetza īpan notlachiyaliz',
@@ -390,7 +390,7 @@ Hueliz quimpiya tlahtōl tlein ahmo mohuelītih motequitiltia tōcāpan.',
 'createaccount' => 'Ticchīhuāz cē cuentah',
 'gotaccount' => "¿Ye ticpiya cē cuentah? '''$1'''.",
 'gotaccountlink' => 'Ximocalaqui',
-'createaccountmail' => 'Ticnemītīz ahmo cemihcac zāzoichtacātlahtōlli nō in tiquēhualtīz in maltzinteyōtl nonetitlanizyeyān',
+'createaccountmail' => 'Ticnemītīz ahmo cemihcac zāzoichtacātlahtōlli nō in tiquēhualtīz in maltzinteyōtl monetitlanizyeyān',
 'createaccountreason' => 'Tlèka:',
 'badretype' => 'Ahneneuhqui motlahtōlichtacāyo.',
 'userexists' => 'In tlatequitiltilīltōcāitl in ōquipehpen ye ia.
@@ -427,7 +427,7 @@ Occeppa xicalaqui niman ticmatīz.',
 'newpassword' => 'Yancuīc motlahtōlichtacayo:',
 'retypenew' => 'Occeppa xiquihcuiloa yancuīc motlahtōlichtacayo:',
 'resetpass_submit' => 'Xicpatlāz motlahtōlichtacāyo auh xicalaquīz',
-'changepassword-success' => 'In ichtacātlahtōlli cualli ōtlapatlalo',
+'changepassword-success' => 'Mochtacātlahtōl cualli ōtlapatlalo.',
 'resetpass_forbidden' => 'Tlahtōlichtacayōtl ahmo mohuelītih mopatlah',
 'resetpass-submit-loggedin' => 'Ticpatlāz motlahtōlichtacāyo',
 'resetpass-submit-cancel' => 'Ticcuepāz',
@@ -472,9 +472,7 @@ Occeppa xicalaqui niman ticmatīz.',
 'loginreqlink' => 'ximocalaqui',
 'loginreqpagetext' => 'Tihuīquilia $1 ic tiquintta occequīntīn zāzaniltin.',
 'accmailtitle' => 'Tlahtōlichtacāyōtl ōmoihuah.',
-'accmailtext' => "Cē zāzotlahtōlichtacāyōtl ōcyōcox [[User talk:$1|$1]]  moquitītlani īhuīc $2.
-
-In tlahtōlichtacāyōtl īpal inīn yancuīc cuenta hueliti ticpatlalo zāzanilpan ''[[Special:ChangePassword|tlahtōlichtacāyōtl patlaliztli]]'' zatepan ōticalac.",
+'accmailtext' => "Ōquiyōcox zāzochtacātlahtōlli in [[User talk:$1|$1]] auh ōmoquitītlan īhuīc $2. Tihueliti ticpatlaz īpan ''[[Special:ChangePassword|Ticpatlaz in ]]'' in ōticalaco achtopa.",
 'newarticle' => '(Yancuīc)',
 'newarticletext' => 'Ōtictocac cētiliztli cē zāzanilhuīc oc ahmo ia. Intlā quiēlēhuia quichīhua, xitlahcuiloa niman (nō xiquitta [[{{MediaWiki:Helppage}}|tēpalēhuiliztli zāzanilli]] huehca ōmpa tlapatlaliztli). Intlā ahmo, yāuh achtopa zāzanilli.',
 'noarticletext' => 'In āxcān, ahmō onca tlahcuilōlli inīn zāzanilpan.
@@ -505,7 +503,7 @@ Tihuelīti [[Special:Search/{{PAGENAME}}|tictēmoa inīn zāzaniltōcācopa]] oc
 'hiddencategories' => 'Inīn zāzanilli mopiya {{PLURAL:$1|1 neneuhcāyōc ōmotlāti|$1 neneuhcāyōc ōmotlāti}}:',
 'nocreatetext' => 'Inīn huiqui ōquitzacuili tlahuelītiliztli ic tlachīhua yancuīc zāzaniltin. Tichuelīti ticcuepa auh ticpatla cē zāzanilli, [[Special:UserLogin|xicalaqui nozo xicchīhua cē cuentah]].',
 'nocreate-loggedin' => 'Ahmo tihuelīti tiquinchīhua yancuīc zāzaniltin.',
-'permissionserrors' => 'Huelītiliztechcopa ahcuallōtl',
+'permissionserrors' => 'Tēmācāhualiztli aiuhcāyōtl',
 'permissionserrorstext' => 'Ahmo tihuelīti quichīhua inōn, inīn {{PLURAL:$1|īxtlamatilizpampa}}:',
 'permissionserrorstext-withaction' => 'Ahmo tiquihuelīti $2 inīn {{PLURAL:$1|īxtlamatilizpampa}}:',
 'moveddeleted-notice' => 'Inīn zāzanilli ōmopolo.
@@ -539,8 +537,8 @@ Ye ia.',
 'page_last' => 'xōcoyōc',
 'history-fieldset-title' => 'Tictēmōz īpan tlahcuilōlloh',
 'history-show-deleted' => 'Zan tlapolōlli',
-'histfirst' => 'Achto',
-'histlast' => 'Yancuīc',
+'histfirst' => 'in achto',
+'histlast' => 'in tlatzaucticah',
 'historysize' => '({{PLURAL:$1|1 byte|$1 byte}})',
 'historyempty' => '(iztāc)',
 
@@ -557,10 +555,10 @@ Hueliz ōmopolo huiqui nozo ōmozacac.
 'revisiondelete' => 'Tiquimpolōz/ahtiquimpolōz tlachiyaliztli',
 'revdelete-show-file-submit' => 'Quēmah',
 'revdelete-selected' => "'''{{PLURAL:$2|Tlachiyaliztli ōmoēlēhui|Tlachiyaliztli ōmoēlēhuih}} [[:$1]] ītechcopa:'''",
-'revdelete-hide-text' => 'Tictlātīz tlachiyaliztli ītlahcuilōl',
+'revdelete-hide-text' => 'In tlahtlachiyaliztli ītlahcuilōl',
 'revdelete-hide-image' => 'Tictlātīz tlahcuilōlli ītlapiyaliz',
-'revdelete-radio-set' => 'Quēmah',
-'revdelete-radio-unset' => 'Ahmo',
+'revdelete-radio-set' => 'Tlaīnāyalli',
+'revdelete-radio-unset' => 'Ittalōni',
 'revdel-restore' => 'Ticpatlāz tlattaliztli',
 'pagehist' => 'Zāzanilli tlahcuilōlloh',
 'deletedhist' => 'Ōtlapolo tlahcuilōlloh',
@@ -753,7 +751,7 @@ Intlā ticnequi, tlācah quimatīzqueh motequi.',
 'rclistfrom' => 'Xiquinttāz yancuīc tlapatlaliztli īhuīcpa $1',
 'rcshowhideminor' => '$1 tlapatlalitzintli',
 'rcshowhidebots' => '$1 tepoztlācah',
-'rcshowhideliu' => '$1 tlatequitiltilīlli ōmocalacqueh',
+'rcshowhideliu' => '$1 tēmachiyōmacalli tlatequitiltilīltin',
 'rcshowhideanons' => '$1 ahtōcā tlatequitiltilīlli',
 'rcshowhidepatr' => '$1 tlapatlaliztli mochiyahua',
 'rcshowhidemine' => '$1 notlahcuilōl',
@@ -1099,7 +1097,7 @@ Xiquitta $2 ic yancuīc tlapololiztli.',
 'contributions-title' => 'Tlatequitiltilīlli $1 ītlahcuilōl',
 'mycontris' => 'Notlahcuilōl',
 'contribsub2' => '$1 ($2)',
-'uctop' => '(ahco)',
+'uctop' => '(āxcān tlapatlaliztli)',
 'month' => 'Īhuīcpa mētztli (auh achtopa):',
 'year' => 'Xiuhhuīcpa (auh achtopa):',
 
@@ -1437,7 +1435,7 @@ Niman tihuelīti [[Special:UserLogin|timocalaqui]] auh ticpactiāz huiquitica.',
 'version' => 'Machiyōtzin',
 'version-specialpages' => 'Nònkuâkìskàtlaìxtlapaltìn',
 'version-other' => 'Occē',
-'version-version' => '(Machiyōtzin $1)',
+'version-version' => '($1)',
 'version-software-version' => 'Machiyōtzin',
 
 # Special:FileDuplicateSearch
index 30e2426..d05c097 100644 (file)
@@ -1152,6 +1152,8 @@ Slette- og flytteloggen vises nedenfor.',
 'invalid-content-data' => 'Ugyldig innhold',
 'content-not-allowed-here' => 'Innholdsmodellen «$1» er ikke tillatt på siden [[$2]]',
 'editwarning-warning' => 'Ved å forlate siden kan du miste alle endringer du har utført. Om du er logget inn kan du slå av denne advarselen under «Redigering»-seksjonen i innstillingene.',
+'editpage-notsupportedcontentformat-title' => 'Innholdsformatet er ikke støttet',
+'editpage-notsupportedcontentformat-text' => 'Innholdsformatet $1 er ikke støttet av innholdsmodellen $2.',
 
 # Content models
 'content-model-wikitext' => 'WikiTekst',
@@ -1193,6 +1195,9 @@ Disse parameterne har blitt utelatt.',
 'cantcreateaccount-text' => "Kontooppretting fra denne IP-adressen ('''$1''') har blitt blokkert av [[User:$3|$3]].
 
 Grunnen som ble oppgitt av $3 er ''$2''",
+'cantcreateaccount-range-text' => "Opprettelsen av en brukerkonto fra IP-adresser i intervallet '''$1''', som inneholder din IP-adresse ('''$4'''), er blitt blokkert av [[User:$3|$3]].
+
+Årsaken angitt av $3 er ''$2''",
 
 # History pages
 'viewpagelogs' => 'Vis logger for denne siden',
@@ -1451,7 +1456,6 @@ Detaljer kan finnes i [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}
 'rows' => 'Rader:',
 'columns' => 'Kolonner',
 'searchresultshead' => 'Søk',
-'resultsperpage' => 'Resultater per side:',
 'stub-threshold' => 'Grense for <span class="mw-stub-example">stubblenkeformatering</span>:',
 'stub-threshold-disabled' => 'Deaktivert',
 'recentchangesdays' => 'Antall dager som skal vises i siste endringer:',
@@ -1722,6 +1726,7 @@ Informasjonen vil være offentlig.',
 'recentchanges-label-bot' => 'Denne redigeringen ble gjort av en bot',
 'recentchanges-label-unpatrolled' => 'Denne redigeringen har ikke blitt patruljert ennå',
 'recentchanges-label-plusminus' => 'Sidestørrelsen kan endres med dette antallet bytes',
+'recentchanges-legend-heading' => "'''Tegnforklaring:'''",
 'recentchanges-legend-newpage' => '(se også [[Special:NewPages|liste av nye sider]])',
 'rcnotefrom' => "Nedenfor er endringene siden '''$2''' (opp til '''$1''' vises).",
 'rclistfrom' => 'Vis nye endringer med start fra $1',
@@ -1842,6 +1847,7 @@ Om du fortsatt ønsker å laste opp filen, gå tilbake og last den opp under et
 Om du fortsatt ønsker å laste opp filen, gå tilbake og last den opp under et nytt navn. [[File:$1|thumb|center|$1]]',
 'file-exists-duplicate' => 'Denne filen er en dublett av følgende {{PLURAL:$1|fil|filer}}:',
 'file-deleted-duplicate' => 'En fil identisk med denne filen ([[:$1]]) har tidligere blitt slettet. Du bør sjekke denne filens slettehistorikk før du prøver å laste den opp på nytt.',
+'file-deleted-duplicate-notitle' => 'En annen fil identisk med denne filen har tidligere blitt slettet og tittelen har blitt fjernet. Du bør sjekke med noen som kan se på fjernede fildata å vurdere saken før filen lastes opp igjen.',
 'uploadwarning' => 'Opplastingsadvarsel',
 'uploadwarning-text' => 'Vennligst endre filbeskrivelsen nedenfor og prøv igjen.',
 'savefile' => 'Lagre fil',
@@ -2219,6 +2225,7 @@ Hver rad inneholder lenker til første og andre omdirigering, samt målet for de
 'protectedpages' => 'Låste sider',
 'protectedpages-indef' => 'Kun beskyttelser på ubestemt tid',
 'protectedpages-cascade' => 'Kun dypbeskyttelse',
+'protectedpages-noredirect' => 'Skjul omdirigeringer',
 'protectedpagesempty' => 'Ingen sider er for øyeblikket låst med disse paramterne.',
 'protectedtitles' => 'Beskyttede titler',
 'protectedtitlesempty' => 'Ingen titler beskyttes med disse parameterne for øyeblikket.',
@@ -2492,6 +2499,7 @@ Se $2 for en oversikt over de siste slettingene.',
 'delete-edit-reasonlist' => 'Rediger begrunnelser for sletting',
 'delete-toobig' => 'Denne siden har en stor redigeringshistorikk, med over {{PLURAL:$1|$1&nbsp;revisjon|$1&nbsp;revisjoner}}. Muligheten til å slette slike sider er begrenset for å unngå utilsiktet forstyrring av {{SITENAME}}.',
 'delete-warning-toobig' => 'Denne siden har en stor redigeringshistorikk, med over {{PLURAL:$1|$1&nbsp;revisjon|$1&nbsp;revisjoner}}. Sletting av denne siden kan forstyrre databasen til {{SITENAME}}; vær varsom.',
+'deleting-backlinks-warning' => "'''Advarsel:''' Andre sider har lenker til den siden du skal til å slette.",
 
 # Rollback
 'rollback' => 'Fjern redigeringer',
@@ -2720,6 +2728,7 @@ Den siste oppføringen i blokkeringsloggen er vist nedenfor som referanse:',
 Se [[Special:BlockList|blokkeringslisten]] for alle blokkeringer.',
 'ipb-blockingself' => 'Du er i ferd med å blokkere deg selv! Er du sikker på at du vil gjøre det?',
 'ipb-confirmhideuser' => 'Du er i ferd med å blokkere en bruker med «skjul bruker» aktivert. Dette vil skjule brukerens navn i alle lister og loggoppføringer. Er du sikker på at du vil gjøre dette?',
+'ipb-confirmaction' => 'Marker feltet "{{int:ipb-confirm}}" nederst om du er sikker på at du virkelig vil gjøre det.',
 'ipb-edit-dropdown' => 'Rediger blokkeringsgrunner',
 'ipb-unblock-addr' => 'Avblokker $1',
 'ipb-unblock' => 'Avblokker et brukernavn eller en IP-adresse',
@@ -3792,6 +3801,9 @@ Denne bekreftelseskoden utløper $4.',
 'confirm-unwatch-button' => 'OK',
 'confirm-unwatch-top' => 'Fjern denne siden fra overvåkningslisten din?',
 
+# Separators for various lists, etc.
+'quotation-marks' => '«$1»',
+
 # Multipage image navigation
 'imgmultipageprev' => '← forrige side',
 'imgmultipagenext' => 'neste side &rarr;',
@@ -3800,7 +3812,7 @@ Denne bekreftelseskoden utløper $4.',
 
 # Language selector for translatable SVGs
 'img-lang-default' => '(standardspråk)',
-'img-lang-info' => 'Fremstill dette bildet i $1 $2.',
+'img-lang-info' => 'Vis dette bildet i $1.$2',
 'img-lang-go' => 'Start',
 
 # Table pager
@@ -3919,6 +3931,10 @@ Du kan også [[Special:EditWatchlist|bruke standardverktøyet]].',
 'version-ext-colheader-license' => 'Lisens',
 'version-ext-colheader-description' => 'Beskrivelse',
 'version-ext-colheader-credits' => 'Forfattere',
+'version-license-title' => 'Lisens for $1',
+'version-license-not-found' => 'Ingen detaljert lisensinformasjon ble funnet for denne utvidelsen.',
+'version-credits-title' => 'Anerkjennelser for $1',
+'version-credits-not-found' => 'Ingen detaljert anerkjennelsesinformasjon ble funnet for denne utvidelsen.',
 'version-poweredby-credits' => "Denne wikien er drevet av '''[https://www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
 'version-poweredby-others' => 'andre',
 'version-poweredby-translators' => 'translatewiki.net-oversettere',
@@ -4188,6 +4204,7 @@ Faktisk utvider den det meste innkapslet i doble krøllparenteser.',
 'expand_templates_input' => 'Skriv inn tekst:',
 'expand_templates_output' => 'Resultat',
 'expand_templates_xml_output' => 'XML-resultat',
+'expand_templates_html_output' => 'Rå HTML-utskrift',
 'expand_templates_ok' => 'OK',
 'expand_templates_remove_comments' => 'Fjern kommentarer',
 'expand_templates_remove_nowiki' => 'Ikke vis <nowiki>-merkelapper i resultatet',
index 3914f2f..cc1db15 100644 (file)
@@ -1114,7 +1114,6 @@ de aver nich jümmer den aktuellsten Stand weerspegelt.<p>',
 'rows' => 'Regen',
 'columns' => 'Spalten',
 'searchresultshead' => 'Söökresultaten',
-'resultsperpage' => 'Treffer pro Siet',
 'stub-threshold' => 'Grött ünner de Lenken op <a href="#" class="stub">Stubbens un lütte Sieden</a> farvlich kenntekent warrn schöölt (in Bytes):',
 'stub-threshold-disabled' => 'Utstellt',
 'recentchangesdays' => 'Daag, de de List vun de „Ne’esten Ännern“ wiesen schall:',
index 2a8ad02..1d1162c 100644 (file)
@@ -1443,7 +1443,6 @@ Waorschienlik ku'j der meer gegevens over vienen in t [{{fullurl:{{#Special:Log}
 'rows' => 'Regels',
 'columns' => 'Kolommen',
 'searchresultshead' => 'Zeukresultaoten',
-'resultsperpage' => 'Antal zeukresultaoten per zied',
 'stub-threshold' => 'Verwiezingsformattering van <a href="#" class="stub">beginnetjes</a>:',
 'stub-threshold-disabled' => 'uutezet',
 'recentchangesdays' => 'Antal dagen die "Leste wiezigingen" löt zien:',
@@ -3250,7 +3249,7 @@ $1',
 'minutes' => '{{PLURAL:$1|$1 minuut|$1 minuten}}',
 'hours' => '{{PLURAL:$1|$1 ure|$1 uren}}',
 'days' => '{{PLURAL:$1|$1 dag|$1 dagen}}',
-'weeks' => '{{PLURAL: $1|één weke|$1 weken}}',
+'weeks' => '{{PLURAL:$1|één weke|$1 weken}}',
 'months' => '{{PLURAL:$1|een maond|$1 maonden}}',
 'years' => '{{PLURAL:$1|één jaor|$1 jaor}}',
 'ago' => '$1 eleen',
index c826d24..257a8e7 100644 (file)
@@ -1128,7 +1128,6 @@ $1",
 'rows' => 'हरफहरु :',
 'columns' => 'स्तम्भहरु :',
 'searchresultshead' => 'खोज',
-'resultsperpage' => 'प्रति पृष्ठ खोज मेल(hits):',
 'stub-threshold' => '<a href="#" class="stub">ठूटो</a> को लागि थ्रेसहोल्ड स्वरूपण (बाइट):',
 'stub-threshold-disabled' => 'निष्क्रिय',
 'recentchangesdays' => 'हालको परिवर्तनमा देखाउने दिनहरु:',
index 4b319af..deb2b3b 100644 (file)
@@ -37,6 +37,7 @@
  * @author Mwpnl
  * @author Naudefj
  * @author Niels
+ * @author Niknetniko
  * @author Paul B
  * @author Romaine
  * @author SPQRobin
@@ -577,7 +578,7 @@ $messages = array(
 'deletethispage' => 'Deze pagina verwijderen',
 'undeletethispage' => 'Pagina terugplaatsen',
 'undelete_short' => '$1 {{PLURAL:$1|bewerking|bewerkingen}} terugplaatsen',
-'viewdeleted_short' => '{{PLURAL: $1|Eén geschrapte bewerking |$1 geschrapte bewerkingen}} bekijken',
+'viewdeleted_short' => '{{PLURAL:$1|Eén geschrapte bewerking |$1 geschrapte bewerkingen}} bekijken',
 'protect' => 'Beveiligen',
 'protect_change' => 'wijzigen',
 'protectthispage' => 'Deze pagina beveiligen',
@@ -1236,6 +1237,8 @@ Deze bestaat al.',
 'content-not-allowed-here' => 'De inhoud "$1" is niet toegestaan op pagina [[$2]].',
 'editwarning-warning' => 'Als u deze pagina verlaat verliest u mogelijk wijzigingen die u hebt gemaakt.
 Als u bent aangemeld, kunt u deze waarschuwing uitschakelen in het tabblad "{{int:prefs-editing}}" in uw voorkeuren.',
+'editpage-notsupportedcontentformat-title' => 'Inhoudsformaat niet ondersteund',
+'editpage-notsupportedcontentformat-text' => 'Het inhoudsformaat $1 wordt niet ondersteund door het inhoudsmodel $2.',
 
 # Content models
 'content-model-wikitext' => 'wikitekst',
@@ -1546,7 +1549,6 @@ De gegevens over {{SITENAME}} zijn mogelijk niet bijgewerkt.',
 'rows' => 'Regels:',
 'columns' => 'Kolommen:',
 'searchresultshead' => 'Zoekresultaten',
-'resultsperpage' => 'Resultaten per pagina:',
 'stub-threshold' => 'Drempel voor markering als <a href="#" class="stub">beginnetje</a>:',
 'stub-threshold-disabled' => 'Uitgeschakeld',
 'recentchangesdays' => 'Aantal dagen weer te geven in de recente wijzigingen:',
@@ -1953,6 +1955,8 @@ Als u het bestand alsnog wilt uploaden, ga dan terug en kies een andere naam.
 'file-exists-duplicate' => 'Dit bestand is identiek aan {{PLURAL:$1|het volgende bestand|de volgende bestanden}}:',
 'file-deleted-duplicate' => 'Een bestand dat identiek is aan dit bestand ([[:$1]]) is voorheen verwijderd.
 Raadpleeg het verwijderingslogboek voordat u verder gaat.',
+'file-deleted-duplicate-notitle' => 'Er is een verwijderd bestand aangetroffen dat identiek is aan dit bestand, en de naam van het bestand is onderdrukt.
+Vraag iemand die onderdrukte bestandsgegevens kan bekijken om de situatie opnieuw te beoordelen voordat u het bestand opnieuw toevoegt.',
 'uploadwarning' => 'Uploadwaarschuwing',
 'uploadwarning-text' => 'Pas de onderstaande bestandsbeschrijving aan en probeer het daarna opnieuw.',
 'savefile' => 'Bestand opslaan',
@@ -2344,6 +2348,7 @@ De pagina's zijn ook niet als sjabloon opgenomen.",
 'protectedpages' => "Beveiligde pagina's",
 'protectedpages-indef' => 'Alleen blokkades zonder vervaldatum',
 'protectedpages-cascade' => 'Alleen beveiligingen met de cascade-optie',
+'protectedpages-noredirect' => 'Doorverwijzingen verbergen',
 'protectedpagesempty' => "Er zijn momenteel geen pagina's beveiligd die aan deze voorwaarden voldoen.",
 'protectedtitles' => 'Beveiligde paginanamen',
 'protectedtitlesempty' => 'Er zijn geen paginanamen beveiligd die aan deze voorwaarden voldoen.',
@@ -2624,6 +2629,7 @@ Het verwijderen van dit soort pagina's is met rechten beperkt om het per ongeluk
 'delete-warning-toobig' => 'Deze pagina heeft een lange bewerkingsgeschiedenis, meer dan $1 {{PLURAL:$1|versie|versies}}.
 Het verwijderen van deze pagina kan de werking van de database van {{SITENAME}} verstoren.
 Wees voorzichtig.',
+'deleting-backlinks-warning' => "'''Waarschuwing:''' andere pagina's verwijzen naar de pagina die u wilt verwijderen.",
 
 # Rollback
 'rollback' => 'Wijzigingen ongedaan maken',
@@ -2864,6 +2870,7 @@ Geef hieronder een reden op (bijvoorbeeld welke pagina's gevandaliseerd zijn).",
 Zie de [[Special:BlockList|blokkadelijst]] voor recente blokkades.',
 'ipb-blockingself' => 'U staat op het punt uzelf te blokkeren. Weet u zeker dat u dat wilt doen?',
 'ipb-confirmhideuser' => 'U staat op het punt een verborgen gebruiker te blokkeren. Hiervoor worden gebruikersnamen in alle lijsten en logboekregels verborgen. Weet u het zeker?',
+'ipb-confirmaction' => 'Weet u zeker dat u dit wilt doen? Vink dank het vakje "{{int:ipb-confirm}}" hieronder aan.',
 'ipb-edit-dropdown' => 'Lijst van redenen bewerken',
 'ipb-unblock-addr' => '$1 deblokkeren',
 'ipb-unblock' => 'Een gebruiker of IP-adres deblokkeren',
@@ -3442,7 +3449,7 @@ $1',
 'minutes' => '{{PLURAL:$1|$1 minuut|$1 minuten}}',
 'hours' => '{{PLURAL:$1|$1 uur|$1 uur}}',
 'days' => '{{PLURAL:$1|$1 dag|$1 dagen}}',
-'weeks' => '{{PLURAL: $1|één week|$1 weken}}',
+'weeks' => '{{PLURAL:$1|één week|$1 weken}}',
 'months' => '{{PLURAL:$1|één maand|$1 maanden}}',
 'years' => '{{PLURAL:$1|één jaar|$1 jaar}}',
 'ago' => '$1 geleden',
@@ -4085,7 +4092,17 @@ U kunt ook [[Special:EditWatchlist|het standaard bewerkingsscherm gebruiken]].',
 'version-hook-name' => 'Hooknaam',
 'version-hook-subscribedby' => 'Geabonneerd door',
 'version-version' => '(Versie $1)',
-'version-license' => 'Licentie',
+'version-license' => 'Licentie voor MediaWiki',
+'version-ext-license' => 'Licentie',
+'version-ext-colheader-name' => 'Uitbreiding',
+'version-ext-colheader-version' => 'Versie',
+'version-ext-colheader-license' => 'Licentie',
+'version-ext-colheader-description' => 'Beschrijving',
+'version-ext-colheader-credits' => 'Auteurs',
+'version-license-title' => 'Licentie voor $1',
+'version-license-not-found' => 'Er zijn geen gedetaillieerde licentiegegevens aangetroffen voor deze uitbreiding.',
+'version-credits-title' => 'Vermeldingen voor $1',
+'version-credits-not-found' => 'Er zijn geen gedetailleerde meldingen aangetroffen voor deze uitbreiding.',
 'version-poweredby-credits' => "Deze wiki wordt aangedreven door '''[https://www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
 'version-poweredby-others' => 'anderen',
 'version-poweredby-translators' => 'translatewiki.net-vertalers',
@@ -4306,6 +4323,7 @@ Anders kunt u ook het eenvoudige formulier hieronder gebruiken. Uw reactie wordt
 'api-error-overwrite' => 'Het overschrijven van een bestand bestand is niet toegestaan.',
 'api-error-stashfailed' => 'Interne fout: de server kon het tijdelijke bestand niet opslaan.',
 'api-error-publishfailed' => 'Interne fout: de server kon het tijdelijke bestand niet publiceren.',
+'api-error-stasherror' => 'Er is een fout opgetreden tijdens het uploaden van het bestand naar de tijdelijke opslagruimte.',
 'api-error-timeout' => 'De server heeft niet binnen de verwachte tijd geantwoord.',
 'api-error-unclassified' => 'Er is een onbekende fout opgetreden',
 'api-error-unknown-code' => 'Interne fout: "$1"',
index b8cc532..fc692ab 100644 (file)
@@ -1400,7 +1400,6 @@ Ver merksam på at registra deira kan vera utdaterte.',
 'rows' => 'Rekkjer',
 'columns' => 'Kolonnar',
 'searchresultshead' => 'Søk',
-'resultsperpage' => 'Resultat per side',
 'stub-threshold' => 'Grense (i byte) for at frø/spirer skal formaterast <a href="#" class="stub">slik</a>:',
 'stub-threshold-disabled' => 'Deaktivert',
 'recentchangesdays' => 'Tal på dagar som viser på siste endringar:',
index a7410e3..fa0940b 100644 (file)
@@ -1404,7 +1404,6 @@ Atencion, lor indexacion de contengut {{SITENAME}} benlèu es pas a jorn.',
 'rows' => 'Rengadas :',
 'columns' => 'Colomnas :',
 'searchresultshead' => 'Recèrca',
-'resultsperpage' => 'Nombre de responsas per pagina :',
 'stub-threshold' => 'Limit superior pels <a href="#" class="stub">ligams cap als esbòsses</a> (octets) :',
 'stub-threshold-disabled' => 'Desactivat',
 'recentchangesdays' => "Nombre de jorns d'afichar dins los darrièrs cambiaments :",
index 276791c..060dd3d 100644 (file)
@@ -1373,7 +1373,6 @@ $1",
 'rows' => 'ଧାଡ଼ି:',
 'columns' => 'ସ୍ତମ୍ଭସବୁ:',
 'searchresultshead' => 'ଖୋଜିବା',
-'resultsperpage' => 'ପୃଷ୍ଠା ପ୍ରତି ହିଟ:',
 'stub-threshold' => '<a href="#" class="stub">ଅସମ୍ପୂର୍ଣ ପୃଷ୍ଠା ଲିଙ୍କ</a> ସଜାଣି (ବାଇଟ) ପାଇଁ ସୀମା:',
 'stub-threshold-disabled' => 'ଅଚଳ କରିଦିଆଯାଇଛି',
 'recentchangesdays' => 'ନଗଦ ବଦଳରେ ଦେଖାଇବା ପାଇଁ ବାକିଥିବା ଦିନ:',
index 1add0e9..cd8138c 100644 (file)
@@ -663,7 +663,7 @@ $2',
 'passwordtooshort' => 'Паролтæ хъуамæ уой уæддæр {{PLURAL:$1|1 дамгъæйы|$1 дамгъæйы}} дæргъæн.',
 'password-name-match' => 'Дæ парол ма хъуамæ уа дæ фæсномыгы хуызæн.',
 'password-login-forbidden' => 'Ацы фæсномыг æмæ паролæй нæй гæнæн архайын.',
-'mailmypassword' => 'РаÑ\80виÑ\82 Ð¼Ã¦Ð¼ Ð½Ð¾Ð³ пароль',
+'mailmypassword' => 'Ð\91аив пароль',
 'passwordremindertitle' => 'Ног рæстæгмæ пароль {{grammar:dative|{{SITENAME}}}}',
 'passwordremindertext' => 'Чидæр (æвæццæгæн ды, $1 IP адрисæй) æрдомтта ног парол {{grammar:dative|{{SITENAME}}}} ($4). "$2" архайæгæн арæзт æрцыд рæстæгмæ парол. Парол у "$3". Кæд уый ды уыдтæ, уæд дын ныр хъæудзæн бахизын æмæ равзарын ног парол.
 Дæ рæстæгмæ парол ма кусдзæнис {{PLURAL:$5|иу бон|$5 боны}}.
@@ -1196,7 +1196,7 @@ ASCII нысæнттæм чи нæ хауы, уыдон ивыны бынаты
 'rclistfrom' => 'Равдисын ивдтытæ амæй фæстæ: $1',
 'rcshowhideminor' => '$1 чысыл ивдтытæ',
 'rcshowhidebots' => '$1 роботты',
-'rcshowhideliu' => '$1, йæхи чи бацамыдта, уыцы архайджыты',
+'rcshowhideliu' => '$1 регистрацигонд архайæджы',
 'rcshowhideanons' => '$1 æнæном архайджыты',
 'rcshowhidepatr' => '$1 бæрæггонд ивдтæ',
 'rcshowhidemine' => '$1 мæ ивдтытæ',
@@ -1211,7 +1211,7 @@ $3',
 'boteditletter' => 'б',
 'rc_categories_any' => 'Кæцы фæнды',
 'newsectionsummary' => '/* $1 */ ног хай',
-'rc-enhanced-expand' => 'Лæмбынæг информаци равдисын (домы JavaScript)',
+'rc-enhanced-expand' => 'Лæмбынæг информаци равдисын',
 'rc-enhanced-hide' => 'Айсын лæмбынæг информаци',
 'rc-old-title' => 'фыццаг арæзт æрцыд куыд "$1"',
 
@@ -1645,7 +1645,7 @@ $3',
 'file-info-size' => '$1 × $2 пикселы, файлы уæз: $3, MIME тип: $4',
 'file-nohires' => 'Нæй ын стырдæр фæлтæр .',
 'svg-long-desc' => 'SVG файл, номиналон $1 × $2 пикселы, файлы бæрц: $3',
-'show-big-image' => 'Æнæхъæнæй',
+'show-big-image' => 'Оригиналы файл',
 
 # Special:NewFiles
 'newimages' => 'Ног нывты галерей',
index ddf68de..16ffe68 100644 (file)
@@ -1178,7 +1178,6 @@ $3|'''1''' ਨਤੀਜਾ|'''$3''' ਨਤੀਜੇ}} ਵਖਾਓ।",
 'rows' => 'ਕਤਾਰਾਂ:',
 'columns' => 'ਕਾਲਮ:',
 'searchresultshead' => 'ਖੋਜ',
-'resultsperpage' => 'ਪ੍ਰਤੀ ਸਫ਼ਾ ਫੇਰੀਆਂ:',
 'stub-threshold-disabled' => 'ਬੰਦ ਹੈ',
 'recentchangesdays' => 'ਤਾਜ਼ਾ ਤਬਦੀਲੀਆਂ ਵਿਚ ਵਿਖਾਉਣ ਲਈ ਦਿਨ:',
 'recentchangesdays-max' => 'ਵੱਧ ਤੋਂ ਵੱਧ $1 {{PLURAL:$1|ਦਿਨ|ਦਿਨ}}',
index 83c1c83..969deff 100644 (file)
@@ -783,7 +783,6 @@ Pakitandanan mung maliaring e no makapanaun deng karelang index king kalamnan ni
 'rows' => 'Dane (rows):',
 'columns' => 'Ding asias:',
 'searchresultshead' => 'Maintun',
-'resultsperpage' => 'Tinud (hits) balang bulung:',
 'stub-threshold' => 'Angganan ning <a href="#" class="stub">stub link</a> formatting (byte):',
 'recentchangesdays' => 'Deng aldong ipalto king bayung mengayalili:',
 'recentchangescount' => 'Bilang da reng me-edit a ipalto king bayung mengayalili:',
index c86533f..2f5e7fd 100644 (file)
@@ -1463,7 +1463,6 @@ Jednak informacje o treści {{GRAMMAR:D.lp|{{SITENAME}}}} mogą być w Google ni
 'rows' => 'Wiersze',
 'columns' => 'Kolumny',
 'searchresultshead' => 'Wyszukiwanie',
-'resultsperpage' => 'Liczba wyników na stronie',
 'stub-threshold' => 'Maksymalny (w bajtach) rozmiar strony oznaczanej jako <a href="#" class="stub">zalążek (stub)</a>',
 'stub-threshold-disabled' => 'Wyłączone',
 'recentchangesdays' => 'Liczba dni prezentowanych w ostatnich zmianach',
@@ -2204,7 +2203,7 @@ Każdy wiersz zawiera linki do pierwszego i drugiego przekierowania oraz link, d
 'ninterwikis' => '$1 {{PLURAL:$1|interwiki|interwiki|interwiki}}',
 'nlinks' => '$1 {{PLURAL:$1|link|linki|linków}}',
 'nmembers' => '$1 {{PLURAL:$1|element|elementy|elementów}}',
-'nmemberschanged' => '$1 → $2 {{PLURAL:$1|element|elementy|elementów}}',
+'nmemberschanged' => '$1 → $2 {{PLURAL:$2|element|elementy|elementów}}',
 'nrevisions' => '$1 {{PLURAL:$1|wersja|wersje|wersji}}',
 'nviews' => 'odwiedzono $1 {{PLURAL:$1|raz|razy}}',
 'nimagelinks' => 'Używane na $1 {{PLURAL:$1|stronie|stronach}}',
@@ -2516,7 +2515,7 @@ Zobacz na stronie $2 rejestr ostatnio wykonanych usunięć.',
 Usuwanie jej zostało ograniczone ze względu na możliwość zakłócenia pracy {{GRAMMAR:D.lp|{{SITENAME}}}}.',
 'delete-warning-toobig' => 'Ta strona ma bardzo długą historię edycji – ponad $1 {{PLURAL:$1|zmianę|zmiany|zmian}}.<br />
 Bądź ostrożny, ponieważ usunięcie jej może spowodować zakłócenia w pracy {{GRAMMAR:D.lp|{{SITENAME}}}}.',
-'deleting-backlinks-warning' => "''' Uwaga:''' Do strony, masz zamiar usunąć, odwołują się inne strony.",
+'deleting-backlinks-warning' => "''' Uwaga:''' Do strony, którą masz zamiar usunąć, odwołują się inne strony.",
 
 # Rollback
 'rollback' => 'Cofnij edycję',
@@ -2546,9 +2545,9 @@ Naciśnij „wstecz” w przeglądarce, przeładuj stronę, po czym ponownie wyd
 'protectlogpage' => 'Zabezpieczone',
 'protectlogtext' => 'Poniżej znajduje się lista zmian w zabezpieczeniu pojedynczych stron.
 Wszystkie aktywne zabezpieczenia odnajdziesz na liście [[Special:ProtectedPages|zabezpieczonych stron]].',
-'protectedarticle' => 'zabezpieczono "[[$1]]"',
-'modifiedarticleprotection' => 'zmieniono stopień zabezpieczenia "[[$1]]"',
-'unprotectedarticle' => 'odbezpieczył [[$1]]',
+'protectedarticle' => 'zabezpieczył(a) „[[$1]]”',
+'modifiedarticleprotection' => 'zmienił(a) stopień zabezpieczenia „[[$1]]”',
+'unprotectedarticle' => 'odbezpieczył(a) „[[$1]]”',
 'movedarticleprotection' => 'przeniósł ustawienia zabezpieczeń z [[$2]] do [[$1]]',
 'protect-title' => 'Zmiana stopnia zabezpieczenia „$1”',
 'protect-title-notallowed' => 'Podgląd stopnia zabezpieczenia „$1”',
@@ -3059,9 +3058,9 @@ Brak katalogu dla plików tymczasowych.',
 # Import log
 'importlogpage' => 'Rejestr importu',
 'importlogpagetext' => 'Rejestr przeprowadzonych importów stron z innych serwisów wiki.',
-'import-logentry-upload' => 'Zaimportowano [[$1]] przez pobieranie plików',
+'import-logentry-upload' => 'zaimportował(a) [[$1]] przez pobieranie plików',
 'import-logentry-upload-detail' => '$1 {{PLURAL:$1|wersja|wersje|wersji}}',
-'import-logentry-interwiki' => 'zaimportowano $1 używając transwiki',
+'import-logentry-interwiki' => 'zaimportował(a) $1 używając transwiki',
 'import-logentry-interwiki-detail' => '$1 {{PLURAL:$1|wersja|wersje|wersji}} z $2',
 
 # JavaScriptTest
@@ -4001,7 +4000,14 @@ Możesz także użyć [[Special:EditWatchlist|standardowego edytora obserwowanyc
 'version-hook-name' => 'Nazwa haka (ang. hook name)',
 'version-hook-subscribedby' => 'Zapotrzebowany przez',
 'version-version' => '(Wersja $1)',
-'version-license' => 'Licencja',
+'version-license' => 'Licencja MediaWiki',
+'version-ext-license' => 'Licencja',
+'version-ext-colheader-name' => 'Rozszerzenie',
+'version-ext-colheader-version' => 'Wersja',
+'version-ext-colheader-license' => 'Licencja',
+'version-ext-colheader-description' => 'Opis',
+'version-ext-colheader-credits' => 'Autorzy',
+'version-license-not-found' => 'Nie znaleziono szczegółowych informacji licencyjnych dla tego rozszerzenia.',
 'version-poweredby-credits' => "Ta wiki korzysta z oprogramowania '''[https://www.mediawiki.org/ MediaWiki]''', copyright © 2001‐$1 $2.",
 'version-poweredby-others' => 'inni',
 'version-poweredby-translators' => 'tłumacze translatewiki.net',
index 6b921c8..602167a 100644 (file)
@@ -871,6 +871,8 @@ A esist già.",
 'content-not-allowed-here' => "Ël contnù «$1» a l'é nen autorisà an sla pàgina [[$2]]",
 'editwarning-warning' => "Chité sta pàgina-sì a peul feje perde tute le modìfiche ch'a l'ha fàit.
 S'a l'é rintrà ant ël sistema, a peul disabilité st'avis ant la session «Modìfica» dij sò gust.",
+'editpage-notsupportedcontentformat-title' => 'Formà ëd contnù nen mantnù',
+'editpage-notsupportedcontentformat-text' => "Ël formà ëd contnù $1 a l'é nen mantnù dal model Ëd contnù $2.",
 
 # Content models
 'content-model-wikitext' => 'test wiki',
@@ -1175,7 +1177,6 @@ Sòn a l'é normalment causà da l'andèje dapress a na veja liura stòrica a na
 'rows' => 'Righe:',
 'columns' => 'Colòne:',
 'searchresultshead' => "Specifiché soe preferense d'arserca",
-'resultsperpage' => 'Arzultà da mostré për vira pàgina:',
 'stub-threshold' => 'Valor mìnim për j\'<a href="#" class="stub">anliure a jë sbòss</a>:',
 'stub-threshold-disabled' => 'Disabilità',
 'recentchangesdays' => "Vàire dì smon-e ant j'ùltime modìfiche:",
@@ -2473,6 +2474,7 @@ Che a scriva codì che st'adrëssa IP o së stranòm a dev second chiel esse blo
 Ch'a consulta la [[Special:BlockList|lista dij blocagi]] për rivëdde ij blocagi.",
 'ipb-blockingself' => "A l'é an camin ch'as blòca chiel-midem! É-lo sigur ëd vorèj fé lòn?",
 'ipb-confirmhideuser' => "A l'é an camin ch'a blòca n'utent con «stërmé l'utent» abilità. Sòn a gaverà lë stranòm ëd l'utent da tute le liste e le vos ëd registr. É-lo sigur ëd vorèj fé lòn?",
+'ipb-confirmaction' => "S'a l'é sigur ëd vorèj pròpe felo, për piasì ch'a marca ël camp «{{int:ipb-confirm}}» al fond.",
 'ipb-edit-dropdown' => 'Modifiché le rason dël blocagi',
 'ipb-unblock-addr' => 'Dësbloché $1',
 'ipb-unblock' => "Dësbloché n'utent ò n'adrëssa IP",
@@ -3671,10 +3673,11 @@ As peul ëdcò [[Special:EditWatchlist|dovré l'editor sòlit]].",
 'version-parser-function-hooks' => 'Gancio për le fonsion dël dëscompositor',
 'version-hook-name' => 'Nòm dël gancio',
 'version-hook-subscribedby' => 'A son scrivusse',
-'version-version' => '(Version $1)',
+'version-version' => '($1)',
 'version-license' => 'Licensa MediaWiki',
 'version-ext-license' => 'Licensa',
 'version-ext-colheader-name' => 'Estension',
+'version-ext-colheader-version' => 'Version',
 'version-ext-colheader-license' => 'Licensa',
 'version-ext-colheader-description' => 'Descrission',
 'version-ext-colheader-credits' => 'Autor',
@@ -3901,6 +3904,7 @@ Dësnò, a peul dovré ël formolari semplificà sì-sota. Sò coment a sarà gi
 'api-error-overwrite' => "Dzorascrive ansima a n'archivi esistent a l'é nen përmëttù.",
 'api-error-stashfailed' => "Eror antern: ël servent a l'ha pa podù memorisé l'archivi a temp.",
 'api-error-publishfailed' => "Eror antern: Ël servent a l'ha pa podù publiché l'archivi provisòri.",
+'api-error-stasherror' => "A-i é staje n'eror durant ël cariament dl'archivi da stërmé.",
 'api-error-timeout' => "Ël servent a l'ha pa rëspondù ant ël temp ëspetà.",
 'api-error-unclassified' => "A l'é capitaje n'eror nen conossù.",
 'api-error-unknown-code' => 'Eror sconossù: «$1».',
index a3f515e..a8b2ffb 100644 (file)
@@ -1009,7 +1009,6 @@ $1",
 'rows' => 'قطار:',
 'columns' => 'کالم:',
 'searchresultshead' => 'کھوج',
-'resultsperpage' => 'ہر صفے ویکھیا گیا:',
 'stub-threshold' => 'بوآ <a href="#" class="stub">stub link</a> formatting (bytes): لئی',
 'stub-threshold-disabled' => 'ناکارہ',
 'recentchangesdays' => 'نیڑے دیاں ہویاں تبدیلیاں چ دن دسو:',
index b97ac6f..65a4bde 100644 (file)
@@ -826,7 +826,6 @@ Pamēnais, kāi tenēisan indicai mazzi ni būtwei aktuālin.',
 'rows' => 'Rīndas:',
 'columns' => 'Kōlunis:',
 'searchresultshead' => 'Laukīs',
-'resultsperpage' => 'Rezultātan gīrbis en pāusu',
 'stub-threshold' => 'Maksimālin debban stesse pāusan ebzentlitan kāigi <a href="#" class="stub">daīgan (stub)</a>',
 'recentchangesdays' => 'Dēinan gīrbis, waidīnts en panzdaumamans kitawīdinsnans:',
 'recentchangesdays-max' => 'Maksimālai $1 {{PLURAL:$1|deinā|dēinas}}',
index 29fd728..a181dac 100644 (file)
@@ -1053,7 +1053,6 @@ $1',
 'rows' => 'ليکې:',
 'columns' => 'ستنې:',
 'searchresultshead' => 'پلټل',
-'resultsperpage' => 'په هر مخ کې د پايلو شمېر:',
 'stub-threshold-disabled' => 'ناچارن',
 'recentchangesdays' => 'د هغو ورځو شمېر وټاکی چې په وروستي بدلونو کې يې ليدل غواړی:',
 'recentchangesdays-max' => 'حد اکثر $1 {{PLURAL:$1|ورځ|ورځې}}',
index 75bbbfd..62eb1d2 100644 (file)
@@ -1474,7 +1474,6 @@ Note, no entanto, que a indexação da {{SITENAME}} neste motor de busca pode es
 'rows' => 'Linhas:',
 'columns' => 'Colunas:',
 'searchresultshead' => 'Pesquisar',
-'resultsperpage' => 'Resultados por página:',
 'stub-threshold' => 'Links para páginas curtas terão <a href="#" class="stub">este formato</a> se elas ocuparem menos de (bytes):',
 'stub-threshold-disabled' => 'Desativado',
 'recentchangesdays' => 'Dias a apresentar nas mudanças recentes:',
@@ -2532,6 +2531,7 @@ A eliminação de páginas como esta foi restringida na {{SITENAME}}, para evita
 'delete-warning-toobig' => 'Esta página tem um histórico de edições longo, com mais de $1 {{PLURAL:$1|edição|edições}}.
 Eliminá-la poderá causar problemas na base de dados da {{SITENAME}};
 prossiga com precaução.',
+'deleting-backlinks-warning' => "'''Aviso:''' Outras páginas têm ligação à página que está prestes a eliminar.",
 
 # Rollback
 'rollback' => 'Reverter edições',
index 3dde622..38398f1 100644 (file)
@@ -1470,7 +1470,6 @@ Note que os índices do sistema de busca externo poderão conter referências de
 'rows' => 'Linhas:',
 'columns' => 'Colunas:',
 'searchresultshead' => 'Pesquisar',
-'resultsperpage' => 'Resultados por página:',
 'stub-threshold' => 'Links para páginas de conteúdo aparecerão <a href="#" class="stub">desta forma</a> se elas possuírem menos de (bytes):',
 'stub-threshold-disabled' => 'Desabilitado',
 'recentchangesdays' => 'Dias a apresentar nas mudanças recentes:',
index c49384f..15a3ff3 100644 (file)
  * @author Sp5uhe
  * @author Srhat
  * @author Subhashkataria21.90
+ * @author TMg
  * @author Tedjuh10
  * @author Tgr
  * @author The Evil IP address
@@ -2137,6 +2138,10 @@ Parameters:
 'editwarning-warning' => "{{doc-important|Do ''not'' use <nowiki>{{int:prefs-editing}}</nowiki> for \"Editing\". It is forbidden in this message, see [[mwr:68405]].}}
 
 but you can see the text of that button here: {{msg-mw|Prefs-editing}}",
+'editpage-notsupportedcontentformat-title' => 'Title of error page shown when using an incompatible format on EditPage',
+'editpage-notsupportedcontentformat-text' => 'Error message shown when using an incompatible format on EditPage. Parameters:
+* $1 - the format id
+* $2 - the content model name',
 
 # Content models
 'content-model-wikitext' => 'Name for the wikitext content model, used when decribing what type of content a page contains.
@@ -3040,7 +3045,6 @@ When changing this message, please also update {{msg-mw|vector-editwarning-warni
 'searchresultshead' => 'Replaced by {{msg-mw|prefs-searchoptions}}, though may still be used in some extensions. DEPRECATED.
 
 {{Identical|Search}}',
-'resultsperpage' => "Option on the 'Search options' tab of [[Special:Preferences]]",
 'stub-threshold' => 'Used in [[Special:Preferences]], tab "Misc".',
 'stub-threshold-disabled' => 'Used in [[Special:Preferences]].
 {{Identical|Disabled}}',
@@ -4989,7 +4993,7 @@ See also:
 See also:
 * {{msg-mw|Notargettitle|title}}
 * {{msg-mw|Notargettext|text}}',
-'nopagetitle' => 'Used as title of [[Special:MovePage]], when the oldtitle does not exist.
+'nopagetitle' => 'Used as title on special pages like [[Special:MovePage]] (when the oldtitle does not exist) or [[Special:PermaLink]].
 
 The text is {{msg-mw|nopagetext}}.
 
@@ -9944,13 +9948,11 @@ This message is followed by the list of parser extension tags like <code><nowiki
 'version-parser-function-hooks' => 'Shown in [[Special:Version]]',
 'version-hook-name' => 'Shown in [[Special:Version]]',
 'version-hook-subscribedby' => 'Shown in [[Special:Version]]',
-'version-version' => 'Used in [[Special:Version]].
-
-Preceded by the MediaWiki extension name.
+'version-version' => '{{Optional}}
+Used in [[Special:Version]]. Preceded by the MediaWiki extension name.
 
 Parameters:
-* $1 - version number of the extension
-{{Identical|Version}}',
+* $1 - version number of the extension',
 'version-svn-revision' => '{{Identical|Revision}}{{optional}}
 Used in [[Special:Version]], preceeding the Subversion revision numbers of the extensions loaded inside brackets, like this: "({{int:version-revision}} r012345"). Parameters:
 * $1 - (Unused) directory revision number or empty string
index f1db6e0..e884afe 100644 (file)
@@ -1363,7 +1363,6 @@ Imaymanata [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} qulluy ha
 'rows' => 'Sinrukuna:',
 'columns' => 'Wachukuna:',
 'searchresultshead' => 'Maskay',
-'resultsperpage' => "Huk p'anqapi hayk'a tarinakuna:",
 'stub-threshold' => 'Kay hatun kaykamam <a href="#" class="stub">t\'una qillqasqa t\'inki</a> nisqa kachun (byte):',
 'stub-threshold-disabled' => 'Ama nisqa',
 'recentchangesdays' => "Ñaqha hukchasqakunapi rikuchina p'unchawkuna:",
index 09424e7..4ba0fb1 100644 (file)
@@ -1098,7 +1098,6 @@ Considerescha che lur index da {{SITENAME}} po cuntegnair datas ch'èn betg pli
 'rows' => 'Lingias:',
 'columns' => 'Colonnas:',
 'searchresultshead' => 'Tschertga',
-'resultsperpage' => 'resultats per pagina:',
 'stub-threshold' => 'Limita per la formataziun sco <a href="#" class="stub">colliaziun a stubs</a>, en bytes:',
 'stub-threshold-disabled' => 'Deactivà',
 'recentchangesdays' => 'Dumber da dis che duain vegnir mussads en las ultimas midadas:',
index a37dbca..63fce52 100644 (file)
@@ -1134,6 +1134,8 @@ Ea există deja.',
 'content-not-allowed-here' => 'Conținutul de tip „$1” nu este permis pe pagina [[$2]]',
 'editwarning-warning' => 'Părăsind această pagină, există riscul pierderii modificărilor efectuate.
 Dacă sunteți autentificat, puteți dezactiva această avertizare în secțiunea „Modificare” a preferințelor dumneavoastră.',
+'editpage-notsupportedcontentformat-title' => 'Formatul conținutului nu este acceptat',
+'editpage-notsupportedcontentformat-text' => 'Formatul de conținut $1 nu este acceptat de modelul de conținut $2.',
 
 # Content models
 'content-model-wikitext' => 'wikitext',
@@ -1437,7 +1439,6 @@ Detalii se pot găsi în [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE
 'rows' => 'Rânduri:',
 'columns' => 'Coloane:',
 'searchresultshead' => 'Parametri căutare',
-'resultsperpage' => 'Numărul de rezultate per pagină',
 'stub-threshold' => 'Valoarea minimă pentru un <a href="#" class="stub">ciot</a> (octeți):',
 'stub-threshold-disabled' => 'Dezactivat',
 'recentchangesdays' => 'Numărul de zile afișate în schimbări recente:',
@@ -2724,6 +2725,7 @@ Precizați motivul blocării; de exemplu indicați paginile vandalizate de acest
 Vedeți [[Special:BlockList|lista blocărilor]] pentru a revizui adresele blocate.',
 'ipb-blockingself' => 'Sunteți pe cale să vă autoblocați! Sunteți sigur că doriți să continuați?',
 'ipb-confirmhideuser' => 'Sunteți pe cale să blocați un utilizator cu funcția „ascunde utilizator” activată. Acest lucru va înlătura numele său de utilizator din toate listele și jurnalele. Sunteți sigur că vreți să continuați?',
+'ipb-confirmaction' => 'Dacă sunteți într-adevăr sigur(ă) că doriți să acționați, bifați câmpul „{{int:ipb-confirm}}” din partea de jos.',
 'ipb-edit-dropdown' => 'Modifică motivele blocării',
 'ipb-unblock-addr' => 'Deblochează utilizatorul $1',
 'ipb-unblock' => 'Deblocați un nume de utilizator sau o adresă IP',
@@ -3899,7 +3901,7 @@ Puteți folosi în schimb [[Special:EditWatchlist|editorul standard]].',
 'version-parser-function-hooks' => 'Hook-uri funcții parser',
 'version-hook-name' => 'Nume hook',
 'version-hook-subscribedby' => 'Subscris de',
-'version-version' => '(Versiune $1)',
+'version-version' => '($1)',
 'version-license' => 'Licență MediaWiki',
 'version-ext-license' => 'Licență',
 'version-ext-colheader-name' => 'Extensie',
index d991829..a013382 100644 (file)
@@ -1190,7 +1190,6 @@ Però fa attenzione purcè l'indice lore sus a {{SITENAME}} ponne condenè pàgg
 'rows' => 'Righe:',
 'columns' => 'Culonne:',
 'searchresultshead' => 'Cirche',
-'resultsperpage' => 'Trasute pe pàgene:',
 'stub-threshold' => 'Soglie pe <a href="#" class="stub">collegamende stub</a> de formattazione (byte):',
 'stub-threshold-disabled' => 'Disabbilitate',
 'recentchangesdays' => "Sciurne da fà vedè jndr'à le cangiaminde recende:",
index e10442d..9cb77b3 100644 (file)
@@ -80,6 +80,7 @@
  * @author Putnik
  * @author Rave
  * @author Rubin
+ * @author Rubin16
  * @author Sagan
  * @author Shirayuki
  * @author Sk
@@ -463,8 +464,8 @@ $messages = array(
 'tog-minordefault' => 'Помечать по умолчанию правки как малозначимые',
 'tog-previewontop' => 'Помещать предпросмотр перед окном редактирования',
 'tog-previewonfirst' => 'Показывать предпросмотр при переходе к редактированию',
-'tog-enotifwatchlistpages' => 'Уведомлять по эл. почте об изменениях страниц и файлов из списка наблюдения',
-'tog-enotifusertalkpages' => 'Уведомлять по эл. почте об изменении персональной страницы обсуждения',
+'tog-enotifwatchlistpages' => 'Уведомлять по электронной почте об изменениях страниц и файлов из списка наблюдения',
+'tog-enotifusertalkpages' => 'Уведомлять по электронной почте об изменении персональной страницы обсуждения',
 'tog-enotifminoredits' => 'Уведомлять даже при незначительных изменениях страниц и файлов',
 'tog-enotifrevealaddr' => 'Показывать мой почтовый адрес в сообщениях оповещения',
 'tog-shownumberswatching' => 'Показывать число участников, включивших страницу в свой список наблюдения',
@@ -477,7 +478,7 @@ $messages = array(
 'tog-watchlisthideminor' => 'Скрывать малые правки из списка наблюдения',
 'tog-watchlisthideliu' => 'Скрывать правки представившихся участников из списка наблюдения',
 'tog-watchlisthideanons' => 'Скрывать правки анонимных участников из списка наблюдения',
-'tog-watchlisthidepatrolled' => 'СкÑ\80Ñ\8bваÑ\82Ñ\8c Ð¾Ñ\82паÑ\82Ñ\80Ñ\83лиÑ\80ованнÑ\8bе Ð¿Ñ\80авки Ð² Ñ\81пиÑ\81ке наблюдения',
+'tog-watchlisthidepatrolled' => 'СкÑ\80Ñ\8bваÑ\82Ñ\8c Ð¾Ñ\82паÑ\82Ñ\80Ñ\83лиÑ\80ованнÑ\8bе Ð¿Ñ\80авки Ð¸Ð· Ñ\81пиÑ\81ка наблюдения',
 'tog-ccmeonemails' => 'Отправлять мне копии писем, которые я посылаю другим участникам',
 'tog-diffonly' => 'Не показывать содержание страницы под сравнением двух версий',
 'tog-showhiddencats' => 'Показывать скрытые категории',
@@ -714,7 +715,7 @@ $1',
 'pagetitle' => '$1 — {{SITENAME}}',
 'retrievedfrom' => 'Источник — «$1»',
 'youhavenewmessages' => 'Вы получили $1 ($2).',
-'youhavenewmessagesfromusers' => 'Вы получили $1 от {{PLURAL:$3|$3 участника|$3 участников|1=другого участника}} ($2).',
+'youhavenewmessagesfromusers' => '{{PLURAL:$4|Вы получили}} $1 от {{PLURAL:$3|$3 участника|$3 участников|1=другого участника}} ($2).',
 'youhavenewmessagesmanyusers' => 'Вы получили $1 от множества пользователей ($2).',
 'newmessageslinkplural' => '{{PLURAL:$1|новое сообщение|999=новые сообщения}}',
 'newmessagesdifflinkplural' => '{{PLURAL:$1|последнее изменение|999=последние изменения}}',
@@ -1287,6 +1288,8 @@ $2
 'content-not-allowed-here' => 'Содержимое "$1" недопустимо на странице [[$2]]',
 'editwarning-warning' => 'Переход на другую страницу может привести к потере сделанных вами изменений.
 Если вы зарегистрированы в системе, то вы можете отключить это предупреждение в разделе «Редактирование» ваших настроек.',
+'editpage-notsupportedcontentformat-title' => 'Формат содержимого не поддерживается',
+'editpage-notsupportedcontentformat-text' => 'Формат содержимого $1 не поддерживается моделью содержимого $2.',
 
 # Content models
 'content-model-wikitext' => 'вики-текст',
@@ -1501,9 +1504,9 @@ $1",
 'diff-empty' => '(нет различий)',
 'diff-multi' => '({{PLURAL:$1|не показана $1 промежуточная версия, сделанная|не показаны $1 промежуточных версий, сделанных|не показаны $1 промежуточные версии, сделанные|1=не показана промежуточная версия, сделанная}} {{PLURAL:$2|$2 участником|$2 участниками|1=одним участником}})',
 'diff-multi-manyusers' => '({{PLURAL:$1|не показана $1 промежуточная версия, сделанная|не показаны $1 промежуточных версий, сделанных|не показаны $1 промежуточные версии, сделанные}} более чем {{PLURAL:$2|$2 участником|$2 участниками}})',
-'difference-missing-revision' => '{{PLURAL:$2|$2 версия|$2 версий|$2 версии}} для этого сравнения ($1) {{PLURAL:$2|1=не обнаружена|не обнаружены}}.
+'difference-missing-revision' => 'Не {{PLURAL:$2|1=найдена|найдены}} {{PLURAL:$2|$2 версия|$2 версий|$2 версии|1=одна из версий}} для этого сравнения ($1).
 
­Ñ\82о Ð¾Ð±Ñ\8bÑ\87но Ð±Ñ\8bваеÑ\82, ÐµÑ\81ли Ð¿ÐµÑ\80ейÑ\82и по устаревшей ссылке сравнения версий для страницы, которая была удалена.
¢Ð°ÐºÐ¾Ðµ Ð¾Ð±Ñ\8bÑ\87но Ñ\81лÑ\83Ñ\87аеÑ\82Ñ\81Ñ\8f Ð¿Ñ\80и Ð¿ÐµÑ\80еÑ\85оде по устаревшей ссылке сравнения версий для страницы, которая была удалена.
 Подробности могут быть в [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} журнале удалений].',
 
 # Search results
@@ -1514,10 +1517,10 @@ $1",
 'textmatches' => 'Совпадения в текстах страниц',
 'notextmatches' => 'Нет совпадений в текстах страниц',
 'prevn' => '{{PLURAL:$1|1=предыдущая|предыдущие}} $1',
-'nextn' => '{{PLURAL:$1|следующая|следующие|следующие}} $1',
+'nextn' => '{{PLURAL:$1|1=следующая|следующие}} $1',
 'prevn-title' => '{{PLURAL:$1|Предыдущая $1 запись|Предыдущие $1 записей|Предыдущие $1 записи}}',
 'nextn-title' => '{{PLURAL:$1|Следующая $1 запись|Следующие $1 записей|Следующие $1 записи}}',
-'shown-title' => 'Ð\9fоказÑ\8bваÑ\82Ñ\8c $1 {{PLURAL:$1|запиÑ\81Ñ\8c|запиÑ\81ей|запиÑ\81и}} на странице',
+'shown-title' => 'Ð\9fоказÑ\8bваÑ\82Ñ\8c $1 {{PLURAL:$1|запиÑ\81Ñ\8c|запиÑ\81и|запиÑ\81ей}} на странице',
 'viewprevnext' => 'Просмотреть ($1 {{int:pipe-separator}} $2) ($3)',
 'searchmenu-exists' => "'''В этой вики есть страница «[[:$1]]»'''",
 'searchmenu-new' => "'''Создать страницу «[[:$1]]» в этом вики-проекте!'''",
@@ -1532,7 +1535,7 @@ $1",
 'searchprofile-everything-tooltip' => 'Поиск на всех страницах (включая страницы обсуждений)',
 'searchprofile-advanced-tooltip' => 'Искать в заданных пространствах имён',
 'search-result-size' => '$1 ({{PLURAL:$2|$2 слово|$2 слов|$2 слова}})',
-'search-result-category-size' => '$1 {{PLURAL:$1|вхождение|вхождений|вхождения}} ($2 {{PLURAL:$2|подкатегория|подкатегорий|подкатегории}}, $3 {{PLURAL:$3|файл|файлов|файла}}).',
+'search-result-category-size' => '$1 {{PLURAL:$1|вхождение|вхождений|вхождения}} ($2 {{PLURAL:$2|подкатегория|подкатегорий|подкатегории}}, $3 {{PLURAL:$3|файл|файлов|файла}})',
 'search-result-score' => 'Релевантность: $1%.',
 'search-redirect' => '(перенаправление с $1)',
 'search-section' => '(раздел «$1»)',
@@ -1544,7 +1547,7 @@ $1",
 'searcheverything-enable' => 'Поиск по всем пространствам имён',
 'searchrelated' => 'связанный',
 'searchall' => 'все',
-'showingresults' => "Ниже показаны до '''$1''' {{PLURAL:$1|1=результата|результатов}}, начиная с № '''$2'''.",
+'showingresults' => "Ниже {{PLURAL:$1|1=показан результат|показаны  результаты}} с № '''$2''' и вплоть до № '''$1'''.",
 'showingresultsnum' => "Ниже {{PLURAL:$3|1=показан|показаны}} '''$3''' {{PLURAL:$3|результат|результатов|результата}}, начиная с № '''$2'''.",
 'showingresultsheader' => "{{PLURAL:$5|1=Результат '''$1''' из '''$3'''|Результаты '''$1—$2''' из '''$3'''}} для «'''$4'''»",
 'search-nonefound' => 'Соответствий запросу не найдено.',
@@ -1574,7 +1577,7 @@ $1",
 'prefs-rc' => 'Свежие правки',
 'prefs-watchlist' => 'Список наблюдения',
 'prefs-watchlist-days' => 'Количество дней:',
-'prefs-watchlist-days-max' => 'Не более $1 {{PLURAL:$1|1=дня|дней}}',
+'prefs-watchlist-days-max' => 'Не более $1 {{PLURAL:$1|дня|дней}}',
 'prefs-watchlist-edits' => 'Максимальное количество правок, отображаемых в расширенном списке наблюдения:',
 'prefs-watchlist-edits-max' => 'Наибольшее значение: 1000',
 'prefs-watchlist-token' => 'Токен списка наблюдения:',
@@ -1590,11 +1593,10 @@ $1",
 'rows' => 'Строк:',
 'columns' => 'Столбцов:',
 'searchresultshead' => 'Поиск',
-'resultsperpage' => 'Количество найденных записей на страницу:',
 'stub-threshold' => 'Порог для определения оформления <a href="#" class="stub">ссылок на заготовки</a> (в байтах):',
 'stub-threshold-disabled' => 'Отключён',
 'recentchangesdays' => 'Количество дней, за которые показывать свежие правки:',
-'recentchangesdays-max' => '(не более $1 {{PLURAL:$1|дня|дней|дней}})',
+'recentchangesdays-max' => '(не более $1 {{PLURAL:$1|дня|дней}})',
 'recentchangescount' => 'Количество правок, отображаемое по умолчанию:',
 'prefs-help-recentchangescount' => 'Включает свежие правки, истории страниц, журналы.',
 'prefs-help-watchlist-token2' => 'Это секретный ключ для веб-канала вашего списка наблюдений.
@@ -1641,7 +1643,7 @@ $1",
 'prefs-help-signature' => 'Комментарии на страницах обсуждений должны быть подписаны посредством добавления символов «<nowiki>~~~~</nowiki>», которые будут преобразованы в вашу подпись и время.',
 'badsig' => 'Неверная подпись. Проверьте корректность HTML-тегов.',
 'badsiglength' => 'Слишком длинная подпись.
\9fодпиÑ\81Ñ\8c Ð½Ðµ Ð´Ð¾Ð»Ð¶Ð½Ð° Ð¿Ñ\80евÑ\8bÑ\88аÑ\82Ñ\8c $1 {{PLURAL:$1|Ñ\81имвола|Ñ\81имволов|Ñ\81имволов}}.',
\9fодпиÑ\81Ñ\8c Ð½Ðµ Ð´Ð¾Ð»Ð¶Ð½Ð° Ð¿Ñ\80евÑ\8bÑ\88аÑ\82Ñ\8c $1 {{PLURAL:$1|Ñ\81имвола|Ñ\81имволов|Ñ\81имвола}}.',
 'yourgender' => 'Какое описание вам более подходит?',
 'gender-unknown' => 'Я предпочитаю не указывать',
 'gender-male' => 'Он редактирует страницы вики',
@@ -1942,8 +1944,8 @@ $1",
 'filetype-mime-mismatch' => 'Расширение файла «.$1» не соответствует его MIME-типу ($2).',
 'filetype-badmime' => 'Файлы, имеющие MIME-тип «$1», не могут быть загружены.',
 'filetype-bad-ie-mime' => 'Невозможно загрузить этот файл, так как Internet Explorer будет определять его как «$1», то есть неразрешённым и потенциально опасным типом файла.',
-'filetype-unwanted-type' => "'''\".\$1\"''' — нежелательный тип файла.
-{{PLURAL:\$3|1=Предпочтительным типом файла является|Предпочтительные типы файлов:}} \$2.",
+'filetype-unwanted-type' => "'''«.$1»''' — нежелательный тип файла.
+{{PLURAL:$3|1=Предпочтительным типом файла является|Предпочтительные типы файлов:}} $2.",
 'filetype-banned-type' => "'''«.$1»''' — {{PLURAL:$4|1=запрещённый тип файла|запрещённые типы файлов}}.
 {{PLURAL:$3|1=Разрешённым типом файла является|Разрешённые типы файлов:}} $2.",
 'filetype-missing' => 'Отсутствует расширение у файла (например, «.jpg»).',
@@ -1984,6 +1986,8 @@ $1",
 Если вы всё-таки хотите загрузить этот файл, пожалуйста, вернитесь назад и измените имя файла. [[File:$1|thumb|center|$1]]',
 'file-exists-duplicate' => 'Этот файл является дубликатом {{PLURAL:$1|1=следующего файла|следующих файлов}}:',
 'file-deleted-duplicate' => 'Подобный файл ([[:$1]]) уже удалялся. Пожалуйста, ознакомьтесь с историей удаления файла, прежде чем загружать его снова.',
+'file-deleted-duplicate-notitle' => 'Файл, идентичный этому файлу, был ранее удалён, а имя файла было запрещено.
+Вам следует попросить кого-нибудь с правами просмотра данных по запрещённым файлам, чтобы он проанализировал ситуацию перед тем, как загружать файл снова.',
 'uploadwarning' => 'Предупреждение',
 'uploadwarning-text' => 'Пожалуйста, измените представленное ниже описание файла и попробуйте ещё раз.',
 'savefile' => 'Записать файл',
@@ -2061,7 +2065,7 @@ $1',
 'backend-fail-closetemp' => 'Не удаётся закрыть временный файл.',
 'backend-fail-read' => 'Не удалось прочитать файл $1.',
 'backend-fail-create' => 'Не удалось записать файл $1.',
-'backend-fail-maxsize' => 'Не удалось записать файл $1, так как его размер превышает {{PLURAL:$2|$2 байт|$2 байт|$2 байта}}.',
+'backend-fail-maxsize' => 'Не удалось записать файл $1, так как его размер превышает $2 {{PLURAL:$2|байт|байт|байта}}.',
 'backend-fail-readonly' => 'Хранилище «$1» сейчас находится в режиме «только чтение». Причина: «$2»',
 'backend-fail-synced' => 'Файл «$1» находится в несогласованном состоянии во внутреннем хранилище',
 'backend-fail-connect' => 'Не удалось подключиться к хранилищу «$1».',
@@ -2362,6 +2366,7 @@ $1',
 'protectedpages' => 'Защищённые страницы',
 'protectedpages-indef' => 'Только бессрочные защиты',
 'protectedpages-cascade' => 'Только каскадная защита',
+'protectedpages-noredirect' => 'Скрыть перенаправления',
 'protectedpagesempty' => 'В настоящий момент нет защищённых страниц с указанными параметрами',
 'protectedtitles' => 'Защищённые названия',
 'protectedtitlesempty' => 'В настоящий момент нет запрещённых названий с указанными параметрами.',
@@ -2447,8 +2452,8 @@ $1',
 'linksearch-ns' => 'Пространство имён:',
 'linksearch-ok' => 'Найти',
 'linksearch-text' => 'Можно использовать подстановочные символы, например, <code>*.wikipedia.org</code>.
-Необходим по крайней мере домен верхнего уровня, например <code>*.org</code><br />
-Поддерживаемые {{PLURAL:$2|1=протокол|протоколы}}: <code>$1</code> (по умолчанию подставляется http://, если протокол явно не задан).',
+Необходимо указать по крайней мере домен верхнего уровня, например <code>*.org</code><br />
+{{PLURAL:$2|1=Поддерживаемый протокол|Поддерживаемые протоколы}}: <code>$1</code> (если протокол явно не задан, по умолчанию подставляется http://).',
 'linksearch-line' => 'Ссылка на $1 из $2',
 'linksearch-error' => 'Подстановочные символы могут использоваться только в начале адресов.',
 
@@ -2460,8 +2465,8 @@ $1',
 
 # Special:ActiveUsers
 'activeusers' => 'Список активных участников',
-'activeusers-intro' => 'Это список участников, совершавших какие-либо действия за {{PLURAL:$1|последний $1 день|последние $1 дней|последние $1 дня}}.',
-'activeusers-count' => '$1 {{PLURAL:$1|правка|правок|правки}} за {{PLURAL:$3|$3 последний день|последние $3 дней|последние $3 дня}}',
+'activeusers-intro' => 'Это список участников, совершавших какие-либо действия за {{PLURAL:$1|последний $1 день|последние $1 дней|последние $1 дня|1=последний день}}.',
+'activeusers-count' => '$1 {{PLURAL:$1|правка|правок|правки}} за {{PLURAL:$3|$3 последний день|последние $3 дней|последние $3 дня|1=последний день}}',
 'activeusers-from' => 'Показать участников, начиная с:',
 'activeusers-hidebots' => 'Скрыть ботов',
 'activeusers-hidesysops' => 'Скрыть администраторов',
@@ -2484,8 +2489,8 @@ $1',
 'listgrouprights-removegroup' => 'может исключать из {{PLURAL:$2|1=группы|групп}}: $1',
 'listgrouprights-addgroup-all' => 'может добавлять во все группы',
 'listgrouprights-removegroup-all' => 'может исключать из всех групп',
-'listgrouprights-addgroup-self' => 'можеÑ\82 Ð´Ð¾Ð±Ð°Ð²Ð¸Ñ\82Ñ\8c {{PLURAL:$2|1=гÑ\80Ñ\83ппÑ\83|гÑ\80Ñ\83ппÑ\8b}} Ðº Ñ\81воей Ñ\83Ñ\87Ñ\91Ñ\82ной Ð·Ð°Ð¿Ð¸Ñ\81и: $1',
-'listgrouprights-removegroup-self' => 'может удалить {{PLURAL:$2|1=группу|группы}} со своей учётной записи: $1',
+'listgrouprights-addgroup-self' => 'можеÑ\82 Ð´Ð¾Ð±Ð°Ð²Ð»Ñ\8fÑ\82Ñ\8c Ñ\81воÑ\8e Ñ\83Ñ\87Ñ\91Ñ\82нÑ\83Ñ\8e Ð·Ð°Ð¿Ð¸Ñ\81Ñ\8c Ð² {{PLURAL:$2|1=гÑ\80Ñ\83ппÑ\83|гÑ\80Ñ\83ппÑ\8b}}: $1',
+'listgrouprights-removegroup-self' => 'может удалять свою учётную запись из {{PLURAL:$2|1=группы|групп}}: $1',
 'listgrouprights-addgroup-self-all' => 'Может добавлять все группы к своей учётной записи',
 'listgrouprights-removegroup-self-all' => 'может удалять все группы со своей учётной записи',
 
@@ -2545,14 +2550,14 @@ $1',
 'unwatchthispage' => 'Прекратить наблюдение',
 'notanarticle' => 'Не статья',
 'notvisiblerev' => 'Версия была удалена',
-'watchlist-details' => 'В вашем списке наблюдения $1 {{PLURAL:$1|страница|страниц|страницы}}, не считая страниц обсуждения.',
+'watchlist-details' => 'В вашем списке наблюдения $1 {{PLURAL:$1|страница|страниц|страницы}}, не считая страниц обсуждений.',
 'wlheader-enotif' => 'Уведомления по эл. почте включены.',
 'wlheader-showupdated' => "Страницы, изменившиеся с вашего последнего их посещения, выделены '''жирным''' шрифтом.",
 'watchmethod-recent' => 'просмотр последних изменений для наблюдаемых страниц',
 'watchmethod-list' => 'просмотр наблюдаемых страниц для последних изменений',
 'watchlistcontains' => 'Ваш список наблюдения содержит $1 {{PLURAL:$1|страница|страниц|страницы}}.',
 'iteminvalidname' => 'Проблема с элементом «$1», недопустимое название…',
-'wlnote' => "Ниже {{PLURAL:$1|показано последнее $1 изменение|показаны последние $1 изменений|показаны последние $1 изменения}} за {{PLURAL:$2|последний|последние|последние}} '''$2''' {{PLURAL:$2|час|часов|часа}}, на момент времени $3 $4.",
+'wlnote' => "Ниже {{PLURAL:$1|показано $1 последнее изменение|показаны $1 последних изменений|показаны $1 последние изменения|1=показано последнее изменение}} за {{PLURAL:$2|'''$2''' последний час|последние '''$2''' часов|последние '''$2''' часа|1=последний час}}, по состоянию на $3 $4.",
 'wlshowlast' => 'Показать за последние $1 часов $2 дней $3',
 'watchlist-options' => 'Настройки списка наблюдения',
 
@@ -2615,7 +2620,7 @@ $UNWATCHURL
 'exblank' => 'страница была пуста',
 'delete-confirm' => '$1 — удаление',
 'delete-legend' => 'Удаление',
-'historywarning' => "'''Внимание:''' эта страница имеет историю изменений приблизительно из $1 {{PLURAL:$1|версии|версий|версий}}:",
+'historywarning' => "'''Внимание:''' эта страница имеет историю изменений приблизительно из $1 {{PLURAL:$1|версии|версий}}:",
 'confirmdeletetext' => 'Вы запросили полное удаление страницы (или изображения) и всей её истории изменений. Пожалуйста, подтвердите, что вы действительно желаете это сделать, понимаете последствия своих действий, и делаете это в соответствии [[{{MediaWiki:Policy-url}}|с правилами]].',
 'actioncomplete' => 'Действие выполнено',
 'actionfailed' => 'Действие не выполнено',
@@ -2635,10 +2640,10 @@ $UNWATCHURL
 ** по запросу автора
 ** неработающее перенаправление',
 'delete-edit-reasonlist' => 'Править список причин',
-'delete-toobig' => 'У этой страницы очень длинная история изменений, более $1 {{PLURAL:$1|версии|версий|версий}}.
-Удаление таких страниц было запрещено во избежание нарушений в работе сайта {{SITENAME}}.',
-'delete-warning-toobig' => 'У этой страницы очень длинная история изменений, более $1 {{PLURAL:$1|версии|версий|версий}}.
-Её удаление может привести к нарушению нормальной работы базы данных сайта {{SITENAME}};
+'delete-toobig' => 'У этой страницы очень длинная история изменений, более $1 {{PLURAL:$1|версии|версий}}.
+Удаление таких страниц было запрещено во избежание нарушений в работе сайта «{{SITENAME}}».',
+'delete-warning-toobig' => 'У этой страницы очень длинная история изменений, более $1 {{PLURAL:$1|версии|версий}}.
+Её удаление может привести к нарушению нормальной работы базы данных сайта «{{SITENAME}}»;
 действуйте с осторожностью.',
 'deleting-backlinks-warning' => "'''Предупреждение.''' Некоторые другие страницы ссылаются на данную удаляемую страницу.",
 
@@ -2692,7 +2697,7 @@ $UNWATCHURL
 'protect-locked-dblock' => "Уровень защиты не может быть изменён, так как основная база данных временно заблокирована.
 Текущие установки для страницы '''$1''':",
 'protect-locked-access' => "У вашей учётной записи недостаточно прав для изменения уровня защиты страницы. Текущие установки для страницы '''$1''':",
-'protect-cascadeon' => 'ЭÑ\82а Ñ\81Ñ\82Ñ\80аниÑ\86а Ð·Ð°Ñ\89иÑ\89ена Ð² Ñ\81вÑ\8fзи Ñ\81 Ñ\82ем, Ñ\87Ñ\82о Ð¾Ð½Ð° Ð²ÐºÐ»Ñ\8eÑ\87ена {{PLURAL:$1|1=в Ñ\83казаннÑ\83Ñ\8e Ð½Ð¸Ð¶Ðµ Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\83, Ð½Ð° ÐºÐ¾Ñ\82оÑ\80Ñ\83Ñ\8e|в Ð½Ð¸Ð¶ÐµÑ\81ледÑ\83Ñ\8eÑ\89ие Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\8b, Ð½Ð° ÐºÐ¾Ñ\82оÑ\80Ñ\8bе}} установлена каскадная защита. Вы можете изменить уровень защиты этой страницы, но это не повлияет на каскадную защиту.',
+'protect-cascadeon' => 'ЭÑ\82а Ñ\81Ñ\82Ñ\80аниÑ\86а Ð·Ð°Ñ\89иÑ\89ена Ð² Ñ\81вÑ\8fзи Ñ\81 Ñ\82ем, Ñ\87Ñ\82о Ð¾Ð½Ð° Ð²ÐºÐ»Ñ\8eÑ\87ена {{PLURAL:$1|1=в Ñ\83казаннÑ\83Ñ\8e Ð½Ð¸Ð¶Ðµ Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\83, Ð´Ð»Ñ\8f ÐºÐ¾Ñ\82оÑ\80ой|в Ð½Ð¸Ð¶ÐµÑ\81ледÑ\83Ñ\8eÑ\89ие Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\8b, Ð´Ð»Ñ\8f ÐºÐ¾Ñ\82оÑ\80Ñ\8bÑ\85}} установлена каскадная защита. Вы можете изменить уровень защиты этой страницы, но это не повлияет на каскадную защиту.',
 'protect-default' => 'Без защиты',
 'protect-fallback' => 'Разрешено только участникам с правами «$1»',
 'protect-level-autoconfirmed' => 'Разрешено только автоподтверждённым участникам',
@@ -2737,12 +2742,12 @@ $UNWATCHURL
 'undeletepage' => 'Просмотр и восстановление удалённых страниц',
 'undeletepagetitle' => "'''Ниже перечислены удалённые версии страницы [[:$1]]'''.",
 'viewdeletedpage' => 'Просмотр удалённых страниц',
-'undeletepagetext' => '{{PLURAL:$1|Следующая $1 страница была удалена|Следующие $1 страниц были удалены|Следующие $1 страницы были удалены}}, однако {{PLURAL:$1|1=она всё ещё находится в архиве и поэтому может быть восстановлена|они всё ещё находятся в архиве и поэтому могут быть восстановлены}}.
+'undeletepagetext' => '{{PLURAL:$1|Следующая $1 страница была удалена|Следующие $1 страниц были удалены|Следующие $1 страницы были удалены|1=Следующая страница была удалена}}, однако {{PLURAL:$1|1=она всё ещё находится в архиве и поэтому может быть восстановлена|они всё ещё находятся в архиве и поэтому могут быть восстановлены}}.
 Архив может периодически очищаться.',
 'undelete-fieldset-title' => 'Восстановить версии',
 'undeleteextrahelp' => "Для полного восстановления истории страницы оставьте все отметки пустыми и нажмите '''«{{int:undeletebtn}}»'''.
 Для частичного восстановления отметьте те версии страницы, которые нужно восстановить, и нажмите '''«{{int:undeletebtn}}»'''.",
-'undeleterevisions' => 'в архиве $1 {{PLURAL:$1|версия|версий|версии}}',
+'undeleterevisions' => '$1 {{PLURAL:$1|версия|версий|версии}} {{PLURAL:$1|помещена|помещены}} в архив',
 'undeletehistory' => 'При восстановлении страницы восстанавливается и её история правок.
 Если после удаления была создана новая страница с тем же названием, то восстановленные версии появятся в истории правок перед новыми версиями.',
 'undeleterevdel' => 'Восстановление не будет произведено, если оно приведёт к частичному удалению последней версии страницы или файла.
@@ -2756,9 +2761,9 @@ $UNWATCHURL
 'undeleteviewlink' => 'просмотреть',
 'undeleteinvert' => 'Обратить выделение',
 'undeletecomment' => 'Причина:',
-'undeletedrevisions' => '$1 {{PLURAL:$1|изменение|изменений|изменения}} восстановлено',
-'undeletedrevisions-files' => '$1 {{PLURAL:$1|версия|версий|версии}} и $2 {{PLURAL:$2|файл|файлов|файла}} восстановлено',
-'undeletedfiles' => '$1 {{PLURAL:$1|файл восстановлен|файлов восстановлено|файла восстановлено}}',
+'undeletedrevisions' => '{{PLURAL:$1|восстановлено|восстановлены}} $1 {{PLURAL:$1|изменение|изменений|изменения}}',
+'undeletedrevisions-files' => 'восстановлены $1 {{PLURAL:$1|версия|версий|версии}} и $2 {{PLURAL:$2|файл|файлов|файла}}',
+'undeletedfiles' => '{{PLURAL:$1|восстановлен|восстановлены}} $1 {{PLURAL:$1|файл|файлов|файла}}',
 'cannotundelete' => 'Ошибка восстановления:
 $1',
 'undeletedpage' => "'''Страница «$1» была восстановлена.'''
@@ -2874,6 +2879,7 @@ $1',
 См. [[Special:BlockList|список заблокированных IP-адресов]] для просмотра блокировок.',
 'ipb-blockingself' => 'Вы пытаетесь заблокировать себя самого! Вы уверены, что вы хотите это сделать?',
 'ipb-confirmhideuser' => 'Вы намереваетесь заблокировать участника и скрыть его имя. Оно не будет отображаться в списках и журналах. Вы уверены, что хотите это сделать?',
+'ipb-confirmaction' => 'Если вы уверены, что вы действительно хотите сделать это, пожалуйста, поставьте ниже отметку «{{int:ipb-confirm}}».',
 'ipb-edit-dropdown' => 'Править список причин',
 'ipb-unblock-addr' => 'Разблокировать $1',
 'ipb-unblock' => 'Разблокировать участника или IP-адрес',
@@ -3034,7 +3040,7 @@ $1',
 'movepage-page-exists' => 'Страница $1 уже существует и не может быть автоматически перезаписана.',
 'movepage-page-moved' => 'Страница $1 была переименована в $2.',
 'movepage-page-unmoved' => 'Страница $1 не может быть переименована в $2.',
-'movepage-max-pages' => '$1 {{PLURAL:$1|страница была переименована|страниц было переименовано|страницы было переименовано}} — это максимум, больше страниц нельзя переименовать автоматически.',
+'movepage-max-pages' => '{{PLURAL:$1|Была переименована|Были переименованы|Было переименовано}} $1 {{PLURAL:$1|страница|страниц|страницы}} — это максимум; большее число страниц автоматически переименовать нельзя.',
 'movelogpage' => 'Журнал переименований',
 'movelogpagetext' => 'Ниже представлен список переименованных страниц.',
 'movesubpage' => '{{PLURAL:$1|1=Подстраница|Подстраницы}}',
@@ -3142,7 +3148,7 @@ $2',
 'importstart' => 'Импортирование страниц…',
 'import-revision-count' => '$1 {{PLURAL:$1|версия|версий|версии}}',
 'importnopages' => 'Нет страниц для импортирования.',
-'imported-log-entries' => '{{PLURAL:$1|Импортирована $1 запись|Импортировано $1 записей|Импортировано $1 записи}} журнала.',
+'imported-log-entries' => '{{PLURAL:$1|Импортирована $1 запись|Импортировано $1 записей|Импортированы $1 записи}} журнала.',
 'importfailed' => 'Не удалось импортировать: $1',
 'importunknownsource' => 'Неизвестный тип импортируемой страницы',
 'importcantopen' => 'Невозможно открыть импортируемый файл',
@@ -3330,7 +3336,7 @@ The wiki server can't provide data in a format your client can read.",
 'pageinfo-robot-noindex' => 'Не разрешено',
 'pageinfo-views' => 'Количество просмотров',
 'pageinfo-watchers' => 'Число наблюдающих',
-'pageinfo-few-watchers' => 'Менее $1 {{PLURAL:$1|1=следящего|следящих}}',
+'pageinfo-few-watchers' => 'Менее $1 {{PLURAL:$1|следящего|следящих}}',
 'pageinfo-redirects-name' => 'Количество перенаправлений на эту страницу',
 'pageinfo-redirects-value' => '$1',
 'pageinfo-subpages-name' => 'Подстраницы данной страницы',
@@ -3343,10 +3349,10 @@ The wiki server can't provide data in a format your client can read.",
 'pageinfo-authors' => 'Общее число различных авторов',
 'pageinfo-recent-edits' => 'Правок за последнее время (в течение $1)',
 'pageinfo-recent-authors' => 'Уникальных авторов за последнее время',
-'pageinfo-magic-words' => '{{PLURAL:$1|1=Ð\9cагиÑ\87еÑ\81кое Ñ\81лово|Ð\9cагиÑ\87еÑ\81кие слова}} ($1)',
+'pageinfo-magic-words' => '{{PLURAL:$1|1=Ð\92олÑ\88ебное Ñ\81лово|Ð\92олÑ\88ебнÑ\8bе слова}} ($1)',
 'pageinfo-hidden-categories' => '{{PLURAL:$1|1=Скрытая категория|Скрытых категорий}} ($1)',
 'pageinfo-templates' => '{{PLURAL:$1|1=Шаблон|Шаблонов}} ($1)',
-'pageinfo-transclusions' => '{{PLURAL:$1|1=Включаемые страницы|Включаемых страниц}} ($1)',
+'pageinfo-transclusions' => '{{PLURAL:$1|1=Включаемая страница|Включаемых страниц}} ($1)',
 'pageinfo-toolboxlink' => 'Сведения о странице',
 'pageinfo-redirectsto' => 'Перенаправление',
 'pageinfo-redirectsto-info' => 'сведения',
@@ -3426,7 +3432,7 @@ $1',
 
 # Special:NewFiles
 'newimages' => 'Галерея новых файлов',
-'imagelisttext' => "Ниже представлен список из '''$1''' {{PLURAL:$1|файла|файлов|файлов}}, отсортированных $2.",
+'imagelisttext' => "Ниже представлен список из '''$1''' {{PLURAL:$1|файла|файлов}}, отсортированных $2.",
 'newimages-summary' => 'На этой служебной странице показаны недавно загруженные файлы.',
 'newimages-legend' => 'Фильтр',
 'newimages-label' => 'Имя файла (или его часть):',
@@ -4042,8 +4048,8 @@ $5
 'livepreview-error' => 'Не удалось установить соединение: $1 «$2». Попробуйте воспользоваться обычным предпросмотром.',
 
 # Friendlier slave lag warnings
-'lag-warn-normal' => 'Изменения, сделанные менее чем $1 {{PLURAL:$1|секунду|секунд|секунды}} назад, могут быть не показаны в этом списке.',
-'lag-warn-high' => 'Из-за большого отставания в синхронизации серверов баз данных изменения, сделанные менее чем $1 {{PLURAL:$1|секунду|секунд|секунды}} назад, могут быть не показаны в этом списке.',
+'lag-warn-normal' => 'Изменения, сделанные менее {{PLURAL:$1|$1 секунды|$1 секунд|1=секунды}} назад, могут не отображаться в этом списке.',
+'lag-warn-high' => 'Из-за большого отставания в синхронизации серверов баз данных изменения, сделанные менее {{PLURAL:$1|$1 секунды|$1 секунд|1=секунды}} назад, могут не отображаться в этом списке.',
 
 # Watchlist editor
 'watchlistedit-numitems' => 'Ваш список наблюдения содержит $1 {{PLURAL:$1|запись|записей|записи}}, не считая страниц обсуждений.',
@@ -4152,7 +4158,17 @@ $5
 'version-hook-name' => 'Имя перехватчика',
 'version-hook-subscribedby' => 'Подписан на',
 'version-version' => '(Версия $1)',
-'version-license' => 'Лицензия',
+'version-license' => 'Лицензия MediaWiki',
+'version-ext-license' => 'Лицензия',
+'version-ext-colheader-name' => 'Расширение',
+'version-ext-colheader-version' => 'Версия',
+'version-ext-colheader-license' => 'Лицензия',
+'version-ext-colheader-description' => 'Описание',
+'version-ext-colheader-credits' => 'Авторы',
+'version-license-title' => 'Лицензия для $1',
+'version-license-not-found' => 'Для этого расширения нет подробных сведений о лицензии.',
+'version-credits-title' => 'Список авторов для $1',
+'version-credits-not-found' => 'Для этого расширения нет подробных сведений об авторах.',
 'version-poweredby-credits' => "Эта вики работает на движке '''[https://www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
 'version-poweredby-others' => 'другие',
 'version-poweredby-translators' => 'переводчики translatewiki.net',
@@ -4174,12 +4190,12 @@ MediaWiki распространяется в надежде, что она бу
 # Special:Redirect
 'redirect' => 'Перенаправление с файла, участника, страницы или идентификатора версии',
 'redirect-legend' => 'Перенаправление на файл или страницу',
-'redirect-summary' => 'Эта специальная страница перенаправляет на файл (с имени файла), страницу (с идентификатора версии) или страницу участника (с числового идентификатора участника).
-Использование: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/revision/328429]] или [[{{#Special:Redirect}}/user/101]].',
+'redirect-summary' => 'Эта служебная страница перенаправляет на файл (с имени файла), страницу (с идентификатора версии или страницы) или страницу участника (с числового идентификатора участника). Использование: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]] или [[{{#Special:Redirect}}/user/101]].',
 'redirect-submit' => 'Перейти',
 'redirect-lookup' => 'Поиск:',
 'redirect-value' => 'Значение:',
 'redirect-user' => 'Идентификатор участника',
+'redirect-page' => 'Идентификатор страницы',
 'redirect-revision' => 'Версия страницы',
 'redirect-file' => 'Название файла',
 'redirect-not-exists' => 'Значение не найдено',
@@ -4287,13 +4303,13 @@ MediaWiki распространяется в надежде, что она бу
 # New logging system
 'logentry-delete-delete' => '$1 {{GENDER:$2|удалил|удалила}} страницу $3',
 'logentry-delete-restore' => '$1 {{GENDER:$2|восстановил|восстановила}} страницу $3',
-'logentry-delete-event' => '$1 {{GENDER:$2|изменил|изменила}} видимость {{PLURAL:$5|1=$5 записи|$5 записей}} журнала на $3: $4',
-'logentry-delete-revision' => '$1 {{GENDER:$2|изменил|изменила}} видимость {{PLURAL:$5|1=$5 версии|$5 версий}} на странице $3: $4',
+'logentry-delete-event' => '$1 {{GENDER:$2|изменил|изменила}} видимость {{PLURAL:$5|$5 записи|$5 записей|1=записи}} журнала для $3: $4',
+'logentry-delete-revision' => '$1 {{GENDER:$2|изменил|изменила}} видимость {{PLURAL:$5|$5 версии|$5 версий|1=версии}} страницы $3: $4',
 'logentry-delete-event-legacy' => '$1 {{GENDER:$2|изменил|изменила}} видимость записей журнала $3',
 'logentry-delete-revision-legacy' => '$1 {{GENDER:$2|изменил|изменила}} видимость версий на странице $3',
 'logentry-suppress-delete' => '$1 {{GENDER:$2|подавил|подавила}} страницу $3',
-'logentry-suppress-event' => '$1 скрытно {{GENDER:$2|изменил|изменила}} видимость {{PLURAL:$5|1=$5 записи|$5 записей}} журнала на $3: $4',
-'logentry-suppress-revision' => '$1 скрытно {{GENDER:$2|изменил|изменила}} видимость {{PLURAL:$5|1=$5 версии|$5 версий}} на странице $3: $4',
+'logentry-suppress-event' => '$1 скрытно {{GENDER:$2|изменил|изменила}} видимость {{PLURAL:$5|$5 записи|$5 записей|1=записи}} журнала для $3: $4',
+'logentry-suppress-revision' => '$1 скрытно {{GENDER:$2|изменил|изменила}} видимость {{PLURAL:$5|$5 версии|$5 версий|1=версии}} для  странице $3: $4',
 'logentry-suppress-event-legacy' => '$1 скрытно {{GENDER:$2|изменил|изменила}} видимость записей журнала $3',
 'logentry-suppress-revision-legacy' => '$1 скрытно {{GENDER:$2|изменил|изменила}} видимость версий на странице $3',
 'revdelete-content-hid' => 'содержание скрыто',
@@ -4347,7 +4363,7 @@ MediaWiki распространяется в надежде, что она бу
 'api-error-duplicate' => 'Уже {{PLURAL:$1|1=существует [$2 другой файл]|существуют [$2 другие файлы]}} с таким же содержимым',
 'api-error-duplicate-archive' => 'Раньше на сайте {{PLURAL:$1|1=уже был [$2 файл]|были [$2 файлы]}} с точно таким же содержанием, но {{PLURAL:$1|1=он был удалён|они были удалены}}.',
 'api-error-duplicate-archive-popup-title' => 'Дубликаты {{PLURAL:$1|1=файла|файлов}}, которые уже были удалены.',
-'api-error-duplicate-popup-title' => 'Дубликат {{PLURAL:$1|1=файла|файлов}}',
+'api-error-duplicate-popup-title' => 'Дубликат {{PLURAL:$1|1=файла|файлов}}.',
 'api-error-empty-file' => 'Отправленный вами файл пуст.',
 'api-error-emptypage' => 'Не допускается создание новых пустых страниц.',
 'api-error-fetchfileerror' => 'Внутренняя ошибка: что-то пошло не так при получении файла.',
@@ -4373,6 +4389,7 @@ MediaWiki распространяется в надежде, что она бу
 'api-error-overwrite' => 'Не допускается замена существующего файла.',
 'api-error-stashfailed' => 'Внутренняя ошибка: сервер не смог сохранить временный файл.',
 'api-error-publishfailed' => 'Внутренняя ошибка: сервер не смог сохранить временный файл.',
+'api-error-stasherror' => 'При загрузке файла в хранилище произошла ошибка.',
 'api-error-timeout' => 'Сервер не отвечает в течение ожидаемого времени.',
 'api-error-unclassified' => 'Произошла неизвестная ошибка',
 'api-error-unknown-code' => 'Неизвестная ошибка: «$1»',
@@ -4421,10 +4438,12 @@ MediaWiki распространяется в надежде, что она бу
 'expand_templates_input' => 'Входной текст:',
 'expand_templates_output' => 'Результат',
 'expand_templates_xml_output' => 'XML вывод',
+'expand_templates_html_output' => 'HTML-вывод',
 'expand_templates_ok' => 'OK',
 'expand_templates_remove_comments' => 'Удалить комментарии',
 'expand_templates_remove_nowiki' => 'Подавлять теги <nowiki> в результате',
 'expand_templates_generate_xml' => 'Показать дерево разбора XML',
+'expand_templates_generate_rawhtml' => 'Показать HTML',
 'expand_templates_preview' => 'Предпросмотр',
 
 );
index 426479f..3a6041d 100644 (file)
@@ -1227,7 +1227,6 @@ $1",
 'rows' => 'Рядкы:',
 'columns' => 'Колонкы:',
 'searchresultshead' => 'Гляданя',
-'resultsperpage' => 'Чісло резултатів на сторінку:',
 'stub-threshold' => 'Поріг про форматованя одказу як <a href="#" class="stub">одказів на "stub"</a> (v bajtech):',
 'stub-threshold-disabled' => 'Выпнуте',
 'recentchangesdays' => 'За кілько днїв вказовати новы едітованя',
index 72cb3d0..1d0f27e 100644 (file)
@@ -1306,7 +1306,6 @@ You can still [$1 view this revision]",
 'rows' => 'पंक्ति',
 'columns' => 'अध: पंक्त्याः',
 'searchresultshead' => 'अन्वेषणम्',
-'resultsperpage' => 'प्रति पृष्ट हिट्स:',
 'stub-threshold' => '<a href="#" class="stub">आधारानुबन्धानां </a>अधिकतमाकारः ।',
 'stub-threshold-disabled' => 'निष्क्रियः',
 'recentchangesdays' => 'दिवसानि पर्यन्तो सद्यावधि-परिवर्तनानि दृश्यतु:',
index 3c6bc2e..5298a22 100644 (file)
@@ -1170,7 +1170,6 @@ $1",
 'rows' => 'Строкаалара:',
 'columns' => 'Колонкалара:',
 'searchresultshead' => 'Көрдөөһүн түмүгэ',
-'resultsperpage' => 'Сирэйгэ булуллубут суруктар ахсааннара:',
 'stub-threshold' => '<a href="#" class="stub">омооннорго ыйынньыктары</a> оҥоруу боруога:',
 'stub-threshold-disabled' => 'Арахсыбыт',
 'recentchangesdays' => 'Хас хонук иһинэн уларытыылары көрдөрөргө:',
index 220ceb5..4741e2e 100644 (file)
@@ -695,7 +695,7 @@ Unuduḱ: '''({{int:cur}})''' = nahaḱ nãwã aroeko saõte tulạo, '''({{int:
 'searchprofile-everything-tooltip' => 'Sanam ko modre sẽndra ( roṛ sakam modre hõ)',
 'searchprofile-advanced-tooltip' => 'Judạ ńutum re sẽndra',
 'search-result-size' => '$1 ({{PLURAL:$2 1 Aṛaṅ$2 Aṛaṅko}})',
-'search-result-category-size' => '{{PLURAL: $1 1 gãoren $1 gãota renko}} ({{PLURAL: $2 1 kạṭic rokom sokom $ 2 goṭen}}, {{PLURAL:$3 1 rẽt $3 rẽtko}})',
+'search-result-category-size' => '{{PLURAL:$1 1 gãoren $1 gãota renko}} ({{PLURAL:$2 1 kạṭic rokom sokom $ 2 goṭen}}, {{PLURAL:$3 1 rẽt $3 rẽtko}})',
 'search-redirect' => '($1 te sujhi doṛha )',
 'search-section' => '(Pahaṭa $1)',
 'search-suggest' => 'Am do cet́ $1 em menocoyet tãhẽkana',
index adf0633..a486599 100644 (file)
@@ -650,7 +650,6 @@ Cosas de ammentare: '''({{int:cur}})''' = diferèntzias cun sa versione currente
 'rows' => 'Lìnias:',
 'columns' => 'Colunnas:',
 'searchresultshead' => 'Settaggio delle preferenze per la ricerca',
-'resultsperpage' => 'Risultati da visualizzare per pagina',
 'stub-threshold-disabled' => 'Disativadu',
 'recentchangescount' => 'Nùmeru de acontzos de amostare pro definidura:',
 'savedprefs' => 'Is preferèntzias tuas sunt stadas sarbadas.',
index 447a476..32c6c06 100644 (file)
@@ -1083,7 +1083,6 @@ S'havi accirtari ca la cuntinuità storica di la pàggina nun veni altirata.",
 'rows' => 'Righi:',
 'columns' => 'Culonni:',
 'searchresultshead' => 'Circata',
-'resultsperpage' => 'Nùmmiru di risurtati pi pàggina:',
 'stub-threshold' => 'Valuri minimu pî <a href="#" class="stub">liami a li stub</a>:',
 'stub-threshold-disabled' => 'Disabbìlitatu',
 'recentchangesdays' => "Nùmmuru di jorna a ammustrari nte l'urtimi cancaiamenti:",
index 6fa63bb..1d54759 100644 (file)
@@ -827,7 +827,6 @@ Cunsulthà lu [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} rigi
 'rows' => 'Righi:',
 'columns' => 'Curonni:',
 'searchresultshead' => 'Zercha',
-'resultsperpage' => 'Nùmaru di risulthaddi pa pàgina:',
 'stub-threshold' => 'Varori mìminu pa i <a href="#" class="stub">cullegamenti a li sàgumi</a>:',
 'recentchangesdays' => 'Nùmaru di dì da musthrà i li ulthimi mudìfigghi:',
 'recentchangescount' => 'Numaru pridifiniddu di mudifigghi da musthrà:',
index beb3810..5066568 100644 (file)
@@ -768,7 +768,6 @@ Kėtė admėnėstratuorē šėtom pruojekte vėsdar galės pasėiktė pasliepta
 'rows' => 'Eilotės:',
 'columns' => 'Štolpalē:',
 'searchresultshead' => 'Paėiškuos nostatīmā',
-'resultsperpage' => 'Rezoltatu poslapie:',
 'stub-threshold' => 'Minimums <a href="#" class="stub">nabėngta poslapė</a> fuormatavėmō:',
 'recentchangesdays' => 'Ruodomas dėinas vielībūju pakeitėmu sārašė:',
 'recentchangesdays-max' => '(daugiausē $1 {{PLURAL:$1|dėina|dėinū|dėinas}})',
index f798f35..035f28f 100644 (file)
@@ -1332,7 +1332,6 @@ Uzmite u obzir da njegovi indeksi za ovu Wiki ne moraju biti ažurirani.',
 'rows' => 'Redova:',
 'columns' => 'Kolona:',
 'searchresultshead' => 'Postavke rezultata pretrage',
-'resultsperpage' => 'Pogodaka po stranici:',
 'stub-threshold' => 'Formatiranje <a href="#" class="stub">linkova stranica u začetku</a> (bajtova):',
 'stub-threshold-disabled' => 'Isključen/a',
 'recentchangesdays' => 'Broj dana za prikaz u nedavnim izmjenama:',
index 8f46757..c1932d3 100644 (file)
@@ -1272,7 +1272,6 @@ $1",
 'rows' => 'පේළි:',
 'columns' => 'තීරු:',
 'searchresultshead' => 'ගවේෂණය',
-'resultsperpage' => 'පිටුවකට හිට් ගණන:',
 'stub-threshold' => '<a href="#" class="stub">කොට සබැඳි</a> ආකෘතිකරණය සඳහා සීමකය (බයිට්):',
 'stub-threshold-disabled' => 'අක්‍රිය කෙරිණි',
 'recentchangesdays' => 'මෑත වෙනස්වීම්හි පෙන්විය යුතු දිනයන්:',
index 9f98340..b7ae1e3 100644 (file)
@@ -663,10 +663,10 @@ Neudala vysvetlenie.',
 'viewsourcetext' => 'Môžete si zobraziť a kopírovať zdroj tejto stránky:',
 'viewyourtext' => "Môžete si prehliadnuť a skopírovať zdrojový kód '''vašich zmien''' tejto stránky:",
 'protectedinterface' => 'Táto stránka poskytuje text používateľského rozhrania tejto wiki a je zamknutá, aby sa predišlo jej zneužitiu.
-Ak chcete pridať alebo zmeniť preklady pre všetky wiki, prosím, použite [//translatewiki.net/wiki/Main_Page?setlang=sk translatewiki.net], projekt lokalizácie MediaWiki.',
+Ak chcete pridať alebo zmeniť preklady pre všetky wiki, prosím, použite [//translatewiki.net/ translatewiki.net], projekt lokalizácie MediaWiki.',
 'editinginterface' => "'''Upozornenie:''' Upravujete stránku, ktorá poskytuje text používateľského rozhrania.
 Zmeny tejto stránky ovplyvnia vzhľad používateľského rozhrania ostatným používateľom.
-Ak chcete pridať alebo zmeniť preklady pre všetky wiki, prosím, použite [//translatewiki.net/wiki/Main_Page?setlang=sk translatewiki.net], projekt lokalizácie MediaWiki.",
+Ak chcete pridať alebo zmeniť preklady pre všetky wiki, prosím, použite [//translatewiki.net/ translatewiki.net], projekt lokalizácie MediaWiki.",
 'cascadeprotected' => 'Táto stránka bola zamknutá proti úpravám, pretože je použitá na {{PLURAL:$1|nasledovnej stránke, ktorá je zamknutá|nasledovných stránkach, ktoré sú zamknuté}} voľbou „kaskádového zamknutia“:
 $2',
 'namespaceprotected' => "Nemáte povolenie upravovať stránky v mennom priestore '''$1'''.",
@@ -1419,7 +1419,6 @@ Podrobnosti nájdete v [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}
 'rows' => 'Riadky:',
 'columns' => 'Stĺpce:',
 'searchresultshead' => 'Vyhľadávanie',
-'resultsperpage' => 'Počet vyhovujúcich výsledkov zobrazených na stránku:',
 'stub-threshold' => 'Prah formátovania <a href="#" class="stub">výhonkov</a> (v bajtoch):',
 'stub-threshold-disabled' => 'Vypnuté',
 'recentchangesdays' => 'Koľko dní zobrazovať v posledných úpravách:',
index c4b1752..381b4c7 100644 (file)
@@ -1341,7 +1341,6 @@ Upoštevajte, da so njihovi podatki vsebine {{GRAMMAR:rodilnik|{{SITENAME}}}} mo
 'rows' => 'Vrstic:',
 'columns' => 'Stolpcev:',
 'searchresultshead' => 'Nastavitve poizvedovanja',
-'resultsperpage' => 'Prikazanih zadetkov na stran:',
 'stub-threshold' => 'Prag označevanja <a href="#" class="stub">škrbin</a> (v bajtih):',
 'stub-threshold-disabled' => 'Onemogočeno',
 'recentchangesdays' => 'Število dni, prikazanih v zadnjih spremembah:',
index 075559a..13123a2 100644 (file)
@@ -1267,7 +1267,6 @@ Kini kujdes se përdorimi i lidhjeve të shfletimit do të ndryshojë përzgjedh
 'rows' => 'Rreshta:',
 'columns' => 'Kollona:',
 'searchresultshead' => 'Kërkimi',
-'resultsperpage' => 'Sa përputhje të tregohen për faqe:',
 'stub-threshold' => 'Kufiri për formatin e <a href="#" class="stub">lidhjeve cung</a> (B):',
 'stub-threshold-disabled' => 'Çaktivizuar',
 'recentchangesdays' => 'Numri i ditëve të treguara në ndryshime së fundmi:',
index f02f631..c7bc020 100644 (file)
@@ -515,12 +515,12 @@ $messages = array(
 'december-date' => '$1 децембар',
 
 # Categories related messages
-'pagecategories' => '{{PLURAL:$1|1=Категорија|Категорије}}',
+'pagecategories' => '{{PLURAL:$1|Категорија|Категорије}}',
 'category_header' => 'Странице у категорији „$1“',
 'subcategories' => 'Поткатегорије',
 'category-media-header' => 'Датотеке у категорији „$1“',
 'category-empty' => "<div style=\"margin:2em 1em 0 1em; padding:0.5em; border:1px solid #AAA; text-align:center;\">''Ова категорија тренутно не садржи странице или датотеке.''</div>",
-'hidden-categories' => '{{PLURAL:$1|1=Сакривена категорија|Сакривене категорије}}',
+'hidden-categories' => '{{PLURAL:$1|Сакривена категорија|Сакривене категорије}}',
 'hidden-category-category' => 'Сакривене категорије',
 'category-subcat-count' => '{{PLURAL:$2|Ова категорија садржи само следећу поткатегорију.|Ова категорија има {{PLURAL:$1|следећу поткатегорију|следеће $1 поткатегорије|следећих $1 поткатегорија}}, од укупно $2.}}',
 'category-subcat-count-limited' => 'Ова категорија садржи {{PLURAL:$1|следећу поткатегорију|следеће $1 поткатегорије|следећих $1 поткатегорија}}.',
@@ -658,7 +658,7 @@ $1',
 
 'badaccess' => 'Грешке у овлашћењима',
 'badaccess-group0' => 'Није вам дозвољено да извршите захтевану радњу.',
-'badaccess-groups' => 'Радња је доступна само корисницима у {{PLURAL:$2|1=следећој групи|следећим групама}}:  $1.',
+'badaccess-groups' => 'Радња коју сте захтевали је ограничена само корисницима у {{PLURAL:$2|следећој групи|следећим групама}}: $1.',
 
 'versionrequired' => 'Потребно је издање $1 Медијавикија',
 'versionrequiredtext' => 'Потребно је издање $1 Медијавикија да бисте користили ову страницу.
@@ -672,8 +672,8 @@ $1',
 'youhavenewmessages' => 'Имате $1 ($2).',
 'youhavenewmessagesfromusers' => 'Имате $1 од {{PLURAL:$3|другог корисника|$3 корисника|$3 корисника}} ($2).',
 'youhavenewmessagesmanyusers' => 'Имате $1 од много корисника ($2).',
-'newmessageslinkplural' => '{{PLURAL:$1|1=нову поруку|999=нове поруке}}',
-'newmessagesdifflinkplural' => '{{PLURAL:$1|1=последњу измену|999=последње измене}}',
+'newmessageslinkplural' => '{{PLURAL:$1|нову поруку|999=нове поруке}}',
+'newmessagesdifflinkplural' => '{{PLURAL:$1|последњу измену|999=последње измене}}',
 'youhavenewmessagesmulti' => 'Имате нових порука на $1',
 'editsection' => 'уреди',
 'editold' => 'уреди',
@@ -766,7 +766,7 @@ $1',
 'badtitletext' => 'Наслов странице је неисправан, празан или је међујезички или међувики наслов погрешно повезан.
 Можда садржи знакове који се не могу користити у насловима.',
 'perfcached' => 'Следећи подаци су кеширани и могу бити застарели. Кеш садржи највише {{PLURAL:$1|један резултат|$1 резултата|$1 резултата}}.',
-'perfcachedts' => 'Следећи подаци су кеширании и последњи пут су ажурирани $2 у $3. Кеш садржи највише {{PLURAL:$4|1=један резултат|$4 резултата}}.',
+'perfcachedts' => 'Следећи подаци су кеширани и последњи пут су ажурирани $2 у $3. У кешу {{PLURAL:$4|је доступан највише један резултат|су доступна највише $4 резултата|је доступно највише $4 резултата}}.',
 'querypage-no-updates' => 'Ажурирање ове странице је тренутно онемогућено.
 Подаци који се овде налазе могу бити застарели.',
 'viewsource' => 'Изворни код',
@@ -781,7 +781,7 @@ $1',
 'editinginterface' => "'''Упозорење:''' уређујете страницу која се користи за приказивање текста корисничког окружења.
 Измене на овој страници ће утицати на све кориснике овог викија.
 Да бисте додали или изменили преводе свих викија, посетите [//translatewiki.net/wiki/Main_Page?setlang=sr_ec Транслејтвики], пројекат за локализацију Медијавикија.",
-'cascadeprotected' => 'Ова страница је закључана јер садржи {{PLURAL:$1|1=следећу страницу која је заштићена|следеће странице које су заштићене}} „преносивом“ заштитом:
+'cascadeprotected' => 'Ова страница је закључана јер садржи {{PLURAL:$1|следећу страницу која је заштићена|следеће странице које су заштићене}} „преносивом“ заштитом:
 $2',
 'namespaceprotected' => "Немате дозволу да уређујете странице у именском простору '''$1'''.",
 'customcssprotected' => 'Немате дозволу да мењате ову CSS страницу јер садржи личне поставке другог корисника.',
@@ -798,7 +798,7 @@ $2',
 'invalidtitle-knownnamespace' => 'Неисправан наслов с именским простором „$2“ и текстом „$3“',
 'invalidtitle-unknownnamespace' => 'Неисправан наслов с именским простором бр. $1 и текстом „$2“',
 'exception-nologin' => 'Нисте пријављени',
-'exception-nologin-text' => 'Ова страница или радња захтева да будете пријављени на вики.',
+'exception-nologin-text' => '[[Special:Userlogin|Пријавите се]] да бисте приступили овој страници или радњи.',
 
 # Virus scanner
 'virus-badscanner' => "Неисправна поставка: непознати скенер за вирусе: ''$1''",
@@ -823,7 +823,7 @@ $2',
 'yourpasswordagain' => 'Потврда лозинке:',
 'createacct-yourpasswordagain' => 'Потврдите лозинку',
 'createacct-yourpasswordagain-ph' => 'Унесите лозинку још једном',
-'remembermypassword' => 'Ð\97апамÑ\82и Ð¼Ð¾Ñ\98Ñ\83 Ð»Ð¾Ð·Ð¸Ð½ÐºÑ\83 Ð½Ð° Ð¾Ð²Ð¾Ð¼ Ð¿Ñ\80егледаÑ\87Ñ\83 (наÑ\98дÑ\83же $1 {{PLURAL:$1|1=дан|дана}})',
+'remembermypassword' => 'Ð\97апамÑ\82и Ð¼Ðµ Ð½Ð° Ð¾Ð²Ð¾Ð¼ Ð¿Ñ\80егледаÑ\87Ñ\83 (наÑ\98дÑ\83же $1 {{PLURAL:$1|дан|дана|дана}})',
 'userlogin-remembermypassword' => 'Остави ме пријављеног/у',
 'userlogin-signwithsecure' => 'Користите сигурну конекцију',
 'yourdomainname' => 'Домен:',
@@ -913,14 +913,14 @@ $2',
 'blocked-mailpassword' => 'Вашој ИП адреси је онемогућено уређивање страница, као и могућност захтевања нове лозинке.',
 'eauthentsent' => 'На наведену е-адресу је послат потврдни код.
 Пре него што пошаљемо даљње поруке, пратите упутства с е-поште да бисте потврдили да сте ви отворили налог.',
-'throttled-mailpassword' => 'Подсетник за лозинку је послат {{PLURAL:$1|пре сат времена|у последња $1 сата|у последњих $1 сати}}.
\94а Ð±Ð¸Ñ\81мо Ñ\81пÑ\80еÑ\87или Ð·Ð»Ð¾Ñ\83поÑ\82Ñ\80ебÑ\83, Ð¿Ð¾Ð´Ñ\81еÑ\82ник Ñ\88аÑ\99емо Ñ\81амо Ñ\98едном Ñ\83 Ñ\80окÑ\83 Ð¾Ð´ {{PLURAL:$1|Ñ\98едног Ñ\81аÑ\82а|$1 сата|$1 сати}}.',
+'throttled-mailpassword' => 'Порука за промену лозинке је послата у {{PLURAL:$1|последњих сат времена|последња $1 сата|последњих $1 сати}}.
\94а Ð±Ð¸Ñ\81мо Ñ\81пÑ\80еÑ\87или Ð·Ð»Ð¾Ñ\83поÑ\82Ñ\80ебÑ\83, Ð¿Ð¾Ð´Ñ\81еÑ\82ник Ñ\88аÑ\99емо Ñ\81амо Ñ\98едном Ñ\83 Ñ\80окÑ\83 Ð¾Ð´ {{PLURAL:$1|Ñ\81аÑ\82 Ð²Ñ\80емена|$1 сата|$1 сати}}.',
 'mailerror' => 'Грешка при слању поруке: $1',
 'acct_creation_throttle_hit' => 'Посетиоци овог викија који користе вашу ИП адресу су већ отворили {{PLURAL:$1|један налог|$1 налога|$1 налога}} претходни дан, што је највећи дозвољени број у том временском периоду.
 Због тога посетиоци с ове ИП адресе тренутно не могу отворити више налога.',
 'emailauthenticated' => 'Ваша е-адреса је потврђена $2 у $3.',
 'emailnotauthenticated' => 'Ваша е-адреса још није потврђена.
-Поруке неће бити послате ни за једну од следећих могућности.',
+Поруке неће бити послате ни у једном од следећих случајева.',
 'noemailprefs' => 'Унесите е-адресу како би ове могућности радиле.',
 'emailconfirmlink' => 'Потврдите своју е-адресу',
 'invalidemailaddress' => 'Е-адреса не може бити прихваћена јер је неисправног облика.
@@ -1055,7 +1055,7 @@ $2
 'blockedtitle' => 'Корисник је блокиран',
 'blockedtext' => "'''Ваше корисничко име или ИП адреса је блокирана.'''
 
-Блокирање је {{GENDER:$4|извршио|извршила|извршио}} $1.
+Блокирање је {{GENDER:$4|извршио|извршила}} $1.
 Разлог: ''$2''.
 
 * Датум блокирања: $8
@@ -1529,7 +1529,6 @@ $1",
 'rows' => 'Редова:',
 'columns' => 'Колоне:',
 'searchresultshead' => 'Претрага',
-'resultsperpage' => 'Погодака по страници:',
 'stub-threshold' => 'Праг за обликовање <a href="#" class="stub">везе као клице</a> (у бајтовима):',
 'stub-threshold-disabled' => 'Онемогућено',
 'recentchangesdays' => 'Број дана у скорашњим изменама:',
@@ -1633,7 +1632,7 @@ $1",
 'userrights-reason' => 'Разлог:',
 'userrights-no-interwiki' => 'Немате овлашћења да мењате корисничка права на другим викијима.',
 'userrights-nodatabase' => 'База података $1 не постоји или није локална.',
-'userrights-nologin' => 'Ð\9cоÑ\80аÑ\82е Ñ\81е [[Special:UserLogin|пÑ\80иÑ\98авиÑ\82и]] Ñ\81 Ð°Ð´Ð¼Ð¸Ð½Ð¸Ñ\81Ñ\82Ñ\80аÑ\82оÑ\80Ñ\81ким Ð½Ð°Ð»Ð¾Ð³Ð¾Ð¼ Ð´Ð° Ð±Ð¸Ñ\81Ñ\82е Ð´Ð¾Ð´али корисничка права.',
+'userrights-nologin' => 'Ð\9cоÑ\80аÑ\82е Ñ\81е [[Special:UserLogin|пÑ\80иÑ\98авиÑ\82и]] Ñ\81 Ð°Ð´Ð¼Ð¸Ð½Ð¸Ñ\81Ñ\82Ñ\80аÑ\82оÑ\80Ñ\81ким Ð½Ð°Ð»Ð¾Ð³Ð¾Ð¼ Ð´Ð° Ð±Ð¸Ñ\81Ñ\82е Ð¼ÐµÑ\9aали корисничка права.',
 'userrights-notallowed' => 'Немате овлашћења да додајете или уклањате корисничка права.',
 'userrights-changeable-col' => 'Групе које можете да промените',
 'userrights-unchangeable-col' => 'Групе које не можете да промените',
@@ -1869,7 +1868,7 @@ $1",
 'filename-toolong' => 'Називи датотека могу имати највише 240 бајтова.',
 'badfilename' => 'Назив датотеке је промењен у „$1“.',
 'filetype-mime-mismatch' => 'Екстензија „.$1“ не одговара препознатој врсти MIME датотеке ($2).',
-'filetype-badmime' => 'Датотеке MIME врсте „$1“ није дозвољено слати.',
+'filetype-badmime' => 'Датотеке MIME типа „$1“ није дозвољено слати.',
 'filetype-bad-ie-mime' => 'Ова датотека се не може послати зато што би је Интернет експлорер уочио као „$1“, а то је забрањена и опасна врста датотеке.',
 'filetype-unwanted-type' => '„.$1“ је непожељна врста датотеке.
 {{PLURAL:$3|1=Пожељна врста датотеке је|Пожељне врсте датотека су}} $2.',
@@ -2613,9 +2612,9 @@ $UNWATCHURL
 'protectlogpage' => 'Дневник закључавања',
 'protectlogtext' => 'Испод је списак измена у виду заштите страница.
 Погледајте [[Special:ProtectedPages|списак заштићених страница]] за више детаља.',
-'protectedarticle' => '{{GENDER:|је заштитио|је заштитила|је заштитио}} „[[$1]]“',
+'protectedarticle' => '{{GENDER:|је заштитио|је заштитила}} „[[$1]]“',
 'modifiedarticleprotection' => '{{GENDER:|је променио|је променила|је променио}} степен заштите за „[[$1]]“',
-'unprotectedarticle' => '{{GENDER:|је уклонио|је уклонила}} заштиту са странице „[[$1]]“',
+'unprotectedarticle' => 'уклоњена заштита са странице „[[$1]]“',
 'movedarticleprotection' => '{{GENDER:|је преместио|је преместила|је преместио}} поставке заштите са „[[$2]]“ на „[[$1]]“',
 'protect-title' => 'Степен заштите за „$1“',
 'protect-title-notallowed' => 'Преглед степена заштите за „$1“',
@@ -2786,7 +2785,7 @@ $1',
 'whatlinkshere-filters' => 'Филтери',
 
 # Block/unblock
-'autoblockid' => 'Самоблокирање #$1',
+'autoblockid' => 'Ð\90Ñ\83Ñ\82омаÑ\82Ñ\81ко блокирање #$1',
 'block' => 'Блокирај корисника',
 'unblock' => 'Деблокирај корисника',
 'blockip' => 'Блокирај корисника',
@@ -2850,7 +2849,7 @@ $1',
 'ipblocklist-submit' => 'Претражи',
 'ipblocklist-localblock' => 'Локално блокирање',
 'ipblocklist-otherblocks' => '{{PLURAL:$1|1=Друго блокирање|Друга блокирања}}',
-'infiniteblock' => 'никада',
+'infiniteblock' => 'трајно',
 'expiringblock' => 'истиче дана $1 у $2',
 'anononlyblock' => 'само анонимни',
 'noautoblockblock' => 'аутоматско блокирање је онемогућено',
@@ -2864,8 +2863,8 @@ $1',
 'change-blocklink' => 'промени блокирање',
 'contribslink' => 'доприноси',
 'emaillink' => 'пошаљи е-поруку',
-'autoblocker' => 'СамоблокиÑ\80ани Ñ\81Ñ\82е Ñ\98еÑ\80 Ð´ÐµÐ»Ð¸Ñ\82е Ð\98Ð\9f Ð°Ð´Ñ\80еÑ\81Ñ\83 Ñ\81 {{GENDER:$1|коÑ\80иÑ\81ником|коÑ\80иÑ\81ниÑ\86ом|коÑ\80иÑ\81ником}} [[User:$1|$1]].
-Разлог блокирања: "\'\'\'$2\'\'\'"',
+'autoblocker' => 'Ð\90Ñ\83Ñ\82омаÑ\82Ñ\81ки Ñ\81Ñ\82е Ð±Ð»Ð¾ÐºÐ¸Ñ\80ани Ñ\98еÑ\80 Ð´ÐµÐ»Ð¸Ñ\82е Ð\98Ð\9f Ð°Ð´Ñ\80еÑ\81Ñ\83 Ñ\81 {{GENDER:$1|коÑ\80иÑ\81ником|коÑ\80иÑ\81ниÑ\86ом}} [[User:$1|$1]].
+Разлог блокирања: „$2“',
 'blocklogpage' => 'Дневник блокирања',
 'blocklog-showlog' => '{{GENDER:$1|Овај корисник је раније блокиран|Ова корисница је раније блокирана|Овај корисник је раније блокиран}}.
 Историја блокирања се налази испод:',
index 790739c..c42e745 100644 (file)
@@ -688,7 +688,7 @@ Da biste dodali ili izmenili prevode svih vikija, posetite [//translatewiki.net/
 'editinginterface' => "'''Upozorenje:''' uređujete stranicu koja se koristi za prikazivanje teksta korisničkog okruženja.
 Izmene na ovoj stranici će uticati na sve korisnike ovog vikija.
 Da biste dodali ili izmenili prevode svih vikija, posetite [//translatewiki.net/wiki/Main_Page?setlang=sr_ec Translejtviki], projekat za lokalizaciju Medijavikija.",
-'cascadeprotected' => 'Ova stranica je zaključana jer sadrži {{PLURAL:$1|1=sledeću stranicu koja je zaštićena|sledeće stranice koje su zaštićene}} „prenosivom“ zaštitom:
+'cascadeprotected' => 'Ova stranica je zaključana jer sadrži {{PLURAL:$1|sledeću stranicu koja je zaštićena|sledeće stranice koje su zaštićene}} „prenosivom“ zaštitom:
 $2',
 'namespaceprotected' => "Nemate dozvolu da uređujete stranice u imenskom prostoru '''$1'''.",
 'customcssprotected' => 'Nemate dozvolu da menjate ovu CSS stranicu jer sadrži lične postavke drugog korisnika.',
@@ -941,7 +941,7 @@ Ako ponovo kliknete na „{{int:savearticle}}“, vaša izmena će biti sačuvan
 'blockedtitle' => 'Korisnik je blokiran',
 'blockedtext' => "'''Vaše korisničko ime ili IP adresa je blokirana.'''
 
-Blokiranje je {{GENDER:$4|izvršio|izvršila|izvršio}} $1.
+Blokiranje je {{GENDER:$4|izvršio|izvršila}} $1.
 Razlog: ''$2''.
 
 * Datum blokiranja: $8
@@ -1414,7 +1414,6 @@ Upamtite da njegovi popisi ovog vikija mogu biti zastareli.',
 'rows' => 'Redova:',
 'columns' => 'Kolone:',
 'searchresultshead' => 'Pretraga',
-'resultsperpage' => 'Pogodaka po stranici:',
 'stub-threshold' => 'Prag za oblikovanje <a href="#" class="stub">veze kao klice</a> (u bajtovima):',
 'stub-threshold-disabled' => 'Onemogućeno',
 'recentchangesdays' => 'Broj dana u skorašnjim izmenama:',
@@ -1516,7 +1515,7 @@ Ako izaberete da ga unesete, ono će biti korišćeno za pripisivanje vašeg rad
 'userrights-reason' => 'Razlog:',
 'userrights-no-interwiki' => 'Nemate ovlašćenja da menjate korisnička prava na drugim vikijima.',
 'userrights-nodatabase' => 'Baza podataka $1 ne postoji ili nije lokalna.',
-'userrights-nologin' => 'Morate se [[Special:UserLogin|prijaviti]] s administratorskim nalogom da biste dodali korisnička prava.',
+'userrights-nologin' => 'Morate se [[Special:UserLogin|prijaviti]] s administratorskim nalogom da biste menjali korisnička prava.',
 'userrights-notallowed' => 'Nemate ovlašćenja da dodajete ili uklanjate korisnička prava.',
 'userrights-changeable-col' => 'Grupe koje možete da promenite',
 'userrights-unchangeable-col' => 'Grupe koje ne možete da promenite',
@@ -1663,6 +1662,8 @@ Ako izaberete da ga unesete, ono će biti korišćeno za pripisivanje vašeg rad
 'recentchanges-label-minor' => 'Manja izmena',
 'recentchanges-label-bot' => 'Ovu izmenu je napravio bot',
 'recentchanges-label-unpatrolled' => 'Ova izmena još nije pregledana',
+'recentchanges-label-plusminus' => 'Promena veličine stranice (u bajtovima)',
+'recentchanges-legend-heading' => "'''Legenda:'''",
 'recentchanges-legend-newpage' => '([[Special:NewPages|spisak novih stranica]])',
 'rcnotefrom' => 'Ispod su izmene od <b>$3; $4</b> (do <b>$1</b> izmena).',
 'rclistfrom' => 'Prikaži nove izmene počev od $1',
@@ -1743,7 +1744,7 @@ Promenite naziv datoteke i ponovo je pošaljite.',
 'filename-toolong' => 'Nazivi datoteka mogu imati najviše 240 bajtova.',
 'badfilename' => 'Naziv datoteke je promenjen u „$1“.',
 'filetype-mime-mismatch' => 'Ekstenzija „.$1“ ne odgovara prepoznatoj vrsti MIME datoteke ($2).',
-'filetype-badmime' => 'Datoteke MIME vrste „$1“ nije dozvoljeno slati.',
+'filetype-badmime' => 'Datoteke MIME tipa „$1“ nije dozvoljeno slati.',
 'filetype-bad-ie-mime' => 'Ova datoteka se ne može poslati zato što bi je Internet eksplorer uočio kao „$1“, a to je zabranjena i opasna vrsta datoteke.',
 'filetype-unwanted-type' => '„.$1“ je nepoželjna vrsta datoteke.
 {{PLURAL:$3|1=Poželjna vrsta datoteke je|Poželjne vrste datoteka su}} $2.',
@@ -2470,9 +2471,9 @@ Vratite se na prethodnu stranicu, ponovo je učitajte i pokušajte ponovo.',
 'protectlogpage' => 'Dnevnik zaključavanja',
 'protectlogtext' => 'Ispod je spisak izmena u vidu zaštite stranica.
 Pogledajte [[Special:ProtectedPages|spisak zaštićenih stranica]] za više detalja.',
-'protectedarticle' => '{{GENDER:|je zaštitio|je zaštitila|je zaštitio}} „[[$1]]“',
+'protectedarticle' => '{{GENDER:|je zaštitio|je zaštitila}} „[[$1]]“',
 'modifiedarticleprotection' => '{{GENDER:|je promenio|je promenila|je promenio}} stepen zaštite za „[[$1]]“',
-'unprotectedarticle' => '{{GENDER:|je uklonio|je uklonila}} zaštitu sa stranice „[[$1]]“',
+'unprotectedarticle' => 'uklonjena zaštita sa stranice „[[$1]]“',
 'movedarticleprotection' => '{{GENDER:|je premestio|je premestila|je premestio}} postavke zaštite sa „[[$2]]“ na „[[$1]]“',
 'protect-title' => 'Stepen zaštite za „$1“',
 'protect-title-notallowed' => 'Pregled stepena zaštite za „$1“',
@@ -2643,7 +2644,7 @@ Izveštaj o blokiranim korisnicima se nalazi ispod:',
 'whatlinkshere-filters' => 'Filteri',
 
 # Block/unblock
-'autoblockid' => 'Samoblokiranje #$1',
+'autoblockid' => 'Automatsko blokiranje #$1',
 'block' => 'Blokiraj korisnika',
 'unblock' => 'Deblokiraj korisnika',
 'blockip' => 'Blokiraj korisnika',
@@ -2707,7 +2708,7 @@ Blokiranja možete da pogledate [[Special:BlockList|ovde]].',
 'ipblocklist-submit' => 'Pretraži',
 'ipblocklist-localblock' => 'Lokalno blokiranje',
 'ipblocklist-otherblocks' => '{{PLURAL:$1|1=Drugo blokiranje|Druga blokiranja}}',
-'infiniteblock' => 'nikada',
+'infiniteblock' => 'trajno',
 'expiringblock' => 'ističe dana $1 u $2',
 'anononlyblock' => 'samo anonimni',
 'noautoblockblock' => 'automatsko blokiranje je onemogućeno',
@@ -2721,8 +2722,8 @@ Blokiranja možete da pogledate [[Special:BlockList|ovde]].',
 'change-blocklink' => 'promeni blokiranje',
 'contribslink' => 'doprinosi',
 'emaillink' => 'pošalji e-poruku',
-'autoblocker' => 'Samoblokirani ste jer delite IP adresu s {{GENDER:$1|korisnikom|korisnicom|korisnikom}} [[User:$1|$1]].
-Razlog blokiranja: "\'\'\'$2\'\'\'"',
+'autoblocker' => 'Automatski ste blokirani jer delite IP adresu s {{GENDER:$1|korisnikom|korisnicom}} [[User:$1|$1]].
+Razlog blokiranja: „$2“',
 'blocklogpage' => 'Dnevnik blokiranja',
 'blocklog-showlog' => '{{GENDER:$1|Ovaj korisnik je ranije blokiran|Ova korisnica je ranije blokirana|Ovaj korisnik je ranije blokiran}}.
 Istorija blokiranja se nalazi ispod:',
index 9ebf999..9d664c9 100644 (file)
@@ -1008,7 +1008,6 @@ Staal deertruch sicher, dät ju Versionsgeskichte fon n Artikkel historisk akroa
 'rows' => 'Riegen',
 'columns' => 'Spalten',
 'searchresultshead' => 'Säike (010)',
-'resultsperpage' => 'Träffere pro Siede:',
 'stub-threshold' => '<a href="#" class="stub">Kuute Artikkele</a> markierje bi (in Byte):',
 'stub-threshold-disabled' => 'Deaktivierd',
 'recentchangesdays' => 'Antaal fon Deege, do ju Lieste fon „Lääste Annerengen“ standoardmäitich uumfoatje skäl:',
index 148fee1..70e614e 100644 (file)
@@ -1077,7 +1077,6 @@ Pastikeun yén ieu parobahan bisa miara jujutan kaca sagemblengna.',
 'rows' => 'Baris',
 'columns' => 'Kolom',
 'searchresultshead' => 'Aturan hasil néang',
-'resultsperpage' => 'Hasil nu ditémbongkeun per kaca',
 'stub-threshold' => 'Wates ambang pikeun format <a href="#" class="stub">tumbu taratas</a> (bit):',
 'stub-threshold-disabled' => 'Tumpur',
 'recentchangesdays' => 'Jumlah poé nu dipidangkeun dina Nu anyar robah:',
index 88698fc..8aff5ab 100644 (file)
@@ -1155,6 +1155,8 @@ Den finns redan.',
 'content-not-allowed-here' => 'innehåll av "$1" är inte tillåtet på sidan [[$2]]',
 'editwarning-warning' => 'Om du lämnar den här sidan kommer du att förlora alla ändringar du har gjort.
 Om du är inloggad kan du slå av den här varningen under "Redigering" i dina inställningar.',
+'editpage-notsupportedcontentformat-title' => 'Innehållsformat som inte stöds',
+'editpage-notsupportedcontentformat-text' => 'Innehållsformatet $1 stöds inte av innehållsmodellen $2.',
 
 # Content models
 'content-model-wikitext' => 'wikitext',
@@ -1464,7 +1466,6 @@ Notera dock att deras indexering av {{SITENAME}} kan vara något föråldrad.',
 'rows' => 'Rader:',
 'columns' => 'Kolumner:',
 'searchresultshead' => 'Sökning',
-'resultsperpage' => 'Träffar per sida:',
 'stub-threshold' => 'Gräns för <a href="#" class="stub">stubblänk</a>-formatering (byte):',
 'stub-threshold-disabled' => 'Avaktiverat',
 'recentchangesdays' => 'Antal dygn som skall visas i "senaste ändringarna":',
@@ -1756,7 +1757,7 @@ Om du väljer att ange ditt riktiga namn, kommer det att användas för att till
 'number_of_watching_users_pageview' => '[$1 bevakande {{PLURAL:$1|användare|användare}}]',
 'rc_categories' => 'Begränsa till följande kategorier (separera med "|")',
 'rc_categories_any' => 'Vilken som helst',
-'rc-change-size-new' => '$1 {{PLURAL:$1|byte|bytes}} efter ändring',
+'rc-change-size-new' => '$1 {{PLURAL:$1|byte}} efter ändring',
 'newsectionsummary' => '/* $1 */ nytt avsnitt',
 'rc-enhanced-expand' => 'Visa detaljer',
 'rc-enhanced-hide' => 'Göm detaljer',
@@ -2238,6 +2239,7 @@ Varje rad innehåller länkar till den första och andra omdirigeringsidan, samt
 'protectedpages' => 'Skyddade sidor',
 'protectedpages-indef' => 'Endast skydd på obestämd tid',
 'protectedpages-cascade' => 'Endast kaskaderande skydd',
+'protectedpages-noredirect' => 'Dölj omdirigeringar',
 'protectedpagesempty' => 'Inga sidor är skyddade under de villkoren.',
 'protectedtitles' => 'Skyddade titlar',
 'protectedtitlesempty' => 'Just nu finns inga skyddade sidtitlar med de parametrarna.',
@@ -2746,6 +2748,7 @@ Ange orsak nedan (exempelvis genom att nämna sidor som blivit vandaliserade).',
 För att se alla aktuella blockeringar, gå till [[Special:BlockList|listan över blockeringar]].',
 'ipb-blockingself' => 'Du håller på att blockera dig själv! Är du säker på att du vill göra det?',
 'ipb-confirmhideuser' => 'Du är på väg att blockera en användare med "göm användare" aktiverat. Detta kommer upphäva användarens namn i alla listor och loggar. Är du säker på att du vill göra det?',
+'ipb-confirmaction' => 'Markera fältet "{{int:ipb-confirm}}" längst ned om du är säker på att du verkligen vill göra det.',
 'ipb-edit-dropdown' => 'Redigera blockeringsanledningar',
 'ipb-unblock-addr' => 'Ta bort blockering av $1',
 'ipb-unblock' => 'Ta bort blockering av en användare eller IP-adress',
@@ -3938,7 +3941,17 @@ Du kan också [[Special:EditWatchlist|använda standardeditorn]].',
 'version-hook-name' => 'Namn',
 'version-hook-subscribedby' => 'Används av',
 'version-version' => '(Version $1)',
-'version-license' => 'Licens',
+'version-license' => 'MediaWiki-licens',
+'version-ext-license' => 'Licens',
+'version-ext-colheader-name' => 'Tillägg',
+'version-ext-colheader-version' => 'Version',
+'version-ext-colheader-license' => 'Licens',
+'version-ext-colheader-description' => 'Beskrivning',
+'version-ext-colheader-credits' => 'Författare',
+'version-license-title' => 'Licens för $1',
+'version-license-not-found' => 'Ingen detaljerad licensinformation hittades för detta tillägg.',
+'version-credits-title' => 'Erkännande för $1',
+'version-credits-not-found' => 'Ingen detaljerad erkännandeinformation hittades för detta tillägg.',
 'version-poweredby-credits' => "Den här wikin drivs av '''[https://www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
 'version-poweredby-others' => 'andra',
 'version-poweredby-translators' => 'översättare från translatewiki.net',
index 72ab692..79ce472 100644 (file)
@@ -1146,7 +1146,6 @@ Ujue lakini kwamba kumbukumbu za {{SITENAME}} kule Google labda zilipitwa na wak
 'rows' => 'Mistari:',
 'columns' => 'Safu:',
 'searchresultshead' => 'Kutafuta',
-'resultsperpage' => 'Matokeo yanayoorodheshwa katika ukurasa mmoja:',
 'stub-threshold' => 'Kiwango cha juu cha kuonyesha kiungo kama <a href="#" class="stub">kiungo kinachoelekea mbegu</a> (baiti):',
 'stub-threshold-disabled' => 'Imelemazwa',
 'recentchangesdays' => 'Ionyeshwe siku ngapi kwenye orodha ya mabadiliko ya karibuni?',
index d61ce8d..15b7ec0 100644 (file)
@@ -1056,7 +1056,6 @@ $1',
 'rows' => 'Wjerše:',
 'columns' => 'Kůlumny:',
 'searchresultshead' => 'Šnupańy',
-'resultsperpage' => 'Ličba wyńikůw na zajće',
 'stub-threshold' => 'Maksymalny rozmjar artikla uoznačanygo kej <a href="#" class="stub">stub (kůnsek)</a>',
 'stub-threshold-disabled' => 'Uodymkńynte',
 'recentchangesdays' => 'Ličba dńi do pokazańo we půmjyńanych na uostatku:',
index 4b16b6b..05c0b60 100644 (file)
@@ -361,7 +361,7 @@ $1',
 'youhavenewmessages' => 'உங்களுக்குப் $1 உள்ளன ($2).',
 'youhavenewmessagesfromusers' => 'உங்களுக்கு $1 {{PLURAL:$3|வேறொரு பயனரிடம்|$3 பயனர்களிடம்}} இருந்து உள்ளது ($2).',
 'youhavenewmessagesmanyusers' => 'உங்களுக்கு பல பயனர்களிடமிருந்து $1 பதிய செய்திகள்  உள்ளன ($2).',
-'newmessageslinkplural' => '{{PLURAL:$1|ஒரு புதிய செய்தி|புதிய செய்திகள்}}',
+'newmessageslinkplural' => '{{PLURAL:$1|ஒரு புதிய செய்தி|999=புதிய செய்திகள்}}',
 'newmessagesdifflinkplural' => 'கடைசி {{PLURAL:$1|மாற்றம்|மாற்றங்கள்}}',
 'youhavenewmessagesmulti' => '$1 இல் உங்களுக்கு புதிய செய்திகள் காத்திருக்கின்றன',
 'editsection' => 'தொகு',
@@ -568,7 +568,7 @@ $1',
 'passwordtooshort' => 'கடவுச்சொற்களில் குறைந்தது {{PLURAL:$1|1 எழுத்து முதல் |$1 எழுத்துக்களாவது}} இருக்க வேண்டும்.',
 'password-name-match' => 'உங்கள் பயனர் பெயரிலிருந்து உங்கள் கடவுச்சொல் முற்றிலும் மாறுபட்டிருக்க வேண்டும்.',
 'password-login-forbidden' => 'இந்த பயனர்பெயர் மற்றும் கடவுச்சொல்லை உபயோகிப்பது தடைசெய்யப்பட்டுள்ளது.',
-'mailmypassword' => 'பà¯\81திய à®\95à®\9fவà¯\81à®\9aà¯\8d à®\9aà¯\8aலà¯\8dலà¯\8aனà¯\8dà®±à¯\88 à®®à®¿à®©à¯\8dனà®\9eà¯\8dà®\9aலà¯\8d à®\9aà¯\86யà¯\8dயவà¯\81à®®à¯\8d',
+'mailmypassword' => 'à®\95à®\9fவà¯\81à®\9aà¯\8dà®\9aà¯\8aலà¯\8dலà¯\88 à®®à¯\80à®\9fà¯\8dà®\9fà®®à¯\88',
 'passwordremindertitle' => '{{SITENAME}} தளத்திலிருந்தான கடவுச்சொல் நினைவூட்டல்',
 'passwordremindertext' => 'யாரோ ஒருவர் (நீங்களாக இருக்கலாம், IP முகவரி $1 இலிருந்து)
 {{SITENAME}} ($4) தளத்திற்கு புதிய கடவுச்சொல் ஒன்று அனுப்பும்படி கோரியுள்ளார். பயனர் "$2" க்கான தற்காலிக கடவுச்சொல் உருவாக்கப்பட்டுள்ளது. "$3" இதுவே அந்த கடவுச்சொல்லாகும். இந்த நடவடிக்கையே தாங்கள் எண்ணியதாக இருந்தால், தாங்கள் இப்பொழுது புகுபதிகை செய்து கடவுச்சொல்லை மாற்றிக்கொள்ளவும்.
@@ -652,7 +652,7 @@ $2
 {{PLURAL:$3|This temporary password|These temporary passwords}} காலாவதி ஆக உள்ள நாட்கள் {{PLURAL:$5|one day|$5 days}}.
 நீங்கள் புதிய கடவுச்சொல்லை இப்போதே தேர்வு செய்து வேண்டும், அல்லது வேறு யாராவது இந்த கோரிக்கையை அனுப்பியிருந்தாலோ
 அல்லது உங்கள் மூல கடவுச்சொல் நினைவில் இருந்தாலோ இதை மாற்ற வேண்டிய அவசியம் இல்லை,நீங்கள் இந்த தகவலை புறக்கணித்துவிட்டுஉங்கள் பழைய கடவுச்சொல்லையே பயன்படுத்திக்கொள்ளலாம்.',
-'passwordreset-emailtext-user' => 'பயனரà¯\8d $1 {{SITENAME}} à®²à®¿à®°à¯\81நà¯\8dதà¯\81 à®¨à®¿à®©à¯\88வà¯\81பà®\9fà¯\81தà¯\8dதி à®\92னà¯\8dà®±à¯\88 à®\95à¯\80à®´à¯\8dவரà¯\81à®®à¯\8d à®\89à®\99à¯\8dà®\95ளà¯\8d à®\95ணà®\95à¯\8dà®\95à¯\81 à®µà®¿à®µà®°à®\99à¯\8dà®\95ளை {{SITENAME}}
+'passwordreset-emailtext-user' => 'பயனரà¯\8d $1 {{SITENAME}} à®²à®¿à®°à¯\81நà¯\8dதà¯\81 à®\95à®\9fவà¯\81à®\9aà¯\8dà®\9aà¯\8aலà¯\8d à®®à¯\80à®\9fà¯\8dà®\9fà®®à¯\88யினை {{SITENAME}}
 ($4) க்கு கோரியுள்ளார்.பின்வரும் பயனர்  {{PLURAL:$3|account is|accounts are}}
  இந்த மின்னஞ்சல் முகவரியுடன் இணைக்கப்பட்டுள்ளது.
 $2
@@ -988,8 +988,8 @@ $1 எனும் பயனரையோ வேறு [[{{MediaWiki:Grouppage-sy
 'revdelete-hide-text' => 'திருத்த உரையை மறை',
 'revdelete-hide-image' => 'கோப்பின் உள்ளடக்கங்களை மறை',
 'revdelete-hide-name' => 'செயற்பாட்டையும் இலக்கையும் மறை',
-'revdelete-hide-comment' => 'தà¯\8aà®\95à¯\81பà¯\8dபà¯\81à®\9aà¯\8d à®\9aà¯\81à®°à¯\81à®\95à¯\8dà®\95தà¯\8dதà¯\88 à®®à®±à¯\88',
-'revdelete-hide-user' => 'தà¯\8aà®\95à¯\81பà¯\8dபவரினà¯\8d à®\90.பி./பயனரà¯\8dபà¯\86யரà¯\88 à®®à®±à¯\88',
+'revdelete-hide-comment' => 'தà¯\8aà®\95à¯\81பà¯\8dபà¯\81à®\9aà¯\8d à®\9aà¯\81à®°à¯\81à®\95à¯\8dà®\95à®®à¯\8d',
+'revdelete-hide-user' => 'தà¯\8aà®\95à¯\81பà¯\8dபவரினà¯\8d à®\90.பி./பயனரà¯\8dபà¯\86யரà¯\8d',
 'revdelete-hide-restricted' => 'குறிப்புக்களை அதிகாரிகள் உட்பட எல்லோரிடமிருந்தும் மறைத்துவிடு (காட்டத்தேவையில்லை).',
 'revdelete-radio-same' => '(தயவுசெய்து மாற்ற வேண்டாம்)',
 'revdelete-radio-set' => 'மறைக்கப்பட்டது',
@@ -1157,7 +1157,6 @@ $1",
 'rows' => 'நிரைகள் (கிடை வரிசைகள்):',
 'columns' => 'நிரல்கள்',
 'searchresultshead' => 'தேடுக',
-'resultsperpage' => 'ஒரு பக்கத்துக்குக் காட்டப்படவேண்டிய அடிகள்',
 'stub-threshold' => '<a href="#" class="stub">stub link</a> சீர்படுத்தலுக்கான எல்லை (பைட்டுகள்):',
 'stub-threshold-disabled' => 'செயலிழக்கம் செய்யப்பட்டுள்ளது',
 'recentchangesdays' => 'அண்மைய மாற்றங்களில் காட்ட வேண்டிய நாட்களின் எண்ணிக்கை:',
@@ -1212,7 +1211,9 @@ $1",
 'gender-unknown' => 'நான் குறிப்பிட விரும்பவில்லை',
 'gender-male' => 'ஆண்',
 'gender-female' => 'பெண்',
-'prefs-help-gender' => 'விருப்பத் தேர்வுதான்: ஒருவரைக் குறிப்பிடும்பொழுது, அவருடைய பால் சரியானதாக இருக்க மென்கலம் பயன்படுத்தும் தகவல். இத்தகவல் பொதுவில் கிடைக்கும்படி இனி இருக்கும்.',
+'prefs-help-gender' => 'விருப்பத்தேர்வை அமைப்பது இங்கள் விருப்பம்.
+ஒருவரைக் குறிப்பிடும்பொழுது, அவருடைய பால் சரியானதாக இருக்க மென்கலம் பயன்படுத்தும் தகவல்.
+இத்தகவல் பொதுவில் கிடைக்கும்படி இனி இருக்கும்.',
 'email' => 'மின்னஞ்சல்',
 'prefs-help-realname' => 'உண்மையான பெயர் கட்டாயமற்றது. நீங்கள் இதை கொடுத்தால் உங்கள் ஆக்கங்களுக்கான உரிமையளிப்புகளின் போது இது பயன்படும்.',
 'prefs-help-email' => 'மின்னஞ்சல் விருப்பத் தேர்வு,  ஆனால் உங்கள் கடவுச்சொல் உங்களுக்கு நினைவில்லையென்றால், புதிய கடவுச்சொல்லை மீட்டமைக்க தேவைப்படும்.',
@@ -1329,7 +1330,7 @@ $1",
 'right-ipblock-exempt' => 'ஐ.பி (IP) தடுப்புகளையும், தானியங்கியான தடுப்புகளையும், வரம்புவரையான தடுப்புகளையும் மீறிச் செயல்படுக.',
 'right-proxyunbannable' => 'தானாக தடுப்புகப்பட்ட  Proxies ஐ மீறு.',
 'right-unblockself' => 'தங்களே தடுப்பு நீக்கு',
-'right-protect' => 'பாதுகாப்பு மட்டங்களை மாற்று மற்றும் பாதுகாக்கப்பட்ட பக்கங்களை திருத்து',
+'right-protect' => 'பாதà¯\81à®\95ாபà¯\8dபà¯\81 à®®à®\9fà¯\8dà®\9fà®\99à¯\8dà®\95ளà¯\88 à®®à®¾à®±à¯\8dà®±à¯\81 à®®à®±à¯\8dà®±à¯\81à®®à¯\8d à®¤à¯\8aà®\9fà®°à¯\8d-பாதà¯\81à®\95ாà®\95à¯\8dà®\95பà¯\8dபà®\9fà¯\8dà®\9f à®ªà®\95à¯\8dà®\95à®\99à¯\8dà®\95ளà¯\88 à®¤à®¿à®°à¯\81தà¯\8dதà¯\81',
 'right-editprotected' => '( வடிவமான பாதுகாப்பு இல்லாமல்) பாதுகாக்கப்பட்ட பக்கங்களை திருத்து',
 'right-editinterface' => 'பயனர் இடைமுகப்பை தொகுக்கவும்',
 'right-editusercssjs' => 'மற்ற பயனர்களின் CSS மற்றும் JavaScript கோப்புகளை திருத்து',
@@ -3427,7 +3428,7 @@ $5
 'version-hook-name' => 'கொக்கியின் பெயர்',
 'version-hook-subscribedby' => 'பயன்பாடு',
 'version-version' => '(பதிப்பு $1)',
-'version-license' => 'à®\85னà¯\81மதி',
+'version-license' => 'à®®à¯\80à®\9fியாவிà®\95à¯\8dà®\95ி à®\89ரிமமà¯\8d',
 'version-poweredby-credits' => "இந்த் விக்கி '''[https://www.mediawiki.org/ MediaWiki]''' இதன் மூலம் வழங்கப்படுகிறது, காப்புரிமை © 2001-$1 $2.",
 'version-poweredby-others' => 'பிறர்',
 'version-license-info' => 'மீடியாவிக்கியானது இலவச மென்பொருள்.இதை நீங்கள் மற்றவர்களுக்கு கொடுப்பது அல்லது திருத்தம் செய்வது இலவச மென்பொருள் அறக்கட்டளை வழங்கிய   GNUவின் பொது உரிம விதிகளுக்குட்பட்டது;உரிமத்தின் இரண்டாவது பதிப்பு அல்லது அதற்கு மேற்பட்ட பதிப்பு (உங்கள் விருப்பத்திற்க்கேற்றவாறு).
index a15d8e9..f5fff04 100644 (file)
@@ -1237,7 +1237,6 @@ $1",
 'rows' => 'వరుసలు',
 'columns' => 'వరుసలు:',
 'searchresultshead' => 'అన్వేషణ',
-'resultsperpage' => 'పేజీకి ఫలితాలు:',
 'stub-threshold' => '<a href="#" class="stub">మొలక లింకు</a> ఫార్మాటింగు కొరకు హద్దు (బైట్లు):',
 'stub-threshold-disabled' => 'అచేతనం',
 'recentchangesdays' => 'ఇటీవలి మార్పులు లో చూపించవలసిన రోజులు:',
@@ -1499,6 +1498,8 @@ $1",
 'recentchanges-label-minor' => 'ఇది ఒక చిన్న మార్పు',
 'recentchanges-label-bot' => 'ఈ మార్పును ఒక బాటు చేసింది',
 'recentchanges-label-unpatrolled' => 'ఈ దిద్దుబాటు మీద నిఘా లేదు',
+'recentchanges-label-plusminus' => 'ఈ పేజి పరిమాణంలో  జరిగిన మార్పుల  బైట్ల సంఖ్య',
+'recentchanges-legend-heading' => "'''సూచిక :'''",
 'recentchanges-legend-newpage' => '([[Special:NewPages|కొత్త పేజీల జాబితా]]ను కూడా చూడండి)',
 'rcnotefrom' => '<b>$2</b> నుండి జరిగిన మార్పులు (<b>$1</b> వరకు చూపబడ్డాయి).',
 'rclistfrom' => '$1 నుండి జరిగిన మార్పులను చూపించు',
@@ -2031,7 +2032,8 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization చూడండి.',
 'listgrouprights' => 'వాడుకరి గుంపుల హక్కులు',
 'listgrouprights-summary' => 'కింది జాబితాలో ఈ వికీలో నిర్వచించిన వాడుకరి గుంపులు, వాటికి సంబంధించిన హక్కులు ఉన్నాయి.
 విడివిడిగా హక్కులకు సంబంధించిన మరింత సమాచారం [[{{MediaWiki:Listgrouprights-helppage}}]] వద్ద లభించవచ్చు.',
-'listgrouprights-key' => '* <span class="listgrouprights-granted">ప్రసాదించిన హక్కు</span>
+'listgrouprights-key' => 'సూచిక:
+* <span class="listgrouprights-granted">ప్రసాదించిన హక్కు</span>
 * <span class="listgrouprights-revoked">వెనక్కి తీసుకున్న హక్కు</span>',
 'listgrouprights-group' => 'గుంపు',
 'listgrouprights-rights' => 'హక్కులు',
@@ -3504,6 +3506,7 @@ $5
 
 # Special:SpecialPages
 'specialpages' => 'ప్రత్యేక పేజీలు',
+'specialpages-note-top' => 'సూచిక',
 'specialpages-note' => '* మామూలు ప్రత్యేక పుటలు.
 * <strong class="mw-specialpagerestricted">నియంత్రిత ప్రత్యేక పుటలు.</strong>
 * <span class="mw-specialpagecached">Cached ప్రత్యేక పుటలు (పాతబడి ఉండొచ్చు).</span>',
index 7670afd..d525fbf 100644 (file)
@@ -849,7 +849,6 @@ $1',
 'rows' => 'Теъдоди сатрҳо:',
 'columns' => 'Теъдоди сутунҳо:',
 'searchresultshead' => 'Ҷустуҷӯ',
-'resultsperpage' => 'Теъдоди натоиҷ дар ҳар саҳифа:',
 'stub-threshold' => 'Остонаи вироиши пайвандҳои <a href="#" class="stub">ноқис</a>:',
 'recentchangesdays' => 'Теъдоди рӯзҳои намоиш додашуда дар тағйироти охир:',
 'recentchangescount' => 'Теъдоди вироишҳо барои намоиш дар тағйироти охир:',
index 122809e..6b3af02 100644 (file)
@@ -726,7 +726,6 @@ Itminon hosil kuned, ki in taƣjir davomnokiji ta'rixiji sahifaro nigoh dorad.",
 'rows' => "Te'dodi satrho:",
 'columns' => "Te'dodi sutunho:",
 'searchresultshead' => 'Çustuçū',
-'resultsperpage' => "Te'dodi natoiç dar har sahifa:",
 'stub-threshold' => 'Ostonai viroişi pajvandhoi <a href="#" class="stub">noqis</a>:',
 'recentchangesdays' => "Te'dodi rūzhoi namoiş dodaşuda dar taƣjiroti oxir:",
 'savedprefs' => 'Tarçihoti şumo zaxira şud.',
index ecb95ea..25ed1cc 100644 (file)
@@ -1298,7 +1298,6 @@ $1",
 'rows' => 'แถว:',
 'columns' => 'คอลัมน์:',
 'searchresultshead' => 'ค้นหา',
-'resultsperpage' => 'การเปิดดูต่อหน้า:',
 'stub-threshold' => 'ขีดแบ่งสำหรับ <a href="#" class="stub">ลิงก์โครง</a> (ไบต์):',
 'stub-threshold-disabled' => 'ปิดใช้งาน',
 'recentchangesdays' => 'จำนวนวันที่แสดงในปรับปรุงล่าสุด:',
index e86c3f4..24a11aa 100644 (file)
@@ -1001,7 +1001,6 @@ Emma olaryň {{SITENAME}} indeksleriniň möwriti geçen bolmagy mümkindir.',
 'rows' => 'Hatarlar:',
 'columns' => 'Sütünler:',
 'searchresultshead' => 'Gözleg',
-'resultsperpage' => 'Sahypa başyna netije sany:',
 'stub-threshold' => '<a href="#" class="stub">Ownuk makala çykgydynyň</a> formaty üçin bosaga (baýt):',
 'stub-threshold-disabled' => 'Ýapyk',
 'recentchangesdays' => 'Soňky üýtgeşmelerde görkeziljek gün sany:',
index 0cc4454..83e19da 100644 (file)
@@ -8,6 +8,7 @@
  * @file
  *
  * @author AnakngAraw
+ * @author Aze
  * @author Dosmiin Barsbold
  * @author Felipe Aira
  * @author Jojit fb
@@ -561,13 +562,19 @@ Tandaan na may ilang pahinang maaaring magpatuloy na nagpapakitang parang nakala
 'welcomecreation-msg' => 'Nilikha na ang iyong kuwenta.
 Huwag kalimutang baguhin ang iyong [[Special:Preferences|mga kagustuhan sa {{SITENAME}}]].',
 'yourname' => 'Bansag:',
+'userlogin-yourname' => 'Pangngalan',
+'userlogin-yourname-ph' => 'Ilagay ang iyong Pangngalan',
+'createacct-another-username-ph' => 'Ilagay ang Pangngalan',
 'yourpassword' => 'Hudyat:',
 'userlogin-yourpassword' => 'Hudyat',
 'userlogin-yourpassword-ph' => 'Ipasok ang iyong hudyat',
+'createacct-yourpassword-ph' => 'Ilagay ang hudyat',
 'yourpasswordagain' => 'Hudyat mo uli:',
 'createacct-yourpasswordagain' => 'Tiyakin ang hudyat',
+'createacct-yourpasswordagain-ph' => 'Muling ilagay ang hudyat',
 'remembermypassword' => 'Tandaan ang paglagda ko sa kompyuter na ito (pinakamarami na ang $1 {{PLURAL:$1|araw|mga araw}})',
 'userlogin-remembermypassword' => 'Panatilihin akong nakalagda',
+'userlogin-signwithsecure' => 'Gumamit ng wastong koneksyon',
 'yourdomainname' => 'Dominyo mo:',
 'password-change-forbidden' => 'Hindi mo maaaring palitan ang mga hudyat sa wiking ito.',
 'externaldberror' => 'Maaaring may kamalian sa pagpapatotoo ng kalipunan ng mga dato o kaya hindi ka pinahintulutang isapanahon ng iyong panlabas na kuwenta o patnugutan.',
@@ -587,15 +594,23 @@ Huwag kalimutang baguhin ang iyong [[Special:Preferences|mga kagustuhan sa {{SIT
 'gotaccount' => 'May kuwenta ka na ba? $1.',
 'gotaccountlink' => 'Lumagda',
 'userlogin-resetlink' => 'Nakalimutan mo ang iyong mga detalyeng panglagda?',
+'userlogin-resetpassword-link' => 'Nakalimutan ang hudyat?',
+'userlogin-createanother' => 'Lumikha ng isang akawnt',
+'createacct-join' => 'Ilagay ang iyong impormasyon sa baba.',
+'createacct-another-join' => 'Ilagay ang impormasyon ng bagong akawnt sa baba.',
 'createacct-emailrequired' => 'Direksiyong e-liham:',
 'createaccountmail' => 'Gumamit ng pansamantalang walang-piling hudyat at ipadala ito sa direksiyong e-liham na nakasaad sa ibaba',
 'createacct-realname' => 'Tunay na pangalan (maaaring wala)',
 'createaccountreason' => 'Dahilan:',
 'createacct-reason' => 'Dahilan',
+'createacct-reason-ph' => 'Bakit ka gagawa ng isa pang akawnt?',
+'createacct-imgcaptcha-ph' => 'Ilagay ang tekstong makikita sa taas.',
+'createacct-benefit-heading' => '{{SITENAME}} ay linikha ng mga taong tulad mo.',
 'badretype' => 'Hindi magkatugma ang ipinasok mong mga hudyat.',
 'userexists' => 'May gumagamit na ng ipinasok na bansag.
 Pumili po ng ibang pangalan.',
 'loginerror' => 'Kamalian sa paglagda',
+'createacct-error' => 'May pagkakamali sa paglikha ng akawnt',
 'createaccounterror' => 'Hindi mailikha ang kuwenta: $1',
 'nocookiesnew' => "Nalikha ang kuwenta ng tagagamit, ngunit hindi ka nakalagda.
 Gumagamit ang {{SITENAME}} ng mga kuki (''cookies'') upang makalagda ang mga tagagamit.
@@ -624,7 +639,7 @@ Pakisubok muli.',
 'passwordtooshort' => 'Ang mga hudyat ay dapat mayroong {{PLURAL:$1|1 panitik|$1 panitik}} (karakter).',
 'password-name-match' => 'Dapat magkaiba ang hudyat mo sa bansag mo.',
 'password-login-forbidden' => 'Ipinagbabawal ang paggamit ng ganitong pangalan ng tagagamit at hudyat.',
-'mailmypassword' => 'Ipadala sa pamamagitan ng e-liham ang bagong hudyat',
+'mailmypassword' => 'Muling itakda ang hudyat',
 'passwordremindertitle' => 'Bagong pansamantalang hudyat para sa {{SITENAME}}',
 'passwordremindertext' => 'Mayroong (na maaaring ikaw, mula sa adres ng IP na $1) humiling ng isang bagong
 hudyat para sa {{SITENAME}} ($4). Isang pansamantalang hudyat ang nilikha
@@ -1240,7 +1255,6 @@ Matatagpuan ang mga detalye sa loob ng [{{fullurl:{{#Special:Log}}/delete|page={
 'rows' => 'Mga pahalang na hanay:',
 'columns' => 'Mga pahabang hanay:',
 'searchresultshead' => 'Hanapin',
-'resultsperpage' => 'Bilang ng pagtama sa bawat pahina:',
 'stub-threshold' => 'Kakayanan para sa pagpopormat ng <a href="#" class="usbong">kawing ng usbong</a> (mga \'\'byte\'\'):',
 'stub-threshold-disabled' => 'Hindi pinagagana',
 'recentchangesdays' => 'Mga araw na ipapakita sa kamakailan lamang na mga pagbabago:',
index db44436..a73fb17 100644 (file)
@@ -1180,6 +1180,8 @@ Sayfa zaten mevcut.',
 'content-not-allowed-here' => '"$1" içeriğine, [[$2]] sayfasında izin verilmemekte.',
 'editwarning-warning' => 'Bu sayfadan ayrılmak yaptığınız herhangi bir değişikliği kaybetmenize sebep olabilir.
 Eğer giriş yaptıysanız, bu uyarıyı, tercihlerinizin "Sayfa yazma alanı" bölümünde devre dışı bırakabilirsiniz.',
+'editpage-notsupportedcontentformat-title' => 'İçerik biçimi desteklenmiyor',
+'editpage-notsupportedcontentformat-text' => '$1 içerik biçimi $2 içerik modeli tarafından desteklenmiyor.',
 
 # Content models
 'content-model-wikitext' => 'vikimetin',
@@ -1485,7 +1487,6 @@ Ayrıntılar [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} silme g
 'rows' => 'Satır',
 'columns' => 'Sütun',
 'searchresultshead' => 'Arama',
-'resultsperpage' => 'Sayfada gösterilecek bulunan madde sayısı',
 'stub-threshold' => '<a href="#" class="stub">Taslak bağlantısı</a> formatı için baraj (bayt):',
 'stub-threshold-disabled' => 'Devre dışı',
 'recentchangesdays' => 'Son değişikliklerde gösterilecek günler:',
@@ -1874,6 +1875,8 @@ Dosyanızı yinede yüklemek istiyorsanız, lütfen geri dönüp yeni bir isim k
 Dosyanızı yinede yüklemek istiyorsanız, lütfen geri gidip yeni bir isim kullanın. [[File:$1|thumb|center|$1]]',
 'file-exists-duplicate' => 'Bu dosya aşağıdaki {{PLURAL:$1|dosyanın|dosyaların}} kopyasıdır:',
 'file-deleted-duplicate' => 'Bu dosyanın özdeşi olan başka bir dosya ([[:$1]]) daha önceden silindi. Bu dosyayı yeniden yüklemeden önce diğer dosyanın silme kayıtlarını kontrol etmelisiniz.',
+'file-deleted-duplicate-notitle' => 'Bu dosyaya eş bir dosya daha önceden silinmiş, ve başlık bastırılmış.
+Dosyayı tekrar yüklemeye devam etmeden önce, bastırılmış dosya verisini görme yetkisine sahip birisine durumu gözden geçirmesini istemelisiniz.',
 'uploadwarning' => 'Yükleme uyarısı',
 'uploadwarning-text' => 'Lütfen aşağıdaki dosya açıklamasını değiştirin ve tekrar deneyin.',
 'savefile' => 'Dosyayı kaydet',
@@ -2769,6 +2772,7 @@ Son engelleme günlüğü girdisi kaynak amacıyla aşağıda verilmiştir:',
 Engellemeleri gözden geçirmek için [[Special:BlockList|engel listesine]] bakınız.',
 'ipb-blockingself' => 'Kendinizi engellemek üzeresiniz! Bunu yapmak istediğinizden emin misiniz?',
 'ipb-confirmhideuser' => '"Kullanıcıyı gizle" seçiliyken bir kullanıcı engellemek üzeresiniz. Bu, kullanıcının adını tüm listeler ile günlük girişlerinde bastıracaktır. Bunu yapmak istediğinizden emin misiniz?',
+'ipb-confirmaction' => 'Bunu gerçekten yapmak istediğinize eminseniz, lütfen en alttaki "{{int:ipb-confirm}}" alanını işaretleyin.',
 'ipb-edit-dropdown' => 'Engelleme nedenleri düzenle',
 'ipb-unblock-addr' => '$1 için engellemeyi kaldır',
 'ipb-unblock' => 'Engellemeyi kaldır',
@@ -3321,7 +3325,7 @@ Bunu çalıştırmak, sisteminizi tehlikeye atabilir.",
 'minutes' => '{{PLURAL:$1|$1 dakika|$1 dakika}}',
 'hours' => '{{PLURAL:$1|$1 saat|$1 saat}}',
 'days' => '{{PLURAL:$1|$1 gün|$1 gün}}',
-'weeks' => '{{PLURAL: $1|$1 hafta|$1 hafta}}',
+'weeks' => '{{PLURAL:$1|$1 hafta|$1 hafta}}',
 'months' => '{{PLURAL:$1|$1 ay|$1 ay}}',
 'years' => '{{PLURAL:$1|$1 yıl|$1 yıl}}',
 'ago' => '$1 önce',
@@ -3982,6 +3986,8 @@ Ayrıca [[Special:EditWatchlist|standart düzenleme sayfasını]] da kullanabili
 'version-ext-colheader-credits' => 'Yazarlar',
 'version-license-title' => '$1 için Lisans',
 'version-license-not-found' => 'Bu uzantı için detaylı lisans bilgisi bulunamadı.',
+'version-credits-title' => '$1 için Krediler',
+'version-credits-not-found' => 'Bu eklenti için detaylı kredi bilgisi bulunamadı.',
 'version-poweredby-credits' => "Bu wiki '''[https://www.mediawiki.org/ MediaWiki]''' programı kullanılarak oluşturulmuştur, telif © 2001-$1 $2.",
 'version-poweredby-others' => 'diğerleri',
 'version-poweredby-translators' => 'translatewiki.net çevirmenleri',
@@ -4199,6 +4205,7 @@ Bu programla birlikte [{{SERVER}}{{SCRIPTPATH}}/COPYING GNU Genel Kamu Lisansın
 'api-error-overwrite' => 'Varolan dosyanın üzerine yazmaya izin verilmiyor.',
 'api-error-stashfailed' => 'İç hata: Sunucu, geçici dosyaları kaybetti.',
 'api-error-publishfailed' => 'İç hata: Sunucu geçici dosyayı yayınlarken başarısız oldu.',
+'api-error-stasherror' => 'Dosya zulaya yüklenirken hata oluştu.',
 'api-error-timeout' => 'Sunucu beklenen süre içinde yanıt vermedi.',
 'api-error-unclassified' => 'Bilinmeyen bir hata oluştu.',
 'api-error-unknown-code' => 'Bilinmeyen hata: "$1"',
index 5c4857b..233145d 100644 (file)
@@ -8,6 +8,7 @@
  * @file
  *
  * @author Ariyo
+ * @author Arjunaraoc
  */
 
 $messages = array(
index acf53f5..6247a2a 100644 (file)
@@ -1190,7 +1190,6 @@ $1",
 'rows' => 'Юллар:',
 'columns' => 'Баганалар:',
 'searchresultshead' => 'Эзләү',
-'resultsperpage' => 'Бер биткә туры килгән табылдыклар:',
 'stub-threshold' => '<a href="#" class="stub">Ясалма сылтамаларның</a> бизәлеше буенча чикләүләр (байтларда):',
 'stub-threshold-disabled' => 'Ябылган',
 'recentchangesdays' => 'Соңгы үзгәртүләрне күрсәтүче көннәр саны:',
@@ -1352,7 +1351,7 @@ $1",
 'rclistfrom' => '$1 башлап яңа үзгәртүләрне күрсәт',
 'rcshowhideminor' => 'кече үзгәртүләрне $1',
 'rcshowhidebots' => 'ботларны $1',
-'rcshowhideliu' => 'кергән кулланучыларны $1',
+'rcshowhideliu' => '$1 кергән кулланучылар',
 'rcshowhideanons' => 'кермәгән кулланучыларны $1',
 'rcshowhidepatr' => 'тикшерелгән үзгәртүләрне $1',
 'rcshowhidemine' => 'минем үзгәртүләремне $1',
@@ -1368,7 +1367,7 @@ $1",
 'rc_categories' => 'Төркемнәрдә генә тора («|» бүлүче)',
 'rc_categories_any' => 'Һәрбер',
 'newsectionsummary' => '/* $1 */ яңа бүлек',
-'rc-enhanced-expand' => 'Ваклыкларны күрсәтү (JavaScript кирәк)',
+'rc-enhanced-expand' => 'Ваклыкларны күрсәтү',
 'rc-enhanced-hide' => 'Ваклыкларны яшерү',
 
 # Recent changes linked
index 930fdcc..88cecfd 100644 (file)
@@ -922,7 +922,6 @@ Sez idaräçe bulu säbäple, [$1 yäşerelgän yuramanı qarıy alasız]",
 'rows' => 'Yullar:',
 'columns' => 'Bağanalar:',
 'searchresultshead' => 'Ezläw',
-'resultsperpage' => 'Ber bitkä turı kilgän tabıldıqlar:',
 'stub-threshold' => '<a href="#" class="stub">Yasalma sıltamalarnıñ</a> bizäleşe buyınça çikläwlär (baytlarda):',
 'stub-threshold-disabled' => 'Yabılğan',
 'recentchangesdays' => 'Soñğı üzgärtülärne kürsätüçe könnär sanı:',
index d08eb16..bc08686 100644 (file)
@@ -1219,7 +1219,7 @@ It must not be more than $1 {{PLURAL:$1|1=character|characters}} long.',
 'ilsubmit' => 'Дилээр',
 
 # Video information, used by Language::formatTimePeriod() to format lengths in the above messages
-'seconds' => '{{PLURAL: $1|$1 секунда|$1 секунда}}',
+'seconds' => '{{PLURAL:$1|$1 секунда|$1 секунда}}',
 'minutes' => '{{PLURAL:$1|$1 минут|$1 минут}}',
 'hours' => '{{PLURAL:$1|1=$1 шак|$1 шак}}',
 'days' => '{{PLURAL:$1|1=$1 хүн|$1 хүн}}',
index 5c7e3d1..1a2e627 100644 (file)
@@ -1228,7 +1228,6 @@ $1",
 'rows' => 'قۇر:',
 'columns' => 'ستون:',
 'searchresultshead' => 'ئىزدە',
-'resultsperpage' => 'ھەر بەتتىكى ئۇلانما سانى:',
 'stub-threshold' => '<a href="#" class="stub">قىسقا بەت ئۇلانمىسى</a> فورمات چەك قىممىتى (بايت) :',
 'stub-threshold-disabled' => 'چەكلەنگەن',
 'recentchangesdays' => 'يېقىنقى ئۆزگەرتىشنىڭ كۆرۈنىدىغان كۈن سانى:',
@@ -3071,7 +3070,7 @@ $1',
 'minutes-abbrev' => '$1m',
 'hours-abbrev' => '$1h',
 'days-abbrev' => '$1d',
-'seconds' => '{{PLURAL: $1|$1سېكۇنت}}',
+'seconds' => '{{PLURAL:$1|$1سېكۇنت}}',
 'minutes' => '{{PLURAL:$1|$1مىنۇت}}',
 'hours' => '{{PLURAL:$1|$1سائەت}}',
 'days' => '{{PLURAL:$1|$1 كۈن}}',
index d038f48..93c4b08 100644 (file)
@@ -366,7 +366,8 @@ $linkPrefixCharset = '„«';
 
 $messages = array(
 # User preference toggles
-'tog-underline' => 'Підкреслювати посилання:',
+'tog-underline' => 'Підкреслювати посилання:
+Підкреслювання посилань:',
 'tog-justify' => 'Вирівнювати текст по ширині сторінки',
 'tog-hideminor' => 'Приховати незначні редагування у списку останніх змін',
 'tog-hidepatrolled' => 'Приховувати патрульовані редагування у списку нових редагувань',
@@ -959,7 +960,7 @@ $1',
 
 $2
 
-{{PLURAL:$3|1=Цей тимчасовий пароль|Ці тимчасові паролі}} стануть недійсні через {{PLURAL:$5|день|$5 дні|$5 днів}}.
+{{PLURAL:$3|1=Цей тимчасовий пароль стане недійсним|Ці тимчасові паролі стануть недійсними}} через $5 {{PLURAL:$5|день|дні|днів}}.
 Ви маєте ввійти в систему і вибрати новий пароль. Якщо ж цей запит зробив хтось інший, або Ви пам'ятаєте свій старий пароль і не бажаєте його змінювати, можете просто проігнорувати це повідомлення та продовжувати використовувати старий пароль.",
 'passwordreset-emailtext-user' => "Користувач $1 з {{SITENAME}} попросив нагадати деталі Вашого облікового запису для {{SITENAME}} ($4). З Вашою електронною скринькою пов'язан{{PLURAL:$3|1=ий такий запис|і такі записи}}:
 
@@ -1210,6 +1211,8 @@ $2
 'content-not-allowed-here' => 'Вміст «$1» недопустимий на сторінці [[$2]]',
 'editwarning-warning' => 'Перехід на іншу сторінку призведе до втрати ваших змін.
 Якщо ви ввійшли до системи, то ви можете відключити це попередження в розділі «Редагування» ваших налаштувань.',
+'editpage-notsupportedcontentformat-title' => 'Непідтримуваний формат вмісту',
+'editpage-notsupportedcontentformat-text' => 'Формат вмісту $1 не підтримується моделлю вмісту $2.',
 
 # Content models
 'content-model-wikitext' => 'вікітекст',
@@ -1515,7 +1518,6 @@ $1",
 'rows' => 'Рядків:',
 'columns' => 'Колонок:',
 'searchresultshead' => 'Пошук',
-'resultsperpage' => 'Кількість результатів на сторінку:',
 'stub-threshold' => 'Поріг для визначення оформлення <a href="#" class="stub">посилань на стаби</a> (у байтах):',
 'stub-threshold-disabled' => 'Вимкнений',
 'recentchangesdays' => 'За скільки днів показувати нові редагування:',
@@ -1608,8 +1610,8 @@ $1",
 'email-address-validity-invalid' => 'Введіть чинну адресу електронної пошти',
 
 # User rights
-'userrights' => 'УпÑ\80авлÑ\96ння правами користувачів',
-'userrights-lookup-user' => 'УпÑ\80авлÑ\96ння групами користувача',
+'userrights' => 'Ð\9aеÑ\80Ñ\83вання правами користувачів',
+'userrights-lookup-user' => 'Ð\9aеÑ\80Ñ\83вання групами користувача',
 'userrights-user-editname' => "Введіть ім'я користувача:",
 'editusergroup' => 'Редагувати групи користувача',
 'editinguser' => "Зміна прав користувача '''[[User:$1|$1]]''' $2",
@@ -1922,6 +1924,8 @@ $1",
 Якщо ви все ж хочете завантажити цей файл, будь ласка, поверніться назад і змініть назву файлу. [[File:$1|thumb|center|$1]]',
 'file-exists-duplicate' => 'Цей файл є дублікатом {{PLURAL:$1|1=файлу|таких файлів}}:',
 'file-deleted-duplicate' => 'Такий самий файл ([[:$1]]) уже вилучався раніше. Будь ласка, ознайомтеся з історією вилучень файлу перед тим, як завантажити його знову.',
+'file-deleted-duplicate-notitle' => 'Файл, ідентичний до цього файлу, був раніше видалений, і назву було усунено.
+Вам слід попросити кого-небудь з можливістю перегляду усуненого файлу даних, щоб проаналізувати ситуацію, перш ніж приступити до повторного завантаження.',
 'uploadwarning' => 'Попередження',
 'uploadwarning-text' => 'Будь ласка, змініть наданий нижче опис файлу і спробуйте ще раз.',
 'savefile' => 'Зберегти файл',
@@ -2818,6 +2822,7 @@ $1',
 Див. [[Special:BlockList|список заблокованих IP-адрес]] для перегляду блокувань.',
 'ipb-blockingself' => 'Ви збираєтеся заблокувати себе!  Ви дійсно бажаєте це зробити?',
 'ipb-confirmhideuser' => "Ви збираєтеся заблокувати користувача з опцією приховання імені. Це вилучить його ім'я з усіх списків та журналів. Ви точно хочете це зробити?",
+'ipb-confirmaction' => 'Якщо ви дійсно хочете зробити це, встановіть нижче прапорець у полі "{{int:ipb-confirm}}".',
 'ipb-edit-dropdown' => 'Редагувати причини блокувань',
 'ipb-unblock-addr' => 'Розблокувати $1',
 'ipb-unblock' => 'Розблокувати користувача або IP-адресу',
@@ -3640,7 +3645,7 @@ Variants for Chinese language
 'exif-datetimemetadata' => 'Остання дата зміни метаданих',
 'exif-nickname' => 'Неофіційна назва зображення',
 'exif-rating' => 'Рейтинг (від 0 до 5)',
-'exif-rightscertificate' => 'Сертифікат управління правами',
+'exif-rightscertificate' => 'Сертифікат керування правами',
 'exif-copyrighted' => 'Статус авторських прав',
 'exif-copyrightowner' => 'Власник авторських прав',
 'exif-usageterms' => 'Умови користування',
@@ -4169,10 +4174,20 @@ $5
 'version-parser-function-hooks' => 'Перехоплювачі функцій синтаксичного аналізатора',
 'version-hook-name' => "Ім'я перехоплювача",
 'version-hook-subscribedby' => 'Підписаний на',
-'version-version' => '(Версія $1)',
+'version-version' => '($1)',
 'version-svn-revision' => '(r$2)',
-'version-license' => 'Ліцензія',
-'version-poweredby-credits' => "Ця Вікі працює на системі управління вмістом '''[https://www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
+'version-license' => 'Ліцензія MediaWik',
+'version-ext-license' => 'Ліцензія',
+'version-ext-colheader-name' => 'Розширення',
+'version-ext-colheader-version' => 'Версія',
+'version-ext-colheader-license' => 'Ліцензія',
+'version-ext-colheader-description' => 'Опис',
+'version-ext-colheader-credits' => 'Автори',
+'version-license-title' => 'Ліцензія для $1',
+'version-license-not-found' => 'Не знайдено докладних відомостей про ліцензію для цього розширення.',
+'version-credits-title' => 'Кредити для $1',
+'version-credits-not-found' => 'Детальної інформації про авторів не знайдено для цього розширення.',
+'version-poweredby-credits' => "Ця Вікі працює на системі керування вмістом '''[https://www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
 'version-poweredby-others' => 'інші',
 'version-poweredby-translators' => 'перекладачі translatewiki.net',
 'version-credits-summary' => 'Нам хотілося б відзначити наступних осіб, що зробили внесок у [[Special:Version|MediaWiki]].',
index b37dd4e..8611a65 100644 (file)
@@ -305,7 +305,7 @@ $messages = array(
 'unprotectthispage' => 'Ushbu sahifaning himoyasini oʻzgaritish',
 'newpage' => 'Yangi sahifa',
 'talkpage' => 'Bu sahifa haqida munozara',
-'talkpagelinktext' => 'Munozara',
+'talkpagelinktext' => 'munozara',
 'specialpage' => 'Maxsus sahifa',
 'personaltools' => 'Shaxsiy uskunalar',
 'postcomment' => 'Yangi boʻlim',
@@ -520,6 +520,7 @@ Ism yozilishini tekshirib koʻring.',
 'newpassword' => "Yangi mahfiy so'z:",
 'retypenew' => 'Yangi mahfiy soʻzni qayta tering:',
 'resetpass_submit' => "Maxfiy so'zni o'rnatish va kirish",
+'changepassword-success' => 'Maxfiy soʻzni oʻzgartirish muvaffaqiyatli oʻtdi!',
 'resetpass_forbidden' => "Maxfiy so'z o'zgartirilishi mumkin emas",
 'resetpass-submit-loggedin' => 'Maxfiy soʻzni oʻzgartirish',
 'resetpass-submit-cancel' => 'Bekor',
@@ -674,9 +675,8 @@ Ayrim andozalar qo'shilmaydi.",
 'last' => 'oxirgi',
 'page_first' => 'birinchi',
 'page_last' => 'oxirgi',
-'histlegend' => 'Farqlar: solishtirish uchun kerakli radiobokslarni belgilang va pastdagi tugmani yoki Enterni bosing.<br />
-Bu yerda: (joriy) = hozirgi koʻrinish bilan farq,
-(oxirgi) = avvalgi koʻrinish bilan farq, k = kichkina tahrir.',
+'histlegend' => "Farqlarni tanlash: solishtirish uchun kerakli radiobokslarni belgilang va '''{{int:compare-submit}}''' tugmasini bosing.<br />
+Bu yerda: '''({{int:cur}})''' = hozirgi koʻrinish bilan farqi, '''({{int:last}})''' = avvalgi koʻrinish bilan farqi, '''{{int:minoreditletter}}''' = kichkina tahrir.",
 'history-fieldset-title' => 'Tarixni koʻrish',
 'history-show-deleted' => 'Faqat o‘chirilganlari',
 'histfirst' => 'Eng avvalgi',
@@ -746,14 +746,14 @@ Bu yerda: (joriy) = hozirgi koʻrinish bilan farq,
 'viewprevnext' => 'Koʻrish ($1 {{int:pipe-separator}} $2) ($3).',
 'searchmenu-exists' => "'''Ushbu vikida \"[[:\$1]]\" nomli sahifa mavjud.'''",
 'searchmenu-new' => "'''Ushbu vikida \"[[:\$1]]\" sahifasini yarat!'''",
-'searchprofile-articles' => 'Asosiy sahifalar',
+'searchprofile-articles' => 'Maqolalar',
 'searchprofile-project' => 'Yordam va loyiha sahifalari',
 'searchprofile-images' => 'Multimedia',
-'searchprofile-everything' => 'Har yerda',
-'searchprofile-advanced' => 'Kengaytirilgan',
+'searchprofile-everything' => 'Hamma joyda',
+'searchprofile-advanced' => 'Tanlangan joyda',
 'searchprofile-articles-tooltip' => '$1da qidirish',
 'searchprofile-project-tooltip' => '$1da qidirish',
-'searchprofile-images-tooltip' => 'Fayllarni qidir',
+'searchprofile-images-tooltip' => 'Fayllarni qidirish',
 'searchprofile-everything-tooltip' => 'Barcha sahifalardan qidirish (munozara sahifalarinidan ham)',
 'searchprofile-advanced-tooltip' => 'Belgilangan nomfazolardan qidirish',
 'search-result-size' => '$1 ({{PLURAL:$2|1 ta soʻz|$2 ta soʻz}})',
@@ -809,7 +809,6 @@ Bu yerda: (joriy) = hozirgi koʻrinish bilan farq,
 'rows' => 'Qatorlar soni:',
 'columns' => 'Ustunlar soni:',
 'searchresultshead' => 'Qidiruv',
-'resultsperpage' => 'Sahifaga topilgan yozuvlar miqdori',
 'stub-threshold' => '<a href="#" class="stub">Chala maqolalarga ishorat</a> keltirish uchun pastki chegara (baytlarda):',
 'stub-threshold-disabled' => 'Oʻchirib qoʻyilgan',
 'recentchangesdays' => 'Necha kunlik tahrirlar koʻrsatiladi:',
@@ -935,12 +934,16 @@ Agar keltirsangiz, undan sahifa kim tomonidan tahrirlanganini koʻrsatish uchun
 'nchanges' => '$1 {{PLURAL:$1|oʻzgarish|oʻzgarishlar}}',
 'recentchanges' => 'Yangi oʻzgarishlar',
 'recentchanges-legend' => 'Yangi oʻzgarishlar moslamalari',
-'recentchanges-summary' => 'Bu sahifada siz oxirgi oʻzgarishlarni koʻrishingiz mumkin',
+'recentchanges-summary' => 'Bu sahifada siz {{SITENAME}}da sodir boʻlgan soʻnggi oʻzgarishlarni koʻrishingiz mumkin.',
+'recentchanges-noresult' => 'Koʻrsatilgan muddatga va shartlarga oid oʻzgarishlar topilmadi.',
 'recentchanges-feed-description' => 'Vikida mazkur oqimdagi oxirgi oʻzgarishlarni kuzatish',
-'recentchanges-label-newpage' => 'Bu tahrir orqali yangi sahifa yaratildi',
-'recentchanges-label-minor' => 'Bu kichik tahrir',
-'recentchanges-label-bot' => 'Bu tahrirni bot bajardi',
+'recentchanges-label-newpage' => 'Bu tahrir orqali yangi sahifa yaratilgan',
+'recentchanges-label-minor' => 'Bu tahrir kichik deb belgilangan',
+'recentchanges-label-bot' => 'Bu tahrirni bot bajargan',
 'recentchanges-label-unpatrolled' => 'Bu tahrir hali tekshirilmagan',
+'recentchanges-label-plusminus' => 'vazni qanchaga oʻzgargani (bayt)',
+'recentchanges-legend-heading' => "'''Izoh:'''",
+'recentchanges-legend-newpage' => '([[Special:NewPages|alohida roʻyxat]])',
 'rcnotefrom' => "Quyida <strong>$2</strong> dan (<strong>$1</strong> gacha) bo'lgan o'zgarishlar keltirilgan.",
 'rclistfrom' => '$1 dan boshlab yangi oʻzgarishlarni koʻrsat.',
 'rcshowhideminor' => 'Kichik tahrirlarni $1',
@@ -953,7 +956,7 @@ Agar keltirsangiz, undan sahifa kim tomonidan tahrirlanganini koʻrsatish uchun
 'diff' => 'farq',
 'hist' => 'tarix',
 'hide' => 'yashir',
-'show' => 'Koʻrsat',
+'show' => 'koʻrsat',
 'minoreditletter' => 'k',
 'newpageletter' => 'Y',
 'boteditletter' => 'b',
@@ -1143,7 +1146,11 @@ Also see [[Special:WantedCategories|wanted categories]].',
 'activeusers-noresult' => 'Foydalanuvchilar topilmadi.',
 
 # Special:ListGroupRights
-'listgrouprights' => 'Foydalanuvchilar guruhi huquqlari',
+'listgrouprights' => 'Foydalanuvchilar guruhlari roʻyxati',
+'listgrouprights-summary' => 'Har bir viki-loyihada boʻlgani kabi, Oʻzbekcha Vikipediyada ham foydalanuvchilar bir nechta guruhlarga boʻlingan boʻlib, quyida ularning roʻyxati va tegishli huquqlari keltirilgan. Alohida huquqlar haqida [[{{MediaWiki:Listgrouprights-helppage}}|qoʻshimcha maʼlumotlar]] boʻlishi mumkin.',
+'listgrouprights-key' => 'Izohlar:
+* <span class="listgrouprights-granted">Amaldagi huquqlar</span>
+* <span class="listgrouprights-revoked">Bekor qilingan huquqlar</span>',
 'listgrouprights-group' => 'Guruh',
 'listgrouprights-rights' => 'Huquqlar',
 'listgrouprights-helppage' => 'Help:Guruhlar huquqlari',
@@ -1194,8 +1201,9 @@ Also see [[Special:WantedCategories|wanted categories]].',
 'unwatchthispage' => "Kuzatuvni to'xtatish",
 'notanarticle' => 'Maqola emas',
 'watchlist-details' => 'Sizning kuzatuv roʻyxatingizda hozirda {{PLURAL:$1|bitta sahifa|$1ta sahifa}} mavjud (munozara sahifalarini hisobga olmaganda).',
+'wlheader-showupdated' => "Siz oxirgi marta kirganingizdan keyin oʻzgartirilgan sahifalar '''qalin''' yozuv bilan ajratib koʻrsatilgan.",
 'wlnote' => "Below {{PLURAL:$1|is the last change|are the last '''$1''' changes}} in the last {{PLURAL:$2|hour|'''$2''' hours}}, as of $3, $4.",
-'wlshowlast' => 'Oxirgi $1 soatdagi $2 kundagi tahrirlarni ko‘rsatish. $3 tahrirlarni ko‘rsatish',
+'wlshowlast' => 'Oxirgi $1 soatdagi $2 kundagi tahrirlarni koʻrsat $3',
 'watchlist-options' => 'Kuzatuv roʻyxati moslamalari',
 
 # Displayed when you click the "watch" button and it is in the process of watching
@@ -1203,7 +1211,7 @@ Also see [[Special:WantedCategories|wanted categories]].',
 'unwatching' => "Kuzatuv ro'yxatidan o'chirish...",
 
 'enotif_mailer' => "{{SITENAME}} Pochta orqali e'lon qilish xizmati",
-'enotif_reset' => 'Hamma sahifalarni koʻrib chiqilgan deb belgilash',
+'enotif_reset' => 'Hammasini koʻrib chiqilgan deb belgilash',
 'enotif_impersonal_salutation' => '{{SITENAME}} ishtirokchisi',
 'enotif_subject_deleted' => '{{SITENAME}} loyihasining $1 nomli sahifasi foydalanuvchi {{gender:$2|$2}} tomonidan o‘chirildi',
 'enotif_subject_created' => '{{SITENAME}} loyihasining $1 nomli sahifasi foydalanuvchi {{gender:$2|$2}} tomonidan yaratildi',
@@ -1259,7 +1267,7 @@ Qayta aloqa va yordam
 'deletedtext' => '"$1" yoʻqotildi.
 Yaqinda sodir etilgan yoʻqotishlar uchun $2ni koʻring.',
 'dellogpage' => 'Yoʻqotish qaydlari',
-'dellogpagetext' => 'Quyida oxirgi oʻchirish qaydlari keltirilgan',
+'dellogpagetext' => 'Quyida oxirgi yoʻqotish qaydlari keltirilgan',
 'deletionlog' => 'yoʻqotish qaydlari',
 'reverted' => 'Eski holiga keltirildi',
 'deletecomment' => 'Sabab:',
@@ -1389,14 +1397,14 @@ Yaqinda sodir etilgan yoʻqotishlar uchun $2ni koʻring.',
 'ipadressorusername' => 'IP-manzil yoki foydalanuvchi nomi:',
 'ipbexpiry' => 'Tugaydi:',
 'ipbreason' => 'Sabab:',
-'ipbreason-dropdown' => "* Chetlashtirishning andazaviy sabablari
-** Yolg'on axborot kiritish
-** Sahifa matnini o'chirish
-** Tashqi saytlarga spam-yo'llanmalar
-** Ma'nosiz matn/axlat qo'shish
-** Tahdid, ishtirokchilarni ta'qib qilish
-** Bir necha hisob yozuvlaridan o'z manfaatlarida foydalanish
-** Ishtirokchining nomaqbul ismi",
+'ipbreason-dropdown' => '* Chetlashtirishning odatiy sabablari
+** Yolgʻon maʼlumot kiritish
+** Sahifa matnini toʻliq oʻchirish
+** Tashqi saytlarga spam-havolalar
+** Maʼnosiz matn/axlat qoʻshish
+** Foydalanuvchilarga tahdid qilish, ularni taʼqib qilish
+** Bir nechta hisob yozuvlaridan oʻz manfaatlarida foydalanish
+** Nomaqbul foydalanuvchi nomi',
 'ipbsubmit' => 'Ushbu foydalanuvchini chetlashtirish',
 'ipbother' => 'Boshqa vaqt:',
 'ipboptions' => '2 soat:2 hours,1 kun:1 day,3 kun:3 days,1 hafta:1 week,2 hafta:2 weeks,1 oy:1 month,3 oy:3 months,6 oy:6 months,1 yil:1 year,cheksiz:infinite',
@@ -1626,7 +1634,7 @@ Umumiy omborda [[:$1]] mavjud. Faylning bu nomga qayta nomlanishi faylning umumi
 'exif-iimcategory-wea' => 'Ob-havo',
 
 # 'all' in various places, this might be different for inflected languages
-'watchlistall2' => 'Barcha',
+'watchlistall2' => 'hammasi',
 'namespacesall' => 'Barchasi',
 'monthsall' => 'barchasi',
 
@@ -1644,6 +1652,7 @@ Umumiy omborda [[:$1]] mavjud. Faylning bu nomga qayta nomlanishi faylning umumi
 'table_pager_last' => 'Oxirgi sahifa',
 
 # Auto-summaries
+'autosumm-blank' => 'Sahifa tozalandi',
 'autoredircomment' => '[[$1]]ga yoʻnaltirildi',
 'autosumm-new' => '"$1" yozuvi orqali yangi sahifa yaratildi',
 
@@ -1670,6 +1679,9 @@ Umumiy omborda [[:$1]] mavjud. Faylning bu nomga qayta nomlanishi faylning umumi
 # Special:Tags
 'tag-filter' => '[[Special:Tags|Nishonlar]] filtri:',
 
+# Special:ComparePages
+'compare-submit' => 'Solishtirish',
+
 # HTML forms
 'htmlform-reset' => 'Oʻzgarishlarni bekor qilish',
 'htmlform-selectorother-other' => 'Boshqa',
@@ -1687,6 +1699,7 @@ Umumiy omborda [[:$1]] mavjud. Faylning bu nomga qayta nomlanishi faylning umumi
 
 # Search suggestions
 'searchsuggest-search' => 'Qidiruv',
+'searchsuggest-containing' => 'ichida bu boʻlgan...',
 
 # API errors
 'api-error-unknown-code' => 'Noaniq xato: "$1".',
index 938d203..7e42482 100644 (file)
@@ -641,7 +641,7 @@ Asicurate de 'ver ativà i cookie, ricarica sta pajina e riprova.",
 'passwordtooshort' => 'Łe password e ga da contegnere almanco {{PLURAL:$1|1 caratere|$1 carateri}}.',
 'password-name-match' => 'Ła password a ga da esare difarente dal nome utente.',
 'password-login-forbidden' => 'Sto nome utente e/o password i xè stai proibìi',
-'mailmypassword' => 'Màndeme na password nova al me indirisso e-mail',
+'mailmypassword' => 'Rinposta ła password',
 'passwordremindertitle' => 'Servisio Password Reminder de {{SITENAME}}',
 'passwordremindertext' => 'Qualcheduni (probabilmente ti, da l\'indirizo IP $1) el gà domandà che ghe vegna mandà na nova password par {{SITENAME}} ($4).
 Na password tenporànea par l\'utente "$2" la xe stà creà e inpostà a "$3".
@@ -826,7 +826,7 @@ Se prega de specificar el to indirizo IP atuale ($3) e el nùmaro del bloco (ID
 'nosuchsectiontext' => 'Te ghè sercà de modificar na sezion che no esiste.
 Forse la xe stà spostà o scancelà fin che te sèri drio vardar la pagina.',
 'loginreqtitle' => "Par modificar sta pagina bisogna prima eseguir l'acesso al sito.",
-'loginreqlink' => 'login',
+'loginreqlink' => 'far el login',
 'loginreqpagetext' => 'Par védar altre pagine bisogna $1.',
 'accmailtitle' => 'Password spedia.',
 'accmailtext' => "Na password xenerà casualmente par [[User talk:$1|$1]] la xe stà mandà a $2.
@@ -1009,8 +1009,8 @@ La motivazion del bloco fornìa da $3 la xe sta qua: ''$2''",
 Legenda: '''({{int:cur}})''' = difarense co l'ultima version, '''({{int:last}})''' = difarense co la version subito prima, '''{{int:minoreditletter}}''' = canbiamento picenin",
 'history-fieldset-title' => 'Ruma in te la storia',
 'history-show-deleted' => 'Solo quei scancelà',
-'histfirst' => 'Prima',
-'histlast' => 'Ultema',
+'histfirst' => 'pi vecia',
+'histlast' => 'pi nova',
 'historysize' => '({{PLURAL:$1|1 byte|$1 byte}})',
 'historyempty' => '(voda)',
 
@@ -1068,15 +1068,15 @@ I altri aministradori de {{SITENAME}} i podarà vardar istesso i contenuti scont
 * Informassion personali mia apropriate
 *: ''indirissi de casa e nùmari de telefono, nùmari de previdensa sociale, etc.''",
 'revdelete-legend' => 'Inposta le seguenti limitazion su le versioni scancelàe:',
-'revdelete-hide-text' => 'Scondi el testo de ła version',
+'revdelete-hide-text' => 'El testo de ła version',
 'revdelete-hide-image' => 'Scondi i contenuti del file',
 'revdelete-hide-name' => 'Scondi azion e ogeto de la stessa',
-'revdelete-hide-comment' => "Scondi l'oggetto de ła modifega",
-'revdelete-hide-user' => "Scondi el nome o l'indirisso IP dell'autore",
+'revdelete-hide-comment' => "L'ogeto de ła modifega",
+'revdelete-hide-user' => "El nome o l'indirisso IP de l'autor",
 'revdelete-hide-restricted' => 'Scóndighe le informassion indicà anca ai aministradori',
 'revdelete-radio-same' => '(no stà canbiar)',
-'revdelete-radio-set' => 'Sì',
-'revdelete-radio-unset' => 'No',
+'revdelete-radio-set' => 'Sconto',
+'revdelete-radio-unset' => 'Visibile',
 'revdelete-suppress' => 'Scondi le informazion anca ai aministradori',
 'revdelete-unsuppress' => 'Elimina le limitazion su le revision ripristinà',
 'revdelete-log' => 'Motivassion:',
@@ -1242,7 +1242,6 @@ I detaji i pol esar catai inte'l [{{fullurl:{{#Special:Log}}/delete|page={{FULLP
 'rows' => 'Righe:',
 'columns' => 'Cołone:',
 'searchresultshead' => 'Riserca',
-'resultsperpage' => 'Nùmaro de risultati par pagina:',
 'stub-threshold' => 'Valor minimo par i <a href="#" class="stub">colegamenti ai stub</a>:',
 'stub-threshold-disabled' => 'Disativà',
 'recentchangesdays' => 'Nùmaro de giòrni da mostrar ne le ultime modifiche:',
@@ -1309,6 +1308,7 @@ Co qualcheduni te scrivarà, nol vedarà mia el to indirizo.',
 'prefs-dateformat' => 'Formato de la data',
 'prefs-timeoffset' => 'Ore de difarensa',
 'prefs-advancedediting' => 'Preferense avansade',
+'prefs-editor' => 'Contributor',
 'prefs-advancedrc' => 'Preferense avansade',
 'prefs-advancedrendering' => 'Preferense avansade',
 'prefs-advancedsearchoptions' => 'Preferense avansade',
@@ -1494,7 +1494,7 @@ Co qualcheduni te scrivarà, nol vedarà mia el to indirizo.',
 'rclistfrom' => 'Fà védar i canbiamenti fati dal $1',
 'rcshowhideminor' => '$1 i canbiamenti picenini',
 'rcshowhidebots' => '$1 i bot',
-'rcshowhideliu' => '$1 i utenti registrai',
+'rcshowhideliu' => '$1 i utenti registrài',
 'rcshowhideanons' => '$1 i utenti anonimi',
 'rcshowhidepatr' => '$1 łe modifeghe controłae',
 'rcshowhidemine' => '$1 i me canbiamenti',
@@ -1511,7 +1511,7 @@ Co qualcheduni te scrivarà, nol vedarà mia el to indirizo.',
 'rc_categories_any' => 'Qualsiasi',
 'rc-change-size-new' => '$1 {{PLURAL:$1|byte}} dopo ła modifega',
 'newsectionsummary' => '/* $1 */ sezion nova',
-'rc-enhanced-expand' => 'Mostra detaji (richiede JavaScript)',
+'rc-enhanced-expand' => 'Mostra detaji',
 'rc-enhanced-hide' => 'Scondi detaji',
 'rc-old-title' => 'creà in orijine come "$1"',
 
@@ -1531,8 +1531,7 @@ Le pagine [[Special:Watchlist|tegnùe d'ocio]] le xe in '''grosso'''.",
 'reuploaddesc' => 'Lassa pèrdar el caricamento e torna al modulo de caricamento',
 'upload-tryagain' => 'Invia la descrission del file modificà',
 'uploadnologin' => 'Te devi far el login par exeguire sta operassion.',
-'uploadnologintext' => 'Te ghè da far [[Special:UserLogin|el login]]
-par poder cargar dei file.',
+'uploadnologintext' => 'Te ghè da $1 par cargar dei file.',
 'upload_directory_missing' => 'La cartèla de caricamento ($1) no la esiste mìa e no la pode vegner creàda dal browser web.',
 'upload_directory_read_only' => "El server web no l'è bon de scrìvar ne la directory de caricamento ($1).",
 'uploaderror' => 'Eror nel caricamento',
@@ -1869,7 +1868,9 @@ Probabilmente te vui modifegar ła descrision prexente inte ła [$2 pàjina de d
 
 # Random page in category
 'randomincategory' => 'Pagina a ocio in te na categoria',
+'randomincategory-invalidcategory' => '"$1" no\'l và mia ben come nome de categoria.',
 'randomincategory-nopages' => 'No ghe xe mia pagine in [[:Category:$1]].',
+'randomincategory-selectcategory' => 'Ciapa na pagina a ocio da la categoria: $1 $2.',
 'randomincategory-selectcategory-submit' => 'Và',
 
 # Random redirect
@@ -1966,12 +1967,14 @@ Le righe <del>sbarà</del> le xe xà stà sistemà.',
 'protectedpages' => 'Pagine protete',
 'protectedpages-indef' => 'Solo le protezion infinìe',
 'protectedpages-cascade' => 'Solo protezion ricorsive',
+'protectedpages-noredirect' => 'Scondi rimandi',
 'protectedpagesempty' => 'Al momento no ghe xe pagine protete',
 'protectedtitles' => 'Titoli proteti',
 'protectedtitlesempty' => 'Al momento no ghe xe titoli proteti coi parametri specificà.',
 'listusers' => 'Elenco dei utenti',
 'listusers-editsonly' => 'Fà védar sol che i utenti che gà fato dei contributi',
 'listusers-creationsort' => 'Òrdena par data de creassion',
+'listusers-desc' => 'Ordina in senso decresente',
 'usereditcount' => '$1 {{PLURAL:$1|contributo|contributi}}',
 'usercreated' => '{{GENDER:$3|Creà|Creà}} el $1 a le $2',
 'newpages' => 'Pagine nove',
@@ -2384,9 +2387,9 @@ $1',
 'contributions' => 'Contributi {{GENDER:$1|utente}}',
 'contributions-title' => 'Contributi de $1',
 'mycontris' => 'Contributi',
-'contribsub2' => 'Par $1 ($2)',
+'contribsub2' => 'Par {{GENDER:$3|$1}} ($2)',
 'nocontribs' => 'No xe stà catà nissuna modifica che vaga ben par sti critèri.',
-'uctop' => '(ultima)',
+'uctop' => '(de dèsso)',
 'month' => 'Dal mese (e quei prima):',
 'year' => "Da l'ano (e quei prima):",
 
@@ -2959,7 +2962,7 @@ La so esecuzion la podarìa danegiar el to computer.",
 'svg-long-desc' => 'file en formato SVG, dimension nominałi $1 × $2 pixel, dimension del file: $3',
 'svg-long-desc-animated' => 'file in formato SVG animà, dimension nominałi $1 × $2 pixel, dimension del file: $3',
 'svg-long-error' => 'File SVG mìa valido: $1',
-'show-big-image' => 'Version ad alta risołusion',
+'show-big-image' => 'File original',
 'show-big-image-preview' => 'Dimension de sta anteprima: $1.',
 'show-big-image-other' => '{{PLURAL:$2|Altra risołusion|Altre risołusion}}: $1.',
 'show-big-image-size' => '$1 × $2 pixel',
@@ -3521,6 +3524,9 @@ Par piaser, conferma che te vołi dal bon ricrear sta voxe.',
 'imgmultigo' => 'Và',
 'imgmultigoto' => 'Và a la pagina $1',
 
+# Language selector for translatable SVGs
+'img-lang-default' => '(lengua predefinìa)',
+
 # Table pager
 'ascending_abbrev' => 'cresc',
 'descending_abbrev' => 'decresc',
@@ -3601,7 +3607,13 @@ Nota che te pol anca [[Special:EditWatchlist|modificar la lista con l'interfacia
 'version-hook-name' => "Nome de l'hook",
 'version-hook-subscribedby' => 'Sotoscrizioni',
 'version-version' => '(Version $1)',
-'version-license' => 'Licensa',
+'version-license' => 'Licensa MediaWiki',
+'version-ext-license' => 'Licensa',
+'version-ext-colheader-name' => 'Estension',
+'version-ext-colheader-version' => 'Version',
+'version-ext-colheader-license' => 'Licensa',
+'version-ext-colheader-description' => 'Descrission',
+'version-license-title' => 'Licensa par $1',
 'version-poweredby-credits' => "Sta wiki la va con '''[https://www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
 'version-poweredby-others' => 'altri',
 'version-poweredby-translators' => 'tradutori de translatewiki.net',
@@ -3682,6 +3694,7 @@ Insieme co sto programa te dovaressi 'ver ricevùo na copia de la Licensa Public
 'tags-tag' => 'Nome del tag',
 'tags-display-header' => 'Aspetto ne la lista de le modifiche',
 'tags-description-header' => 'Descrission conpleta del significado',
+'tags-active-header' => 'Ativo?',
 'tags-hitcount-header' => 'Modifiche che gà dei tag',
 'tags-edit' => 'modìfega',
 'tags-hitcount' => '$1 {{PLURAL:$1|modìfega|modìfeghe}}',
index c8772dd..21c3e90 100644 (file)
@@ -413,6 +413,7 @@ Kc. [[Special:SpecialPages|specialižiden lehtpoliden nimikirj]].",
 # General errors
 'error' => 'Petuz',
 'databaseerror' => 'Andmusiden bazan petuz',
+'databaseerror-query' => 'Ecmine: $1',
 'databaseerror-function' => 'Funkcii:$1',
 'databaseerror-error' => 'Petuz: $1',
 'laggedslavemode' => "Varutuz: voib olda, lehtpolen versijal ei ole jäl'gmäižid ližadusid.",
@@ -564,17 +565,17 @@ Olgat hüväd, kirjutagatoiš sistemha, konz sat sen.",
 'mailerror' => 'E-počtan oigendamižen petuz: $1',
 'emailauthenticated' => 'Teiden e-počtan adres vahvištoittihe datal $2 aigal $3.',
 'emailnotauthenticated' => 'Teiden e-počtan adres ei ole völ vahvištoittud.
-Wiki-likutimen počtfunkcijad ei olgoi kävutamas.',
+Kirjeižid ei oigekoi ni-ühten funkcijan täht.',
 'noemailprefs' => 'Kirjutagat e-počtan adres teiden järgendusihe, miše se oliži kävutamas.',
 'emailconfirmlink' => 'Vahvištoitkat teiden e-počtan adres',
 'invalidemailaddress' => 'Ningomal e-počtan adresal om vär format. Olgat hüväd, kirjutagat e-počtan adres oiktas formatas vai puhtastagat e-počtan pöud.',
 'emaildisabled' => 'Nece sait ei voi oigeta e-počtad.',
 'accountcreated' => 'Registracii om OK',
-'accountcreatedtext' => 'Registracii $1-kävutajan täht om sätud.',
+'accountcreatedtext' => 'Registracii [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|talk]])-kävutajan täht om sätud.',
 'createaccount-title' => '{{SITENAME}}: registracijan sädand.',
 'usernamehasherror' => 'Kävutajan nimes ei voi olda mugošt znamad.',
 'login-throttled' => 'Tö olet tehnu äjahkon naprindoid kirjutadas sistemha.
-Olgat hüväd, varastagat pordon aigad edel ut naprindad.',
+Olgat hüväd, varastagat $1 aigad edel ut naprindad.',
 'login-abort-generic' => 'Teiden naprind tulda sistemha om satusetoi - Azotadud',
 'loginlanguagelabel' => 'Kel’: $1',
 
@@ -592,7 +593,7 @@ Miše tulda sistemha lopuližikš, teile pidab säta uz' peitsana naku:",
 'newpassword' => "Uz' peitsana:",
 'retypenew' => "Toštkat uz' peitsana:",
 'resetpass_submit' => 'Säta peitsana da kirjutadas sistemha',
-'changepassword-success' => 'Teiden peisana om vajehtadud jügedusita! Tulend sistemha...',
+'changepassword-success' => 'Teiden peisana om vajehtadud jügedusita!',
 'resetpass_forbidden' => 'Ei voi vajehtada peitsanad',
 'resetpass-no-info' => 'Miše kirjutada necil lehtpolel, teile pidab kirjutadas sistemha.',
 'resetpass-submit-loggedin' => 'Vajehtada peitsana',
@@ -610,7 +611,7 @@ Voib olda, tö olet jo toižetanuded peitsanan vai pakinuded uden peitsanan.',
 'passwordreset-email' => 'E-počtan adres:',
 'passwordreset-emailelement' => 'Kävutajannimi: $1
 Aigaline peitsana: $2',
-'passwordreset-emailsent' => 'Muštatai kirjeine oigetihe e-počtadme',
+'passwordreset-emailsent' => 'Muštatai kirjeine uden peitsananke oigetihe e-počtadme.',
 
 # Special:ChangeEmail
 'changeemail' => 'Toižetada e-počtan adres',
@@ -872,7 +873,7 @@ Detalid voidas olda [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}}
 'revdelete-text' => "'''Čutud versijad ozutadas lehtpolen istorijas da aigkirjoiš, no järgeližed lugijad ei voiškakoi nähta niiden südäimišton erasid paloid.'''
 Administratorad voiškatas lugeda peittud südäimištod da endištada sidä necen interfeisan kal't siloi, konz ei ole ližakaidendusid.",
 'revdelete-legend' => 'Säta kaidendused',
-'revdelete-hide-text' => 'Peitta necen lehtpolen versijan tekst',
+'revdelete-hide-text' => 'Redakcijan tekst',
 'revdelete-hide-image' => 'Peitta failan südäiolend',
 'revdelete-hide-name' => 'Peitta tegend da sen objekt',
 'revdelete-hide-comment' => 'Peitta toižetusiden kirjutez',
@@ -1028,7 +1029,6 @@ Otkat sil'mnägubale üks-se, miše {{SITENAME}}-saitan sädäimišt voib olda v
 'rows' => 'Rivid:',
 'columns' => 'Pachid:',
 'searchresultshead' => 'Ecind',
-'resultsperpage' => 'Kirjutesiden lugu lehtpolel:',
 'stub-threshold' => 'Nägutesen märitamižen künduz <a href="#" class="stub">kosketust otetile</a> (baitoiš)',
 'stub-threshold-disabled' => 'Ei ole kävutamas',
 'recentchangesdays' => 'Päiväd veresiden toižetusidenke, lugumär:',
@@ -1053,7 +1053,7 @@ Otkat sil'mnägubale üks-se, miše {{SITENAME}}-saitan sädäimišt voib olda v
 'timezoneregion-indian' => 'Indijan valdmeri',
 'timezoneregion-pacific' => "Tün' valdmeri",
 'allowemail' => 'Laskkat toižile kävutajile oigeta teile e-počtad',
-'prefs-searchoptions' => 'Ecindan järgendused',
+'prefs-searchoptions' => 'Ec',
 'prefs-namespaces' => 'Nimiavarused',
 'defaultns' => 'Toižiš statjoiš ectä neniš nimiavarusiš:',
 'default' => 'augotižjärgendusen mödhe',
@@ -1448,6 +1448,7 @@ Ku valitas vaiše ühten kävutajan failad, ka ozutadas vaiše necen kävutajan
 'listfiles_size' => 'Suruz’',
 'listfiles_description' => 'Ümbrikirjutand',
 'listfiles_count' => 'Versijad',
+'listfiles-latestversion' => 'Nügüdläine versii',
 'listfiles-latestversion-yes' => 'Ka',
 
 # File description page
@@ -1665,6 +1666,9 @@ Olgat hüväd, otkat sil'mnägubale, miše toižed-ki saitad voidas kosketada fa
 'allpages-bad-ns' => '{{SITENAME}}-saital ei ole "$1"-nimiavarust.',
 'allpages-hide-redirects' => 'Peitta läbikosketused',
 
+# SpecialCachedPage
+'cachedspecial-refresh-now' => 'Ozutada möhembad.',
+
 # Special:Categories
 'categories' => 'Kategorijad',
 'categoriespagetext' => '{{PLURAL:$1|Neciš kategorijas|Neniš kategorijoiš }} om lehtpolid vai mediafailoid.
@@ -3067,6 +3071,7 @@ Kävutagat normaline ezikacund.',
 
 # API errors
 'api-error-empty-file' => "Teil oigetud fail om pall'az.",
+'api-error-fetchfileerror' => 'Südäipetuz: mi-se läksi värin failad sades.',
 'api-error-filename-tooshort' => 'Lühudahk failannimi.',
 'api-error-filetype-banned' => "Nece failtip om kel'tud.",
 'api-error-filetype-banned-type' => '$1 {{PLURAL:$4|om laskmatoi failantip|oma laskmatomad failantipad}}. Lasktud {{PLURAL:$3|failantip om|failantipad oma}} $2.',
index 6e12cca..f6fd03c 100644 (file)
@@ -1460,7 +1460,6 @@ Xem chi tiết trong [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}}
 'rows' => 'Số hàng:',
 'columns' => 'Số cột:',
 'searchresultshead' => 'Tìm kiếm',
-'resultsperpage' => 'Số kết quả mỗi trang:',
 'stub-threshold' => 'Định dạng <a href="#" class="stub">liên kết đến sơ khai</a> cho các trang ngắn hơn (byte):',
 'stub-threshold-disabled' => 'Tắt',
 'recentchangesdays' => 'Số ngày hiển thị trong thay đổi gần đây:',
@@ -1855,6 +1854,8 @@ Nếu bạn vẫn muốn tải tập tin của bạn lên, xin hãy quay lại v
 Nếu bạn vẫn muốn tải tập tin của bạn lên, xin hãy quay lại và dùng một tên khác. [[File:$1|thumb|center|$1]]',
 'file-exists-duplicate' => 'Tập tin này có vẻ là bản sao của {{PLURAL:$1|tập tin|các  tập tin}} sau:',
 'file-deleted-duplicate' => 'Một tập tin giống hệt như tập tin này ([[:$1]]) đã từng bị xóa trước đây. Bạn nên xem lại lịch sử xóa tập tin trước khi tiếp tục tải nó lên lại.',
+'file-deleted-duplicate-notitle' => 'Một tập tin giống hệt như tập tin này đã từng bị xóa và tên bị đàn áp trước đây.
+Bạn nên xin một người có quyền xem dữ liệu tập tin bị đàn áp xem lại trường hợp này trước khi tiếp tục tải nó lên lại.',
 'uploadwarning' => 'Cảnh báo!',
 'uploadwarning-text' => 'Xin hãy chỉnh sửa miêu tả tập tin ở dưới và thử lại.',
 'savefile' => 'Lưu tập tin',
@@ -2745,6 +2746,7 @@ $1',
 Xem lại những lần cấm tại [[Special:BlockList|danh sách cấm]].',
 'ipb-blockingself' => 'Bạn sẽ tự bỏ cấm cho mình! Bạn có chắc chắn muốn làm vậy không?',
 'ipb-confirmhideuser' => 'Bạn sẽ cấm người dùng với tùy chọn “ẩn người dùng”. Bạn có chắc chắn muốn dời tên người dùng khỏi tất cả mọi danh sách và nhật trình?',
+'ipb-confirmaction' => 'Nếu bạn chắc chắn muốn thực hiện tác vụ này, xin hãy bấm “{{int:ipb-confirm}}” bên dưới.',
 'ipb-edit-dropdown' => 'Sửa đổi lý do cấm',
 'ipb-unblock-addr' => 'Bỏ cấm $1',
 'ipb-unblock' => 'Bỏ cấm thành viên hay địa chỉ IP',
@@ -4037,7 +4039,17 @@ Bạn cũng có thể [[Special:EditWatchlist|dùng trang sửa đổi bình th
 'version-hook-name' => 'Tên hook',
 'version-hook-subscribedby' => 'Được theo dõi bởi',
 'version-version' => '(Phiên bản $1)',
-'version-license' => 'Giấy phép bản quyền',
+'version-license' => 'Giấy phép MediaWiki',
+'version-ext-license' => 'Giấy phép',
+'version-ext-colheader-name' => 'Phần mở rộng',
+'version-ext-colheader-version' => 'Phiên bản',
+'version-ext-colheader-license' => 'Giấy phép',
+'version-ext-colheader-description' => 'Miêu tả',
+'version-ext-colheader-credits' => 'Tác giả',
+'version-license-title' => 'Giấy phép $1',
+'version-license-not-found' => 'Không tìm thấy chi tiết giấy phép của phần mở rộng này.',
+'version-credits-title' => 'Ghi công $1',
+'version-credits-not-found' => 'Không tìm thấy chi tiết ghi công của phần mở rộng này.',
 'version-poweredby-credits' => "Wiki này chạy trên '''[https://www.mediawiki.org/ MediaWiki]''', bản quyền © 2001–$1 $2.",
 'version-poweredby-others' => 'những người khác',
 'version-poweredby-translators' => 'các biên dịch viên translatewiki.net',
index f1e4564..cab261a 100644 (file)
@@ -1007,7 +1007,6 @@ Kontrololös, va votükam at okipon fovöfi padajenotema.',
 'rows' => 'Kedets:',
 'columns' => 'Padüls:',
 'searchresultshead' => 'Suk',
-'resultsperpage' => 'Tiäds petuvöl a pad:',
 'stub-threshold' => 'Soliad pro fomätam <a href="#" class="stub">sidayümas</a> (jöläts):',
 'recentchangesdays' => 'Dels ad pajonön in votükams nulik:',
 'recentchangesdays-max' => '(maxum: {{PLURAL:$1|del|dels}} $1)',
index 00b610d..13a30b2 100644 (file)
@@ -846,7 +846,6 @@ Lisateedüst või ollaq [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAME
 'rows' => 'Rito',
 'columns' => 'Tulpõ',
 'searchresultshead' => 'Otsminõ',
-'resultsperpage' => 'Tulõmuisi leheküle kotsilõ',
 'stub-threshold' => '<a href="#" class="stub">Kehväkese lehe</a> näütämispiir (baidõn):',
 'recentchangesdays' => 'Päivi, midä näüdädäq viimätsin muutmiisin',
 'recentchangescount' => 'Päälkirjo hulk viimätsin muutmiisin',
index c270cf5..02a29df 100644 (file)
@@ -852,7 +852,6 @@ Les ôtes manaedjeus so {{SITENAME}} pôront todi vey li contnou catchî eyet l'
 'rows' => 'Royes',
 'columns' => 'Colones',
 'searchresultshead' => 'Håynaedje des rzultats di cweraedje',
-'resultsperpage' => 'Nombe di responses a håyner so ene pådje',
 'recentchangesdays' => 'Nombe di djoûs po les dierins candjmints:',
 'recentchangesdays-max' => 'Macsimom $1 djoû{{PLURAL:$1||s}}',
 'recentchangescount' => 'Prémetou nombe di candjmintstites a håyner:',
index 93d8f7a..0db027e 100644 (file)
@@ -1022,7 +1022,6 @@ Ginpapasabot nga an sulod han mga panudlok han {{SITENAME}} in bangin daan an.',
 'rows' => 'Mga rumbay pahigda:',
 'columns' => 'Mga rumbay patindog:',
 'searchresultshead' => 'Bilnga',
-'resultsperpage' => 'Mga igo kada pakli:',
 'stub-threshold-disabled' => 'Waray ginpagana',
 'recentchangesdays' => 'Kadamo hin adlaw nga igpapakita an mga kabag-ohan:',
 'recentchangesdays-max' => 'Pinakadamo $1 {{PLURAL:$1|ka adlaw|ka mga adlaw}}',
index c583b60..fd5eb15 100644 (file)
@@ -993,7 +993,6 @@ $1",
 'rows' => '行数:',
 'columns' => '列数:',
 'searchresultshead' => '搜索',
-'resultsperpage' => '每页显示链接数:',
 'stub-threshold' => '<a href="#" class="stub">短页面链接</a>格式门槛值(字节):',
 'recentchangesdays' => '最近更改里向个显示日数:',
 'recentchangesdays-max' => '最长 $1 日',
index 9228ef1..efac44d 100644 (file)
@@ -597,7 +597,6 @@ $1',
 'prefs-editing' => 'Чикллһн',
 'rows' => 'Мөрд:',
 'columns' => 'Бахд:',
-'resultsperpage' => 'Халхд бәәдг олсн бичврин то:',
 'savedprefs' => 'Тана көгүдиг хадһлв.',
 'timezonelegend' => 'Часин бүс:',
 'localtime' => 'Бәәрн һазра цаг:',
index f163bdc..16f460f 100644 (file)
@@ -1348,7 +1348,6 @@ $1",
 'rows' => 'שורות:',
 'columns' => 'עמודים:',
 'searchresultshead' => 'זוכן',
-'resultsperpage' => 'צאל טרעפֿן אין א בלאַט:',
 'stub-threshold' => 'שוועל פֿאַר <a href="#" class="stub">שטומף לינק</a> פֿאָרמאַטירונג (בייטן):',
 'stub-threshold-disabled' => 'אַנולירט',
 'recentchangesdays' => 'צאל פון טעג צו ווייזן אין די לעצטע ענדערונגן:',
@@ -2067,6 +2066,7 @@ $1",
 'mostrevisions' => 'אַרטיקלען מיט די מערסטע באַאַרבעטונגען',
 'prefixindex' => 'פּרעפֿיקס אינדעקס',
 'prefixindex-namespace' => 'אלע בלעטער מיט פרעפֿיקס ($1 נאמענטייל)',
+'prefixindex-strip' => 'אפשניידן פרעפיקס אין ליסטע',
 'shortpages' => 'קורצע בלעטער',
 'longpages' => 'לאנגע בלעטער',
 'deadendpages' => 'בלינדע בלעטער',
@@ -2074,6 +2074,7 @@ $1",
 'protectedpages' => 'געשיצטע בלעטער',
 'protectedpages-indef' => 'בלויז אומבאַשרענקטע באַשוצינגען',
 'protectedpages-cascade' => 'בלויז קאַסקאַדירנדיקע באַשיצונגען',
+'protectedpages-noredirect' => 'פֿארהיילן ווייטערפֿירונגען',
 'protectedpagesempty' => 'אצינד זענען קיין בלעטער נישט געשיצט מיט די דאזיגע פאַראַמעטערס.',
 'protectedtitles' => 'געשיצטע קעפלעך',
 'protectedtitlesempty' => 'אצינד זענען קיין קעפלעך נישט באַשיצט מיט די דאזיגע פאַראַמעטערס.',
@@ -2347,6 +2348,7 @@ $UNWATCHURL
 'delete-edit-reasonlist' => 'רעדאַקטירן די אויסמעקן סיבות',
 'delete-toobig' => 'דער בלאַט האט א גרויסע רעדאקטירונג היסטאריע, מער ווי $1 {{PLURAL:$1|רעוויזיע|רעוויזיעס}}. אויסמעקן אזעלכע בלעטער איז באַגרענעצט געווארן בכדי צו פֿאַרמײַדן א צופֿעליגע פֿאַרשטערונג פֿון  {{SITENAME}}.',
 'delete-warning-toobig' => 'דער בלאַט האט א גרויסע רעדאקטירונג היסטאריע, מער ווי $1 {{PLURAL:$1|רעוויזיע|רעוויזיעס}}. אויסמעקן אים קען פֿאַרשטערן דאַטנבאַזע אפעראַציעס פֿון {{SITENAME}}; זײַט פֿארזיכטיג איידער איר מעקט אויס.',
+'deleting-backlinks-warning' => "'''ווארענוג:''' אנדערע בלעטער פארבינדן צום בלאט איר האלט ביי אויסמעקן.",
 
 # Rollback
 'rollback' => 'צוריקדרייען רעדאַקטירונגען',
@@ -2657,6 +2659,7 @@ $1',
 'ip_range_toolarge' => 'אָפשטאַנדן גרעסער ווי /$1 קען מען נישט בלאקירן.',
 'proxyblocker' => 'פראקסי בלאקער',
 'proxyblockreason' => 'אייער איי.פי. אדרעס איז געווארן געבלאקט צוליב דעם ווייל דאס איז א אפענער פראקסי. ביטע פארבינדט זיך מיט אייער אינטערנעט סערוויס פראוויידער אדער טעקס סאפארט צו אינפארמירן זיי איבער דעם ערענסטן זיכערהייט פראבלעם.',
+'sorbsreason' => 'אייער IP־אדרעס געפינט זיך אין דער ליסטע פון אפענע פראקסיס אינעם DNSBL געניצט אין {{SITENAME}}.',
 'ipbblocked' => 'איר קען נישט בלאקירן אדער אויפבלאקירן אנדערע באניצער, ווייל איר זענט אליין בלאקירט.',
 'ipbnounblockself' => 'איר זענט נישט ערלויבט זיך אליין אויסבלאקירן',
 
index d537714..3f0e17d 100644 (file)
@@ -1181,7 +1181,6 @@ Ní báyìí ná ẹ le ṣàwárí lọ́dọ̀ Google.
 'rows' => 'Àwọn ìtẹ̀lé gbọlọjọ:',
 'columns' => 'Àwọn ìtẹ̀lé gogoro:',
 'searchresultshead' => 'Àwárí',
-'resultsperpage' => 'Àwọn èsì ní ojúewé kọ̀ọ̀kan:',
 'stub-threshold' => 'Àlà fún idárú <a href="#" class="stub">àjàpọ̀ ẹ̀kúnrẹ́rẹ́</a> (bytes):',
 'stub-threshold-disabled' => 'Dídálẹ́kun',
 'recentchangesdays' => 'Iye ọjọ́ láti fihàn nínú àwọn àtúnṣe tuntun:',
index ebb8e5a..2e3b9c1 100644 (file)
@@ -1155,7 +1155,6 @@ $1",
 'rows' => '行數:',
 'columns' => '列數:',
 'searchresultshead' => '搵嘢',
-'resultsperpage' => '每頁顯示嘅擊中數:',
 'stub-threshold' => '<a href="#" class="stub">楔位連結</a>格式門檻 (bytes):',
 'stub-threshold-disabled' => '閂咗',
 'recentchangesdays' => '最近更改中嘅顯示日數:',
index 4a1f93f..3bd06b0 100644 (file)
@@ -226,7 +226,7 @@ $messages = array(
 'delete' => 'Wissen',
 'deletethispage' => 'Wis deêze bladzie',
 'undelete_short' => '$1 {{PLURAL:$1|bewerkieng|bewerkiengen}} terugzetten',
-'viewdeleted_short' => '{{PLURAL: $1|Eên geschrapte bewarkienge|$1 geschrapte bewarkiengen}} bekieken',
+'viewdeleted_short' => '{{PLURAL:$1|Eên geschrapte bewarkienge|$1 geschrapte bewarkiengen}} bekieken',
 'protect' => 'Bescherm',
 'protect_change' => 'wiezigen',
 'protectthispage' => 'Bescherm deêze bladzie',
@@ -829,7 +829,6 @@ De hehevens over {{SITENAME}} zien meuhlijk nie bie'ewerkt.",
 'rows' => 'Rehels:',
 'columns' => "Kolomm'n:",
 'searchresultshead' => 'Zoek',
-'resultsperpage' => "Resultaot'n per pagina:",
 'stub-threshold' => 'Drempel voe markerieng <a href="#" class="stub">stompje</a>:',
 'recentchangesdays' => 'Antal daehen weer te heven in Juust angepast:',
 'recentchangescount' => "Antal pagina's in Juust angepast:",
index 23538e0..b00a1b5 100644 (file)
@@ -64,6 +64,7 @@
  * @author Stevenliuyi
  * @author Supaiku
  * @author Tommyang
+ * @author User670839245
  * @author Waihorace
  * @author Wilsonmess
  * @author Wmr89502270
@@ -582,7 +583,7 @@ $messages = array(
 'deletethispage' => '删除本页',
 'undeletethispage' => '还原本页',
 'undelete_short' => '还原{{PLURAL:$1|$1个编辑}}',
-'viewdeleted_short' => '查看$1个被删除的编辑',
+'viewdeleted_short' => '查看$1个被删除的编辑',
 'protect' => '保护',
 'protect_change' => '更改',
 'protectthispage' => '保护本页',
@@ -670,7 +671,7 @@ $1',
 'collapsible-expand' => '展开',
 'thisisdeleted' => '查看或恢复$1?',
 'viewdeleted' => '查看$1?',
-'restorelink' => '$1个被删除的编辑',
+'restorelink' => '$1个被删除的编辑',
 'feedlinks' => 'Feed:',
 'feed-invalid' => '无效的订阅feed类型。',
 'feed-unavailable' => '不提供联合feed',
@@ -1158,6 +1159,8 @@ $2
 'invalid-content-data' => '无效的内容数据',
 'content-not-allowed-here' => '[[$2]]页面上不允许“$1”内容',
 'editwarning-warning' => '离开本页面可能导致你失去任何你已经作出的更改。如果你处于登录状态,你可以在你的设置的“编辑”部分停用该警告。',
+'editpage-notsupportedcontentformat-title' => '内容格式尚不支持',
+'editpage-notsupportedcontentformat-text' => '内容模型$2尚不支持内容格式$1。',
 
 # Content models
 'content-model-wikitext' => 'wiki文本',
@@ -1219,7 +1222,7 @@ $3给出的原因是“$2”。",
 'histlegend' => "差异选择:选出需要对比的版本,按“回车键”或下方的按钮进行对比。<br />
 说明:'''({{int:cur}})'''=与最后版本之间的差异,'''({{int:last}})'''=与上一版本之间的差异,'''{{int:minoreditletter}}'''=小编辑。",
 'history-fieldset-title' => '浏览历史',
-'history-show-deleted' => '仅被删除的',
+'history-show-deleted' => '仅已被删除',
 'histfirst' => '最早',
 'histlast' => '最新',
 'historysize' => '($1字节)',
@@ -1440,7 +1443,6 @@ $1",
 'rows' => '行数:',
 'columns' => '列数:',
 'searchresultshead' => '搜索',
-'resultsperpage' => '每页显示链接数:',
 'stub-threshold' => '<a href="#" class="stub">短页面链接</a>格式阈值(字节):',
 'stub-threshold-disabled' => '停用',
 'recentchangesdays' => '最近更改中显示的天数:',
@@ -1465,7 +1467,7 @@ $1",
 'timezoneregion-europe' => '欧洲',
 'timezoneregion-indian' => '印度洋',
 'timezoneregion-pacific' => '太平洋',
-'allowemail' => '接受来自其他用户的电子邮件',
+'allowemail' => '启用来自其他用户的电子邮件',
 'prefs-searchoptions' => '搜索',
 'prefs-namespaces' => '名字空间',
 'defaultns' => '否则在这些名字空间中搜索:',
@@ -1599,8 +1601,8 @@ $1",
 'right-deletelogentry' => '删除和恢复特定的日志项目',
 'right-deleterevision' => '删除和恢复页面的特定版本',
 'right-deletedhistory' => '查看被删除的历史项目,不含相关文本',
-'right-deletedtext' => '查看被删除的文本及被删除的版本间差异',
-'right-browsearchive' => '搜索被删除的页面',
+'right-deletedtext' => '查看已被删除的文本及已删除版本间的差异',
+'right-browsearchive' => '搜索被删除的页面',
 'right-undelete' => '还原页面',
 'right-suppressrevision' => '审查和恢复向管理员隐藏的版本',
 'right-suppressionlog' => '查看非公开日志',
@@ -1668,7 +1670,7 @@ $1",
 'action-delete' => '删除本页',
 'action-deleterevision' => '删除本版本',
 'action-deletedhistory' => '查看本页面被删除的历史',
-'action-browsearchive' => '搜索被删除的页面',
+'action-browsearchive' => '搜索被删除的页面',
 'action-undelete' => '还原本页',
 'action-suppressrevision' => '审查和恢复本隐藏版本',
 'action-suppressionlog' => '查看本非公开日志',
@@ -1792,7 +1794,7 @@ $1",
 'filename-tooshort' => '文件名过短。',
 'filetype-banned' => '此类文件被禁止。',
 'verification-error' => '文件未通过验证。',
-'hookaborted' => '您所尝试的修改被插件钩子舍弃。',
+'hookaborted' => '您所尝试的修改被一个扩展程序终止。',
 'illegal-filename' => '文件名非法。',
 'overwrite' => '不允许覆盖现有文件。',
 'unknown-error' => '发生未知错误。',
@@ -2246,8 +2248,8 @@ $1',
 'special-categories-sort-abc' => '按字母排列',
 
 # Special:DeletedContributions
-'deletedcontributions' => '被删除的用户贡献',
-'deletedcontributions-title' => '被删除的用户贡献',
+'deletedcontributions' => '被删除的用户贡献',
+'deletedcontributions-title' => '被删除的用户贡献',
 'sp-deletedcontributions-contribs' => '贡献',
 
 # Special:LinkSearch
@@ -2309,7 +2311,7 @@ $1',
 'noemailtitle' => '无电子邮件地址',
 'noemailtext' => '该用户还没有指定一个有效的电子邮件地址。',
 'nowikiemailtitle' => '禁止电子邮件',
-'nowikiemailtext' => 'è¿\99ä½\8dç\94¨æ\88·é\80\89æ\8b©ä¸\8dæ\8e¥æ\94其他用户的电子邮件。',
+'nowikiemailtext' => '该ç\94¨æ\88·å·²ç»\8fé\80\89æ\8b©ä¸\8dæ\8e¥æ\94¶æ\9d¥è\87ª其他用户的电子邮件。',
 'emailnotarget' => '收件人不存在或无效的用户名。',
 'emailtarget' => '输入收件人的用户名',
 'emailusername' => '用户名:',
@@ -2596,7 +2598,7 @@ $1',
 'sp-contributions-newbies-sub' => '新手',
 'sp-contributions-newbies-title' => '新手的用户贡献',
 'sp-contributions-blocklog' => '封禁日志',
-'sp-contributions-deleted' => '被删除的用户贡献',
+'sp-contributions-deleted' => '被删除的用户贡献',
 'sp-contributions-uploads' => '上传',
 'sp-contributions-logs' => '日志',
 'sp-contributions-talk' => '讨论',
@@ -2667,6 +2669,7 @@ $1',
 参见[[Special:BlockList|封禁列表]]以复核封禁。',
 'ipb-blockingself' => '您将要封禁自己!确实要这样做吗?',
 'ipb-confirmhideuser' => '您即将在封禁用户的同时启用“隐藏账户”功能。这将从所有列表和日志记录中隐藏这个用户名。您确认这样做吗?',
+'ipb-confirmaction' => '如果您确信要这样做,请检查底部的“{{int:ipb-confirm}}”部分。',
 'ipb-edit-dropdown' => '编辑封禁原因',
 'ipb-unblock-addr' => '解封$1',
 'ipb-unblock' => '解封用户名或IP地址',
@@ -3864,7 +3867,7 @@ $5
 'version-parser-function-hooks' => '解析器函数钩',
 'version-hook-name' => '钩名',
 'version-hook-subscribedby' => '署名',
-'version-version' => '(版本$1)',
+'version-version' => '(版本 $1)',
 'version-license' => 'MediaWiki协议',
 'version-ext-license' => '授权',
 'version-ext-colheader-name' => '扩展',
index 187a69c..9233619 100644 (file)
@@ -1089,6 +1089,8 @@ $2
 'invalid-content-data' => '內容資料無效',
 'content-not-allowed-here' => '[[$2]]頁面上不允許「$1」內容',
 'editwarning-warning' => '離開這個頁面可能會令您失去之前作出的所有更改。若您已經登入,您可在偏好設定的「編輯」部份裡關閉此警告。',
+'editpage-notsupportedcontentformat-title' => '內容格式尚無法支援',
+'editpage-notsupportedcontentformat-text' => '內容模型$2尚無法支援內容格式$1。',
 
 # Content models
 'content-model-wikitext' => '圍記文字(Wikitext)',
@@ -1374,7 +1376,6 @@ $1",
 'rows' => '行數:',
 'columns' => '列數:',
 'searchresultshead' => '搜尋',
-'resultsperpage' => '每頁顯示連結數:',
 'stub-threshold' => '<a href="#" class="stub">短頁面連結</a>格式門檻值 (位元組):',
 'stub-threshold-disabled' => '已停用',
 'recentchangesdays' => '近期變更的顯示日數:',
@@ -2632,6 +2633,7 @@ $1',
 參看[[Special:BlockList|被封IP地址列表]]以覆審查封。',
 'ipb-blockingself' => '你要封禁自己!確認要這樣做嗎?',
 'ipb-confirmhideuser' => '你要封禁用戶並隱藏其用戶名,這會隱藏在所有列表及日誌中涉及此用戶之用戶名。你確定要這樣做嗎?',
+'ipb-confirmaction' => '如果您確信這樣做,請檢查底部的「{{int:ipb-confirm}}」部分。',
 'ipb-edit-dropdown' => '編輯查封原因',
 'ipb-unblock-addr' => '解封$1',
 'ipb-unblock' => '解除禁封用戶名或IP地址',
index 1f4d0cd..4e2e869 100644 (file)
@@ -35,8 +35,8 @@ class CLDRPluralRuleEvaluator {
         * Evaluate a number against a set of plural rules. If a rule passes,
         * return the index of plural rule.
         *
-        * @param int The number to be evaluated against the rules
-        * @param array The associative array of plural rules in pluralform => rule format.
+        * @param int $number The number to be evaluated against the rules
+        * @param array $rules The associative array of plural rules in pluralform => rule format.
         * @return int The index of the plural form which passed the evaluation
         */
        public static function evaluate( $number, array $rules ) {
@@ -64,9 +64,9 @@ class CLDRPluralRuleEvaluator {
         * Evaluate a compiled set of rules returned by compile(). Do not allow
         * the user to edit the compiled form, or else PHP errors may result.
         *
-        * @param string The number to be evaluated against the rules, in English, or it
+        * @param string $number The number to be evaluated against the rules, in English, or it
         *   may be a type convertible to string.
-        * @param array The associative array of plural rules in pluralform => rule format.
+        * @param array $rules The associative array of plural rules in pluralform => rule format.
         * @return int The index of the plural form which passed the evaluation
         */
        public static function evaluateCompiled( $number, array $rules ) {
@@ -243,7 +243,8 @@ class CLDRPluralRuleEvaluator_Range {
        /**
         * Add another part to this range.
         *
-        * @param mixed The part to add, either a range object itself or a single number.
+        * @param CLDRPluralRuleEvaluator_Range|int $other The part to add, either
+        *   a range object itself or a single number.
         */
        function add( $other ) {
                if ( $other instanceof self ) {
@@ -359,7 +360,7 @@ class CLDRPluralRuleConverter {
        /**
         * Convert a rule to RPN. This is the only public entry point.
         *
-        * @param $rule The rule to convert
+        * @param string $rule The rule to convert
         * @return string The RPN representation of the rule
         */
        public static function convert( $rule ) {
@@ -386,6 +387,7 @@ class CLDRPluralRuleConverter {
 
                // Iterate through all tokens, saving the operators and operands to a
                // stack per Dijkstra's shunting yard algorithm.
+               /** @var CLDRPluralRuleConverter_Operator $token */
                while ( false !== ( $token = $this->nextToken() ) ) {
                        // In this grammar, there are only binary operators, so every valid
                        // rule string will alternate between operator and operand tokens.
@@ -534,6 +536,8 @@ class CLDRPluralRuleConverter {
         * For the binary operator $op, pop its operands off the stack and push
         * a fragment with rpn and type members describing the result of that
         * operation.
+        *
+        * @param CLDRPluralRuleConverter_Operator $op
         */
        protected function doOperation( $op ) {
                if ( count( $this->operands ) < 2 ) {
@@ -548,6 +552,8 @@ class CLDRPluralRuleConverter {
        /**
         * Create a numerical expression object
         *
+        * @param string $text
+        * @param int $pos
         * @return CLDRPluralRuleConverter_Expression The numerical expression
         */
        protected function newNumber( $text, $pos ) {
@@ -557,6 +563,9 @@ class CLDRPluralRuleConverter {
        /**
         * Create a binary operator
         *
+        * @param string $type
+        * @param int $pos
+        * @param int $length
         * @return CLDRPluralRuleConverter_Operator The operator
         */
        protected function newOperator( $type, $pos, $length ) {
@@ -602,7 +611,11 @@ class CLDRPluralRuleConverter_Fragment {
  * validation.
  */
 class CLDRPluralRuleConverter_Expression extends CLDRPluralRuleConverter_Fragment {
-       public $type, $rpn;
+       /** @var string */
+       public $type;
+
+       /** @var string */
+       public $rpn;
 
        function __construct( $parser, $type, $rpn, $pos, $length ) {
                parent::__construct( $parser, $pos, $length );
@@ -627,11 +640,7 @@ class CLDRPluralRuleConverter_Expression extends CLDRPluralRuleConverter_Fragmen
  * messages), and the binary operator at that location.
  */
 class CLDRPluralRuleConverter_Operator extends CLDRPluralRuleConverter_Fragment {
-       /**
-        * The name
-        *
-        * @var string
-        */
+       /** @var string The name */
        public $name;
 
        /**
@@ -684,8 +693,8 @@ class CLDRPluralRuleConverter_Operator extends CLDRPluralRuleConverter_Fragment
         *
         * @param CLDRPluralRuleConverter $parser The parser
         * @param string $name The operator name
-        * @param int $pos The position
         * @param int $pos The length
+        * @param int $length
         */
        function __construct( $parser, $name, $pos, $length ) {
                parent::__construct( $parser, $pos, $length );
index 09b9295..8bacb26 100644 (file)
@@ -347,15 +347,33 @@ class CopyFileBackend extends Maintenance {
                } else {
                        $dstStat = $dst->getFileStat( array( 'src' => $dPath ) );
                }
-               return (
+               // Initial fast checks to see if files are obviously different
+               $sameFast = (
                        is_array( $srcStat ) // sanity check that source exists
                        && is_array( $dstStat ) // dest exists
                        && $srcStat['size'] === $dstStat['size']
-                       && ( !$skipHash || $srcStat['mtime'] <= $dstStat['mtime'] )
-                       && ( $skipHash || $src->getFileSha1Base36( array( 'src' => $sPath, 'latest' => 1 ) )
-                               === $dst->getFileSha1Base36( array( 'src' => $dPath, 'latest' => 1 ) )
-                       )
                );
+               // More thorough checks against files
+               if ( !$sameFast ) {
+                       $same = false; // no need to look farther
+               } elseif ( isset( $srcStat['md5'] ) && isset( $dstStat['md5'] ) ) {
+                       // If MD5 was already in the stat info, just use it.
+                       // This is useful as many objects stores can return this in object listing,
+                       // so we can use it to avoid slow per-file HEADs.
+                       $same = ( $srcStat['md5'] === $dstStat['md5'] );
+               } elseif ( $skipHash ) {
+                       // This mode is good for copying to a backup location or resyncing clone
+                       // backends in FileBackendMultiWrite (since they get writes second, they have
+                       // higher timestamps). However, when copying the other way, this hits loads of
+                       // false positives (possibly 100%) and wastes a bunch of time on GETs/PUTs.
+                       $same = ( $srcStat['mtime'] <= $dstStat['mtime'] );
+               } else {
+                       // This is the slowest method which does many per-file HEADs (unless an object
+                       // store tracks SHA-1 in listings).
+                       $same = ( $src->getFileSha1Base36( array( 'src' => $sPath, 'latest' => 1 ) )
+                               === $dst->getFileSha1Base36( array( 'src' => $dPath, 'latest' => 1 ) ) );
+               }
+               return $same;
        }
 }
 
index 55fbd9a..02d65ed 100644 (file)
@@ -66,11 +66,13 @@ class FixExtLinksProtocolRelative extends LoggedUpdateMaintenance {
                        $db->insert( 'externallinks',
                                array(
                                        array(
+                                               'el_id' => $db->nextSequenceValue( 'externallinks_el_id_seq' ),
                                                'el_from' => $row->el_from,
                                                'el_to' => $row->el_to,
                                                'el_index' => "http:{$row->el_index}",
                                        ),
                                        array(
+                                               'el_id' => $db->nextSequenceValue( 'externallinks_el_id_seq' ),
                                                'el_from' => $row->el_from,
                                                'el_to' => $row->el_to,
                                                'el_index' => "https:{$row->el_index}",
index 554e0a8..9c8354c 100644 (file)
@@ -97,7 +97,7 @@ class GenerateJsonI18n extends Maintenance {
                }
 
                $this->output( "All done.\n" );
-               $this->output( "Also add \$wgMessagesDirs['YourExtension'] = __DIR__ . /i18n';\n" );
+               $this->output( "Also add \$wgMessagesDirs['YourExtension'] = __DIR__ . '/i18n';\n" );
        }
 
        protected function doShim( $jsondir ) {
@@ -110,7 +110,7 @@ $GLOBALS['wgHooks']['LocalisationCacheRecache'][] = function ( $cache, $code, &$
                $fileName = __DIR__ . "/{{OUT}}/$csCode.json";
                if ( is_readable( $fileName ) ) {
                        $data = FormatJson::decode( file_get_contents( $fileName ), true );
-                       foreach ( $data as $key => $unused ) {
+                       foreach ( array_keys( $data ) as $key ) {
                                if ( $key === '' || $key[0] === '@' ) {
                                        unset( $data[$key] );
                                }
diff --git a/maintenance/language/generateNormalizerData.php b/maintenance/language/generateNormalizerData.php
deleted file mode 100644 (file)
index b638b63..0000000
+++ /dev/null
@@ -1,160 +0,0 @@
-<?php
-/**
- * Generates normalizer data files for Arabic and Malayalam.
- *
- * 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 MaintenanceLanguage
- */
-
-require_once __DIR__ . '/../../includes/normal/UtfNormalUtil.php';
-
-require_once __DIR__ . '/../Maintenance.php';
-
-/**
- * Generates normalizer data files for Arabic and Malayalam.
- * For NFC see includes/normal.
- *
- * @ingroup MaintenanceLanguage
- */
-class GenerateNormalizerData extends Maintenance {
-       public $dataFile;
-
-       public function __construct() {
-               parent::__construct();
-               $this->addOption( 'unicode-data-file', 'The local location of the data file ' .
-                       'from http://unicode.org/Public/UNIDATA/UnicodeData.txt', false, true );
-       }
-
-       public function execute() {
-               if ( !$this->hasOption( 'unicode-data-file' ) ) {
-                       $this->dataFile = 'UnicodeData.txt';
-                       if ( !file_exists( $this->dataFile ) ) {
-                               $this->error( "Unable to find UnicodeData.txt. Please specify " .
-                                       "its location with --unicode-data-file=<FILE>" );
-                               exit( 1 );
-                       }
-               } else {
-                       $this->dataFile = $this->getOption( 'unicode-data-file' );
-                       if ( !file_exists( $this->dataFile ) ) {
-                               $this->error( 'Unable to find the specified data file.' );
-                               exit( 1 );
-                       }
-               }
-
-               $this->generateArabic();
-               $this->generateMalayalam();
-       }
-
-       function generateArabic() {
-               $file = fopen( $this->dataFile, 'r' );
-               if ( !$file ) {
-                       $this->error( 'Unable to open the data file.' );
-                       exit( 1 );
-               }
-
-               // For the file format, see http://www.unicode.org/reports/tr44/
-               $fieldNames = array(
-                       'Code',
-                       'Name',
-                       'General_Category',
-                       'Canonical_Combining_Class',
-                       'Bidi_Class',
-                       'Decomposition_Type_Mapping',
-                       'Numeric_Type_Value',
-                       'Bidi_Mirrored',
-                       'Unicode_1_Name',
-                       'ISO_Comment',
-                       'Simple_Uppercase_Mapping',
-                       'Simple_Lowercase_Mapping',
-                       'Simple_Titlecase_Mapping'
-               );
-
-               $pairs = array();
-
-               $lineNum = 0;
-               while ( false !== ( $line = fgets( $file ) ) ) {
-                       ++$lineNum;
-
-                       # Strip comments
-                       $line = trim( substr( $line, 0, strcspn( $line, '#' ) ) );
-                       if ( $line === '' ) {
-                               continue;
-                       }
-
-                       # Split fields
-                       $numberedData = explode( ';', $line );
-                       $data = array();
-                       foreach ( $fieldNames as $number => $name ) {
-                               $data[$name] = $numberedData[$number];
-                       }
-
-                       $code = base_convert( $data['Code'], 16, 10 );
-                       if ( ( $code >= 0xFB50 && $code <= 0xFDFF ) # Arabic presentation forms A
-                               || ( $code >= 0xFE70 && $code <= 0xFEFF ) # Arabic presentation forms B
-                       ) {
-                               if ( $data['Decomposition_Type_Mapping'] === '' ) {
-                                       // No decomposition
-                                       continue;
-                               }
-                               if ( !preg_match( '/^ *(<\w*>) +([0-9A-F ]*)$/',
-                                       $data['Decomposition_Type_Mapping'], $m )
-                               ) {
-                                       $this->error( "Can't parse Decomposition_Type/Mapping on line $lineNum" );
-                                       $this->error( $line );
-                                       continue;
-                               }
-
-                               $source = hexSequenceToUtf8( $data['Code'] );
-                               $dest = hexSequenceToUtf8( $m[2] );
-                               $pairs[$source] = $dest;
-                       }
-               }
-
-               global $IP;
-               file_put_contents( "$IP/serialized/normalize-ar.ser", serialize( $pairs ) );
-               echo "ar: " . count( $pairs ) . " pairs written.\n";
-       }
-
-       function generateMalayalam() {
-               $hexPairs = array(
-                       # From http://unicode.org/versions/Unicode5.1.0/#Malayalam_Chillu_Characters
-                       '0D23 0D4D 200D' => '0D7A',
-                       '0D28 0D4D 200D' => '0D7B',
-                       '0D30 0D4D 200D' => '0D7C',
-                       '0D32 0D4D 200D' => '0D7D',
-                       '0D33 0D4D 200D' => '0D7E',
-
-                       # From http://permalink.gmane.org/gmane.science.linguistics.wikipedia.technical/46413
-                       '0D15 0D4D 200D' => '0D7F',
-               );
-
-               $pairs = array();
-               foreach ( $hexPairs as $hexSource => $hexDest ) {
-                       $source = hexSequenceToUtf8( $hexSource );
-                       $dest = hexSequenceToUtf8( $hexDest );
-                       $pairs[$source] = $dest;
-               }
-
-               global $IP;
-               file_put_contents( "$IP/serialized/normalize-ml.ser", serialize( $pairs ) );
-               echo "ml: " . count( $pairs ) . " pairs written.\n";
-       }
-}
-
-$maintClass = 'GenerateNormalizerData';
-require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/language/generateNormalizerDataAr.php b/maintenance/language/generateNormalizerDataAr.php
new file mode 100644 (file)
index 0000000..ece0450
--- /dev/null
@@ -0,0 +1,133 @@
+<?php
+/**
+ * Generates the normalizer data file for Arabic.
+ *
+ * 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 MaintenanceLanguage
+ */
+
+require_once __DIR__ . '/../Maintenance.php';
+
+/**
+ * Generates the normalizer data file for Arabic.
+ * For NFC see includes/normal.
+ *
+ * @ingroup MaintenanceLanguage
+ */
+class GenerateNormalizerDataAr extends Maintenance {
+       public function __construct() {
+               parent::__construct();
+               $this->mDescription = 'Generate the normalizer data file for Arabic';
+               $this->addOption( 'unicode-data-file', 'The local location of the data file ' .
+                       'from http://unicode.org/Public/UNIDATA/UnicodeData.txt', false, true );
+       }
+
+       public function getDbType() {
+               return Maintenance::DB_NONE;
+       }
+
+       public function execute() {
+               if ( !$this->hasOption( 'unicode-data-file' ) ) {
+                       $dataFile = 'UnicodeData.txt';
+                       if ( !file_exists( $dataFile ) ) {
+                               $this->error( "Unable to find UnicodeData.txt. Please specify " .
+                                       "its location with --unicode-data-file=<FILE>" );
+                               exit( 1 );
+                       }
+               } else {
+                       $dataFile = $this->getOption( 'unicode-data-file' );
+                       if ( !file_exists( $dataFile ) ) {
+                               $this->error( 'Unable to find the specified data file.' );
+                               exit( 1 );
+                       }
+               }
+
+               $file = fopen( $dataFile, 'r' );
+               if ( !$file ) {
+                       $this->error( 'Unable to open the data file.' );
+                       exit( 1 );
+               }
+
+               // For the file format, see http://www.unicode.org/reports/tr44/
+               $fieldNames = array(
+                       'Code',
+                       'Name',
+                       'General_Category',
+                       'Canonical_Combining_Class',
+                       'Bidi_Class',
+                       'Decomposition_Type_Mapping',
+                       'Numeric_Type_Value_6',
+                       'Numeric_Type_Value_7',
+                       'Numeric_Type_Value_8',
+                       'Bidi_Mirrored',
+                       'Unicode_1_Name',
+                       'ISO_Comment',
+                       'Simple_Uppercase_Mapping',
+                       'Simple_Lowercase_Mapping',
+                       'Simple_Titlecase_Mapping'
+               );
+
+               $pairs = array();
+
+               $lineNum = 0;
+               while ( false !== ( $line = fgets( $file ) ) ) {
+                       ++$lineNum;
+
+                       # Strip comments
+                       $line = trim( substr( $line, 0, strcspn( $line, '#' ) ) );
+                       if ( $line === '' ) {
+                               continue;
+                       }
+
+                       # Split fields
+                       $numberedData = explode( ';', $line );
+                       $data = array();
+                       foreach ( $fieldNames as $number => $name ) {
+                               $data[$name] = $numberedData[$number];
+                       }
+
+                       $code = base_convert( $data['Code'], 16, 10 );
+                       if ( ( $code >= 0xFB50 && $code <= 0xFDFF ) # Arabic presentation forms A
+                               || ( $code >= 0xFE70 && $code <= 0xFEFF ) # Arabic presentation forms B
+                       ) {
+                               if ( $data['Decomposition_Type_Mapping'] === '' ) {
+                                       // No decomposition
+                                       continue;
+                               }
+                               if ( !preg_match( '/^ *(<\w*>) +([0-9A-F ]*)$/',
+                                       $data['Decomposition_Type_Mapping'], $m )
+                               ) {
+                                       $this->error( "Can't parse Decomposition_Type/Mapping on line $lineNum" );
+                                       $this->error( $line );
+                                       continue;
+                               }
+
+                               $source = hexSequenceToUtf8( $data['Code'] );
+                               $dest = hexSequenceToUtf8( $m[2] );
+                               $pairs[$source] = $dest;
+                       }
+               }
+
+               global $IP;
+               file_put_contents( "$IP/serialized/normalize-ar.ser", serialize( $pairs ) );
+               echo "ar: " . count( $pairs ) . " pairs written.\n";
+       }
+}
+
+$maintClass = 'GenerateNormalizerDataAr';
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/language/generateNormalizerDataMl.php b/maintenance/language/generateNormalizerDataMl.php
new file mode 100644 (file)
index 0000000..c7237cf
--- /dev/null
@@ -0,0 +1,69 @@
+<?php
+/**
+ * Generates the normalizer data file for Malayalam.
+ *
+ * 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 MaintenanceLanguage
+ */
+
+require_once __DIR__ . '/../Maintenance.php';
+
+/**
+ * Generates the normalizer data file for Malayalam.
+ * For NFC see includes/normal.
+ *
+ * @ingroup MaintenanceLanguage
+ */
+class GenerateNormalizerDataMl extends Maintenance {
+       public function __construct() {
+               parent::__construct();
+               $this->mDescription = 'Generate the normalizer data file for Malayalam';
+       }
+
+       public function getDbType() {
+               return Maintenance::DB_NONE;
+       }
+
+       public function execute() {
+               $hexPairs = array(
+                       # From http://unicode.org/versions/Unicode5.1.0/#Malayalam_Chillu_Characters
+                       '0D23 0D4D 200D' => '0D7A',
+                       '0D28 0D4D 200D' => '0D7B',
+                       '0D30 0D4D 200D' => '0D7C',
+                       '0D32 0D4D 200D' => '0D7D',
+                       '0D33 0D4D 200D' => '0D7E',
+
+                       # From http://permalink.gmane.org/gmane.science.linguistics.wikipedia.technical/46413
+                       '0D15 0D4D 200D' => '0D7F',
+               );
+
+               $pairs = array();
+               foreach ( $hexPairs as $hexSource => $hexDest ) {
+                       $source = hexSequenceToUtf8( $hexSource );
+                       $dest = hexSequenceToUtf8( $hexDest );
+                       $pairs[$source] = $dest;
+               }
+
+               global $IP;
+               file_put_contents( "$IP/serialized/normalize-ml.ser", serialize( $pairs ) );
+               echo "ml: " . count( $pairs ) . " pairs written.\n";
+       }
+}
+
+$maintClass = 'GenerateNormalizerDataMl';
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/language/generateUtf8Case.php b/maintenance/language/generateUtf8Case.php
new file mode 100644 (file)
index 0000000..dbb70c1
--- /dev/null
@@ -0,0 +1,129 @@
+<?php
+/**
+ * Generates Utf8Case.ser from the Unicode Character Database and
+ * supplementary files.
+ *
+ * Copyright © 2004, 2008 Brion Vibber <brion@pobox.com>
+ * http://www.mediawiki.org/
+ *
+ * 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 MaintenanceLanguage
+ */
+
+require_once __DIR__ . '/../Maintenance.php';
+
+/**
+ * Generates Utf8Case.ser from the Unicode Character Database and
+ * supplementary files.
+ *
+ * @ingroup MaintenanceLanguage
+ */
+class GenerateUtf8Case extends Maintenance {
+
+       public function __construct() {
+               parent::__construct();
+               $this->mDescription = 'Generate Utf8Case.ser from the Unicode Character Database ' .
+                       'and supplementary files';
+               $this->addOption( 'unicode-data-file', 'The local location of the data file ' .
+                       'from http://unicode.org/Public/UNIDATA/UnicodeData.txt', false, true );
+       }
+
+       public function getDbType() {
+               return Maintenance::DB_NONE;
+       }
+
+       public function execute() {
+               if ( !$this->hasOption( 'unicode-data-file' ) ) {
+                       $dataFile = 'UnicodeData.txt';
+                       if ( !file_exists( $dataFile ) ) {
+                               $this->error( "Unable to find UnicodeData.txt. Please specify " .
+                                       "its location with --unicode-data-file=<FILE>" );
+                               exit( 1 );
+                       }
+               } else {
+                       $dataFile = $this->getOption( 'unicode-data-file' );
+                       if ( !file_exists( $dataFile ) ) {
+                               $this->error( 'Unable to find the specified data file.' );
+                               exit( 1 );
+                       }
+               }
+
+               $file = fopen( $dataFile, 'r' );
+               if ( !$file ) {
+                       $this->error( 'Unable to open the data file.' );
+                       exit( 1 );
+               }
+
+               // For the file format, see http://www.unicode.org/reports/tr44/
+               $fieldNames = array(
+                       'Code',
+                       'Name',
+                       'General_Category',
+                       'Canonical_Combining_Class',
+                       'Bidi_Class',
+                       'Decomposition_Type_Mapping',
+                       'Numeric_Type_Value_6',
+                       'Numeric_Type_Value_7',
+                       'Numeric_Type_Value_8',
+                       'Bidi_Mirrored',
+                       'Unicode_1_Name',
+                       'ISO_Comment',
+                       'Simple_Uppercase_Mapping',
+                       'Simple_Lowercase_Mapping',
+                       'Simple_Titlecase_Mapping'
+               );
+
+               $upper = array();
+               $lower = array();
+
+               $lineNum = 0;
+               while ( false !== ( $line = fgets( $file ) ) ) {
+                       ++$lineNum;
+
+                       # Strip comments
+                       $line = trim( substr( $line, 0, strcspn( $line, '#' ) ) );
+                       if ( $line === '' ) {
+                               continue;
+                       }
+
+                       # Split fields
+                       $numberedData = explode( ';', $line );
+                       $data = array();
+                       foreach ( $fieldNames as $number => $name ) {
+                               $data[$name] = $numberedData[$number];
+                       }
+
+                       $source = hexSequenceToUtf8( $data['Code'] );
+                       if ( $data['Simple_Uppercase_Mapping'] ) {
+                               $upper[$source] = hexSequenceToUtf8( $data['Simple_Uppercase_Mapping'] );
+                       }
+                       if ( $data['Simple_Lowercase_Mapping'] ) {
+                               $lower[$source] = hexSequenceToUtf8( $data['Simple_Lowercase_Mapping'] );
+                       }
+               }
+
+               global $IP;
+               file_put_contents( "$IP/serialized/Utf8Case.ser", serialize( array(
+                       'wikiUpperChars' => $upper,
+                       'wikiLowerChars' => $lower,
+               ) ) );
+       }
+}
+
+$maintClass = 'GenerateUtf8Case';
+require_once RUN_MAINTENANCE_IF_MAIN;
index d3c70d6..a7d1ceb 100644 (file)
@@ -246,6 +246,13 @@ $wgIgnoredMessages = array(
        'tags-summary',
        'comparepages-summary',
        'resettokens-summary',
+       'version-db-mysql-url',
+       'version-db-mariadb-url',
+       'version-db-percona-url',
+       'version-db-postgres-url',
+       'version-db-oracle-url',
+       'version-db-sqlite-url',
+       'version-db-mssql-url',
        'version-entrypoints-index-php',
        'version-entrypoints-api-php',
        'version-entrypoints-load-php',
index d9ef44a..3534810 100644 (file)
@@ -766,6 +766,8 @@ $wgMessageStructure = array(
                'invalid-content-data',
                'content-not-allowed-here',
                'editwarning-warning',
+               'editpage-notsupportedcontentformat-title',
+               'editpage-notsupportedcontentformat-text',
        ),
        'contentmodels' => array(
                'content-model-wikitext',
@@ -1037,7 +1039,6 @@ $wgMessageStructure = array(
                'rows',
                'columns',
                'searchresultshead',
-               'resultsperpage',
                'stub-threshold',
                'stub-threshold-disabled',
                'recentchangesdays',
@@ -3684,6 +3685,13 @@ $wgMessageStructure = array(
                'version-software',
                'version-software-product',
                'version-software-version',
+               'version-db-mysql-url',
+               'version-db-mariadb-url',
+               'version-db-percona-url',
+               'version-db-postgres-url',
+               'version-db-oracle-url',
+               'version-db-sqlite-url',
+               'version-db-mssql-url',
                'version-entrypoints',
                'version-entrypoints-header-entrypoint',
                'version-entrypoints-header-url',
index b9eb809..2a9bb4f 100644 (file)
@@ -144,6 +144,7 @@ class RebuildRecentchanges extends Maintenance {
                                                'rc_last_oldid' => $lastOldId,
                                                'rc_new' => $new,
                                                'rc_type' => $new,
+                                               'rc_source' => $new === 1 ? RecentChange::SRC_NEW : RecentChange::SRC_EDIT,
                                                'rc_old_len' => $lastSize,
                                                'rc_new_len' => $size,
                                        ), array(
@@ -196,6 +197,7 @@ class RebuildRecentchanges extends Maintenance {
                                'rc_this_oldid' => 0,
                                'rc_last_oldid' => 0,
                                'rc_type'       => RC_LOG,
+                               'rc_source'     => $dbw->addQuotes( RecentChange::SRC_LOG ),
                                'rc_cur_id'     => $dbw->cascadingDeletes() ? 'page_id' : 'COALESCE(page_id, 0)',
                                'rc_log_type'   => 'log_type',
                                'rc_log_action' => 'log_action',
index 4489ddb..01d4a3f 100644 (file)
@@ -894,6 +894,13 @@ return array(
                        'postedit-confirmation',
                ),
        ),
+       'mediawiki.action.view.redirectToFragment' => array(
+               'scripts' => 'resources/mediawiki.action/mediawiki.action.view.redirectToFragment.js',
+               'dependencies' => array(
+                       'jquery.client',
+               ),
+               'position' => 'top',
+       ),
        'mediawiki.action.view.rightClickEdit' => array(
                'scripts' => 'resources/mediawiki.action/mediawiki.action.view.rightClickEdit.js',
        ),
index 38938ab..55ea7c9 100644 (file)
@@ -1,6 +1,10 @@
 /* See also jquery.makeCollapsible.js */
 .mw-collapsible-toggle {
        float: right;
+       -moz-user-select: none;
+       -webkit-user-select: none;
+       -ms-user-select: none;
+       user-select: none;
 }
 
 /* collapse links in captions should be inline */
diff --git a/resources/mediawiki.action/mediawiki.action.view.redirectToFragment.js b/resources/mediawiki.action/mediawiki.action.view.redirectToFragment.js
new file mode 100644 (file)
index 0000000..1e2d624
--- /dev/null
@@ -0,0 +1,35 @@
+/**
+ * JavaScript to scroll the page to an id, when a redirect with fragment is viewed.
+ */
+( function ( mw, $ ) {
+       var profile = $.client.profile(),
+               fragment = mw.config.get( 'wgRedirectToFragment' );
+
+       if ( fragment === null ) {
+               // nothing to do
+               return;
+       }
+
+       if ( profile.layout === 'webkit' && profile.layoutVersion < 420 ) {
+               // Released Safari w/ WebKit 418.9.1 messes up horribly
+               // Nightlies of 420+ are ok
+               return;
+       }
+       if ( !window.location.hash ) {
+               window.location.hash = fragment;
+
+               // Mozilla needs to wait until after load, otherwise the window doesn't
+               // scroll.  See <https://bugzilla.mozilla.org/show_bug.cgi?id=516293>.
+               // There's no obvious way to detect this programmatically, so we use
+               // version-testing.  If Firefox fixes the bug, they'll jump twice, but
+               // better twice than not at all, so make the fix hit future versions as
+               // well.
+               if ( profile.layout === 'gecko' ) {
+                       $( function () {
+                               if ( window.location.hash === fragment ) {
+                                       window.location.hash = fragment;
+                               }
+                       } );
+               }
+       }
+}( mediaWiki, jQuery ) );
index f3bb414..5623575 100644 (file)
@@ -1815,6 +1815,38 @@ var mw = ( function ( $, undefined ) {
                                        // Cache hit stats
                                        stats: { hits: 0, misses: 0, expired: 0 },
 
+                                       // Experiment data
+                                       experiment: ( function () {
+                                               var start = ( new Date() ).getTime(), id = 0, seed = 0;
+
+                                               try {
+                                                       id = JSON.parse( localStorage.getItem( 'moduleStorageExperiment2' ) );
+                                                       if ( typeof id !== 'number' ) {
+                                                               id = Math.floor( Math.random() * Math.random() * 1e16 );
+                                                               localStorage.setItem( 'moduleStorageExperiment2', id );
+                                                       }
+                                                       seed = id % 2000;
+                                               } catch ( e ) {}
+
+                                               return {
+                                                       // Unique identifier for this browser. This allows us to group all
+                                                       // datapoints generated by a particular browser, which in turn allows us
+                                                       // to see how the initial load compares to subsequent page loads.
+                                                       id: id,
+
+                                                       // Group assignment may be 0 (not in experiment), 1 (control group), or 2
+                                                       // (experimental group). Browsers that don't implement all the prerequisite APIs
+                                                       // (JSON and Web Storage) are ineligible. Eligible browsers have a 0.1% chance
+                                                       // of being included in the experiment, in which case they are equally likely to
+                                                       // be assigned to either the experimental or control group.
+                                                       group: seed === 1 ? 1 : ( seed === 2 ? 2 : 0 ),
+
+                                                       // Assess module storage performance by measuring the time between this
+                                                       // reference point and the window load event.
+                                                       start: start
+                                               };
+                                       }() ),
+
                                        /**
                                         * Construct a JSON-serializable object representing the content of the store.
                                         * @return {Object} Module store contents.
@@ -1875,7 +1907,8 @@ var mw = ( function ( $, undefined ) {
                                                        return;
                                                }
 
-                                               if ( !mw.config.get( 'wgResourceLoaderStorageEnabled' ) || mw.config.get( 'debug' ) ) {
+                                               if ( ( !mw.config.get( 'wgResourceLoaderStorageEnabled' ) && mw.loader.store.experiment.group !== 2 )
+                                                       || mw.config.get( 'debug' ) ) {
                                                        // Disabled by configuration, or because debug mode is set
                                                        mw.loader.store.enabled = false;
                                                        return;
index 8fd8496..0713541 100644 (file)
@@ -18,6 +18,8 @@
                map = {
                        // SimpleSearch is broken in Opera < 9.6
                        opera: [['>=', 9.6]],
+                       // Older Konquerors are unable to position the suggestions correctly (bug 50805)
+                       konqueror: [['>=', '4.11']],
                        docomo: false,
                        blackberry: false,
                        ipod: false,
diff --git a/serialized/.gitignore b/serialized/.gitignore
new file mode 100644 (file)
index 0000000..d9d58dd
--- /dev/null
@@ -0,0 +1,4 @@
+/UnicodeData.txt
+/allkeys.txt
+/ucd.all.grouped.xml
+/ucd.all.grouped.zip
index 062155b..c7e7506 100644 (file)
@@ -1,7 +1,7 @@
-
-SPECIAL_TARGETS=Utf8Case.ser
+SPECIAL_TARGETS=Utf8Case.ser normalize-ar.ser normalize-ml.ser first-letters-root.ser
 ALL_TARGETS=$(SPECIAL_TARGETS)
 DIST_TARGETS=$(SPECIAL_TARGETS)
+UNICODE_VERSION=6.0.0
 
 .PHONY: all dist clean
 
@@ -13,6 +13,26 @@ dist: $(DIST_TARGETS)
 clean:
        rm -f $(ALL_TARGETS)
 
-Utf8Case.ser : ../includes/normal/Utf8Case.php
-       php serialize.php -o $@ $<
+Utf8Case.ser: UnicodeData.txt
+       php ../maintenance/language/generateUtf8Case.php
+
+normalize-ar.ser: UnicodeData.txt
+       php ../maintenance/language/generateNormalizerDataAr.php
+
+normalize-ml.ser:
+       php ../maintenance/language/generateNormalizerDataMl.php
+
+first-letters-root.ser: allkeys.txt ucd.all.grouped.xml
+       php ../maintenance/language/generateCollationData.php
+
+UnicodeData.txt:
+       wget http://www.unicode.org/Public/$(UNICODE_VERSION)/ucd/UnicodeData.txt
+
+allkeys.txt:
+       wget http://www.unicode.org/Public/UCA/$(UNICODE_VERSION)/allkeys.txt
+
+ucd.all.grouped.xml: ucd.all.grouped.zip
+       unzip ucd.all.grouped.zip ucd.all.grouped.xml
 
+ucd.all.grouped.zip:
+       wget http://www.unicode.org/Public/$(UNICODE_VERSION)/ucdxml/ucd.all.grouped.zip
diff --git a/serialized/serialize.php b/serialized/serialize.php
deleted file mode 100644 (file)
index 766c1a5..0000000
+++ /dev/null
@@ -1,95 +0,0 @@
-<?php
-/**
- * Serialize variables found in input file and store the result in the
- * specified file.
- *
- * 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
- */
-
-if ( !defined( 'MEDIAWIKI' ) ) {
-       $wgNoDBParam = true;
-       $optionsWithArgs = array( 'o' );
-       require_once __DIR__ .'/../maintenance/commandLine.inc';
-
-       $stderr = fopen( 'php://stderr', 'w' );
-       if ( !isset( $args[0] ) ) {
-               fwrite( $stderr, "No input file specified\n" );
-               exit( 1 );
-       }
-       if ( wfIsWindows() ) {
-               $files = array();
-               foreach ( $args as $arg ) {
-                       $files = array_merge( $files, glob( $arg ) );
-               }
-               if ( !$files ) {
-                       fwrite( $stderr, "No files found\n" );
-               }
-       } else {
-               $files = $args;
-       }
-
-       if ( isset( $options['o'] ) ) {
-               $out = fopen( $options['o'], 'wb' );
-               if ( !$out ) {
-                       fwrite( $stderr, "Unable to open file \"{$options['o']}\" for output\n" );
-                       exit( 1 );
-               }
-       } else {
-               $out = fopen( 'php://stdout', 'wb' );
-       }
-
-       $vars = array();
-       foreach ( $files as $inputFile ) {
-               $vars = array_merge( $vars, getVars( $inputFile ) );
-       }
-       fwrite( $out, serialize( $vars ) );
-       fclose( $out );
-       exit( 0 );
-}
-
-//----------------------------------------------------------------------------
-
-function getVars( $_gv_filename ) {
-       require $_gv_filename;
-       $vars = get_defined_vars();
-       unset( $vars['_gv_filename'] );
-
-       # Clean up line endings
-       if ( wfIsWindows() ) {
-               $vars = unixLineEndings( $vars );
-       }
-       return $vars;
-}
-
-function unixLineEndings( $var ) {
-       static $recursionLevel = 0;
-       if ( $recursionLevel > 50 ) {
-               global $stderr;
-               fwrite( $stderr, "Error: Recursion limit exceeded. Possible circular reference in array variable.\n" );
-               exit( 2 );
-       }
-
-       if ( is_array( $var ) ) {
-               ++$recursionLevel;
-               $var = array_map( 'unixLineEndings', $var );
-               --$recursionLevel;
-       } elseif ( is_string( $var ) ) {
-               $var = str_replace( "\r\n", "\n", $var );
-       }
-       return $var;
-}
index b068915..1657d97 100644 (file)
@@ -628,12 +628,6 @@ table.collapsed tr.collapsable {
        clear: both;
 }
 
-#mw_trackbacks {
-       border: solid 1px #bbbbff;
-       background-color: #eeeeff;
-       padding: 0.2em;
-}
-
 /**
  * Data table style
  *
index d28ca0a..f0aa943 100644 (file)
@@ -18,7 +18,14 @@ if ( mw.config.get( 'wgBreakFrames' ) ) {
        }
 }
 
-win.redirectToFragment = function ( fragment ) {
+/**
+ * Legacy function to scroll to an id while viewing the page over a redirect.
+ * Superseeded by module 'mediawiki.action.view.redirectToFragment' in version 1.23.
+ * Kepted because cache can contain still inline script calls to this function.
+ * Should be removed in version 1.24.
+ * @deprecated since 1.23 Use mediawiki.action.view.redirectToFragment instead
+ */
+mw.log.deprecate( win, 'redirectToFragment', function ( fragment ) {
        var webKitVersion,
                match = navigator.userAgent.match( /AppleWebKit\/(\d+)/ );
        if ( match ) {
@@ -46,7 +53,7 @@ win.redirectToFragment = function ( fragment ) {
                        } );
                }
        }
-};
+}, 'Use the module mediawiki.action.view.redirectToFragment instead.' );
 
 /**
  * User-agent sniffing.
@@ -226,8 +233,11 @@ win.importScriptURI = function ( url ) {
        return s;
 };
 
-win.importStylesheet = function( page ) {
-       return win.importStylesheetURI( mw.config.get( 'wgScript' ) + '?action=raw&ctype=text/css&title=' + mw.util.wikiUrlencode( page ) );
+win.importStylesheet = function ( page ) {
+       var uri = mw.config.get( 'wgScript' ) + '?title=' +
+               mw.util.wikiUrlencode( page ) +
+               '&action=raw&ctype=text/css';
+       return win.importStylesheetURI( uri );
 };
 
 win.importStylesheetURI = function( url, media ) {
diff --git a/skins/vector/collapsibleNav.less b/skins/vector/collapsibleNav.less
deleted file mode 100644 (file)
index e6f5c9a..0000000
+++ /dev/null
@@ -1,91 +0,0 @@
-/**
- * LESS Stylesheet for collapsible nav
- */
-@import "mediawiki.mixins.less";
-
-#mw-panel.collapsible-nav {
-       .portal {
-               background-position: left top;
-               background-repeat: no-repeat;
-               .background-image('images/portal-break.png');
-               padding: 0.25em 0 !important;
-               margin: -11px 9px 10px 11px;
-
-               h3 {
-                       font-size: @menu-main-heading-font-size;
-                       color: @collapsible-nav-heading-color;
-                       font-weight: normal;
-                       background-position: left center;
-                       background-repeat: no-repeat;
-                       .background-image-svg('images/arrow-expanded.svg', 'images/arrow-expanded.png');
-                       padding: @collapsible-nav-heading-padding;
-                       margin-bottom: 0;
-
-                       &:hover {
-                               cursor: pointer;
-                               text-decoration: none;
-                       }
-
-                       a {
-                               color: @collapsible-nav-heading-color;
-                               text-decoration: none;
-                       }
-               }
-
-               .body {
-                       margin: @collapsible-nav-body-margin;
-                       background-image: none !important;
-                       padding-top: 0;
-                       display: none;
-
-                       ul {
-                               li {
-                                       padding: 0.25em 0;
-                               }
-                       }
-               }
-
-
-               /* First */
-               &.first {
-                       background-image: none;
-                       margin-top: 0;
-                       h3 {
-                               display: none;
-                       }
-               }
-
-               /* Persistent */
-               &.persistent {
-                       .body {
-                               display: block;
-                               margin-left: 0.5em;
-                       }
-
-                       h3 {
-                               background-image: none !important;
-                               padding-left: 0.7em;
-                               cursor: default;
-                       }
-               }
-
-               /* Collapsed */
-               &.collapsed {
-                       h3 {
-                               color: @collapsible-nav-heading-collapsed-color;
-                               background-position: left center;
-                               background-repeat: no-repeat;
-                               .background-image-svg('images/arrow-collapsed-ltr.svg', 'images/arrow-collapsed-ltr.png');
-                               margin-bottom: 0;
-
-                               &:hover {
-                                       text-decoration: underline;
-                               }
-
-                               a {
-                                       color: @collapsible-nav-heading-collapsed-color;
-                               }
-                       }
-               }
-       }
-}
diff --git a/skins/vector/components/collapsibleNav.less b/skins/vector/components/collapsibleNav.less
new file mode 100644 (file)
index 0000000..e6f5c9a
--- /dev/null
@@ -0,0 +1,91 @@
+/**
+ * LESS Stylesheet for collapsible nav
+ */
+@import "mediawiki.mixins.less";
+
+#mw-panel.collapsible-nav {
+       .portal {
+               background-position: left top;
+               background-repeat: no-repeat;
+               .background-image('images/portal-break.png');
+               padding: 0.25em 0 !important;
+               margin: -11px 9px 10px 11px;
+
+               h3 {
+                       font-size: @menu-main-heading-font-size;
+                       color: @collapsible-nav-heading-color;
+                       font-weight: normal;
+                       background-position: left center;
+                       background-repeat: no-repeat;
+                       .background-image-svg('images/arrow-expanded.svg', 'images/arrow-expanded.png');
+                       padding: @collapsible-nav-heading-padding;
+                       margin-bottom: 0;
+
+                       &:hover {
+                               cursor: pointer;
+                               text-decoration: none;
+                       }
+
+                       a {
+                               color: @collapsible-nav-heading-color;
+                               text-decoration: none;
+                       }
+               }
+
+               .body {
+                       margin: @collapsible-nav-body-margin;
+                       background-image: none !important;
+                       padding-top: 0;
+                       display: none;
+
+                       ul {
+                               li {
+                                       padding: 0.25em 0;
+                               }
+                       }
+               }
+
+
+               /* First */
+               &.first {
+                       background-image: none;
+                       margin-top: 0;
+                       h3 {
+                               display: none;
+                       }
+               }
+
+               /* Persistent */
+               &.persistent {
+                       .body {
+                               display: block;
+                               margin-left: 0.5em;
+                       }
+
+                       h3 {
+                               background-image: none !important;
+                               padding-left: 0.7em;
+                               cursor: default;
+                       }
+               }
+
+               /* Collapsed */
+               &.collapsed {
+                       h3 {
+                               color: @collapsible-nav-heading-collapsed-color;
+                               background-position: left center;
+                               background-repeat: no-repeat;
+                               .background-image-svg('images/arrow-collapsed-ltr.svg', 'images/arrow-collapsed-ltr.png');
+                               margin-bottom: 0;
+
+                               &:hover {
+                                       text-decoration: underline;
+                               }
+
+                               a {
+                                       color: @collapsible-nav-heading-collapsed-color;
+                               }
+                       }
+               }
+       }
+}
diff --git a/skins/vector/components/common.less b/skins/vector/components/common.less
new file mode 100644 (file)
index 0000000..b70066a
--- /dev/null
@@ -0,0 +1,118 @@
+/*
+ * Any rules which should not be flipped automatically in right-to-left situations should be
+ * prepended with @noflip in a comment block.
+ *
+ * This stylesheet employs a few CSS trick to accomplish compatibility with a wide range of web
+ * browsers. The most common trick is to use some styles in IE6 only. This is accomplished by using
+ * a rule that makes things work in IE6, and then following it with a rule that begins with
+ * "html > body" or use a child selector ">", which is ignored by IE6 because it does not support
+ * the child selector. You can spot this by looking for the "OVERRIDDEN BY COMPLIANT BROWSERS" and
+ * "IGNORED BY IE6" comments.
+ */
+@import "mediawiki.mixins";
+
+/* Framework */
+html {
+       font-size: @html-font-size;
+}
+html,
+body {
+       height: 100%;
+       margin: 0;
+       padding: 0;
+       font-family: @content-font-family;
+}
+body {
+       background-color: #f6f6f6;
+       font-size: @body-font-size;
+}
+
+/* Content */
+div#content {
+       line-height: @content-line-height;
+       margin-left: 10em;
+       padding: @content-padding;
+       /* Border on top, left, and bottom side */
+       border: 1px solid #a7d7f9;
+       border-right-width: 0;
+       /* Merge the border with tabs' one (in their background image) */
+       margin-top: -1px;
+       background-color: white;
+       color: @content-font-color;
+       direction: ltr;
+}
+
+/* Hide empty portlets */
+div.emptyPortlet {
+               display: none;
+}
+
+ul {
+       list-style-type: disc;
+       .list-style-image('images/bullet-icon.png');
+}
+
+pre, .mw-code {
+       line-height: 1.3em;
+}
+
+/* Site Notice (includes notices from CentralNotice extension) */
+#siteNotice {
+       font-size: 0.8em;
+}
+
+#firstHeading {
+       padding-top: 0;
+       margin-top: 0;
+       font-size: @content-heading-font-size;
+}
+
+.redirectText {
+       font-size: 140%;
+}
+
+.redirectMsg img {
+       vertical-align: text-bottom;
+}
+
+#bodyContent {
+       position: relative;
+       width: 100%;
+       line-height: 1.5em;
+       font-size: @content-font-size;
+}
+
+/* Tooltips are outside of the normal body code, so this helps make the size of the text sensible */
+// FIXME: Should be part of jquery.tipsy.css
+.tipsy {
+       font-size: 0.8em;
+}
+
+/* Animate between standard and high definition layouts */
+body.vector-animateLayout {
+       div#content,
+       div#footer,
+       #left-navigation {
+               .transition(margin-left 250ms, padding 250ms;);
+       }
+
+       #p-logo {
+               .transition(left 250ms);
+       }
+
+       #mw-panel {
+               .transition(padding-right 250ms);
+       }
+
+       #p-search {
+               .transition(margin-right 250ms);
+       }
+
+       #p-personal {
+               .transition(right 250ms);
+       }
+
+       #mw-head-base {
+               .transition(margin-left 250ms);
+       }
+}
diff --git a/skins/vector/components/externalLinks.less b/skins/vector/components/externalLinks.less
new file mode 100644 (file)
index 0000000..3e26a22
--- /dev/null
@@ -0,0 +1,75 @@
+// FIXME: This size of this CSS is ridiculous. Please refactor (see bug 54604)
+@import "mediawiki.mixins.less";
+
+div#content a.external {
+       background-position: center right;
+       background-repeat: no-repeat;
+       .background-image-svg('images/external-link-ltr-icon.svg', 'images/external-link-ltr-icon.png');
+       padding-right: 13px;
+}
+div#content a.external[href ^="https://"],
+.link-https {
+       background-position: center right;
+       background-repeat: no-repeat;
+       .background-image-svg('images/lock-icon.svg', 'images/lock-icon.png');
+       padding-right: 13px;
+}
+div#content a.external[href ^="mailto:"],
+.link-mailto {
+       background-position: center right;
+       background-repeat: no-repeat;
+       .background-image-svg('images/mail-icon.svg', 'images/mail-icon.png');
+       padding-right: 13px;
+}
+div#content a.external[href ^="news:"] {
+       background-position: center right;
+       background-repeat: no-repeat;
+       .background-image-svg('images/news-icon.svg', 'images/news-icon.png');
+       padding-right: 13px;
+}
+div#content a.external[href ^="ftp://"],
+.link-ftp {
+       background-position: center right;
+       background-repeat: no-repeat;
+       .background-image-svg('images/file-icon.svg', 'images/file-icon.png');
+       padding-right: 13px;
+}
+div#content a.external[href ^="irc://"],
+div#content a.external[href ^="ircs://"],
+.link-irc {
+       background-position: center right;
+       background-repeat: no-repeat;
+       .background-image-svg('images/talk-icon.svg', 'images/talk-icon.png');
+       padding-right: 13px;
+}
+div#content a.external[href $=".ogg"], div#content a.external[href $=".OGG"],
+div#content a.external[href $=".mid"], div#content a.external[href $=".MID"],
+div#content a.external[href $=".midi"], div#content a.external[href $=".MIDI"],
+div#content a.external[href $=".mp3"], div#content a.external[href $=".MP3"],
+div#content a.external[href $=".wav"], div#content a.external[href $=".WAV"],
+div#content a.external[href $=".wma"], div#content a.external[href $=".WMA"],
+.link-audio {
+       background-position: center right;
+       background-repeat: no-repeat;
+       .background-image-svg('images/audio-icon.svg', 'images/audio-icon.png');
+       padding-right: 13px;
+}
+div#content a.external[href $=".ogm"], div#content a.external[href $=".OGM"],
+div#content a.external[href $=".avi"], div#content a.external[href $=".AVI"],
+div#content a.external[href $=".mpeg"], div#content a.external[href $=".MPEG"],
+div#content a.external[href $=".mpg"], div#content a.external[href $=".MPG"],
+.link-video {
+       background-position: center right;
+       background-repeat: no-repeat;
+       .background-image-svg('images/video-icon.svg', 'images/video-icon.png');
+       padding-right: 13px;
+}
+div#content a.external[href $=".pdf"], div#content a.external[href $=".PDF"],
+div#content a.external[href *=".pdf#"], div#content a.external[href *=".PDF#"],
+div#content a.external[href *=".pdf?"], div#content a.external[href *=".PDF?"],
+.link-document {
+       background-position: center right;
+       background-repeat: no-repeat;
+       .background-image-svg('images/document-icon.svg', 'images/document-icon.png');
+       padding-right: 13px;
+}
diff --git a/skins/vector/components/footer.less b/skins/vector/components/footer.less
new file mode 100644 (file)
index 0000000..3d61b66
--- /dev/null
@@ -0,0 +1,57 @@
+/* Footer */
+div#footer {
+       margin-left: 10em;
+       margin-top: 0;
+       padding: 0.75em;
+       direction: ltr;
+
+       ul {
+               list-style-type: none;
+               list-style-image: none;
+               margin: 0;
+               padding: 0;
+
+               li {
+                       margin: 0;
+                       padding: 0;
+                       padding-top: 0.5em;
+                       padding-bottom: 0.5em;
+                       color: #333;
+                       font-size: 0.7em;
+               }
+       }
+
+       #footer-icons {
+               float: right;
+
+               li {
+                       float: left;
+                       margin-left: 0.5em;
+                       line-height: 2em;
+                       text-align: right;
+               }
+       }
+
+       #footer-info {
+               li {
+                       line-height: 1.4em;
+               }
+       }
+
+       #footer-places {
+               li {
+                       float: left;
+                       margin-right: 1em;
+                       line-height: 2em;
+               }
+       }
+}
+
+body.ltr {
+       div#footer {
+               #footer-places {
+                       /* @noflip */
+                       float: left;
+               }
+       }
+}
diff --git a/skins/vector/components/navigation.less b/skins/vector/components/navigation.less
new file mode 100644 (file)
index 0000000..4512efa
--- /dev/null
@@ -0,0 +1,132 @@
+@import "mediawiki.mixins";
+@import "personalMenu";
+@import "collapsibleNav";
+@import "search";
+@import "tabs";
+
+/* Hide, but keep accessible for screen-readers */
+#mw-navigation h2 {
+       position: absolute;
+       top: -9999px;
+}
+
+/* Head */
+#mw-page-base {
+       height: 5em;
+       background-color: white;
+       .background-image('images/page-fade.png');
+       background-position: bottom left;
+       background-repeat: repeat-x;
+}
+
+#mw-head-base {
+       margin-top: -5em;
+       margin-left: 10em;
+       height: 5em;
+}
+
+div#mw-head {
+       position: absolute;
+       top: 0;
+       right: 0;
+       width: 100%;
+
+       h3 {
+               margin: 0;
+               padding: 0;
+       }
+}
+
+/* Navigation Containers */
+#left-navigation {
+       float: left;
+       margin-left: 10em;
+       margin-top: 2.5em;
+       /* When right nav would overlap left nav, it's placed below it
+          (normal CSS floats behavior). This rule ensures that no empty space
+          is shown between them due to right nav's margin-top. Page layout
+          is still broken, but at least the nav overlaps only the page title
+          instead of half the content. */
+       margin-bottom: -2.5em;
+       /* IE 6 double-margin bug fix */
+       display: inline;
+}
+
+#right-navigation {
+       float: right;
+       margin-top: 2.5em;
+}
+
+/* Logo */
+#p-logo {
+       position: absolute;
+       top: -160px;
+       left: 0;
+       width: 10em;
+       height: 160px;
+
+       a {
+               display: block;
+               width: 10em;
+               height: 160px;
+               background-repeat: no-repeat;
+               background-position: center center;
+               text-decoration: none;
+       }
+}
+
+/* Panel */
+div#mw-panel {
+       font-size: @menu-main-font-size;
+       position: absolute;
+       top: 160px;
+       padding-top: 1em;
+       width: 10em;
+       left: 0;
+
+       div.portal {
+               padding-bottom: 1.5em;
+               direction: ltr;
+
+               h3 {
+                       font-weight: normal;
+                       color: #444;
+                       padding: @menu-main-heading-padding;
+                       cursor: default;
+                       border: none;
+                       font-size: @menu-main-heading-font-size;
+               }
+
+               div.body {
+                       padding-top: 0.5em;
+                       margin: @menu-main-body-margin;
+
+                       .background-image('images/portal-break.png');
+                       background-repeat: no-repeat;
+                       background-position: top left;
+
+                       ul {
+                               list-style-type: none;
+                               list-style-image: none;
+                               padding: @menu-main-body-padding;
+                               margin: 0;
+
+                               li {
+                                       line-height: 1.125em;
+                                       padding: 0;
+                                       padding-bottom: 0.5em;
+                                       margin: 0;
+                                       font-size: @menu-main-body-font-size;
+                                       word-wrap: break-word;
+
+                                       a {
+                                               color: @menu-main-body-link-color;
+                                               &:visited {
+                                                       color: @menu-main-body-link-visited-color;
+                                               }
+                                       }
+                               }
+                       }
+               }
+       }
+}
diff --git a/skins/vector/components/notifications.less b/skins/vector/components/notifications.less
new file mode 100644 (file)
index 0000000..43b9882
--- /dev/null
@@ -0,0 +1,20 @@
+/* mediawiki.notification */
+.skin-vector {
+       .mw-notification-area {
+               font-size: 0.8em;
+       }
+
+       .mw-notification-area-layout {
+               top: 7em;
+       }
+
+       .mw-notification {
+               background-color: #fff;
+               background-color: rgba(255, 255, 255, 0.93);
+               padding: 0.75em 1.5em;
+               border: solid 1px #a7d7f9;
+               border-radius: 0.75em;
+               -webkit-box-shadow: 0 2px 10px 0 rgba(0, 0, 0, 0.125);
+               box-shadow: 0 2px 10px 0 rgba(0, 0, 0, 0.125);
+       }
+}
diff --git a/skins/vector/components/personalMenu.less b/skins/vector/components/personalMenu.less
new file mode 100644 (file)
index 0000000..7256929
--- /dev/null
@@ -0,0 +1,41 @@
+/* Personal */
+#p-personal {
+       position: absolute;
+       top: 0.33em;
+       right: 0.75em;
+       /* Display on top of page tabs - bugs 37158, 48078 */
+       z-index: 100;
+
+       h3 {
+               display: none;
+       }
+
+       ul {
+               list-style-type: none;
+               list-style-image: none;
+               margin: 0;
+               padding-left: 10em; /* Keep from overlapping logo */
+       }
+
+       li {
+               line-height: 1.125em;
+               /* @noflip */
+               float: left;
+               margin-left: 0.75em;
+               margin-top: 0.5em;
+               font-size: @menu-personal-font-size;
+               white-space: nowrap;
+       }
+}
+
+/* Icon for Usernames */
+#pt-userpage,
+#pt-anonuserpage,
+#pt-login {
+       background-position: left top;
+       background-repeat: no-repeat;
+       /* SVG support using a transparent gradient to guarantee cross-browser
+        * compatibility (browsers able to understand gradient syntax support also SVG) */
+       .background-image-svg('images/user-icon.svg', 'images/user-icon.png');
+       padding-left: 15px !important;
+}
diff --git a/skins/vector/components/search.less b/skins/vector/components/search.less
new file mode 100644 (file)
index 0000000..5d716b6
--- /dev/null
@@ -0,0 +1,98 @@
+/* Search */
+#p-search {
+       /* @noflip */
+       float: left;
+       margin-right: 0.5em;
+       margin-left: 0.5em;
+
+       h3 {
+               display: none;
+       }
+
+       form,
+       input {
+               margin: 0;
+               margin-top: 0.4em;
+       }
+}
+
+div#simpleSearch {
+       display: block;
+       width: 14em;
+       height: 1.4em;
+       margin-top: 0.65em;
+       position: relative;
+       min-height: 1px; /* Gotta trigger hasLayout for IE7 */
+       border: solid 1px #aaa;
+       color: black;
+       background-color: white;
+       .background-image('images/search-fade.png');
+       background-position: top left;
+       background-repeat: repeat-x;
+
+       input {
+               color: black;
+               &:focus {
+                       outline: none;
+               }
+
+               &.placeholder {
+                       color: #999;
+               }
+
+               &:-ms-input-placeholder,
+               &:-moz-placeholder,
+               &::-webkit-input-placeholder {
+                       color: #999;
+               }
+
+               &#searchInput {
+                       position: absolute;
+                       top: 0;
+                       left: 0;
+                       width: 90%;
+                       margin: 0;
+                       padding: 0;
+                       padding-left: 0.2em;
+                       padding-top: 0.2em;
+                       padding-bottom: 0.2em;
+                       outline: none;
+                       border: none;
+                       /*
+                        * DON'T PANIC! Browsers that won't scale this properly are the same browsers that have JS issues that prevent
+                        * this from ever being shown anyways.
+                       */
+                       font-size: 13px;
+                       background-color: transparent;
+                       direction: ltr;
+               }
+       }
+
+       button#searchButton {
+               position: absolute;
+               width: 10%;
+               right: 0;
+               top: 0;
+               padding: 0;
+               padding-top: 0.3em;
+               padding-bottom: 0.2em;
+               padding-right: 0.4em;
+               margin: 0;
+               border: none;
+               cursor: pointer;
+               background-color: transparent;
+               background-image: none;
+
+               /* OVERRIDDEN BY COMPLIANT BROWSERS */
+               img {
+                       border: none;
+                       margin: 0;
+                       margin-top: -3px;
+                       padding: 0;
+               }
+               /* IGNORED BY IE6 */
+               > img {
+                       margin: 0;
+               }
+       }
+}
diff --git a/skins/vector/components/tabs.less b/skins/vector/components/tabs.less
new file mode 100644 (file)
index 0000000..43e77cd
--- /dev/null
@@ -0,0 +1,273 @@
+/*
+Styling for namespace tabs (page, discussion) and views (read, edit, view history, watch and other actions)
+*/
+
+/* Navigation Labels */
+div.vectorTabs h3,
+div.vectorMenu h3 span {
+       display: none;
+}
+
+/* Namespaces and Views */
+div.vectorTabs {
+       /* @noflip */
+       float: left;
+       height: 2.5em;
+       .background-image('images/tab-break.png');
+       background-position: bottom left;
+       background-repeat: no-repeat;
+       padding-left: 1px;
+
+       ul {
+               /* @noflip */
+               float: left;
+               height: 100%;
+               list-style-type: none;
+               list-style-image: none;
+               margin: 0;
+               padding: 0;
+               .background-image('images/tab-break.png');
+               background-position: right bottom;
+               background-repeat: no-repeat;
+
+               li {
+                       /* @noflip */
+                       float: left;
+                       line-height: 1.125em;
+                       /* For IE6, overridden later to display:block by modern browsers */
+                       display: inline-block;
+                       height: 100%;
+                       margin: 0;
+                       padding: 0;
+                       background-color: #f3f3f3;
+                       .background-image('images/tab-normal-fade.png');
+                       background-position: bottom left;
+                       background-repeat: repeat-x;
+                       white-space: nowrap;
+               }
+
+               /* IGNORED BY IE6 which doesn't support child selector */
+               > li {
+                       display: block;
+               }
+       }
+
+       li {
+               &.new {
+                       a,
+                       a:visited{
+                               color: #a55858;
+                       }
+               }
+
+               &.selected {
+                       .background-image('images/tab-current-fade.png');
+                       a,
+                       a:visited{
+                               color: #333;
+                               text-decoration: none;
+                       }
+               }
+
+               &.icon {
+                       a {
+                               background-position: bottom right;
+                               background-repeat: no-repeat;
+                       }
+               }
+
+               a {
+                       /* For IE6, overridden later to display:block by modern browsers */
+                       display: inline-block;
+                       height: 1.9em;
+                       padding-left: 0.5em;
+                       padding-right: 0.5em;
+                       color: @menu-link-color;
+                       cursor: pointer;
+                       font-size: 0.8em;
+               }
+
+               /* Ignored by IE6 which doesn't support child selector */
+               > a {
+                       display: block;
+               }
+       }
+
+       span {
+               display: inline-block;
+               .background-image('images/tab-break.png');
+               background-position: bottom right;
+               background-repeat: no-repeat;
+
+               a  {
+                       /* For IE6, overridden later to display:block by modern browsers */
+                       display: inline-block;
+                       padding-top: 1.25em;
+               }
+
+               /* Ignored by IE6 which doesn't support child selector */
+               > a {
+                       /* @noflip */
+                       float: left;
+                       display: block;
+               }
+       }
+}
+
+/* Variants and Actions */
+div.vectorMenu {
+       /* @noflip */
+       direction: ltr;
+       /* @noflip */
+       float: left;
+       /* SVG support using a transparent gradient to guarantee cross-browser
+        * compatibility (browsers able to understand gradient syntax support also SVG) */
+       .background-image-svg('images/arrow-down-icon.svg', 'images/arrow-down-icon.png');
+       /* @noflip */
+       background-position: 100% 60%;
+       background-repeat: no-repeat;
+       cursor: pointer;
+}
+
+div.vectorMenuFocus {
+       /* SVG support using a transparent gradient to guarantee cross-browser
+        * compatibility (browsers able to understand gradient syntax support also SVG) */
+       .background-image-svg('images/arrow-down-focus-icon.svg', 'images/arrow-down-focus-icon.png');
+       background-position: 100% 60%;
+}
+
+body.rtl div.vectorMenu {
+       /* @noflip */
+       direction: rtl;
+}
+
+/* OVERRIDDEN BY COMPLIANT BROWSERS */
+div#mw-head div.vectorMenu h3 {
+       /* @noflip */
+       float: left;
+       .background-image('images/tab-break.png');
+       background-repeat: no-repeat;
+       background-position: bottom left;
+       margin-left: -1px;
+}
+
+/* IGNORED BY IE6 */
+div#mw-head div.vectorMenu > h3 {
+       background-image: none;
+}
+
+div#mw-head div.vectorMenu h4,
+div.vectorMenu#p-variants #mw-vector-current-variant {
+       display: inline-block;
+       float: left;
+       font-size: 0.8em;
+       padding-left: 0.5em;
+       padding-top: 1.375em;
+       font-weight: normal;
+       border: none;
+}
+
+/* OVERRIDDEN BY COMPLIANT BROWSERS */
+div.vectorMenu h3 a {
+       display: inline-block;
+       width: 24px;
+       height: 1.9em;
+       text-decoration: none;
+       .background-image('images/tab-break.png');
+       background-repeat: no-repeat;
+       background-position: bottom right;
+}
+
+/* IGNORED BY IE6 */
+div.vectorMenu h3 > a {
+       display: block;
+}
+
+div.vectorMenu div.menu {
+       position: relative;
+       display: none;
+       clear: both;
+       text-align: left;
+}
+
+/* OVERRIDDEN BY COMPLIANT BROWSERS */
+body.rtl div.vectorMenu div.menu {
+       /* @noflip */
+       margin-left: 24px;
+}
+
+/* IGNORED BY IE6 */
+body.rtl div.vectorMenu > div.menu {
+       /* @noflip */
+       margin-left: auto;
+}
+
+/* IGNORED BY IE6 */
+/* Also fixes old versions of FireFox */
+body.rtl div.vectorMenu > div.menu,
+x:-moz-any-link {
+       /* @noflip */
+       margin-left: 23px;
+}
+
+/* Enable forcing showing of the menu for accessibility */
+div.vectorMenu:hover div.menu,
+div.vectorMenu div.menuForceShow {
+       display: block;
+}
+
+div.vectorMenu ul {
+       position: absolute;
+       background-color: white;
+       border: solid 1px silver;
+       border-top-width: 0;
+       list-style-type: none;
+       list-style-image: none;
+       padding: 0;
+       margin: 0;
+       margin-left: -1px;
+       text-align: left;
+}
+
+/* Fixes old versions of FireFox */
+div.vectorMenu ul,
+x:-moz-any-link {
+       min-width: 5em;
+}
+
+/* Returns things back to normal in modern versions of FireFox */
+div.vectorMenu ul,
+x:-moz-any-link,
+x:default {
+       min-width: 0;
+}
+
+div.vectorMenu li {
+       padding: 0;
+       margin: 0;
+       text-align: left;
+       line-height: 1em;
+}
+
+/* OVERRIDDEN BY COMPLIANT BROWSERS */
+div.vectorMenu li a {
+       display: inline-block;
+       padding: 0.5em;
+       white-space: nowrap;
+       color: @menu-link-color;
+       cursor: pointer;
+       font-size: 0.8em;
+}
+
+/* IGNORED BY IE6 */
+div.vectorMenu li > a {
+       display: block;
+}
+
+div.vectorMenu li.selected a,
+div.vectorMenu li.selected a:visited {
+       color: #333;
+       text-decoration: none;
+}
+
+@import 'watchstar.less';
diff --git a/skins/vector/components/watchstar.less b/skins/vector/components/watchstar.less
new file mode 100644 (file)
index 0000000..6f93215
--- /dev/null
@@ -0,0 +1,40 @@
+/* Watch/Unwatch Icon Styling */
+#ca-unwatch.icon a,
+#ca-watch.icon a {
+       margin: 0;
+       padding: 0;
+       outline: none;
+       display: block;
+       width: 26px;
+       /* This hides the text but shows the background image */
+       padding-top: 3.1em;
+       margin-top: 0;
+       /* Only applied in IE6 */
+       margin-top: -0.8em !ie;
+       height: 0;
+       overflow: hidden;
+       .background-image('images/watch-icons.png');
+}
+#ca-unwatch.icon a {
+       background-position: -43px 60%;
+}
+#ca-watch.icon a {
+       background-position: 5px 60%;
+}
+#ca-unwatch.icon a:hover,
+#ca-unwatch.icon a:focus {
+       background-position: -67px 60%;
+}
+#ca-watch.icon a:hover,
+#ca-watch.icon a:focus {
+       background-position: -19px 60%;
+}
+#ca-unwatch.icon a.loading,
+#ca-watch.icon a.loading {
+       .background-image('images/watch-icon-loading.gif');
+       background-position: 5px 60%;
+}
+#ca-unwatch.icon a span,
+#ca-watch.icon a span {
+       display: none;
+}
diff --git a/skins/vector/externalLinks.less b/skins/vector/externalLinks.less
deleted file mode 100644 (file)
index 3e26a22..0000000
+++ /dev/null
@@ -1,75 +0,0 @@
-// FIXME: This size of this CSS is ridiculous. Please refactor (see bug 54604)
-@import "mediawiki.mixins.less";
-
-div#content a.external {
-       background-position: center right;
-       background-repeat: no-repeat;
-       .background-image-svg('images/external-link-ltr-icon.svg', 'images/external-link-ltr-icon.png');
-       padding-right: 13px;
-}
-div#content a.external[href ^="https://"],
-.link-https {
-       background-position: center right;
-       background-repeat: no-repeat;
-       .background-image-svg('images/lock-icon.svg', 'images/lock-icon.png');
-       padding-right: 13px;
-}
-div#content a.external[href ^="mailto:"],
-.link-mailto {
-       background-position: center right;
-       background-repeat: no-repeat;
-       .background-image-svg('images/mail-icon.svg', 'images/mail-icon.png');
-       padding-right: 13px;
-}
-div#content a.external[href ^="news:"] {
-       background-position: center right;
-       background-repeat: no-repeat;
-       .background-image-svg('images/news-icon.svg', 'images/news-icon.png');
-       padding-right: 13px;
-}
-div#content a.external[href ^="ftp://"],
-.link-ftp {
-       background-position: center right;
-       background-repeat: no-repeat;
-       .background-image-svg('images/file-icon.svg', 'images/file-icon.png');
-       padding-right: 13px;
-}
-div#content a.external[href ^="irc://"],
-div#content a.external[href ^="ircs://"],
-.link-irc {
-       background-position: center right;
-       background-repeat: no-repeat;
-       .background-image-svg('images/talk-icon.svg', 'images/talk-icon.png');
-       padding-right: 13px;
-}
-div#content a.external[href $=".ogg"], div#content a.external[href $=".OGG"],
-div#content a.external[href $=".mid"], div#content a.external[href $=".MID"],
-div#content a.external[href $=".midi"], div#content a.external[href $=".MIDI"],
-div#content a.external[href $=".mp3"], div#content a.external[href $=".MP3"],
-div#content a.external[href $=".wav"], div#content a.external[href $=".WAV"],
-div#content a.external[href $=".wma"], div#content a.external[href $=".WMA"],
-.link-audio {
-       background-position: center right;
-       background-repeat: no-repeat;
-       .background-image-svg('images/audio-icon.svg', 'images/audio-icon.png');
-       padding-right: 13px;
-}
-div#content a.external[href $=".ogm"], div#content a.external[href $=".OGM"],
-div#content a.external[href $=".avi"], div#content a.external[href $=".AVI"],
-div#content a.external[href $=".mpeg"], div#content a.external[href $=".MPEG"],
-div#content a.external[href $=".mpg"], div#content a.external[href $=".MPG"],
-.link-video {
-       background-position: center right;
-       background-repeat: no-repeat;
-       .background-image-svg('images/video-icon.svg', 'images/video-icon.png');
-       padding-right: 13px;
-}
-div#content a.external[href $=".pdf"], div#content a.external[href $=".PDF"],
-div#content a.external[href *=".pdf#"], div#content a.external[href *=".PDF#"],
-div#content a.external[href *=".pdf?"], div#content a.external[href *=".PDF?"],
-.link-document {
-       background-position: center right;
-       background-repeat: no-repeat;
-       .background-image-svg('images/document-icon.svg', 'images/document-icon.png');
-       padding-right: 13px;
-}
diff --git a/skins/vector/screen.less b/skins/vector/screen.less
deleted file mode 100644 (file)
index 4651b48..0000000
+++ /dev/null
@@ -1,693 +0,0 @@
-/*
- * Any rules which should not be flipped automatically in right-to-left situations should be
- * prepended with @noflip in a comment block.
- *
- * This stylesheet employs a few CSS trick to accomplish compatibility with a wide range of web
- * browsers. The most common trick is to use some styles in IE6 only. This is accomplished by using
- * a rule that makes things work in IE6, and then following it with a rule that begins with
- * "html > body" or use a child selector ">", which is ignored by IE6 because it does not support
- * the child selector. You can spot this by looking for the "OVERRIDDEN BY COMPLIANT BROWSERS" and
- * "IGNORED BY IE6" comments.
- */
-@import "mediawiki.mixins";
-
-/* Framework */
-html {
-       font-size: @html-font-size;
-}
-html,
-body {
-       height: 100%;
-       margin: 0;
-       padding: 0;
-       font-family: @content-font-family;
-}
-body {
-       background-color: #f6f6f6;
-       font-size: @body-font-size;
-}
-/* Content */
-div#content {
-       line-height: @content-line-height;
-       margin-left: 10em;
-       padding: @content-padding;
-       /* Border on top, left, and bottom side */
-       border: 1px solid #a7d7f9;
-       border-right-width: 0;
-       /* Merge the border with tabs' one (in their background image) */
-       margin-top: -1px;
-       background-color: white;
-       color: @content-font-color;
-       direction: ltr;
-}
-/* Hide, but keep accessible for screen-readers */
-#mw-navigation h2 {
-       position: absolute;
-       top: -9999px;
-}
-/* Head */
-#mw-page-base {
-       height: 5em;
-       background-color: white;
-       .background-image('images/page-fade.png');
-       background-position: bottom left;
-       background-repeat: repeat-x;
-}
-#mw-head-base {
-       margin-top: -5em;
-       margin-left: 10em;
-       height: 5em;
-}
-div#mw-head {
-       position: absolute;
-       top: 0;
-       right: 0;
-       width: 100%;
-}
-div#mw-head h3 {
-       margin: 0;
-       padding: 0;
-}
-/* Hide empty portlets */
-div.emptyPortlet {
-               display: none;
-}
-/* Personal */
-#p-personal {
-       position: absolute;
-       top: 0.33em;
-       right: 0.75em;
-       /* Display on top of page tabs - bugs 37158, 48078 */
-       z-index: 100;
-}
-#p-personal h3 {
-       display: none;
-}
-#p-personal ul {
-       list-style-type: none;
-       list-style-image: none;
-       margin: 0;
-       padding-left: 10em; /* Keep from overlapping logo */
-}
-#p-personal li {
-       line-height: 1.125em;
-       /* @noflip */
-       float: left;
-       margin-left: 0.75em;
-       margin-top: 0.5em;
-       font-size: @menu-personal-font-size;
-       white-space: nowrap;
-}
-/* Navigation Containers */
-#left-navigation {
-       float: left;
-       margin-left: 10em;
-       margin-top: 2.5em;
-       /* When right nav would overlap left nav, it's placed below it
-          (normal CSS floats behavior). This rule ensures that no empty space
-          is shown between them due to right nav's margin-top. Page layout
-          is still broken, but at least the nav overlaps only the page title
-          instead of half the content. */
-       margin-bottom: -2.5em;
-       /* IE 6 double-margin bug fix */
-       display: inline;
-}
-#right-navigation {
-       float: right;
-       margin-top: 2.5em;
-}
-/* Navigation Labels */
-div.vectorTabs h3,
-div.vectorMenu h3 span {
-       display: none;
-}
-/* Namespaces and Views */
-div.vectorTabs {
-       /* @noflip */
-       float: left;
-       height: 2.5em;
-}
-div.vectorTabs {
-       .background-image('images/tab-break.png');
-       background-position: bottom left;
-       background-repeat: no-repeat;
-       padding-left: 1px;
-}
-div.vectorTabs ul {
-       /* @noflip */
-       float: left;
-       height: 100%;
-       list-style-type: none;
-       list-style-image: none;
-       margin: 0;
-       padding: 0;
-}
-/* OVERRIDDEN BY COMPLIANT BROWSERS */
-div.vectorTabs ul li {
-       /* @noflip */
-       float: left;
-       line-height: 1.125em;
-       display: inline-block;
-       height: 100%;
-       margin: 0;
-       padding: 0;
-       background-color: #f3f3f3;
-       .background-image('images/tab-normal-fade.png');
-       background-position: bottom left;
-       background-repeat: repeat-x;
-       white-space: nowrap;
-}
-/* IGNORED BY IE6 */
-div.vectorTabs ul > li {
-       display: block;
-}
-div.vectorTabs li.selected {
-       .background-image('images/tab-current-fade.png');
-}
-/* OVERRIDDEN BY COMPLIANT BROWSERS */
-div.vectorTabs li a {
-       display: inline-block;
-       height: 1.9em;
-       padding-left: 0.5em;
-       padding-right: 0.5em;
-       color: @menu-link-color;
-       cursor: pointer;
-       font-size: 0.8em;
-}
-/* IGNORED BY IE6 */
-div.vectorTabs li > a {
-       display: block;
-}
-div.vectorTabs li.icon a {
-       background-position: bottom right;
-       background-repeat: no-repeat;
-}
-/* OVERRIDDEN BY COMPLIANT BROWSERS */
-div.vectorTabs span a {
-       display: inline-block;
-       padding-top: 1.25em;
-}
-/* IGNORED BY IE6 */
-div.vectorTabs span > a {
-       /* @noflip */
-       float: left;
-       display: block;
-}
-div.vectorTabs span {
-       display: inline-block;
-       .background-image('images/tab-break.png');
-       background-position: bottom right;
-       background-repeat: no-repeat;
-}
-div.vectorTabs li.selected a,
-div.vectorTabs li.selected a:visited{
-       color: #333;
-       text-decoration: none;
-}
-div.vectorTabs li.new a,
-div.vectorTabs li.new a:visited{
-       color: #a55858;
-}
-/* Variants and Actions */
-div.vectorMenu {
-       /* @noflip */
-       direction: ltr;
-       /* @noflip */
-       float: left;
-       /* SVG support using a transparent gradient to guarantee cross-browser
-        * compatibility (browsers able to understand gradient syntax support also SVG) */
-       .background-image-svg('images/arrow-down-icon.svg', 'images/arrow-down-icon.png');
-       /* @noflip */
-       background-position: 100% 60%;
-       background-repeat: no-repeat;
-       cursor: pointer;
-}
-div.vectorMenuFocus {
-       /* SVG support using a transparent gradient to guarantee cross-browser
-        * compatibility (browsers able to understand gradient syntax support also SVG) */
-       .background-image-svg('images/arrow-down-focus-icon.svg', 'images/arrow-down-focus-icon.png');
-       background-position: 100% 60%;
-}
-body.rtl div.vectorMenu {
-       /* @noflip */
-       direction: rtl;
-}
-/* OVERRIDDEN BY COMPLIANT BROWSERS */
-div#mw-head div.vectorMenu h3 {
-       /* @noflip */
-       float: left;
-       .background-image('images/tab-break.png');
-       background-repeat: no-repeat;
-       background-position: bottom left;
-       margin-left: -1px;
-}
-/* IGNORED BY IE6 */
-div#mw-head div.vectorMenu > h3 {
-       background-image: none;
-}
-div#mw-head div.vectorMenu h4,
-div.vectorMenu#p-variants #mw-vector-current-variant {
-       display: inline-block;
-       float: left;
-       font-size: 0.8em;
-       padding-left: 0.5em;
-       padding-top: 1.375em;
-       font-weight: normal;
-       border: none;
-}
-/* OVERRIDDEN BY COMPLIANT BROWSERS */
-div.vectorMenu h3 a {
-       display: inline-block;
-       width: 24px;
-       height: 1.9em;
-       text-decoration: none;
-       .background-image('images/tab-break.png');
-       background-repeat: no-repeat;
-       background-position: bottom right;
-}
-/* IGNORED BY IE6 */
-div.vectorMenu h3 > a {
-       display: block;
-}
-div.vectorMenu div.menu {
-       position: relative;
-       display: none;
-       clear: both;
-       text-align: left;
-}
-/* OVERRIDDEN BY COMPLIANT BROWSERS */
-body.rtl div.vectorMenu div.menu {
-       /* @noflip */
-       margin-left: 24px;
-}
-/* IGNORED BY IE6 */
-body.rtl div.vectorMenu > div.menu {
-       /* @noflip */
-       margin-left: auto;
-}
-/* IGNORED BY IE6 */
-/* Also fixes old versions of FireFox */
-body.rtl div.vectorMenu > div.menu,
-x:-moz-any-link {
-       /* @noflip */
-       margin-left: 23px;
-}
-/* Enable forcing showing of the menu for accessibility */
-div.vectorMenu:hover div.menu,
-div.vectorMenu div.menuForceShow {
-       display: block;
-}
-div.vectorMenu ul {
-       position: absolute;
-       background-color: white;
-       border: solid 1px silver;
-       border-top-width: 0;
-       list-style-type: none;
-       list-style-image: none;
-       padding: 0;
-       margin: 0;
-       margin-left: -1px;
-       text-align: left;
-}
-/* Fixes old versions of FireFox */
-div.vectorMenu ul,
-x:-moz-any-link {
-       min-width: 5em;
-}
-/* Returns things back to normal in modern versions of FireFox */
-div.vectorMenu ul,
-x:-moz-any-link,
-x:default {
-       min-width: 0;
-}
-div.vectorMenu li {
-       padding: 0;
-       margin: 0;
-       text-align: left;
-       line-height: 1em;
-}
-/* OVERRIDDEN BY COMPLIANT BROWSERS */
-div.vectorMenu li a {
-       display: inline-block;
-       padding: 0.5em;
-       white-space: nowrap;
-       color: @menu-link-color;
-       cursor: pointer;
-       font-size: 0.8em;
-}
-/* IGNORED BY IE6 */
-div.vectorMenu li > a {
-       display: block;
-}
-div.vectorMenu li.selected a,
-div.vectorMenu li.selected a:visited {
-       color: #333;
-       text-decoration: none;
-}
-/* Search */
-#p-search h3 {
-       display: none;
-}
-#p-search {
-       /* @noflip */
-       float: left;
-}
-#p-search {
-       margin-right: 0.5em;
-       margin-left: 0.5em;
-}
-#p-search form,
-#p-search input {
-       margin: 0;
-       margin-top: 0.4em;
-}
-div#simpleSearch {
-       display: block;
-       width: 14em;
-       height: 1.4em;
-       margin-top: 0.65em;
-       position: relative;
-       min-height: 1px; /* Gotta trigger hasLayout for IE7 */
-       border: solid 1px #aaa;
-       color: black;
-       background-color: white;
-       .background-image('images/search-fade.png');
-       background-position: top left;
-       background-repeat: repeat-x;
-}
-div#simpleSearch input:focus {
-       outline: none;
-}
-div#simpleSearch input {
-       color: black;
-}
-div#simpleSearch input.placeholder {
-       color: #999;
-}
-div#simpleSearch input::-webkit-input-placeholder {
-       color: #999;
-}
-div#simpleSearch input:-moz-placeholder {
-       color: #999;
-}
-div#simpleSearch input:-ms-input-placeholder {
-       color: #999;
-}
-div#simpleSearch input#searchInput {
-       position: absolute;
-       top: 0;
-       left: 0;
-       width: 90%;
-       margin: 0;
-       padding: 0;
-       padding-left: 0.2em;
-       padding-top: 0.2em;
-       padding-bottom: 0.2em;
-       outline: none;
-       border: none;
-       /*
-        * DON'T PANIC! Browsers that won't scale this properly are the same browsers that have JS issues that prevent
-        * this from ever being shown anyways.
-       */
-       font-size: 13px;
-       background-color: transparent;
-       direction: ltr;
-}
-div#simpleSearch button#searchButton {
-       position: absolute;
-       width: 10%;
-       right: 0;
-       top: 0;
-       padding: 0;
-       padding-top: 0.3em;
-       padding-bottom: 0.2em;
-       padding-right: 0.4em;
-       margin: 0;
-       border: none;
-       cursor: pointer;
-       background-color: transparent;
-       background-image: none;
-}
-/* OVERRIDDEN BY COMPLIANT BROWSERS */
-div#simpleSearch button#searchButton img {
-       border: none;
-       margin: 0;
-       margin-top: -3px;
-       padding: 0;
-}
-/* IGNORED BY IE6 */
-div#simpleSearch button#searchButton > img {
-       margin: 0;
-}
-/* Panel */
-div#mw-panel {
-       font-size: @menu-main-font-size;
-       position: absolute;
-       top: 160px;
-       padding-top: 1em;
-       width: 10em;
-       left: 0;
-}
-div#mw-panel div.portal {
-       padding-bottom: 1.5em;
-       direction: ltr;
-}
-div#mw-panel div.portal h3 {
-       font-weight: normal;
-       color: #444;
-       padding: @menu-main-heading-padding;
-       cursor: default;
-       border: none;
-       font-size: @menu-main-heading-font-size;
-}
-div#mw-panel div.portal div.body {
-       padding-top: 0.5em;
-       margin: @menu-main-body-margin;
-
-       .background-image('images/portal-break.png');
-       background-repeat: no-repeat;
-       background-position: top left;
-}
-div#mw-panel div.portal div.body ul {
-       list-style-type: none;
-       list-style-image: none;
-       padding: @menu-main-body-padding;
-       margin: 0;
-}
-div#mw-panel div.portal div.body ul li {
-       line-height: 1.125em;
-       padding: 0;
-       padding-bottom: 0.5em;
-       margin: 0;
-       font-size: @menu-main-body-font-size;
-       word-wrap: break-word;
-}
-div#mw-panel div.portal div.body ul li a {
-       color: @menu-main-body-link-color;
-       &:visited {
-               color: @menu-main-body-link-visited-color;
-       }
-}
-
-/* Footer */
-div#footer {
-       margin-left: 10em;
-       margin-top: 0;
-       padding: 0.75em;
-       direction: ltr;
-}
-div#footer ul {
-       list-style-type: none;
-       list-style-image: none;
-       margin: 0;
-       padding: 0;
-}
-div#footer ul li {
-       margin: 0;
-       padding: 0;
-       padding-top: 0.5em;
-       padding-bottom: 0.5em;
-       color: #333;
-       font-size: 0.7em;
-}
-div#footer #footer-icons {
-       float: right;
-}
-
-body.ltr div#footer #footer-places {
-       /* @noflip */
-       float: left;
-}
-div#footer #footer-info li {
-       line-height: 1.4em;
-}
-div#footer #footer-icons li {
-       float: left;
-       margin-left: 0.5em;
-       line-height: 2em;
-       text-align: right;
-}
-div#footer #footer-places li {
-       float: left;
-       margin-right: 1em;
-       line-height: 2em;
-}
-/* Logo */
-#p-logo {
-       position: absolute;
-       top: -160px;
-       left: 0;
-       width: 10em;
-       height: 160px;
-}
-#p-logo a {
-       display: block;
-       width: 10em;
-       height: 160px;
-       background-repeat: no-repeat;
-       background-position: center center;
-       text-decoration: none;
-}
-
-ul {
-       list-style-type: disc;
-       .list-style-image('images/bullet-icon.png');
-}
-
-pre, .mw-code {
-       line-height: 1.3em;
-}
-
-/* Site Notice (includes notices from CentralNotice extension) */
-#siteNotice {
-       font-size: 0.8em;
-}
-#firstHeading {
-       padding-top: 0;
-       margin-top: 0;
-       font-size: @content-heading-font-size;
-}
-
-/* Icon for Usernames */
-#pt-userpage,
-#pt-anonuserpage,
-#pt-login {
-       background-position: left top;
-       background-repeat: no-repeat;
-       /* SVG support using a transparent gradient to guarantee cross-browser
-        * compatibility (browsers able to understand gradient syntax support also SVG) */
-       .background-image-svg('images/user-icon.svg', 'images/user-icon.png');
-       padding-left: 15px !important;
-}
-
-.redirectText {
-       font-size: 140%;
-}
-
-.redirectMsg img {
-       vertical-align: text-bottom;
-}
-
-#bodyContent {
-       position: relative;
-       width: 100%;
-       line-height: 1.5em;
-       font-size: @content-font-size;
-}
-
-/* mediawiki.notification */
-.skin-vector .mw-notification-area {
-       font-size: 0.8em;
-}
-.skin-vector .mw-notification-area-layout {
-       top: 7em;
-}
-.skin-vector .mw-notification {
-       background-color: #fff;
-       background-color: rgba(255, 255, 255, 0.93);
-       padding: 0.75em 1.5em;
-       border: solid 1px #a7d7f9;
-       border-radius: 0.75em;
-       -webkit-box-shadow: 0 2px 10px 0 rgba(0, 0, 0, 0.125);
-       box-shadow: 0 2px 10px 0 rgba(0, 0, 0, 0.125);
-}
-
-/* Watch/Unwatch Icon Styling */
-#ca-unwatch.icon a,
-#ca-watch.icon a {
-       margin: 0;
-       padding: 0;
-       outline: none;
-       display: block;
-       width: 26px;
-       /* This hides the text but shows the background image */
-       padding-top: 3.1em;
-       margin-top: 0;
-       /* Only applied in IE6 */
-       margin-top: -0.8em !ie;
-       height: 0;
-       overflow: hidden;
-       .background-image('images/watch-icons.png');
-}
-#ca-unwatch.icon a {
-       background-position: -43px 60%;
-}
-#ca-watch.icon a {
-       background-position: 5px 60%;
-}
-#ca-unwatch.icon a:hover,
-#ca-unwatch.icon a:focus {
-       background-position: -67px 60%;
-}
-#ca-watch.icon a:hover,
-#ca-watch.icon a:focus {
-       background-position: -19px 60%;
-}
-#ca-unwatch.icon a.loading,
-#ca-watch.icon a.loading {
-       .background-image('images/watch-icon-loading.gif');
-       background-position: 5px 60%;
-}
-#ca-unwatch.icon a span,
-#ca-watch.icon a span {
-       display: none;
-}
-div.vectorTabs ul {
-       .background-image('images/tab-break.png');
-       background-position: right bottom;
-       background-repeat: no-repeat;
-}
-
-/* Tooltips are outside of the normal body code, so this helps make the size of the text sensible */
-.tipsy {
-       font-size: 0.8em;
-}
-
-/* Animate between standard and high definition layouts */
-body.vector-animateLayout {
-       div#content,
-       div#footer,
-       #left-navigation {
-               .transition(margin-left 250ms, padding 250ms;);
-       }
-
-       #p-logo {
-               .transition(left 250ms);
-       }
-
-       #mw-panel {
-               .transition(padding-right 250ms);
-       }
-
-       #p-search {
-               .transition(margin-right 250ms);
-       }
-
-       #p-personal {
-               .transition(right 250ms);
-       }
-
-       #mw-head-base {
-               .transition(margin-left 250ms);
-       }
-}
index bd45851..8d5423a 100644 (file)
@@ -1,9 +1,11 @@
 @import "variables.less";
 
 @media screen {
-       @import "screen.less";
-       @import "externalLinks.less";
-       @import "collapsibleNav.less";
+       @import "components/common.less";
+       @import "components/navigation.less";
+       @import "components/footer.less";
+       @import 'components/notifications.less';
+       @import "components/externalLinks.less";
 }
 
 @media screen and (min-width: 982px) {
index cc935da..6dff54e 100644 (file)
@@ -146,6 +146,12 @@ Template:Bullet
 * Bar
 !!endarticle
 
+!!article
+Template:OpenTable
+!!text
+{|
+!!endarticle
+
 ###
 ### Basic tests
 ###
@@ -916,27 +922,36 @@ Non-html5 tags should be accepted
 !! test
 Non-word characters don't terminate tag names (bug 17663, 40670, 52022)
 !! input
-<b→> doesn't work! </b>
-
-<bä> doesn't work! </b>
+<b→> doesn't work! </b→>
 
-<boo> works fine </b>
+<bä> doesn't work! </bä>
 
-<s.foo>foo</s>
+<boo> works fine </boo>
 
 <s.foo>s.foo</s.foo>
 
 <sub-ID#1>
 !! result
-<p>&lt;b→&gt; doesn't work! &lt;/b&gt;
-</p><p>&lt;bä&gt; doesn't work! &lt;/b&gt;
-</p><p>&lt;boo&gt; works fine &lt;/b&gt;
-</p><p>&lt;s.foo&gt;foo&lt;/s&gt;
+<p>&lt;b→&gt; doesn't work! &lt;/b→&gt;
+</p><p>&lt;bä&gt; doesn't work! &lt;/bä&gt;
+</p><p>&lt;boo&gt; works fine &lt;/boo&gt;
 </p><p>&lt;s.foo&gt;s.foo&lt;/s.foo&gt;
 </p><p>&lt;sub-ID#1&gt;
 </p>
 !! end
 
+!! test
+Isolated close tags should be treated as literal text (bug 52760)
+!! input
+</b>
+
+<s.foo>s</s>
+!! result
+<p>&lt;/b&gt;
+</p><p>&lt;s.foo&gt;s&lt;/s&gt;
+</p>
+!! end
+
 ###
 ### Special characters
 ###
@@ -1336,6 +1351,22 @@ b
 
 !! end
 
+## PHP parser emits output which is broken
+!! test
+Unclosed HTML p-tags should be handled properly
+!! options
+parsoid
+!! input
+<div><p>foo</div>
+a
+
+b
+!! result
+<div data-parsoid='{"stx":"html"}'><p data-parsoid='{"stx":"html", "autoInsertedEnd":true}'>foo</p></div>
+<p>a</p>
+<p>b</p>
+!! end
+
 ###
 ### Preformatted text
 ###
@@ -1589,6 +1620,46 @@ Entities inside <pre>
 </p>
 !! end
 
+!! test
+Empty pre; pre inside other HTML tags (bug 54946)
+!! input
+a
+
+<div><pre>
+foo
+</pre></div>
+<pre></pre>
+!! result
+<p>a
+</p>
+<div><pre>
+foo
+</pre></div>
+<pre></pre>
+
+!! end
+
+!! test
+HTML pre followed by indent-pre
+!! input
+<pre>foo</pre>
+ bar
+!! result
+<pre>foo</pre>
+<pre>bar
+</pre>
+!! end
+
+!!test
+Block tag pre
+!!options
+parsoid
+!!input
+<p><pre>foo</pre></p>
+!!result
+<p data-parsoid='{"stx":"html","autoInsertedEnd":true,"dsr":[0,3,3,0]}'></p><pre data-parsoid='{"stx":"html","dsr":[3,17,5,6]}'>foo</pre><p data-parsoid='{"autoInsertedStart":true,"stx":"html","dsr":[17,21,0,null]}'></p>
+!!end
+
 !!test
 Templates: Indent-Pre: 1a. Templates that break a line should suppress <pre>
 !!input
@@ -1708,6 +1779,25 @@ Templates: Indent-Pre: 1f: Wrapping should be based on expanded content
 </pre>
 !!end
 
+!! test
+Things that look like <pre> tags aren't treated as such
+!! input
+Barack Obama <President> of the United States
+!! result
+<p>Barack Obama &lt;President&gt; of the United States
+</p>
+!! end
+
+!! test
+Parsoid: handle pre with space after attribute
+!! options
+parsoid=wt2html
+!! input
+<pre style="width:50%;" >{{echo|foo}}</pre>
+!! result
+<pre style="width:50%;">{{echo|foo}}</pre>
+!! end
+
 # TODO / maybe: fix wt2wt for this
 !! test
 Parsoid: Don't paragraph-wrap fosterable content
@@ -1928,6 +2018,17 @@ parsoid=html2wt,wt2wt
 <p about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"{{echo|1=bar}}"}},"i":0}}]}'>bar</p>
 !! end
 
+## Bug 56733
+!! test
+Templates parameters with special tokenizing behavior dont get modified because of arg escaping
+!! options
+parsoid
+!! input
+{{echo|a : b}}
+!! result
+<p about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"a : b"}},"i":0}}]}'>a<span typeof="mw:Placeholder" data-parsoid='{"isDisplayHack":true}'> </span>: b</p>
+!! end
+
 ###
 ### Parsoid-centric tests for testing RT edge cases for pre
 ###
 !!test
 3a. Indent-Pre and block tags (single-line html)
 !!input
- <p> foo </p>
- <div> foo </div>
- <blockquote> foo </blockquote>
<p> foo </p>
<div> foo </div>
<blockquote> foo </blockquote>
  <span> foo </span>
 !!result
- <p> foo </p>
- <div> foo </div>
- <blockquote> foo </blockquote>
<p> foo </p>
<div> foo </div>
<blockquote> foo </blockquote>
 <pre><span> foo </span>
 </pre>
 !!end
 
+!!test
+3c. Indent-Pre and block tags (multi-line html)
+!!input
+ a <span>foo</span>
+ b <div> foo </div>
+!!result
+<pre>a <span>foo</span>
+</pre>
+ b <div> foo </div>
+
+!!end
+
 !!test
 3b. Indent-Pre and block tags (pre-content on separate line)
 !!input
@@ -2137,11 +2250,11 @@ foo
 
 !!end
 
+## NOTE: the leading white-space chars on empty line are significant
 !! test
-5. White-space in indent-pre
-NOTE: the white-space char on 2nd line is significant
+5a. White-space in indent-pre
 !! input
- a<br/>
+ a<br />
  
  b
 !! result
@@ -2151,6 +2264,39 @@ b
 </pre>
 !! end
 
+## NOTE: the leading white-space chars on empty line are significant
+!! test
+5b. White-space in indent-pre
+!! input
+ a
+ b
+ c
+!! result
+<pre>a
+
+b
+
+
+c
+</pre>
+!! end
+
+!! test
+5c. White-space in indent-pre
+!! input
+ ''a''
+  ''b''
+   ''c''
+!! result
+<pre><i>a</i>
+ <i>b</i>
+  <i>c</i>
+</pre>
+!! end
+
 !! test
 6. Pre-blocks should extend across lines with leading WS even when there is no wrappable content
 !! input
@@ -3935,6 +4081,83 @@ http://example.com
 <p><a rel="mw:ExtLink" href="http://example.com">http://example.com</a></p>
 !! end
 
+!! test
+Parenthesis in external links, especially URL links
+!! options
+php
+!! input 
+http://example.com)
+
+http://example.com/test)
+
+http://example.com/(test)
+
+http://example.com/((test)
+
+(http://example.com/(test))
+
+(http://example.com/(test)))))
+
+http://example.com/a)b
+
+[http://example.com) foo]
+!! result
+<p><a rel="nofollow" class="external free" href="http://example.com">http://example.com</a>)
+</p><p><a rel="nofollow" class="external free" href="http://example.com/test">http://example.com/test</a>)
+</p><p><a rel="nofollow" class="external free" href="http://example.com/(test)">http://example.com/(test)</a>
+</p><p><a rel="nofollow" class="external free" href="http://example.com/((test)">http://example.com/((test)</a>
+</p><p>(<a rel="nofollow" class="external free" href="http://example.com/(test))">http://example.com/(test))</a>
+</p><p>(<a rel="nofollow" class="external free" href="http://example.com/(test)))))">http://example.com/(test)))))</a>
+</p><p><a rel="nofollow" class="external free" href="http://example.com/a)b">http://example.com/a)b</a>
+</p><p><a rel="nofollow" class="external text" href="http://example.com)">foo</a>
+</p>
+!! end
+
+!! test
+Parenthesis in external links, especially URL links (Parsoid)
+!! options
+parsoid
+!! input 
+http://example.com)
+
+http://example.com/test)
+
+http://example.com/(test)
+
+http://example.com/((test)
+
+(http://example.com/(test))
+
+(http://example.com/(test)))))
+
+http://example.com/a)b
+
+[http://example.com) foo]
+!! result
+<p><a rel="mw:ExtLink" href="http://example.com">http://example.com</a>)</p>
+<p><a rel="mw:ExtLink" href="http://example.com/test">http://example.com/test</a>)</p>
+<p><a rel="mw:ExtLink" href="http://example.com/(test)">http://example.com/(test)</a></p>
+<p><a rel="mw:ExtLink" href="http://example.com/((test)">http://example.com/((test)</a></p>
+<p>(<a rel="mw:ExtLink" href="http://example.com/(test))">http://example.com/(test))</a></p>
+<p>(<a rel="mw:ExtLink" href="http://example.com/(test)))))">http://example.com/(test)))))</a></p>
+<p><a rel="mw:ExtLink" href="http://example.com/a)b">http://example.com/a)b</a></p>
+<p><a rel="mw:ExtLink" href="http://example.com)">foo</a></p>
+!! end
+
+!! test
+Parenthesis in external links, w/ transclusion or comment
+!! options
+parsoid
+!! input
+(http://example.com/{{echo|hi}})
+
+(http://example.com<!-- hi -->)
+!! result
+<p>(<a data-mw='{"attribs":[[{"txt":"href"},{"html":"http://example.com/&lt;span about=\"#mwt1\" typeof=\"mw:Transclusion\" data-mw=\"{&amp;quot;parts&amp;quot;:[{&amp;quot;template&amp;quot;:{&amp;quot;target&amp;quot;:{&amp;quot;wt&amp;quot;:&amp;quot;echo&amp;quot;,&amp;quot;href&amp;quot;:&amp;quot;./Template:Echo&amp;quot;},&amp;quot;params&amp;quot;:{&amp;quot;1&amp;quot;:{&amp;quot;wt&amp;quot;:&amp;quot;hi&amp;quot;}},&amp;quot;i&amp;quot;:0}}]}\" data-parsoid=\"{&amp;quot;dsr&amp;quot;:[20,31,null,null],&amp;quot;pi&amp;quot;:[[{&amp;quot;k&amp;quot;:&amp;quot;1&amp;quot;,&amp;quot;spc&amp;quot;:[&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;]}]]}\">hi&lt;/span>"}]]}' typeof="mw:ExpandedAttrs" about="#mwt2" rel="mw:ExtLink" href="http://example.com/hi" data-parsoid='{"stx":"url","a":{"href":"http://example.com/hi"},"sa":{"href":"http://example.com/{{echo|hi}}"},"dsr":[1,31,0,0]}'>http://example.com/hi</a>)</p>
+
+<p>(<a rel="mw:ExtLink" href="http://example.com" data-parsoid='{"stx":"url","a":{"href":"http://example.com"},"sa":{"href":"http://example.com&lt;!-- hi -->"},"dsr":[35,64,0,0]}'>http://example.com</a>)</p>
+!! end
+
 ###
 ### Quotes
 ###
@@ -4048,16 +4271,71 @@ php
 !! input
 {||}
 !! result
+
 !! end
+
 # Parsoid team replies: empty table tags are legal in HTML5
 !! test
 A table with no data. (parsoid)
 !! options
-parsoid
+parsoid=wt2html
 !! input
 {||}
 !! result
 <table></table>
+
+!! end
+
+!! test
+A table with stray table end tags on start tag line (wt2html)
+!! options
+parsoid=wt2html
+!! input
+{|style="color: red;"|}
+
+{|style="color: red;" |}
+|foo
+|}
+
+{|style="color: red;"|} id="foo"
+|foo
+|}
+
+{|style="color: red;" |} id="foo"
+|foo
+|}
+!! result
+<table style="color: red;"></table>
+
+<table style="color: red;">
+<tbody><tr>
+<td>foo</td>
+</tr></tbody>
+</table>
+
+<table style="color: red;" id="foo">
+<tbody><tr>
+<td>foo</td>
+</tr></tbody>
+</table>
+
+<table style="color: red;" id="foo">
+<tbody><tr>
+<td>foo</td>
+</tr></tbody>
+</table>
+
+!! end
+
+!! test
+A table with no data (take 2) (parsoid)
+!! options
+parsoid
+!! input
+{|
+|}
+!! result
+<table></table>
 !! end
 
 # A table with nothing but a caption is invalid XHTML, we might want to render
@@ -4757,6 +5035,18 @@ parsoid=html2wt
 <tr><td>baz</td></tr></tbody></table><b>quux</b>
 !! end
 
+!! test
+Parsoid: newline inducing block nodes don't suppress <nowiki>
+!! options
+parsoid=html2wt
+!! input
+<nowiki> </nowiki>a
+
+= foo =
+!! result
+ a<h1>foo</h1>
+!! end
+
 ###
 ### Internal links
 ###
@@ -4899,6 +5189,17 @@ Piped link with 3 brackets
 </p>
 !! end
 
+!! test
+Piped link with extlink-like text
+!! input
+[[Main Page|[bar]]]
+[[Main Page|This is a [bar]]]
+!! result
+<p><a href="/wiki/Main_Page" title="Main Page">[bar]</a>
+<a href="/wiki/Main_Page" title="Main Page">This is a [bar]</a>
+</p>
+!! end
+
 !! test
 Link with multiple pipes
 !! input
@@ -5451,6 +5752,25 @@ parsoid
 <p data-parsoid='{"dsr":[19,30,0,0]}'><a rel="mw:ExtLink" href="//en.wikipedia.org/wiki/Foo" data-parsoid='{"stx":"simple","a":{"href":"//en.wikipedia.org/wiki/Foo"},"sa":{"href":":en:Foo"},"isIW":true,"dsr":[19,30,null,1]}'>en:Foo</a></p>
 !! end
 
+!! test
+Interwiki links that cannot be represented in wiki syntax
+!! options
+parsoid
+!! input
+[[meatball:ok]]
+[[meatball:ok#foo|ok with fragment]]
+[[meatball:ok_as_well?|ok ending with ? mark]]
+[http://de.wikipedia.org/wiki/Foo?action=history has query]
+[http://de.wikipedia.org/wiki/#foo is just fragment]
+
+!! result
+<p><a rel="mw:ExtLink" href="http://www.usemod.com/cgi-bin/mb.pl?ok">meatball:ok</a>
+<a rel="mw:ExtLink" href="http://www.usemod.com/cgi-bin/mb.pl?ok#foo">ok with fragment</a>
+<a rel="mw:ExtLink" href="http://www.usemod.com/cgi-bin/mb.pl?ok_as_well%3F">ok ending with ? mark</a>
+<a rel="mw:ExtLink" href="http://de.wikipedia.org/wiki/Foo?action=history">has query</a>
+<a rel="mw:ExtLink" href="http://de.wikipedia.org/wiki/#foo">is just fragment</a></p>
+!! end
+
 
 ###
 ### Interlanguage links
@@ -7972,6 +8292,30 @@ parsoid
 </p>
 !!end
 
+!!test
+4. includeonly in table attributes
+!!input
+{|
+|- <noinclude>
+|-
+|a
+</noinclude>
+|- <includeonly>
+|-
+|b
+</includeonly>
+|}
+!!result
+<table>
+
+
+<tr>
+<td>a
+</td></tr>
+</table>
+
+!!end
+
 ###
 ### Testing parsing of templates where a template arg
 ### has the same name as the template itself.
@@ -9393,6 +9737,36 @@ parsoid
 <figure class="mw-default-size mw-halign-right" typeof="mw:Image"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"></a><figcaption>Caption text</figcaption></figure>
 !! end
 
+!! test
+Image with caption, bug 53312 #1 (parsoid)
+!! options
+parsoid
+!! input
+[[File:Foobar.jpg|right|Caption page stuff]]
+!! result
+<figure class="mw-default-size mw-halign-right" typeof="mw:Image"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"></a><figcaption>Caption page stuff</figcaption></figure>
+!! end
+
+!! test
+Image with caption, bug 53312 #2 (parsoid)
+!! options
+parsoid
+!! input
+[[File:Foobar.jpg|right|Caption page=]]
+!! result
+<figure class="mw-default-size mw-halign-right" typeof="mw:Image"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"></a><figcaption>Caption page=</figcaption></figure>
+!! end
+
+!! test
+Image with caption, bug 53312 #3 (parsoid)
+!! options
+parsoid
+!! input
+[[File:Foobar.jpg|right|Caption page=stuff]]
+!! result
+<figure class="mw-default-size mw-halign-right" typeof="mw:Image"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"></a><figcaption>Caption page=stuff</figcaption></figure>
+!! end
+
 !! test
 Image with empty attribute (php)
 !! options
@@ -9840,9 +10214,9 @@ Thumbnail image caption with a free URL and explicit alt
 SVG thumbnails with no language set
 !! options
 !! input
-[[File:Foobar.svg|thumb|width=200]]
+[[File:Foobar.svg|thumb|caption]]
 !! result
-<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.svg" class="image"><img alt="" src="http://example.com/images/thumb/f/ff/Foobar.svg/180px-Foobar.svg.png" width="180" height="180" class="thumbimage" srcset="http://example.com/images/thumb/f/ff/Foobar.svg/270px-Foobar.svg.png 1.5x, http://example.com/images/thumb/f/ff/Foobar.svg/360px-Foobar.svg.png 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.svg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>width=200</div></div></div>
+<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.svg" class="image"><img alt="" src="http://example.com/images/thumb/f/ff/Foobar.svg/180px-Foobar.svg.png" width="180" height="180" class="thumbimage" srcset="http://example.com/images/thumb/f/ff/Foobar.svg/270px-Foobar.svg.png 1.5x, http://example.com/images/thumb/f/ff/Foobar.svg/360px-Foobar.svg.png 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.svg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>caption</div></div></div>
 
 !! end
 
@@ -9850,9 +10224,9 @@ SVG thumbnails with no language set
 SVG thumbnails with language de
 !! options
 !! input
-[[File:Foobar.svg|thumb|width=200|lang=de]]
+[[File:Foobar.svg|thumb|caption|lang=de]]
 !! result
-<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/index.php?title=File:Foobar.svg&amp;lang=de" class="image"><img alt="" src="http://example.com/images/thumb/f/ff/Foobar.svg/langde-180px-Foobar.svg.png" width="180" height="180" class="thumbimage" srcset="http://example.com/images/thumb/f/ff/Foobar.svg/langde-270px-Foobar.svg.png 1.5x, http://example.com/images/thumb/f/ff/Foobar.svg/langde-360px-Foobar.svg.png 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.svg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>width=200</div></div></div>
+<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/index.php?title=File:Foobar.svg&amp;lang=de" class="image"><img alt="" src="http://example.com/images/thumb/f/ff/Foobar.svg/langde-180px-Foobar.svg.png" width="180" height="180" class="thumbimage" srcset="http://example.com/images/thumb/f/ff/Foobar.svg/langde-270px-Foobar.svg.png 1.5x, http://example.com/images/thumb/f/ff/Foobar.svg/langde-360px-Foobar.svg.png 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.svg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>caption</div></div></div>
 
 !! end
 
@@ -9860,7 +10234,7 @@ SVG thumbnails with language de
 SVG thumbnails with invalid language code
 !! options
 !! input
-[[File:Foobar.svg|thumb|width=200|lang=invalid.language.code]]
+[[File:Foobar.svg|thumb|caption|lang=invalid.language.code]]
 !! result
 <div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.svg" class="image"><img alt="" src="http://example.com/images/thumb/f/ff/Foobar.svg/180px-Foobar.svg.png" width="180" height="180" class="thumbimage" srcset="http://example.com/images/thumb/f/ff/Foobar.svg/270px-Foobar.svg.png 1.5x, http://example.com/images/thumb/f/ff/Foobar.svg/360px-Foobar.svg.png 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.svg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>lang=invalid.language.code</div></div></div>
 
@@ -10208,22 +10582,22 @@ parsoid
 #</p>
 
 !! test
-Caption with a template in it
+Parsoid-specific image handling - caption with a template in it
 !! options
 parsoid
 !! input
-[[Image:Foobar.jpg|thumb|200px|This caption has a {{echo|transclusion}} in it.]]
+[[File:Foobar.jpg|thumb|200x200px|This caption has a {{echo|transclusion}} in it.]]
 !! result
 <figure typeof="mw:Image/Thumb"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/200px-Foobar.jpg" height="23" width="200"></a><figcaption>This caption has a <span about="#mwt1" typeof="mw:Transclusion" data-mw="{&quot;parts&quot;:[{&quot;template&quot;:{&quot;target&quot;:{&quot;wt&quot;:&quot;echo&quot;,&quot;href&quot;:&quot;./Template:Echo&quot;},&quot;params&quot;:{&quot;1&quot;:{&quot;wt&quot;:&quot;transclusion&quot;}},&quot;i&quot;:0}}]}">transclusion</span> in it.</figcaption></figure>
 !! end
 
 !! test
-Caption with unbalanced tags in it
+Parsoid-specific image handling - caption with unbalanced tags in it
 !! options
-parsoid
+parsoid=wt2html,wt2wt,html2html
 !! input
 foo
-[[Image:Foobar.jpg|thumb|200px|This caption has a <center>unbalanced tag in it.]]
+[[File:Foobar.jpg|thumb|200x200px|This caption has a <center>unbalanced tag in it.]]
 bar
 !! result
 <p>foo</p>
@@ -10531,6 +10905,16 @@ parsoid
 <link rel="mw:PageProp/Category" href="Category:Foo#Bar">
 !! end
 
+!! test
+Parsoid: Defaultsort
+!! options
+parsoid
+!! input
+{{DEFAULTSORT:Foo}}
+!! result
+<meta property="mw:PageProp/categorydefaultsort" content="Foo"/>
+!! end
+
 ###
 ### Inter-language links
 ###
@@ -11241,6 +11625,29 @@ I always thought &xacute; was a cute letter.
 </p>
 !! end
 
+# TODO: generalize to PHP parser?
+!! test
+HTML5 tags
+!! options
+parsoid
+!! input
+<data value="5">five</data>
+<time datetime="2000-01-01T00:00Z">The new millenium started</time>
+<mark>This highlighted text</mark>
+!! result
+<p><data value="5">five</data>
+<time datetime="2000-01-01T00:00Z">The new millenium started</time>
+<mark>This highlighted text</mark></p>
+!! end
+
+!! test
+HTML tag with leading space is parsed as text
+!! input
+< div>foo< /div>
+!! result
+<p>&lt; div&gt;foo&lt; /div&gt;
+</p>
+!! end
 
 ###
 ### Nesting tests (see bug 41545, 50604, 51081)
@@ -16280,6 +16687,19 @@ language=be-tarask
 </p>
 !! end
 
+!! test
+Wrong option for formatNum (bug 56199)
+!! input
+{{formatnum:1,234.56|Random}}
+{{formatnum:1,234.56|EVERYTHING}}
+{{formatnum:1234.56|any argument that has the string 'NOSEP'}}
+!! result
+<p>1,234.56
+1,234.56
+1,234.56
+</p>
+!! end
+
 !! test
 Strip marker in grammar
 !! options
@@ -16799,6 +17219,22 @@ B1 <span about="#mwt7" class="reference" data-mw='{"name":"ref","attrs":{"name":
 </ol>
 !!end
 
+## We don't bother wt2wt-ing non-standard whitespace
+!!test
+Ref: 16. Tokenizer should accept non-standard whitespace in <ref> and </ref> tags
+!!options
+parsoid=wt2html
+!!input
+A <ref >foo</ref >
+
+<references />
+!!result
+<p>A <span class="reference" data-mw='{"name":"ref","body":{"html":"foo"},"attrs":{}}' id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-1">[1]</a></span></p>
+
+<ol class="references" typeof="mw:Extension/references" data-mw='{"name":"references","attrs":{}}'>
+<li id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1-0">↑</a></span> foo</li></ol>
+!!end
+
 !!test
 References: 1. references tag without any refs should be handled properly
 !!options
@@ -16817,7 +17253,7 @@ parsoid
 A <ref group="a">foo</ref>
 B <ref group="b">bar</ref>
 
-<references group='a' />
+<references group="a" />
 !!result
 <p>A <span about="#mwt2" class="reference" data-mw='{"name":"ref","body":{"html":"foo"},"attrs":{"group":"a"}}' id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-1">[a 1]</a></span>
 B <span about="#mwt4" class="reference" data-mw='{"name":"ref","body":{"html":"bar"},"attrs":{"group":"b"}}' id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-1">[b 1]</a></span></p>
@@ -16858,7 +17294,7 @@ parsoid
 A <ref group="a">afoo</ref>
 B <ref>bfoo</ref>
 
-<references group="a"/>
+<references group="a" />
 
 C <ref>cfoo</ref>
 
@@ -16904,9 +17340,9 @@ References: 6. <references /> from a transclusion
 !!options
 parsoid
 !!input
-{{echo|<references />}}
+<ref>Foo</ref> {{echo|<references />}}
 !!result
-<ol class="references" about="#mwt2" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"<references />"}},"i":0}}]}'></ol>
+<span about="#mwt3" class="reference" data-mw='{"name":"ref","body":{"html":"Foo"},"attrs":{}}' id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-1">[1]</a></span> <ol class="references" typeof="mw:Extension/references mw:Transclusion" about="#mwt4" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"&lt;references />"}},"i":0}}]}'><li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1-0">↑</a></span> Foo</li></ol>
 !!end
 
 !! test
@@ -16983,41 +17419,48 @@ parsoid
 
 !! test
 Headings: 1. Nested inside html
+(New headings and existing headings are handled differently)
 !! options
-parsoid
+parsoid=html2wt
 !! input
-=<nowiki>=foo=</nowiki>=
+= =foo= =
 
-==<nowiki>=foo=</nowiki>==
+== =foo= ==
 
-===<nowiki>=foo=</nowiki>===
+=== =foo= ===
 
+=<nowiki>=foo=</nowiki>=
+==<nowiki>=foo=</nowiki>==
+===<nowiki>=foo=</nowiki>===
 ====<nowiki>=foo=</nowiki>====
-
 =====<nowiki>=foo=</nowiki>=====
-
 ======<nowiki>=foo=</nowiki>======
+
 !! result
-<h1><span typeof="mw:Nowiki">=foo=</span></h1>
-<h2><span typeof="mw:Nowiki">=foo=</span></h2>
-<h3><span typeof="mw:Nowiki">=foo=</span></h3>
-<h4><span typeof="mw:Nowiki">=foo=</span></h4>
-<h5><span typeof="mw:Nowiki">=foo=</span></h5>
-<h6><span typeof="mw:Nowiki">=foo=</span></h6>
+<h1>=foo=</h1>
+<h2>=foo=</h2>
+<h3>=foo=</h3>
+
+<h1 data-parsoid='{}'>=foo=</h1>
+<h2 data-parsoid='{}'>=foo=</h2>
+<h3 data-parsoid='{}'>=foo=</h3>
+<h4 data-parsoid='{}'>=foo=</h4>
+<h5 data-parsoid='{}'>=foo=</h5>
+<h6 data-parsoid='{}'>=foo=</h6>
 !!end
 
 !! test
 Headings: 2. Outside heading nest on a single line <h1>foo</h1>*bar
 !! options
-parsoid
+parsoid=html2wt
 !! input
-=foo=
+= foo =
 <nowiki>*</nowiki>bar
 
-=foo=
+= foo =
 =bar
 
-=foo=
+= foo =
 <nowiki>=bar=</nowiki>
 !! result
 <h1>foo</h1>*bar
@@ -17028,9 +17471,9 @@ parsoid
 !! test
 Headings: 3. Nested inside html with wikitext split by html tags
 !! options
-parsoid
+parsoid=html2wt
 !! input
-=='''bold'''<nowiki>foo=</nowiki>=
+= ='''bold'''<nowiki>foo=</nowiki> =
 !! result
 <h1>=<b>bold</b><span typeof="mw:Nowiki">foo=</span></h1>
 !!end
@@ -17038,23 +17481,23 @@ parsoid
 !! test
 Headings: 4a. No escaping needed (testing just h1 and h2)
 !! options
-parsoid
+parsoid=html2wt
 !! input
-==foo=
+= =foo =
 
-=foo==
+= foo= =
 
 = =foo= =
 
-==foo= bar=
+= =foo= bar =
 
-===foo==
+== =foo ==
 
-==foo===
+== foo= ==
 
-=''=''foo==
+= ''=''foo= =
 
-=<nowiki>=</nowiki>=
+= <nowiki>=</nowiki> =
 !! result
 <h1>=foo</h1>
 <h1>foo=</h1>
@@ -17069,7 +17512,7 @@ parsoid
 !! test
 Headings: 4b. No escaping needed (inside p-tags)
 !! options
-parsoid
+parsoid=html2wt
 !! input
 ===
 =foo= x
@@ -17171,8 +17614,8 @@ Headings: 6d. Heading chars in SOL context (with interspersed comments)
 parsoid
 !! input
 <!--c0--><nowiki>=a=</nowiki>
-<!--c1-->
-<nowiki>=a=</nowiki> <!--c2-->  <!--c3-->
+
+<!--c1--><nowiki>=a=</nowiki> <!--c2-->         <!--c3-->
 !! result
 <p><!--c0-->=a=</p>
 <p><!--c1-->=a= <!--c2-->       <!--c3--></p>
@@ -17326,6 +17769,8 @@ parsoid
 *''foo''*bar
 
 *[[Foo]]: bar
+
+*[[Foo]]*bar
 !! result
 <ul>
 <li>foo*bar
@@ -17339,6 +17784,10 @@ parsoid
 <li><a rel="mw:WikiLink" href="Foo">Foo</a>: bar
 </li>
 </ul>
+<ul>
+<li><a rel="mw:WikiLink" href="Foo">Foo</a>*bar
+</li>
+</ul>
 !!end
 
 !! test
@@ -17482,14 +17931,18 @@ Tables: 1d. No escaping needed
 !! test
 Tables: 2a. Nested in td
 !! options
-parsoid
+parsoid=html2wt
 !! input
 {|
 |<nowiki>foo|bar</nowiki>
+|-
+|x<div><nowiki>a|b</nowiki></div>
 |}
 !! result
 <table><tbody><tr>
-<td><span typeof="mw:Nowiki">foo|bar</span></td></tr></tbody></table>
+<td>foo|bar</td></tr>
+<tr><td>x<div>a|b</div></td>
+</tbody></table>
 !! end
 
 !! test
@@ -17612,6 +18065,9 @@ parsoid
 bar|baz
 +bar
 -bar
+|-
+|x
+<div>a|b</div>
 |}
 !! result
 <table><tbody>
@@ -17621,32 +18077,27 @@ bar|baz
 <p>bar|baz
 +bar
 -bar</p></td></tr>
+<tr><td>x
+<div>a|b</div></td>
 </tbody></table>
 !! end
 
-### SSS FIXME: Disabled right now because accurate html2wt
-### on this snippet requires data-parsoid flags that we've
-### stripped out of these tests.  We should scheme how we
-### we want to handle these kind of tests that require
-### data-parsoid flags for accurate html2wt serialization
-
 !! test
 Tables: 4d. No escaping needed
 !! options
-disabled
+parsoid
 !! input
 {|
+|[[Foo]]-bar
 ||+1
 ||-2
 |}
 !! result
 <table>
-<tr>
-<td>+1
-</td>
-<td>-2
-</td></tr></table>
-
+<tbody><tr><td><a rel="mw:WikiLink" href="./Foo">Foo</a>-bar</td>
+<td data-parsoid='{"startTagSrc":"|","attrSepSrc":"|"}'>+1</td>
+<td data-parsoid='{"startTagSrc":"|","attrSepSrc":"|"}'>-2</td></tr>
+</tbody></table>
 !! end
 
 #### --------------- Links ----------------
@@ -17713,9 +18164,16 @@ parsoid
 !! input
 [http://google.com <nowiki>[google]</nowiki>]
 [http://google.com <nowiki>google]</nowiki>]
+
+<nowiki>[http://google.com]</nowiki>
+
+<nowiki>[http://google.com google]</nowiki>
+
 !! result
-<a href="http://google.com" rel="mw:ExtLink">[google]</a>
-<a href="http://google.com" rel="mw:ExtLink">google]</a>
+<p><a href="http://google.com" rel="mw:ExtLink">[google]</a>
+<a href="http://google.com" rel="mw:ExtLink">google]</a></p>
+<p>[http://google.com]</p>
+<p>[http://google.com google]</p>
 !! end
 
 !! test
@@ -17754,6 +18212,8 @@ parsoid=html2wt,wt2wt
 ''''foo'''
 '''foo'''<nowiki/>'
 '<nowiki/>'''foo'''<nowiki/>'
+''fools'<span> errand</span>''
+''<span>fool</span>'s errand''
 !! result
 <p><i>'foo'</i>
 <i>''foo''</i>
@@ -17770,6 +18230,8 @@ parsoid=html2wt,wt2wt
 '<b>foo</b>
 <b>foo</b>'
 '<b>foo</b>'</p>
+<i>fools'<span> errand</span></i>
+<i><span>fool</span>'s errand</i>
 !! end
 
 !! test
@@ -17901,6 +18363,7 @@ __|__
 #### 1. a tags
 #### 2. other tags
 #### 3. multi-line html tag
+#### 4. extension tags
 #### -----------------------------------------
 !! test
 1. a tags
@@ -17940,8 +18403,14 @@ parsoid
 4. extension tags
 !! input
 <nowiki><ref>foo</ref></nowiki>
+
+<nowiki><ref>bar</nowiki>
+
+baz<nowiki></ref></nowiki>
 !! result
 <p>&lt;ref&gt;foo&lt;/ref&gt;
+</p><p>&lt;ref&gt;bar
+</p><p>baz&lt;/ref&gt;
 </p>
 !! end
 
@@ -18531,6 +19000,26 @@ parsoid=wt2wt,wt2html
 <td>b</td></tr></tbody></table>
 !!end
 
+!!test
+Table in fosterable position
+!!options
+parsoid=wt2html,wt2wt
+!!input
+{{OpenTable}}
+<div>
+{|
+|}
+</div>
+|}
+!!result
+<div about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"OpenTable","href":"./Template:OpenTable"},"params":{},"i":0}},"\n&lt;div>"]}' data-parsoid='{"stx":"html","autoInsertedEnd":true,"dsr":[0,19,null,null],"src":"{{OpenTable}}\n&lt;div>","pi":[[]]}'></div><span about="#mwt1" data-parsoid="{}">
+</span>
+<table about="#mwt1" data-parsoid='{"autoInsertedEnd":true,"dsr":[null,19,2,0]}'></table>
+
+<table data-parsoid='{"dsr":[20,25,2,2]}'>
+</table>
+!!end
+
 # -----------------------------------------------------------------
 # The following section of tests are primarily to spec requirements
 # around serialization of new/edited content.
@@ -18560,16 +19049,11 @@ parsoid=html2wt
 <p>123</p><figure typeof="mw:Image/Thumb" class="mw-halign-right"><a href="./File:Wiki.png"><img src="http://192.168.142.128/mw/images/thumb/b/bc/Wiki.png/131px-Wiki.png" width="131" height="150" resource="./File:Wiki.png"></a></figure><p>456</p>
 !!end
 
-# Wacky -- the leading newline in input is required because
-# that is what the serializer emits. To be fixed. Not fixing
-# the test because this test is required to test serialization of
-# new content and preferred whitespace style.
 !! test
 Lists: Serialize correctly even when list content is wrapped in p-tags (like VE does)
 !! options
 parsoid=html2wt
 !! input
-
 * foo
 !! result
 <ul>
@@ -18577,6 +19061,16 @@ parsoid=html2wt
 </ul>
 !! end
 
+!! test
+Lists: Serialize correctly even when list tags has unneeded whitespace between tags
+!! options
+parsoid=html2wt
+!! input
+* foo
+!! result
+<ul> <li>foo</li></ul>
+!! end
+
 !! test
 Don't strip leading whitespace when handling indent-pre suppressing tags
 !! options
@@ -18623,6 +19117,10 @@ foo
 
 <div>foo</div>
 <span>bar</span>
+
+<div>
+<span>foo</span>
+</div>
 !! result
 <p>foo</p>
  <span>bar</span>
@@ -18632,18 +19130,17 @@ foo
 
 <div>foo</div>
  <span>bar</span>
+
+<div>
+ <span>foo</span>
+</div>
 !! end
 
-# Wacky -- the leading newline in input is required because
-# that is what the serializer emits. To be fixed. Not fixing
-# the test because this test is required to test serialization of
-# new content and preferred whitespace style.
 !! test
 Lists: Add space after bullets
 !! options
 parsoid=html2wt
 !! input
-
 * foo
 * bar
 * <span> baz</span>
@@ -18655,6 +19152,25 @@ parsoid=html2wt
 </ul>
 !! end
 
+!! test
+Headings: Add space before/after == (Bug 51744)
+!! options
+parsoid=html2wt
+!! input
+== foo ==
+
+== bar ==
+
+== baz ==
+
+== <span> baz</span> ==
+!! result
+<h2>foo</h2>
+<h2> bar</h2>
+<h2>baz </h2>
+<h2><span> baz</span></h2>
+!! end
+
 !! test
 Parsoid: Serialize positional parameters with = in them as named parameter
 !! options
@@ -18781,8 +19297,12 @@ parsoid=html2wt
 <p><i>A</i><b data-parsoid='{}'><i data-parsoid='{}'>B</i></b></p>
 !! end
 
+#------------------------------------
+# End of I/B quote minimization tests
+#------------------------------------
+
 !!test
-5. Bug 54262: New entities
+Bug 54262: New entities
 !! options
 parsoid=html2wt
 !! input
@@ -18791,6 +19311,98 @@ foo
 <span typeof="mw:Entity">foo</span>
 !! end
 
+## Note that there is no wikitext output for 'unknownproperty' ##
+## Unknown magic words are silently dropped ##
+
+!! test
+Magic words
+!! options
+parsoid=html2wt
+!! input
+__TOC__
+__NOTOC__
+__FORCETOC__
+__INDEX__
+__NOINDEX__
+__NOGALLERY__
+__NOEDITSECTION__
+__NOTITLECONVERT__
+__NOCONTENTCONVERT__
+!! result
+<meta property='mw:PageProp/toc' />
+<meta property='mw:PageProp/notoc' />
+<meta property='mw:PageProp/forcetoc' />
+<meta property='mw:PageProp/index' />
+<meta property='mw:PageProp/noindex' />
+<meta property='mw:PageProp/nogallery' />
+<meta property='mw:PageProp/noeditsection' />
+<meta property='mw:PageProp/notitleconvert' />
+<meta property='mw:PageProp/nocontentconvert' />
+<meta property='mw:PageProp/unknownproperty' />
+!! end
+
+!! test
+Consecutive <pre>s should not get merged
+!! options
+parsoid=html2wt,html2html
+!! input
+ a
+
+ b
+
+ c
+
+ d
+
+ e
+
+ f
+!! result
+<pre>a</pre><pre>b</pre>
+
+<pre>c
+</pre><pre>
+d</pre>
+
+<pre>e
+
+</pre><pre>
+
+f</pre>
+!! end
+
+!! test
+Edited ISBN links not serializable as ISBN links should serialize as wikilinks
+!! options
+parsoid=html2wt
+!! input
+[[Special:BookSources/1234567890|ISBN 1234567895]]
+!! result
+<a rel="mw:ExtLink" href="./Special:BookSources/1234567890">ISBN 1234567895</a>
+!! end
+
+!! test
+Edited RFC links not serializable as RFC links should serialize as extlinks
+!! options
+parsoid=html2wt
+!! input
+[//tools.ietf.org/html/rfc123 New RFC]
+!! result
+<a href="//tools.ietf.org/html/rfc123" rel="mw:ExtLink">New RFC</a>
+!! end
+
+!! test
+Edited PMID links not serializable as PMID links should serialize as extlinks
+!! options
+parsoid=html2wt
+!! input
+[//www.ncbi.nlm.nih.gov/pubmed/123?dopt=Abstract New PMID]
+!! result
+<a href="//www.ncbi.nlm.nih.gov/pubmed/123?dopt=Abstract" rel="mw:ExtLink">New PMID</a>
+!! end
+
 # -----------------------------------------------------------------
 # End of section for Parsoid-only html2wt tests for serialization
 # of new content
index 653205f..1dbc74c 100644 (file)
@@ -656,9 +656,25 @@ class FileBackendTest extends MediaWikiTestCase {
 
                if ( $withSource ) {
                        $status = $this->backend->doOperation(
-                               array( 'op' => 'create', 'content' => 'blahblah', 'dst' => $source ) );
+                               array( 'op' => 'create', 'content' => 'blahblah', 'dst' => $source,
+                                       'headers' => array( 'Content-Disposition' => 'xxx' ) ) );
                        $this->assertGoodStatus( $status,
                                "Creation of file at $source succeeded ($backendName)." );
+                       if ( $this->backend->hasFeatures( FileBackend::ATTR_HEADERS ) ) {
+                               $attr = $this->backend->getFileXAttributes( array( 'src' => $source ) );
+                               $this->assertHasHeaders( array( 'Content-Disposition' => 'xxx' ), $attr );
+                       }
+
+                       $status = $this->backend->describe( array( 'src' => $source,
+                               'headers' => array( 'Content-Disposition' => '' ) ) ); // remove
+                       $this->assertGoodStatus( $status,
+                               "Removal of header for $source succeeded ($backendName)." );
+
+                       if ( $this->backend->hasFeatures( FileBackend::ATTR_HEADERS ) ) {
+                               $attr = $this->backend->getFileXAttributes( array( 'src' => $source ) );
+                               $this->assertFalse( isset( $attr['headers']['content-disposition'] ),
+                                       "File 'Content-Disposition' header removed." );
+                       }
                }
 
                $status = $this->backend->doOperation( $op );
@@ -669,6 +685,9 @@ class FileBackendTest extends MediaWikiTestCase {
                                "Describe of file at $source succeeded ($backendName)." );
                        $this->assertEquals( array( 0 => true ), $status->success,
                                "Describe of file at $source has proper 'success' field in Status ($backendName)." );
+                       if ( $this->backend->hasFeatures( FileBackend::ATTR_HEADERS ) ) {
+                               $this->assertHasHeaders( $op['headers'], $attr );
+                       }
                } else {
                        $this->assertEquals( false, $status->isOK(),
                                "Describe of file at $source failed ($backendName)." );
@@ -677,14 +696,27 @@ class FileBackendTest extends MediaWikiTestCase {
                $this->assertBackendPathsConsistent( array( $source ) );
        }
 
+       private function assertHasHeaders( array $headers, array $attr ) {
+               foreach ( $headers as $n => $v ) {
+                       if ( $n !== '' ) {
+                               $this->assertTrue( isset( $attr['headers'][strtolower( $n )] ),
+                                       "File has '$n' header." );
+                               $this->assertEquals( $v, $attr['headers'][strtolower( $n )],
+                                       "File has '$n' header value." );
+                       } else {
+                               $this->assertFalse( isset( $attr['headers'][strtolower( $n )] ),
+                                       "File does not have '$n' header." );
+                       }
+               }
+       }
+
        public static function provider_testDescribe() {
                $cases = array();
 
                $source = self::baseStorePath() . '/unittest-cont1/e/myfacefile.txt';
 
                $op = array( 'op' => 'describe', 'src' => $source,
-                       'headers' => array( 'X-Content-Length' => '91.3', 'Content-Old-Header' => '' ),
-                       'disposition' => 'inline' );
+                       'headers' => array( 'Content-Disposition' => 'inline' ), );
                $cases[] = array(
                        $op, // operation
                        true, // with source
@@ -1480,6 +1512,28 @@ class FileBackendTest extends MediaWikiTestCase {
                                "Preparing dir $path failed ($backendName)." );
                }
 
+               $status = $this->backend->secure( array( 'dir' => dirname( $path ) ) );
+               if ( $isOK ) {
+                       $this->assertGoodStatus( $status,
+                               "Securing dir $path succeeded without warnings ($backendName)." );
+                       $this->assertEquals( true, $status->isOK(),
+                               "Securing dir $path succeeded ($backendName)." );
+               } else {
+                       $this->assertEquals( false, $status->isOK(),
+                               "Securing dir $path failed ($backendName)." );
+               }
+
+               $status = $this->backend->publish( array( 'dir' => dirname( $path ) ) );
+               if ( $isOK ) {
+                       $this->assertGoodStatus( $status,
+                               "Publishing dir $path succeeded without warnings ($backendName)." );
+                       $this->assertEquals( true, $status->isOK(),
+                               "Publishing dir $path succeeded ($backendName)." );
+               } else {
+                       $this->assertEquals( false, $status->isOK(),
+                               "Publishing dir $path failed ($backendName)." );
+               }
+
                $status = $this->backend->clean( array( 'dir' => dirname( $path ) ) );
                if ( $isOK ) {
                        $this->assertGoodStatus( $status,
@@ -1549,8 +1603,6 @@ class FileBackendTest extends MediaWikiTestCase {
                }
        }
 
-       // @todo testSecure
-
        /**
         * @covers FileBackend::doOperations
         */
@@ -2325,7 +2377,7 @@ class FileBackendTest extends MediaWikiTestCase {
                                unlink( $file );
                        }
                }
-               $containers = array( 'unittest-cont1', 'unittest-cont2' );
+               $containers = array( 'unittest-cont1', 'unittest-cont2', 'unittest-cont-bad' );
                foreach ( $containers as $container ) {
                        $this->deleteFiles( $container );
                }
diff --git a/tests/phpunit/includes/libs/HashRingTest.php b/tests/phpunit/includes/libs/HashRingTest.php
new file mode 100644 (file)
index 0000000..68dfea1
--- /dev/null
@@ -0,0 +1,56 @@
+<?php
+
+/**
+ * @group HashRing
+ */
+class HashRingTest extends MediaWikiTestCase {
+       /**
+        * @covers HashRing
+        */
+       public function testHashRing() {
+               $ring = new HashRing( array( 's1' => 1, 's2' => 1, 's3' => 2, 's4' => 2, 's5' => 2, 's6' => 3 ) );
+
+               $locations = array();
+               for ( $i = 0; $i < 20; $i++ ) {
+                       $locations[ "hello$i"] = $ring->getLocation( "hello$i" );
+               }
+               $expectedLocations = array(
+                       "hello0" => "s5",
+                       "hello1" => "s6",
+                       "hello2" => "s2",
+                       "hello3" => "s5",
+                       "hello4" => "s6",
+                       "hello5" => "s4",
+                       "hello6" => "s5",
+                       "hello7" => "s4",
+                       "hello8" => "s5",
+                       "hello9" => "s5",
+                       "hello10" => "s3",
+                       "hello11" => "s6",
+                       "hello12" => "s1",
+                       "hello13" => "s3",
+                       "hello14" => "s3",
+                       "hello15" => "s5",
+                       "hello16" => "s4",
+                       "hello17" => "s6",
+                       "hello18" => "s6",
+                       "hello19" => "s3"
+               );
+
+               $this->assertEquals( $expectedLocations, $locations, 'Items placed at proper locations' );
+
+               $locations = array();
+               for ( $i = 0; $i < 5; $i++ ) {
+                       $locations[ "hello$i"] = $ring->getLocations( "hello$i", 2 );
+               }
+
+               $expectedLocations = array(
+                       "hello0" => array( "s5", "s6" ),
+                       "hello1" => array( "s6", "s4" ),
+                       "hello2" => array( "s2", "s1" ),
+                       "hello3" => array( "s5", "s6" ),
+                       "hello4" => array( "s6", "s4" ),
+               );
+               $this->assertEquals( $expectedLocations, $locations, 'Items placed at proper locations' );
+       }
+}
diff --git a/tests/phpunit/includes/utils/HashRingTest.php b/tests/phpunit/includes/utils/HashRingTest.php
deleted file mode 100644 (file)
index 68dfea1..0000000
+++ /dev/null
@@ -1,56 +0,0 @@
-<?php
-
-/**
- * @group HashRing
- */
-class HashRingTest extends MediaWikiTestCase {
-       /**
-        * @covers HashRing
-        */
-       public function testHashRing() {
-               $ring = new HashRing( array( 's1' => 1, 's2' => 1, 's3' => 2, 's4' => 2, 's5' => 2, 's6' => 3 ) );
-
-               $locations = array();
-               for ( $i = 0; $i < 20; $i++ ) {
-                       $locations[ "hello$i"] = $ring->getLocation( "hello$i" );
-               }
-               $expectedLocations = array(
-                       "hello0" => "s5",
-                       "hello1" => "s6",
-                       "hello2" => "s2",
-                       "hello3" => "s5",
-                       "hello4" => "s6",
-                       "hello5" => "s4",
-                       "hello6" => "s5",
-                       "hello7" => "s4",
-                       "hello8" => "s5",
-                       "hello9" => "s5",
-                       "hello10" => "s3",
-                       "hello11" => "s6",
-                       "hello12" => "s1",
-                       "hello13" => "s3",
-                       "hello14" => "s3",
-                       "hello15" => "s5",
-                       "hello16" => "s4",
-                       "hello17" => "s6",
-                       "hello18" => "s6",
-                       "hello19" => "s3"
-               );
-
-               $this->assertEquals( $expectedLocations, $locations, 'Items placed at proper locations' );
-
-               $locations = array();
-               for ( $i = 0; $i < 5; $i++ ) {
-                       $locations[ "hello$i"] = $ring->getLocations( "hello$i", 2 );
-               }
-
-               $expectedLocations = array(
-                       "hello0" => array( "s5", "s6" ),
-                       "hello1" => array( "s6", "s4" ),
-                       "hello2" => array( "s2", "s1" ),
-                       "hello3" => array( "s5", "s6" ),
-                       "hello4" => array( "s6", "s4" ),
-               );
-               $this->assertEquals( $expectedLocations, $locations, 'Items placed at proper locations' );
-       }
-}
index 401b8a8..039cabb 100755 (executable)
@@ -108,9 +108,9 @@ if ( !class_exists( 'PHPUnit_Runner_Version' ) ) {
 }
 
 if ( PHPUnit_Runner_Version::id() !== '@package_version@'
-       && version_compare( PHPUnit_Runner_Version::id(), '3.6.7', '<' )
+       && version_compare( PHPUnit_Runner_Version::id(), '3.7.0', '<' )
 ) {
-       die( 'PHPUnit 3.6.7 or later required, you have ' . PHPUnit_Runner_Version::id() . ".\n" );
+       die( 'PHPUnit 3.7.0 or later required, you have ' . PHPUnit_Runner_Version::id() . ".\n" );
 }
 
 if ( !class_exists( 'PHPUnit_TextUI_Command' ) ) {